sonner-wc 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -2
- package/dist/sonner-wc.bundle.js +11 -5
- package/dist/sonner-wc.bundle.js.map +3 -3
- package/dist/sonner-wc.js +65 -6
- package/dist/sonner-wc.js.map +3 -3
- package/package.json +9 -1
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ Drop it into anything — vanilla HTML, Vue, Svelte, htmx — same API, same loo
|
|
|
17
17
|
## Install
|
|
18
18
|
|
|
19
19
|
```sh
|
|
20
|
-
|
|
20
|
+
npm install sonner-wc # or bun / pnpm / yarn
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
ESM only. Modern browsers (last two versions of Chrome, Firefox, Safari, Edge).
|
|
@@ -41,7 +41,8 @@ Place once, anywhere in the page. Configure with attributes.
|
|
|
41
41
|
| `visible-toasts` | how many toasts fan out vs. stack behind | `3` |
|
|
42
42
|
| `offset` | viewport gutter; px number or CSS length | `24px` |
|
|
43
43
|
| `mobile-offset` | gutter under 600px | `16px` |
|
|
44
|
-
| `hotkey` | `Alt+KeyT`-style chord that expands the stack
|
|
44
|
+
| `hotkey` | `Alt+KeyT`-style chord that expands the stack; `""` or `"none"` disables it | `altKey+KeyT` |
|
|
45
|
+
| `container-aria-label` | Accessible name for the toaster region. Reactive — changes after mount take effect. | `Notifications` |
|
|
45
46
|
|
|
46
47
|
### The `toast()` helper
|
|
47
48
|
|
|
@@ -80,6 +81,60 @@ toast.dismiss(); // all
|
|
|
80
81
|
The returned element is the `<sonner-toast>` itself. You can mutate it directly — set
|
|
81
82
|
attributes, add children, call `.dismiss()`, etc.
|
|
82
83
|
|
|
84
|
+
### `toast()` options
|
|
85
|
+
|
|
86
|
+
The second argument to `toast()` (and its variants) accepts:
|
|
87
|
+
|
|
88
|
+
| Option | Type | Notes |
|
|
89
|
+
| ---------------------- | ----------------------------------- | ---------------------------------------------------------------------------------------------- |
|
|
90
|
+
| `id` | `string \| number` | Reuse to update a toast in place; pass the same `id` again to `toast.*()`. |
|
|
91
|
+
| `toasterId` | `string` | DOM `id` of a specific `<sonner-toaster>` to route this toast to. Falls back to the default. |
|
|
92
|
+
| `testId` | `string` | Set as `data-testid` on the toast host. Survives promise loading → success/error transitions. |
|
|
93
|
+
| `closeButtonAriaLabel` | `string` | Accessible name for the close button. Defaults to `Close: <title>` (or `Close toast`). |
|
|
94
|
+
| `description` | `string \| Node \| () => …` | Secondary text. |
|
|
95
|
+
| `duration` | `number` (ms) or `Infinity` | Lifetime override. |
|
|
96
|
+
| `dismissible` | `boolean` | Set `false` to disable swipe / close-button dismissal. |
|
|
97
|
+
| `position` | same as toaster | Per-toast position override. |
|
|
98
|
+
| `closeButton` | `boolean` | Per-toast override of the toaster's `close-button` flag. |
|
|
99
|
+
| `richColors` | `boolean` | Force rich colors on this toast. |
|
|
100
|
+
| `invert` | `boolean` | Force inverted colors on this toast. |
|
|
101
|
+
| `icon` | `Node \| string` | Override the icon picked from `type`. |
|
|
102
|
+
| `className` | `string` | Extra class applied to the toast host. |
|
|
103
|
+
| `action` / `cancel` | `{ label, onClick }` or `HTMLElement` | Right/left button. Pass an element for full control. |
|
|
104
|
+
| `onDismiss` | `(el) => void` | Called when the toast is dismissed (manually or via `toast.dismiss`). |
|
|
105
|
+
| `onAutoClose` | `(el) => void` | Called when the duration timer fires. |
|
|
106
|
+
|
|
107
|
+
## Accessibility
|
|
108
|
+
|
|
109
|
+
`sonner-wc` ships with reasonable defaults so you don't have to wire ARIA
|
|
110
|
+
yourself:
|
|
111
|
+
|
|
112
|
+
- The toaster is a labelled `region` (`aria-label="Notifications"` by
|
|
113
|
+
default; override with `container-aria-label`).
|
|
114
|
+
- Each toast carries `aria-atomic="true"` so screen readers re-announce the
|
|
115
|
+
whole toast when its content changes (e.g. `toast.promise` loading →
|
|
116
|
+
success/error), not just the diff.
|
|
117
|
+
- When the stack is collapsed, toasts behind the front one are
|
|
118
|
+
`aria-hidden="true"` so users aren't bombarded by visually obscured
|
|
119
|
+
toasts. Expanding the stack (hover, focus, or the configured `hotkey`)
|
|
120
|
+
reveals them.
|
|
121
|
+
- Urgent transitions that happen *after* mount (e.g. a `loading` toast
|
|
122
|
+
becoming an `error`) are re-announced through a dedicated assertive
|
|
123
|
+
live region inside the toaster's shadow root. Re-evaluating a toast's
|
|
124
|
+
own `aria-live` is unreliable across screen readers; this region
|
|
125
|
+
guarantees the message lands.
|
|
126
|
+
- Pressing **Escape** while focus is inside a toast dismisses it.
|
|
127
|
+
- When a toast that captured focus is dismissed, focus is restored to
|
|
128
|
+
the element that was focused before the toast was entered — no more
|
|
129
|
+
stranded keyboard users on `<body>`.
|
|
130
|
+
- Close buttons get an accessible name automatically (`Close: <title>`),
|
|
131
|
+
or whatever `closeButtonAriaLabel` you pass.
|
|
132
|
+
- The toaster reflects its `hotkey` (default `Alt+T`) as both
|
|
133
|
+
`aria-keyshortcuts` and a `title` tooltip so the shortcut is
|
|
134
|
+
discoverable to screen-reader users and sighted users alike. A
|
|
135
|
+
`:focus-visible` ring shows where focus lands when the hotkey is
|
|
136
|
+
pressed.
|
|
137
|
+
|
|
83
138
|
### Declarative form
|
|
84
139
|
|
|
85
140
|
You can also build toasts as plain HTML and append them to a toaster:
|
package/dist/sonner-wc.bundle.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var $=3;var y=4000,K=356,l=14,V=45,W=0.11,E=200,G=["altKey","KeyT"];var j='<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>',ra=Array.from({length:12},()=>'<div class="sonner-loading-bar"></div>').join(""),ma='<div class="sonner-loading-wrapper" data-visible="true"><div class="sonner-spinner">'+ra+"</div></div>";function p(a){switch(a){case"success":return'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" height="20" width="20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" clip-rule="evenodd"/></svg>';case"info":return'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" height="20" width="20"><path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z" clip-rule="evenodd"/></svg>';case"warning":return'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" height="20" width="20"><path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z" clip-rule="evenodd"/></svg>';case"error":return'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" height="20" width="20"><path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/></svg>';case"loading":return null;default:return null}}var w=new Map,u=new Set,ta=1;function k(){return ta++}function U(a){w.set(a.toastId,a)}function C(a){if(w.get(a.toastId)===a)w.delete(a.toastId)}function v(a){return w.get(a)}function L(a){u.add(a)}function H(a){u.delete(a)}function R(){let a;for(let r of u)a=r;return a}function P(){for(let a of u)a.dismissAll()}var q=`:host {
|
|
2
2
|
position: fixed;
|
|
3
3
|
width: var(--width);
|
|
4
4
|
font-family:
|
|
@@ -57,6 +57,12 @@ var Z=3;var y=4000,$=356,b=14,W=45,p=0.11,V=200,E=["altKey","KeyT"];var G='<svg
|
|
|
57
57
|
display: block;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
:host(:focus-visible) {
|
|
61
|
+
outline: 2px solid var(--gray9);
|
|
62
|
+
outline-offset: 4px;
|
|
63
|
+
border-radius: var(--border-radius);
|
|
64
|
+
}
|
|
65
|
+
|
|
60
66
|
[data-frame] {
|
|
61
67
|
display: block;
|
|
62
68
|
width: 100%;
|
|
@@ -164,7 +170,7 @@ var Z=3;var y=4000,$=356,b=14,W=45,p=0.11,V=200,E=["altKey","KeyT"];var G='<svg
|
|
|
164
170
|
transform: none;
|
|
165
171
|
}
|
|
166
172
|
}
|
|
167
|
-
`;var
|
|
173
|
+
`;var B=`:host {
|
|
168
174
|
--y: translateY(100%);
|
|
169
175
|
--lift-amount: calc(var(--lift) * var(--gap, 14px));
|
|
170
176
|
z-index: var(--z-index);
|
|
@@ -719,7 +725,7 @@ var Z=3;var y=4000,$=356,b=14,W=45,p=0.11,V=200,E=["altKey","KeyT"];var G='<svg
|
|
|
719
725
|
width: 100%;
|
|
720
726
|
}
|
|
721
727
|
}
|
|
722
|
-
`;var S=null,Y=null;function
|
|
728
|
+
`;var S=null,Y=null;function M(){if(!S)S=new CSSStyleSheet,S.replaceSync(q);return S}function N(){if(!Y)Y=new CSSStyleSheet,Y.replaceSync(B);return Y}var da=typeof HTMLElement!=="undefined"?HTMLElement:class{};function Q(a){return a==="error"||a==="warning"}function O(a,r,t){for(let n of Array.from(a.children))if(n.getAttribute("slot")===r)a.removeChild(n);if(t==null||t==="")return;let o=typeof t==="function"?t():t;if(o instanceof Node){if(o instanceof Element)o.setAttribute("slot",r);a.appendChild(o)}else{let n=document.createElement("span");n.setAttribute("slot",r),n.textContent=String(o),a.appendChild(n)}}function F(a,r,t,o){for(let d of Array.from(a.children))if(d.getAttribute("slot")===r)a.removeChild(d);if(!t)return;if(t instanceof HTMLElement){t.setAttribute("slot",r),a.appendChild(t);return}let n=document.createElement("button");if(n.setAttribute("slot",r),n.setAttribute("type","button"),r==="cancel")n.setAttribute("data-cancel","");else n.setAttribute("data-action","");n.textContent=t.label,n.addEventListener("click",(d)=>{if(t.onClick?.(d),d.defaultPrevented&&r==="action")return;o()}),a.appendChild(n)}var ha=Array.from({length:12},()=>'<div class="sonner-loading-bar"></div>').join(""),ia=`
|
|
723
729
|
<div data-frame part="frame">
|
|
724
730
|
<button type="button" data-close-button part="close-button" hidden aria-label="Close toast"></button>
|
|
725
731
|
<div data-icon part="icon">
|
|
@@ -736,7 +742,7 @@ var Z=3;var y=4000,$=356,b=14,W=45,p=0.11,V=200,E=["altKey","KeyT"];var G='<svg
|
|
|
736
742
|
<slot name="action"></slot>
|
|
737
743
|
<slot part="custom"></slot>
|
|
738
744
|
</div>
|
|
739
|
-
`;class l extends da{static get observedAttributes(){return["type","duration","dismissible","position","close-button","rich-colors","invert"]}toastId=0;#o;#e;#w;#c;#t;#f=null;#d=y;#a=null;#s=0;#n=new Set;#h=null;#b=0;#i=null;#m=null;#x=!1;#g=!1;#Y=!1;#y;#u;#k=null;#l=null;constructor(){super();this.#o=this.attachShadow({mode:"open"}),this.#o.adoptedStyleSheets=[A()];let a=document.createElement("template");a.innerHTML=ia,this.#o.appendChild(a.content.cloneNode(!0)),this.#e=this.#o.querySelector("[data-close-button]"),this.#w=this.#o.querySelector("[data-icon]"),this.#c=this.#o.querySelector("[data-title]"),this.#t=this.#o.querySelector("[data-description]"),this.#e.innerHTML=G,this.#e.addEventListener("click",()=>this.dismiss());let r=this.#o.querySelector('slot[name="icon"]'),t=this.#o.querySelector('slot[name="description"]');r.addEventListener("slotchange",()=>this.#X("icon",r)),t.addEventListener("slotchange",()=>this.#X("description",t)),this.addEventListener("pointerdown",this.#H),this.addEventListener("pointermove",this.#C),this.addEventListener("pointerup",this.#U),this.addEventListener("pointercancel",this.#U),this.addEventListener("mouseenter",()=>this.#Z("hover-self")),this.addEventListener("mouseleave",()=>this.#$("hover-self")),this.addEventListener("focusin",(o)=>{if(this.#Z("focus-self"),this.#l)return;let n=o.relatedTarget;if(n&&!this.contains(n))this.#l=n}),this.addEventListener("focusout",()=>this.#$("focus-self")),this.addEventListener("keydown",(o)=>{if(o.key==="Escape"&&this.#W())o.stopPropagation(),this.dismiss()})}connectedCallback(){if(!this.toastId)this.toastId=this.getAttribute("id")||0;if(!this.hasAttribute("tabindex"))this.tabIndex=0;if(this.#_(),this.#J(),this.#K(),this.#S(),this.#Q(),this.#v(),this.setAttribute("data-sonner-toast",""),!this.hasAttribute("aria-atomic"))this.setAttribute("aria-atomic","true");if(this.setAttribute("data-mounted","false"),this.setAttribute("data-removed","false"),this.setAttribute("data-swiping","false"),this.setAttribute("data-swiped","false"),this.setAttribute("data-swipe-out","false"),!this.hasAttribute("data-styled"))this.setAttribute("data-styled","true");j(this),document.addEventListener("visibilitychange",this.#G),requestAnimationFrame(()=>{this.#x=!0,this.setAttribute("data-mounted","true"),this.dispatchEvent(new CustomEvent("sonner-toast-mounted",{bubbles:!0,composed:!0})),this.#p()})}disconnectedCallback(){if(this.#a)clearTimeout(this.#a);document.removeEventListener("visibilitychange",this.#G),H(this)}attributeChangedCallback(a,r,t){if(!this.isConnected)return;switch(a){case"type":this.#_();break;case"duration":this.#f=this.#V(),this.#d=this.#f??y;break;case"dismissible":this.#J();break;case"position":this.#K();break;case"close-button":this.#v();break;case"rich-colors":this.#S();break;case"invert":this.#Q();break}}get toastType(){return this.getAttribute("type")||"default"}dismiss(){if(this.#g||this.#Y)return;if(this.#Y=!0,this.#g=!0,this.setAttribute("data-removed","true"),this.#a)clearTimeout(this.#a);this.dispatchEvent(new CustomEvent("sonner-toast-dismissed",{bubbles:!0,composed:!0})),setTimeout(()=>{this.#r(),this.#y?.(this),this.remove()},V)}#r(){if(!this.#l)return;let a=document.activeElement;if(!a||!this.contains(a))return;let r=this.#l;if(!r.isConnected||typeof r.focus!=="function")return;r.focus()}update(a){let r=a.type!==void 0&&a.type!==this.toastType,t=K(this.toastType);if(a.type!==void 0)this.setAttribute("type",a.type);let o=!1;if(a.duration!==void 0)this.setAttribute("duration",String(a.duration)),this.#f=a.duration,this.#d=a.duration,o=!0;else if(r)this.#f=null,this.removeAttribute("duration"),this.#d=0,o=!0;if(a.dismissible!==void 0)if(a.dismissible)this.setAttribute("dismissible","");else this.removeAttribute("dismissible");if(a.position!==void 0)this.setAttribute("position",a.position);if(a.closeButton!==void 0)if(a.closeButton)this.setAttribute("close-button","");else this.removeAttribute("close-button");if(a.richColors!==void 0)if(a.richColors)this.setAttribute("rich-colors","");else this.removeAttribute("rich-colors");if(a.invert!==void 0)if(a.invert)this.setAttribute("invert","");else this.removeAttribute("invert");if(a.icon!==void 0)this.setIcon(a.icon);if(a.title!==void 0)this.setTitle(a.title);if(a.description!==void 0)this.setDescription(a.description);if(a.action!==void 0)F(this,"action",a.action,()=>this.dismiss());if(a.cancel!==void 0)F(this,"cancel",a.cancel,()=>this.dismiss());if(a.className)this.className=a.className;if(a.testId!==void 0)this.setAttribute("data-testid",a.testId);if(a.closeButtonAriaLabel!==void 0)this.#k=a.closeButtonAriaLabel||null,this.#z();if(a.onDismiss)this.#y=a.onDismiss;if(a.onAutoClose)this.#u=a.onAutoClose;if(o)this.#j();if(this.#x&&r&&!t&&K(this.toastType)){let h=Array.from(this.children).find((e)=>e.getAttribute("slot")==="title")?.textContent?.trim();if(h)this.closest("sonner-toaster")?.announceUrgent(h)}this.dispatchEvent(new CustomEvent("sonner-toast-updated",{bubbles:!0,composed:!0}))}setTitle(a){N(this,"title",a),this.#z()}#z(){if(this.#k){this.#e.setAttribute("aria-label",this.#k);return}let r=Array.from(this.children).find((t)=>t.getAttribute("slot")==="title")?.textContent?.trim();this.#e.setAttribute("aria-label",r?`Close: ${r}`:"Close toast")}setDescription(a){N(this,"description",a)}setIcon(a){for(let r of Array.from(this.children))if(r.getAttribute("slot")==="icon")this.removeChild(r);if(a==null)return;if(a instanceof Node){if(a instanceof Element)a.setAttribute("slot","icon");this.appendChild(a)}else{let r=document.createElement("template");r.innerHTML=a;let t=r.content.firstElementChild;if(t)t.setAttribute("slot","icon"),this.appendChild(t)}}setHandlers(a){this.#y=a.onDismiss,this.#u=a.onAutoClose}setPaused(a){if(a)this.#Z("toaster");else this.#$("toaster")}#X(a,r){if(r.assignedNodes().length>0)this.setAttribute(`data-has-${a}`,"");else this.removeAttribute(`data-has-${a}`)}#_(){let a=this.toastType;this.setAttribute("data-type",a);let r=K(a);if(this.setAttribute("role",r?"alert":"status"),this.setAttribute("aria-live",r?"assertive":"polite"),a==="loading"){this.setAttribute("data-promise","true");for(let t of Array.from(this.children))if(t.getAttribute("slot")==="icon"&&t.hasAttribute("data-sonner-default-icon"))this.removeChild(t)}else if(this.removeAttribute("data-promise"),!Array.from(this.children).some((o)=>{if(o.getAttribute("slot")!=="icon")return!1;return!o.hasAttribute("data-sonner-default-icon")})){for(let n of Array.from(this.children))if(n.getAttribute("slot")==="icon"&&n.hasAttribute("data-sonner-default-icon"))this.removeChild(n);let o=U(a);if(o){let n=document.createElement("template");n.innerHTML=o;let h=n.content.firstElementChild;if(h)h.setAttribute("slot","icon"),h.setAttribute("data-sonner-default-icon",""),this.appendChild(h)}}}#J(){let a=this.getAttribute("dismissible")!=="false";this.setAttribute("data-dismissible",String(a))}#K(){let a=this.getAttribute("position");if(!a)return;let[r,t]=a.split("-");if(r)this.setAttribute("data-y-position",r);if(t)this.setAttribute("data-x-position",t)}#v(){let a=this.hasAttribute("close-button")&&this.getAttribute("close-button")!=="false";this.#e.hidden=!a}#S(){let a=this.hasAttribute("rich-colors")&&this.getAttribute("rich-colors")!=="false";this.setAttribute("data-rich-colors",String(a))}#Q(){let a=this.hasAttribute("invert")&&this.getAttribute("invert")!=="false";this.setAttribute("data-invert",String(a))}#V(){let a=this.getAttribute("duration");if(a==null)return null;if(a==="Infinity")return 1/0;let r=Number(a);return Number.isFinite(r)||r===1/0?r:null}#E(){let a=this.#f??this.#V();if(a!==null)return a;if(this.toastType==="loading")return 1/0;return y}#p(){if(!this.#x||this.#g)return;if(this.#n.size>0)return;if(this.#a!==null)return;let a=this.#E();if(a===1/0)return;this.#d=this.#d>0?this.#d:a,this.#s=Date.now(),this.#a=setTimeout(()=>{this.#a=null,this.#u?.(this),this.dispatchEvent(new CustomEvent("sonner-toast-autoclosed",{bubbles:!0,composed:!0})),this.dismiss()},this.#d)}#Z(a){let r=this.#n.size===0;if(this.#n.add(a),r&&this.#a!==null){clearTimeout(this.#a),this.#a=null;let t=Date.now()-this.#s;this.#d=Math.max(0,this.#d-t)}}#$(a){if(!this.#n.delete(a))return;if(this.#n.size===0&&!this.#g)this.#p()}#j(){if(this.#a)clearTimeout(this.#a),this.#a=null;this.#d=this.#E(),this.#p()}#G=()=>{if(document.visibilityState==="hidden")this.#Z("doc-hidden");else this.#$("doc-hidden")};#W(){return this.getAttribute("dismissible")!=="false"}#H=(a)=>{if(a.button===2)return;if(this.toastType==="loading"||!this.#W())return;let r=a.composedPath()[0];if(r){if(r.tagName==="BUTTON"||typeof r.closest==="function"&&r.closest("button"))return}this.#b=Date.now();try{this.setPointerCapture(a.pointerId)}catch{}if(this.setAttribute("data-swiping","true"),this.#h={x:a.clientX,y:a.clientY},!this.#m){let t=this.getAttribute("data-y-position"),o=this.getAttribute("data-x-position"),n=[];if(t==="top"||t==="bottom")n.push(t);if(o==="left"||o==="right")n.push(o);this.#m=n.length>0?n:["bottom","right"]}};#C=(a)=>{if(!this.#h||!this.#W())return;if((window.getSelection()?.toString().length??0)>0)return;let r=a.clientY-this.#h.y,t=a.clientX-this.#h.x,o=this.#m;if(!this.#i&&(Math.abs(t)>1||Math.abs(r)>1))this.#i=Math.abs(t)>Math.abs(r)?"x":"y";let n=(d)=>1/(1.5+Math.abs(d)/20),h=0,e=0;if(this.#i==="y"){if(o.includes("top")||o.includes("bottom"))if(o.includes("top")&&r<0||o.includes("bottom")&&r>0)e=r;else{let d=r*n(r);e=Math.abs(d)<Math.abs(r)?d:r}}else if(this.#i==="x"){if(o.includes("left")||o.includes("right"))if(o.includes("left")&&t<0||o.includes("right")&&t>0)h=t;else{let d=t*n(t);h=Math.abs(d)<Math.abs(t)?d:t}}if(Math.abs(h)>0||Math.abs(e)>0)this.setAttribute("data-swiped","true");this.style.setProperty("--swipe-amount-x",`${h}px`),this.style.setProperty("--swipe-amount-y",`${e}px`)};#U=()=>{if(this.getAttribute("data-swipe-out")==="true"||!this.#W()){this.#h=null,this.#i=null,this.setAttribute("data-swiping","false");return}let a=parseFloat(this.style.getPropertyValue("--swipe-amount-x"))||0,r=parseFloat(this.style.getPropertyValue("--swipe-amount-y"))||0,t=Math.max(1,Date.now()-this.#b),o=this.#i==="x"?a:r,n=Math.abs(o)/t;if(Math.abs(o)>=W||n>p){if(this.#i==="x")this.setAttribute("data-swipe-direction",a>0?"right":"left");else this.setAttribute("data-swipe-direction",r>0?"down":"up");this.setAttribute("data-swipe-out","true"),this.dismiss()}else this.style.setProperty("--swipe-amount-x","0px"),this.style.setProperty("--swipe-amount-y","0px"),this.setAttribute("data-swiped","false");this.setAttribute("data-swiping","false"),this.#h=null,this.#i=null}}if(typeof customElements!=="undefined"&&!customElements.get("sonner-toast"))customElements.define("sonner-toast",l);var ea=typeof HTMLElement!=="undefined"?HTMLElement:class{};function O(a,r){if(a==null)return r;if(typeof a==="number")return`${a}px`;return a}function I(a,r,t,o){let n=["top","right","bottom","left"];if(r==null||typeof r==="string"||typeof r==="number"){let h=O(r,o);for(let e of n)a.style.setProperty(`${t}-${e}`,h)}else for(let h of n)a.style.setProperty(`${t}-${h}`,O(r[h],o))}class m extends ea{static get observedAttributes(){return["position","theme","rich-colors","expand","duration","gap","visible-toasts","close-button","invert","dir","offset","mobile-offset","hotkey","container-aria-label"]}#o;#e;#w;#c;#t=[];#f=new Map;#d=!1;#a=!1;#s=!1;#n=null;#h=null;constructor(){super();this.#o=this.attachShadow({mode:"open"}),this.#o.adoptedStyleSheets=[B()],this.#o.innerHTML='<div data-frame part="frame"><slot></slot></div><div data-alert-announcer role="alert" aria-live="assertive" aria-atomic="true" style="position:absolute;left:0;top:0;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;pointer-events:none"></div>',this.#e=this.#o.querySelector("[data-alert-announcer]"),this.#w=new MutationObserver((a)=>{let r=!1;for(let t of a){for(let o of Array.from(t.addedNodes))if(o instanceof l)this.#t.unshift(o),this.#c.observe(o),this.#l(o),r=!0;for(let o of Array.from(t.removedNodes))if(o instanceof l)this.#t=this.#t.filter((n)=>n!==o),this.#f.delete(o),this.#c.unobserve(o),r=!0}if(r)this.#r({remeasure:!0})}),this.#c=new ResizeObserver(()=>this.#r({remeasure:!1})),this.addEventListener("mouseenter",this.#X),this.addEventListener("mouseleave",this.#_),this.addEventListener("focusin",this.#J),this.addEventListener("focusout",this.#K),this.addEventListener("sonner-toast-dismissed",()=>this.#r({remeasure:!1})),this.addEventListener("sonner-toast-updated",()=>this.#r({remeasure:!0})),this.addEventListener("sonner-toast-mounted",()=>this.#r({remeasure:!0}))}connectedCallback(){if(!this.hasAttribute("tabindex"))this.tabIndex=-1;if(!this.hasAttribute("role"))this.setAttribute("role","region");if(!this.hasAttribute("aria-label"))this.setAttribute("aria-label",this.getAttribute("container-aria-label")??"Notifications");this.setAttribute("data-sonner-toaster",""),this.#i(),this.#m(),this.#x(),this.#g(),this.#Y(),this.#y(),this.#w.observe(this,{childList:!0});for(let a of Array.from(this.children))if(a instanceof l)this.#t.unshift(a),this.#c.observe(a),this.#l(a);document.addEventListener("keydown",this.#S),window.addEventListener("resize",this.#v),C(this),this.#r({remeasure:!0})}disconnectedCallback(){if(this.#w.disconnect(),this.#c.disconnect(),document.removeEventListener("keydown",this.#S),window.removeEventListener("resize",this.#v),this.#n&&this.#h)this.#n.removeEventListener("change",this.#h);L(this)}attributeChangedCallback(a,r,t){if(!this.isConnected)return;switch(a){case"position":this.#i(),this.#u(),this.#r();break;case"theme":this.#m();break;case"dir":this.#x();break;case"gap":this.#g(),this.#r();break;case"visible-toasts":this.#r();break;case"expand":this.#a=this.hasAttribute("expand");for(let o of this.#t)o.setPaused(this.#a||this.#s);this.#r();break;case"close-button":case"rich-colors":case"invert":this.#k(a);break;case"offset":case"mobile-offset":this.#y();break;case"container-aria-label":this.setAttribute("aria-label",this.getAttribute("container-aria-label")??"Notifications");break}}addToast(a){return this.appendChild(a),a}announceUrgent(a){this.#e.textContent="",requestAnimationFrame(()=>{this.#e.textContent=a})}dismissAll(){for(let a of Array.from(this.children))if(a instanceof l)a.dismiss()}#b(){return this.getAttribute("position")||"bottom-right"}#i(){let[a,r]=this.#b().split("-");if(a)this.setAttribute("data-y-position",a);if(r)this.setAttribute("data-x-position",r)}#m(){if(this.#n&&this.#h)this.#n.removeEventListener("change",this.#h),this.#n=null,this.#h=null;let a=this.getAttribute("theme")||"light";if(a==="system"){this.#n=window.matchMedia("(prefers-color-scheme: dark)");let r=(t)=>{this.setAttribute("data-sonner-theme",t.matches?"dark":"light")};this.#h=r,this.#n.addEventListener("change",r),r(this.#n)}else this.setAttribute("data-sonner-theme",a)}#x(){let a=this.getAttribute("dir");if(a==="auto"||!a){let r=window.getComputedStyle(document.documentElement).direction||"ltr";this.setAttribute("dir",r)}}#g(){let a=this.getAttribute("gap"),r=a?Number(a):b;this.style.setProperty("--gap",`${Number.isFinite(r)?r:b}px`)}#Y(){this.style.setProperty("--width",`${$}px`)}#y(){let a=this.getAttribute("offset"),r=this.getAttribute("mobile-offset");I(this,a??void 0,"--offset","24px"),I(this,r??void 0,"--mobile-offset","16px")}#u(){for(let a of this.#t)if(!a.hasAttribute("position")){let[r,t]=this.#b().split("-");if(r)a.setAttribute("data-y-position",r);if(t)a.setAttribute("data-x-position",t)}}#k(a){let r=this.hasAttribute(a);for(let t of this.#t){if(t.getAttribute(a)==="false")continue;if(r)t.setAttribute(a,"");else t.removeAttribute(a)}}#l(a){if(!a.hasAttribute("position")){let[r,t]=this.#b().split("-");if(r)a.setAttribute("data-y-position",r);if(t)a.setAttribute("data-x-position",t)}if(!a.hasAttribute("duration")){let r=this.getAttribute("duration");if(r)a.setAttribute("duration",r)}if(!a.hasAttribute("close-button")&&this.hasAttribute("close-button"))a.setAttribute("close-button","");if(!a.hasAttribute("rich-colors")&&this.hasAttribute("rich-colors"))a.setAttribute("rich-colors","");if(!a.hasAttribute("invert")&&this.hasAttribute("invert"))a.setAttribute("invert","")}#r(a={remeasure:!1}){let r=Number(this.getAttribute("visible-toasts")??Z);if(a.remeasure){this.#d=!0;for(let d of this.#t){if(d.getAttribute("data-removed")==="true")continue;let i=d.style.height;d.style.height="auto",this.#f.set(d,d.getBoundingClientRect().height),d.style.height=i}this.#d=!1}let t=this.#t.filter((d)=>d.getAttribute("data-removed")!=="true"),o=t.length>0?this.#f.get(t[0])??0:0,n=this.#z(),h=this.#a||this.#s,e=0;this.style.setProperty("--front-toast-height",`${o}px`);for(let d=0;d<t.length;d++){let i=t[d],s=this.#f.get(i)??0,x=d===0,c=d===0?0:e+d*n;if(e+=s,i.style.setProperty("--index",String(d)),i.style.setProperty("--toasts-before",String(d)),i.style.setProperty("--z-index",String(t.length-d)),i.style.setProperty("--offset",`${c}px`),i.style.setProperty("--initial-height",`${s}px`),i.setAttribute("data-index",String(d)),i.setAttribute("data-front",String(x)),i.setAttribute("data-visible",String(d+1<=r)),i.setAttribute("data-expanded",String(h)),h||x)i.removeAttribute("aria-hidden");else i.setAttribute("aria-hidden","true")}}#z(){let a=this.getAttribute("gap"),r=a?Number(a):b;return Number.isFinite(r)?r:b}#X=()=>{this.#s=!0;for(let a of this.#t)a.setPaused(!0);this.#r()};#_=()=>{this.#s=!1;for(let a of this.#t)a.setPaused(!1);this.#r()};#J=()=>{this.#s=!0;for(let a of this.#t)a.setPaused(!0);this.#r()};#K=(a)=>{let r=a.relatedTarget;if(r&&this.contains(r))return;this.#s=!1;for(let t of this.#t)t.setPaused(!1);this.#r()};#v=()=>this.#r({remeasure:!0});#S=(a)=>{let r=a.target;if(r){let n=r.tagName;if(n==="INPUT"||n==="TEXTAREA"||n==="SELECT"||r.isContentEditable)return}if(this.#Q().every((n)=>{if(n==="altKey"||n==="ctrlKey"||n==="shiftKey"||n==="metaKey")return a[n];return a.code===n})){this.#a=!0;for(let n of this.#t)n.setPaused(!0);this.focus(),this.#r();return}if(a.key==="Escape"&&this.#a&&this.contains(document.activeElement)){this.#a=!1;for(let n of this.#t)n.setPaused(!1);this.#r()}};#Q(){let a=this.getAttribute("hotkey");if(!a)return E;return a.split("+").map((r)=>r.trim())}}if(typeof customElements!=="undefined"&&!customElements.get("sonner-toaster"))customElements.define("sonner-toaster",m);function D(a){if(a){let t=document.getElementById(a);if(t instanceof m)return t}let r=M();if(!r)r=document.createElement("sonner-toaster"),document.body.appendChild(r);return r}function _(a){let r=a.id??k(),t=v(r);if(t)return t.update(a),t;let o=document.createElement("sonner-toast");return o.toastId=r,o.update(a),o.setHandlers({onDismiss:a.onDismiss,onAutoClose:a.onAutoClose}),D(a.toasterId).addToast(o),o}function z(a){return(r,t)=>_({...t,type:a,title:r})}function T(a,r){return _({...r,type:"default",title:a})}function fa(a){if(a!==void 0){v(a)?.dismiss();return}R()}function sa(a,r){let t=r?.id??k(),o=document.createElement("sonner-toast");if(o.toastId=t,o.setAttribute("data-styled","false"),r?.duration!==void 0)o.setAttribute("duration",String(r.duration));if(r?.dismissible===!1)o.setAttribute("dismissible","false");if(r?.position)o.setAttribute("position",r.position);if(r?.testId!==void 0)o.setAttribute("data-testid",r.testId);let n=a(t);return o.appendChild(n),o.setHandlers({onDismiss:r?.onDismiss,onAutoClose:r?.onAutoClose}),D(r?.toasterId).addToast(o),o}async function X(a,r){if(a===void 0)return;if(typeof a==="function")return a.length===0?a():a(r);return a}function ca(a,r){let t=r.id??k(),{loading:o,success:n,error:h,description:e,finally:d,...i}=r,s=_({...i,id:t,type:"loading",title:r.loading,duration:1/0,dismissible:r.dismissible??!1}),x=Promise.resolve(typeof a==="function"?a():a),c=null,aa=x.then(async(f)=>{c=["resolve",f];let g=await X(r.success,f),J=await X(r.description,f);if(g!==void 0)s.update({...i,id:t,type:"success",title:g,description:J,duration:r.duration,dismissible:r.dismissible??!0});else s.dismiss()}).catch(async(f)=>{c=["reject",f];let g=await X(r.error,f),J=await X(r.description,f);if(g!==void 0)s.update({...i,id:t,type:"error",title:g,description:J,duration:r.duration,dismissible:r.dismissible??!0});else s.dismiss()}).finally(()=>r.finally?.());return Object.assign(s,{unwrap:()=>new Promise((f,g)=>{aa.then(()=>{if(!c)return g(new Error("promise toast settled without a result"));if(c[0]==="resolve")f(c[1]);else g(c[1])})})})}var Q=Object.assign(T,{success:z("success"),error:z("error"),info:z("info"),warning:z("warning"),loading:(a,r)=>_({...r,type:"loading",title:a,duration:r?.duration??1/0}),message:T,promise:ca,custom:sa,dismiss:fa,getToast:v});if(typeof window!=="undefined")window.toast=Q;export{Q as toast,m as SonnerToaster,l as SonnerToast};
|
|
745
|
+
`;class b extends da{static get observedAttributes(){return["type","duration","dismissible","position","close-button","rich-colors","invert"]}toastId=0;#o;#f;#k;#s;#t;#e=null;#d=y;#a=null;#c=0;#n=new Set;#h=null;#x=0;#i=null;#y=null;#w=!1;#b=!1;#J=!1;#u;#v;#S=null;#l=null;constructor(){super();this.#o=this.attachShadow({mode:"open"}),this.#o.adoptedStyleSheets=[N()];let a=document.createElement("template");a.innerHTML=ia,this.#o.appendChild(a.content.cloneNode(!0)),this.#f=this.#o.querySelector("[data-close-button]"),this.#k=this.#o.querySelector("[data-icon]"),this.#s=this.#o.querySelector("[data-title]"),this.#t=this.#o.querySelector("[data-description]"),this.#f.innerHTML=j,this.#f.addEventListener("click",()=>this.dismiss());let r=this.#o.querySelector('slot[name="icon"]'),t=this.#o.querySelector('slot[name="description"]');r.addEventListener("slotchange",()=>this.#Z("icon",r)),t.addEventListener("slotchange",()=>this.#Z("description",t)),this.addEventListener("pointerdown",this.#C),this.addEventListener("pointermove",this.#L),this.addEventListener("pointerup",this.#p),this.addEventListener("pointercancel",this.#p),this.addEventListener("mouseenter",()=>this.#W("hover-self")),this.addEventListener("mouseleave",()=>this.#E("hover-self")),this.addEventListener("focusin",(o)=>{if(this.#W("focus-self"),this.#l)return;let n=o.relatedTarget;if(n&&!this.contains(n))this.#l=n}),this.addEventListener("focusout",()=>this.#E("focus-self")),this.addEventListener("keydown",(o)=>{if(o.key==="Escape"&&this.#G())o.stopPropagation(),this.dismiss()})}connectedCallback(){if(!this.toastId)this.toastId=this.getAttribute("id")||0;if(!this.hasAttribute("tabindex"))this.tabIndex=0;if(this.#$(),this.#K(),this.#V(),this.#z(),this.#X(),this.#Y(),this.setAttribute("data-sonner-toast",""),!this.hasAttribute("aria-atomic"))this.setAttribute("aria-atomic","true");if(this.setAttribute("data-mounted","false"),this.setAttribute("data-removed","false"),this.setAttribute("data-swiping","false"),this.setAttribute("data-swiped","false"),this.setAttribute("data-swipe-out","false"),!this.hasAttribute("data-styled"))this.setAttribute("data-styled","true");U(this),document.addEventListener("visibilitychange",this.#j),requestAnimationFrame(()=>{this.#w=!0,this.setAttribute("data-mounted","true"),this.dispatchEvent(new CustomEvent("sonner-toast-mounted",{bubbles:!0,composed:!0})),this.#g()})}disconnectedCallback(){if(this.#a)clearTimeout(this.#a);document.removeEventListener("visibilitychange",this.#j),C(this)}attributeChangedCallback(a,r,t){if(!this.isConnected)return;switch(a){case"type":this.#$();break;case"duration":this.#e=this.#_(),this.#d=this.#e??y;break;case"dismissible":this.#K();break;case"position":this.#V();break;case"close-button":this.#Y();break;case"rich-colors":this.#z();break;case"invert":this.#X();break}}get toastType(){return this.getAttribute("type")||"default"}dismiss(){if(this.#b||this.#J)return;if(this.#J=!0,this.#b=!0,this.setAttribute("data-removed","true"),this.#a)clearTimeout(this.#a);this.dispatchEvent(new CustomEvent("sonner-toast-dismissed",{bubbles:!0,composed:!0})),setTimeout(()=>{this.#r(),this.#u?.(this),this.remove()},E)}#r(){if(!this.#l)return;let a=document.activeElement;if(!a||!this.contains(a))return;let r=this.#l;if(!r.isConnected||typeof r.focus!=="function")return;r.focus()}update(a){let r=a.type!==void 0&&a.type!==this.toastType,t=Q(this.toastType);if(a.type!==void 0)this.setAttribute("type",a.type);let o=!1;if(a.duration!==void 0)this.setAttribute("duration",String(a.duration)),this.#e=a.duration,this.#d=a.duration,o=!0;else if(r)this.#e=null,this.removeAttribute("duration"),this.#d=0,o=!0;if(a.dismissible!==void 0)if(a.dismissible)this.setAttribute("dismissible","");else this.removeAttribute("dismissible");if(a.position!==void 0)this.setAttribute("position",a.position);if(a.closeButton!==void 0)if(a.closeButton)this.setAttribute("close-button","");else this.removeAttribute("close-button");if(a.richColors!==void 0)if(a.richColors)this.setAttribute("rich-colors","");else this.removeAttribute("rich-colors");if(a.invert!==void 0)if(a.invert)this.setAttribute("invert","");else this.removeAttribute("invert");if(a.icon!==void 0)this.setIcon(a.icon);if(a.title!==void 0)this.setTitle(a.title);if(a.description!==void 0)this.setDescription(a.description);if(a.action!==void 0)F(this,"action",a.action,()=>this.dismiss());if(a.cancel!==void 0)F(this,"cancel",a.cancel,()=>this.dismiss());if(a.className)this.className=a.className;if(a.testId!==void 0)this.setAttribute("data-testid",a.testId);if(a.closeButtonAriaLabel!==void 0)this.#S=a.closeButtonAriaLabel||null,this.#Q();if(a.onDismiss)this.#u=a.onDismiss;if(a.onAutoClose)this.#v=a.onAutoClose;if(o)this.#U();if(this.#w&&r&&!t&&Q(this.toastType)){let d=Array.from(this.children).find((f)=>f.getAttribute("slot")==="title")?.textContent?.trim();if(d)this.closest("sonner-toaster")?.announceUrgent(d)}this.dispatchEvent(new CustomEvent("sonner-toast-updated",{bubbles:!0,composed:!0}))}setTitle(a){O(this,"title",a),this.#Q()}#Q(){if(this.#S){this.#f.setAttribute("aria-label",this.#S);return}let r=Array.from(this.children).find((t)=>t.getAttribute("slot")==="title")?.textContent?.trim();this.#f.setAttribute("aria-label",r?`Close: ${r}`:"Close toast")}setDescription(a){O(this,"description",a)}setIcon(a){for(let r of Array.from(this.children))if(r.getAttribute("slot")==="icon")this.removeChild(r);if(a==null)return;if(a instanceof Node){if(a instanceof Element)a.setAttribute("slot","icon");this.appendChild(a)}else{let r=document.createElement("template");r.innerHTML=a;let t=r.content.firstElementChild;if(t)t.setAttribute("slot","icon"),this.appendChild(t)}}setHandlers(a){this.#u=a.onDismiss,this.#v=a.onAutoClose}setPaused(a){if(a)this.#W("toaster");else this.#E("toaster")}#Z(a,r){if(r.assignedNodes().length>0)this.setAttribute(`data-has-${a}`,"");else this.removeAttribute(`data-has-${a}`)}#$(){let a=this.toastType;this.setAttribute("data-type",a);let r=Q(a);if(this.setAttribute("role",r?"alert":"status"),this.setAttribute("aria-live",r?"assertive":"polite"),a==="loading"){this.setAttribute("data-promise","true");for(let t of Array.from(this.children))if(t.getAttribute("slot")==="icon"&&t.hasAttribute("data-sonner-default-icon"))this.removeChild(t)}else if(this.removeAttribute("data-promise"),!Array.from(this.children).some((o)=>{if(o.getAttribute("slot")!=="icon")return!1;return!o.hasAttribute("data-sonner-default-icon")})){for(let n of Array.from(this.children))if(n.getAttribute("slot")==="icon"&&n.hasAttribute("data-sonner-default-icon"))this.removeChild(n);let o=p(a);if(o){let n=document.createElement("template");n.innerHTML=o;let d=n.content.firstElementChild;if(d)d.setAttribute("slot","icon"),d.setAttribute("data-sonner-default-icon",""),this.appendChild(d)}}}#K(){let a=this.getAttribute("dismissible")!=="false";this.setAttribute("data-dismissible",String(a))}#V(){let a=this.getAttribute("position");if(!a)return;let[r,t]=a.split("-");if(r)this.setAttribute("data-y-position",r);if(t)this.setAttribute("data-x-position",t)}#Y(){let a=this.hasAttribute("close-button")&&this.getAttribute("close-button")!=="false";this.#f.hidden=!a}#z(){let a=this.hasAttribute("rich-colors")&&this.getAttribute("rich-colors")!=="false";this.setAttribute("data-rich-colors",String(a))}#X(){let a=this.hasAttribute("invert")&&this.getAttribute("invert")!=="false";this.setAttribute("data-invert",String(a))}#_(){let a=this.getAttribute("duration");if(a==null)return null;if(a==="Infinity")return 1/0;let r=Number(a);return Number.isFinite(r)||r===1/0?r:null}#m(){let a=this.#e??this.#_();if(a!==null)return a;if(this.toastType==="loading")return 1/0;return y}#g(){if(!this.#w||this.#b)return;if(this.#n.size>0)return;if(this.#a!==null)return;let a=this.#m();if(a===1/0)return;this.#d=this.#d>0?this.#d:a,this.#c=Date.now(),this.#a=setTimeout(()=>{this.#a=null,this.#v?.(this),this.dispatchEvent(new CustomEvent("sonner-toast-autoclosed",{bubbles:!0,composed:!0})),this.dismiss()},this.#d)}#W(a){let r=this.#n.size===0;if(this.#n.add(a),r&&this.#a!==null){clearTimeout(this.#a),this.#a=null;let t=Date.now()-this.#c;this.#d=Math.max(0,this.#d-t)}}#E(a){if(!this.#n.delete(a))return;if(this.#n.size===0&&!this.#b)this.#g()}#U(){if(this.#a)clearTimeout(this.#a),this.#a=null;this.#d=this.#m(),this.#g()}#j=()=>{if(document.visibilityState==="hidden")this.#W("doc-hidden");else this.#E("doc-hidden")};#G(){return this.getAttribute("dismissible")!=="false"}#C=(a)=>{if(a.button===2)return;if(this.toastType==="loading"||!this.#G())return;let r=a.composedPath()[0];if(r){if(r.tagName==="BUTTON"||typeof r.closest==="function"&&r.closest("button"))return}this.#x=Date.now();try{this.setPointerCapture(a.pointerId)}catch{}if(this.setAttribute("data-swiping","true"),this.#h={x:a.clientX,y:a.clientY},!this.#y){let t=this.getAttribute("data-y-position"),o=this.getAttribute("data-x-position"),n=[];if(t==="top"||t==="bottom")n.push(t);if(o==="left"||o==="right")n.push(o);this.#y=n.length>0?n:["bottom","right"]}};#L=(a)=>{if(!this.#h||!this.#G())return;if((window.getSelection()?.toString().length??0)>0)return;let r=a.clientY-this.#h.y,t=a.clientX-this.#h.x,o=this.#y;if(!this.#i&&(Math.abs(t)>1||Math.abs(r)>1))this.#i=Math.abs(t)>Math.abs(r)?"x":"y";let n=(h)=>1/(1.5+Math.abs(h)/20),d=0,f=0;if(this.#i==="y"){if(o.includes("top")||o.includes("bottom"))if(o.includes("top")&&r<0||o.includes("bottom")&&r>0)f=r;else{let h=r*n(r);f=Math.abs(h)<Math.abs(r)?h:r}}else if(this.#i==="x"){if(o.includes("left")||o.includes("right"))if(o.includes("left")&&t<0||o.includes("right")&&t>0)d=t;else{let h=t*n(t);d=Math.abs(h)<Math.abs(t)?h:t}}if(Math.abs(d)>0||Math.abs(f)>0)this.setAttribute("data-swiped","true");this.style.setProperty("--swipe-amount-x",`${d}px`),this.style.setProperty("--swipe-amount-y",`${f}px`)};#p=()=>{if(this.getAttribute("data-swipe-out")==="true"||!this.#G()){this.#h=null,this.#i=null,this.setAttribute("data-swiping","false");return}let a=parseFloat(this.style.getPropertyValue("--swipe-amount-x"))||0,r=parseFloat(this.style.getPropertyValue("--swipe-amount-y"))||0,t=Math.max(1,Date.now()-this.#x),o=this.#i==="x"?a:r,n=Math.abs(o)/t;if(Math.abs(o)>=V||n>W){if(this.#i==="x")this.setAttribute("data-swipe-direction",a>0?"right":"left");else this.setAttribute("data-swipe-direction",r>0?"down":"up");this.setAttribute("data-swipe-out","true"),this.dismiss()}else this.style.setProperty("--swipe-amount-x","0px"),this.style.setProperty("--swipe-amount-y","0px"),this.setAttribute("data-swiped","false");this.setAttribute("data-swiping","false"),this.#h=null,this.#i=null}}if(typeof customElements!=="undefined"&&!customElements.get("sonner-toast"))customElements.define("sonner-toast",b);var fa=typeof HTMLElement!=="undefined"?HTMLElement:class{};function A(a,r){if(a==null)return r;if(typeof a==="number")return`${a}px`;return a}function I(a,r,t,o){let n=["top","right","bottom","left"];if(r==null||typeof r==="string"||typeof r==="number"){let d=A(r,o);for(let f of n)a.style.setProperty(`${t}-${f}`,d)}else for(let d of n)a.style.setProperty(`${t}-${d}`,A(r[d],o))}class m extends fa{static get observedAttributes(){return["position","theme","rich-colors","expand","duration","gap","visible-toasts","close-button","invert","dir","offset","mobile-offset","hotkey","container-aria-label"]}#o;#f;#k;#s;#t=[];#e=new Map;#d=!1;#a=!1;#c=!1;#n=null;#h=null;constructor(){super();this.#o=this.attachShadow({mode:"open"}),this.#o.adoptedStyleSheets=[M()],this.#o.innerHTML='<div data-frame part="frame"><slot></slot></div><div data-alert-announcer role="alert" aria-live="assertive" aria-atomic="true" style="position:absolute;left:0;top:0;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;pointer-events:none"></div>',this.#f=this.#o.querySelector("[data-alert-announcer]"),this.#k=new MutationObserver((a)=>{let r=!1;for(let t of a){for(let o of Array.from(t.addedNodes))if(o instanceof b)this.#t.unshift(o),this.#s.observe(o),this.#l(o),r=!0;for(let o of Array.from(t.removedNodes))if(o instanceof b)this.#t=this.#t.filter((n)=>n!==o),this.#e.delete(o),this.#s.unobserve(o),r=!0}if(r)this.#r({remeasure:!0})}),this.#s=new ResizeObserver(()=>this.#r({remeasure:!1})),this.addEventListener("mouseenter",this.#Z),this.addEventListener("mouseleave",this.#$),this.addEventListener("focusin",this.#K),this.addEventListener("focusout",this.#V),this.addEventListener("sonner-toast-dismissed",()=>this.#r({remeasure:!1})),this.addEventListener("sonner-toast-updated",()=>this.#r({remeasure:!0})),this.addEventListener("sonner-toast-mounted",()=>this.#r({remeasure:!0}))}connectedCallback(){if(!this.hasAttribute("tabindex"))this.tabIndex=-1;if(!this.hasAttribute("role"))this.setAttribute("role","region");if(!this.hasAttribute("aria-label"))this.setAttribute("aria-label",this.getAttribute("container-aria-label")??"Notifications");this.#_(),this.setAttribute("data-sonner-toaster",""),this.#i(),this.#y(),this.#w(),this.#b(),this.#J(),this.#u(),this.#k.observe(this,{childList:!0});for(let a of Array.from(this.children))if(a instanceof b)this.#t.unshift(a),this.#s.observe(a),this.#l(a);document.addEventListener("keydown",this.#z),window.addEventListener("resize",this.#Y),L(this),this.#r({remeasure:!0})}disconnectedCallback(){if(this.#k.disconnect(),this.#s.disconnect(),document.removeEventListener("keydown",this.#z),window.removeEventListener("resize",this.#Y),this.#n&&this.#h)this.#n.removeEventListener("change",this.#h);H(this)}attributeChangedCallback(a,r,t){if(!this.isConnected)return;switch(a){case"position":this.#i(),this.#v(),this.#r();break;case"theme":this.#y();break;case"dir":this.#w();break;case"gap":this.#b(),this.#r();break;case"visible-toasts":this.#r();break;case"expand":this.#a=this.hasAttribute("expand");for(let o of this.#t)o.setPaused(this.#a||this.#c);this.#r();break;case"close-button":case"rich-colors":case"invert":this.#S(a);break;case"offset":case"mobile-offset":this.#u();break;case"container-aria-label":this.setAttribute("aria-label",this.getAttribute("container-aria-label")??"Notifications");break;case"hotkey":this.#_();break}}addToast(a){return this.appendChild(a),a}announceUrgent(a){this.#f.textContent="",requestAnimationFrame(()=>{this.#f.textContent=a})}dismissAll(){for(let a of Array.from(this.children))if(a instanceof b)a.dismiss()}#x(){return this.getAttribute("position")||"bottom-right"}#i(){let[a,r]=this.#x().split("-");if(a)this.setAttribute("data-y-position",a);if(r)this.setAttribute("data-x-position",r)}#y(){if(this.#n&&this.#h)this.#n.removeEventListener("change",this.#h),this.#n=null,this.#h=null;let a=this.getAttribute("theme")||"light";if(a==="system"){this.#n=window.matchMedia("(prefers-color-scheme: dark)");let r=(t)=>{this.setAttribute("data-sonner-theme",t.matches?"dark":"light")};this.#h=r,this.#n.addEventListener("change",r),r(this.#n)}else this.setAttribute("data-sonner-theme",a)}#w(){let a=this.getAttribute("dir");if(a==="auto"||!a){let r=window.getComputedStyle(document.documentElement).direction||"ltr";this.setAttribute("dir",r)}}#b(){let a=this.getAttribute("gap"),r=a?Number(a):l;this.style.setProperty("--gap",`${Number.isFinite(r)?r:l}px`)}#J(){this.style.setProperty("--width",`${K}px`)}#u(){let a=this.getAttribute("offset"),r=this.getAttribute("mobile-offset");I(this,a??void 0,"--offset","24px"),I(this,r??void 0,"--mobile-offset","16px")}#v(){for(let a of this.#t)if(!a.hasAttribute("position")){let[r,t]=this.#x().split("-");if(r)a.setAttribute("data-y-position",r);if(t)a.setAttribute("data-x-position",t)}}#S(a){let r=this.hasAttribute(a);for(let t of this.#t){if(t.getAttribute(a)==="false")continue;if(r)t.setAttribute(a,"");else t.removeAttribute(a)}}#l(a){if(!a.hasAttribute("position")){let[r,t]=this.#x().split("-");if(r)a.setAttribute("data-y-position",r);if(t)a.setAttribute("data-x-position",t)}if(!a.hasAttribute("duration")){let r=this.getAttribute("duration");if(r)a.setAttribute("duration",r)}if(!a.hasAttribute("close-button")&&this.hasAttribute("close-button"))a.setAttribute("close-button","");if(!a.hasAttribute("rich-colors")&&this.hasAttribute("rich-colors"))a.setAttribute("rich-colors","");if(!a.hasAttribute("invert")&&this.hasAttribute("invert"))a.setAttribute("invert","")}#r(a={remeasure:!1}){let r=Number(this.getAttribute("visible-toasts")??$);if(a.remeasure){this.#d=!0;for(let h of this.#t){if(h.getAttribute("data-removed")==="true")continue;let i=h.style.height;h.style.height="auto",this.#e.set(h,h.getBoundingClientRect().height),h.style.height=i}this.#d=!1}let t=this.#t.filter((h)=>h.getAttribute("data-removed")!=="true"),o=t.length>0?this.#e.get(t[0])??0:0,n=this.#Q(),d=this.#a||this.#c,f=0;this.style.setProperty("--front-toast-height",`${o}px`);for(let h=0;h<t.length;h++){let i=t[h],c=this.#e.get(i)??0,x=h===0,g=h===0?0:f+h*n;if(f+=c,i.style.setProperty("--index",String(h)),i.style.setProperty("--toasts-before",String(h)),i.style.setProperty("--z-index",String(t.length-h)),i.style.setProperty("--offset",`${g}px`),i.style.setProperty("--initial-height",`${c}px`),i.setAttribute("data-index",String(h)),i.setAttribute("data-front",String(x)),i.setAttribute("data-visible",String(h+1<=r)),i.setAttribute("data-expanded",String(d)),d||x)i.removeAttribute("aria-hidden");else i.setAttribute("aria-hidden","true")}}#Q(){let a=this.getAttribute("gap"),r=a?Number(a):l;return Number.isFinite(r)?r:l}#Z=()=>{this.#c=!0;for(let a of this.#t)a.setPaused(!0);this.#r()};#$=()=>{this.#c=!1;for(let a of this.#t)a.setPaused(!1);this.#r()};#K=()=>{this.#c=!0;for(let a of this.#t)a.setPaused(!0);this.#r()};#V=(a)=>{let r=a.relatedTarget;if(r&&this.contains(r))return;this.#c=!1;for(let t of this.#t)t.setPaused(!1);this.#r()};#Y=()=>this.#r({remeasure:!0});#z=(a)=>{if(a.defaultPrevented)return;let r=a.target;if(r){let d=r.tagName;if(d==="INPUT"||d==="TEXTAREA"||d==="SELECT"||r.isContentEditable)return}let t=this.#X(),o=["altKey","ctrlKey","shiftKey","metaKey"];if(t.length>0&&t.every((d)=>{if(o.includes(d))return a[d];return a.code===d})&&o.every((d)=>t.includes(d)||!a[d])){this.#a=!0;for(let d of this.#t)d.setPaused(!0);this.focus(),this.#r();return}if(a.key==="Escape"&&this.#a&&this.contains(document.activeElement)){this.#a=!1;for(let d of this.#t)d.setPaused(!1);this.#r()}};#X(){let a=this.getAttribute("hotkey");if(a===null)return G;let r=a.trim();if(r===""||r.toLowerCase()==="none")return[];return r.split("+").map((t)=>t.trim())}#_(){let a=ea(this.#X());if(!a){if(this.#m)this.removeAttribute("aria-keyshortcuts"),this.#m=!1;if(this.#g)this.removeAttribute("title"),this.#g=!1;return}if(!this.hasAttribute("aria-keyshortcuts")||this.#m)this.setAttribute("aria-keyshortcuts",a),this.#m=!0;if(!this.hasAttribute("title")||this.#g)this.setAttribute("title",`Press ${a} to expand notifications`),this.#g=!0}#m=!1;#g=!1}function ea(a){if(a.length===0)return"";return a.map((r)=>{if(r==="altKey")return"Alt";if(r==="ctrlKey")return"Control";if(r==="shiftKey")return"Shift";if(r==="metaKey")return"Meta";if(/^Key[A-Z]$/.test(r))return r.slice(3);if(/^Digit[0-9]$/.test(r))return r.slice(5);return r}).join("+")}if(typeof customElements!=="undefined"&&!customElements.get("sonner-toaster"))customElements.define("sonner-toaster",m);function D(a){if(a){let t=document.getElementById(a);if(t instanceof m)return t}let r=R();if(!r)r=document.createElement("sonner-toaster"),document.body.appendChild(r);return r}function _(a){let r=a.id??k(),t=v(r);if(t)return t.update(a),t;let o=document.createElement("sonner-toast");return o.toastId=r,o.update(a),o.setHandlers({onDismiss:a.onDismiss,onAutoClose:a.onAutoClose}),D(a.toasterId).addToast(o),o}function z(a){return(r,t)=>_({...t,type:a,title:r})}function T(a,r){return _({...r,type:"default",title:a})}function ca(a){if(a!==void 0){v(a)?.dismiss();return}P()}function ga(a,r){let t=r?.id??k(),o=document.createElement("sonner-toast");if(o.toastId=t,o.setAttribute("data-styled","false"),r?.duration!==void 0)o.setAttribute("duration",String(r.duration));if(r?.dismissible===!1)o.setAttribute("dismissible","false");if(r?.position)o.setAttribute("position",r.position);if(r?.testId!==void 0)o.setAttribute("data-testid",r.testId);let n=a(t);return o.appendChild(n),o.setHandlers({onDismiss:r?.onDismiss,onAutoClose:r?.onAutoClose}),D(r?.toasterId).addToast(o),o}async function X(a,r){if(a===void 0)return;if(typeof a==="function")return a.length===0?a():a(r);return a}function sa(a,r){let t=r.id??k(),{loading:o,success:n,error:d,description:f,finally:h,...i}=r,c=_({...i,id:t,type:"loading",title:r.loading,duration:1/0,dismissible:r.dismissible??!1}),x=Promise.resolve(typeof a==="function"?a():a),g=null,aa=x.then(async(e)=>{g=["resolve",e];let s=await X(r.success,e),J=await X(r.description,e);if(s!==void 0)c.update({...i,id:t,type:"success",title:s,description:J,duration:r.duration,dismissible:r.dismissible??!0});else c.dismiss()}).catch(async(e)=>{g=["reject",e];let s=await X(r.error,e),J=await X(r.description,e);if(s!==void 0)c.update({...i,id:t,type:"error",title:s,description:J,duration:r.duration,dismissible:r.dismissible??!0});else c.dismiss()}).finally(()=>r.finally?.());return Object.assign(c,{unwrap:()=>new Promise((e,s)=>{aa.then(()=>{if(!g)return s(new Error("promise toast settled without a result"));if(g[0]==="resolve")e(g[1]);else s(g[1])})})})}var Z=Object.assign(T,{success:z("success"),error:z("error"),info:z("info"),warning:z("warning"),loading:(a,r)=>_({...r,type:"loading",title:a,duration:r?.duration??1/0}),message:T,promise:sa,custom:ga,dismiss:ca,getToast:v});if(typeof window!=="undefined")window.toast=Z;export{Z as toast,m as SonnerToaster,b as SonnerToast};
|
|
740
746
|
|
|
741
|
-
//# debugId=
|
|
747
|
+
//# debugId=82842EECA6759D7464756E2164756E21
|
|
742
748
|
//# sourceMappingURL=sonner-wc.bundle.js.map
|
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
"import type { SonnerToastElement, SonnerToasterElement } from './types.js';\n\n/** Tracks toasts and toasters by id so the toast() helper can find and update them\n * across multiple toasters and from anywhere in the module. */\n\nconst toastsById = new Map<string | number, SonnerToastElement>();\nconst toasters = new Set<SonnerToasterElement>();\n\nlet counter = 1;\n\nexport function nextToastId(): number {\n return counter++;\n}\n\nexport function registerToast(el: SonnerToastElement): void {\n toastsById.set(el.toastId, el);\n}\n\nexport function unregisterToast(el: SonnerToastElement): void {\n const current = toastsById.get(el.toastId);\n if (current === el) toastsById.delete(el.toastId);\n}\n\nexport function getToast(id: string | number): SonnerToastElement | undefined {\n return toastsById.get(id);\n}\n\nexport function registerToaster(el: SonnerToasterElement): void {\n toasters.add(el);\n}\n\nexport function unregisterToaster(el: SonnerToasterElement): void {\n toasters.delete(el);\n}\n\n/** Find a toaster element to host a new toast. Prefer the most-recently-connected one. */\nexport function defaultToaster(): SonnerToasterElement | undefined {\n let last: SonnerToasterElement | undefined;\n for (const t of toasters) last = t;\n return last;\n}\n\nexport function allToasters(): readonly SonnerToasterElement[] {\n return Array.from(toasters);\n}\n\nexport function dismissAllToasts(): void {\n for (const t of toasters) t.dismissAll();\n}\n",
|
|
8
8
|
"/**\n * Stylesheets shared across both custom elements via adoptedStyleSheets.\n *\n * CSS lives in plain `.css` files under `./styles/` so editors give full\n * language support (highlighting, autocomplete, Prettier). Bun's bundler\n * inlines the file contents as strings via the `with { type: 'text' }`\n * import attribute; we then wrap each in a CSSStyleSheet at runtime.\n *\n * Two scopes:\n * - toaster.css: positioning, theme palettes, dir-based vars (cascades into\n * child shadow trees via inherited custom properties).\n * - toast.css: per-toast layout, animations, swipe, rich colors (reads\n * the inherited theme vars set by the toaster).\n */\n\nimport toasterCss from './styles/toaster.css' with { type: 'text' };\nimport toastCss from './styles/toast.css' with { type: 'text' };\n\nlet toasterSheet: CSSStyleSheet | null = null;\nlet toastSheet: CSSStyleSheet | null = null;\n\nexport function getToasterSheet(): CSSStyleSheet {\n if (!toasterSheet) {\n toasterSheet = new CSSStyleSheet();\n toasterSheet.replaceSync(toasterCss);\n }\n return toasterSheet;\n}\n\nexport function getToastSheet(): CSSStyleSheet {\n if (!toastSheet) {\n toastSheet = new CSSStyleSheet();\n toastSheet.replaceSync(toastCss);\n }\n return toastSheet;\n}\n",
|
|
9
9
|
"import {\n TOAST_LIFETIME,\n TIME_BEFORE_UNMOUNT,\n SWIPE_THRESHOLD,\n SWIPE_VELOCITY_THRESHOLD,\n} from './constants.js';\nimport { CLOSE_ICON, getTypeIcon } from './icons.js';\nimport { registerToast, unregisterToast } from './registry.js';\nimport { getToastSheet } from './styles.js';\nimport type {\n SonnerToastElement,\n SonnerToasterElement,\n SwipeDirection,\n ToastAction,\n ToastContent,\n ToastOptions,\n ToastType,\n} from './types.js';\n\n// SSR-safe: when imported in Node without a DOM, fall back to a no-op base class.\n// The element won't function server-side but the import won't crash.\nconst HTMLElementCtor: typeof HTMLElement =\n typeof HTMLElement !== 'undefined' ? HTMLElement : (class {} as unknown as typeof HTMLElement);\n\ntype PauseReason = 'hover-self' | 'focus-self' | 'doc-hidden' | 'toaster';\n\nfunction isUrgentType(type: ToastType): boolean {\n return type === 'error' || type === 'warning';\n}\n\nfunction setContent(host: HTMLElement, slotName: string, value: ToastContent | undefined): void {\n // Remove prior light DOM child(ren) with this slot name.\n for (const child of Array.from(host.children)) {\n if (child.getAttribute('slot') === slotName) host.removeChild(child);\n }\n if (value == null || value === '') return;\n const resolved = typeof value === 'function' ? value() : value;\n if (resolved instanceof Node) {\n if (resolved instanceof Element) resolved.setAttribute('slot', slotName);\n host.appendChild(resolved);\n } else {\n const span = document.createElement('span');\n span.setAttribute('slot', slotName);\n span.textContent = String(resolved);\n host.appendChild(span);\n }\n}\n\nfunction setButtonSlot(\n host: HTMLElement,\n slotName: 'action' | 'cancel',\n value: ToastAction | HTMLElement | undefined,\n defaultCloseHandler: () => void,\n): void {\n for (const child of Array.from(host.children)) {\n if (child.getAttribute('slot') === slotName) host.removeChild(child);\n }\n if (!value) return;\n if (value instanceof HTMLElement) {\n value.setAttribute('slot', slotName);\n host.appendChild(value);\n return;\n }\n const btn = document.createElement('button');\n btn.setAttribute('slot', slotName);\n btn.setAttribute('type', 'button');\n if (slotName === 'cancel') btn.setAttribute('data-cancel', '');\n else btn.setAttribute('data-action', '');\n btn.textContent = value.label;\n btn.addEventListener('click', (e) => {\n value.onClick?.(e as MouseEvent);\n if ((e as MouseEvent).defaultPrevented && slotName === 'action') return;\n defaultCloseHandler();\n });\n host.appendChild(btn);\n}\n\nconst SPINNER_BARS_HTML = Array.from(\n { length: 12 },\n () => '<div class=\"sonner-loading-bar\"></div>',\n).join('');\n\nconst SHADOW_TEMPLATE = `\n <div data-frame part=\"frame\">\n <button type=\"button\" data-close-button part=\"close-button\" hidden aria-label=\"Close toast\"></button>\n <div data-icon part=\"icon\">\n <slot name=\"icon\"></slot>\n <div class=\"sonner-loading-wrapper\" aria-hidden=\"true\">\n <div class=\"sonner-spinner\">${SPINNER_BARS_HTML}</div>\n </div>\n </div>\n <div data-content part=\"content\">\n <div data-title part=\"title\"><slot name=\"title\"></slot></div>\n <div data-description part=\"description\"><slot name=\"description\"></slot></div>\n </div>\n <slot name=\"cancel\"></slot>\n <slot name=\"action\"></slot>\n <slot part=\"custom\"></slot>\n </div>\n`;\n\nexport class SonnerToast extends HTMLElementCtor implements SonnerToastElement {\n static get observedAttributes() {\n return ['type', 'duration', 'dismissible', 'position', 'close-button', 'rich-colors', 'invert'];\n }\n\n toastId: string | number = 0;\n\n #shadow: ShadowRoot;\n #closeBtn!: HTMLButtonElement;\n #iconWrap!: HTMLDivElement;\n #titleWrap!: HTMLDivElement;\n #descWrap!: HTMLDivElement;\n\n #duration: number | null = null;\n #remainingTime = TOAST_LIFETIME;\n #timeoutId: ReturnType<typeof setTimeout> | null = null;\n #timerStartedAt = 0;\n #pauseReasons = new Set<PauseReason>();\n\n #pointerStart: { x: number; y: number } | null = null;\n #dragStartTime = 0;\n #swipeDirection: 'x' | 'y' | null = null;\n #swipeDirections: SwipeDirection[] | null = null;\n\n #mounted = false;\n #removed = false;\n #pendingRemoval = false;\n\n #onDismiss: ToastOptions['onDismiss'];\n #onAutoClose: ToastOptions['onAutoClose'];\n #closeButtonAriaLabel: string | null = null;\n /** Element that had focus immediately before focus first entered this toast.\n * Used to restore focus when the toast is dismissed while focused. */\n #prevFocus: Element | null = null;\n\n constructor() {\n super();\n this.#shadow = this.attachShadow({ mode: 'open' });\n this.#shadow.adoptedStyleSheets = [getToastSheet()];\n const tpl = document.createElement('template');\n tpl.innerHTML = SHADOW_TEMPLATE;\n this.#shadow.appendChild(tpl.content.cloneNode(true));\n this.#closeBtn = this.#shadow.querySelector('[data-close-button]') as HTMLButtonElement;\n this.#iconWrap = this.#shadow.querySelector('[data-icon]') as HTMLDivElement;\n this.#titleWrap = this.#shadow.querySelector('[data-title]') as HTMLDivElement;\n this.#descWrap = this.#shadow.querySelector('[data-description]') as HTMLDivElement;\n this.#closeBtn.innerHTML = CLOSE_ICON;\n this.#closeBtn.addEventListener('click', () => this.dismiss());\n\n // Reflect slot occupancy as host attributes so CSS can collapse empty wrappers.\n // (Browser support for `:host(:has(...))` is uneven; this is the reliable form.)\n const iconSlot = this.#shadow.querySelector('slot[name=\"icon\"]') as HTMLSlotElement;\n const descSlot = this.#shadow.querySelector('slot[name=\"description\"]') as HTMLSlotElement;\n iconSlot.addEventListener('slotchange', () => this.#reflectSlot('icon', iconSlot));\n descSlot.addEventListener('slotchange', () => this.#reflectSlot('description', descSlot));\n\n this.addEventListener('pointerdown', this.#onPointerDown);\n this.addEventListener('pointermove', this.#onPointerMove);\n this.addEventListener('pointerup', this.#onPointerUp);\n this.addEventListener('pointercancel', this.#onPointerUp);\n this.addEventListener('mouseenter', () => this.#pauseFor('hover-self'));\n this.addEventListener('mouseleave', () => this.#resumeFrom('hover-self'));\n this.addEventListener('focusin', (e: FocusEvent) => {\n this.#pauseFor('focus-self');\n // Capture the externally-focused element only once, on first entry.\n if (this.#prevFocus) return;\n const from = e.relatedTarget as Element | null;\n if (from && !this.contains(from)) this.#prevFocus = from;\n });\n this.addEventListener('focusout', () => this.#resumeFrom('focus-self'));\n this.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.#isDismissible()) {\n e.stopPropagation();\n this.dismiss();\n }\n });\n }\n\n connectedCallback() {\n if (!this.toastId) this.toastId = this.getAttribute('id') || 0;\n if (!this.hasAttribute('tabindex')) this.tabIndex = 0;\n this.#applyType(); // sets role/aria-live based on type (error/warning → alert/assertive)\n this.#applyDismissible();\n this.#applyPosition();\n this.#applyRichColors();\n this.#applyInvert();\n this.#applyCloseButton();\n this.setAttribute('data-sonner-toast', '');\n // aria-atomic ensures the whole toast re-announces when its contents\n // change (e.g. promise loading → success), instead of only the diff.\n if (!this.hasAttribute('aria-atomic')) this.setAttribute('aria-atomic', 'true');\n this.setAttribute('data-mounted', 'false');\n this.setAttribute('data-removed', 'false');\n this.setAttribute('data-swiping', 'false');\n this.setAttribute('data-swiped', 'false');\n this.setAttribute('data-swipe-out', 'false');\n if (!this.hasAttribute('data-styled')) this.setAttribute('data-styled', 'true');\n\n registerToast(this);\n\n document.addEventListener('visibilitychange', this.#onVisibilityChange);\n\n // Trigger mount on next frame so transitions kick in.\n requestAnimationFrame(() => {\n this.#mounted = true;\n this.setAttribute('data-mounted', 'true');\n this.dispatchEvent(\n new CustomEvent('sonner-toast-mounted', { bubbles: true, composed: true }),\n );\n this.#startTimer();\n });\n }\n\n disconnectedCallback() {\n if (this.#timeoutId) clearTimeout(this.#timeoutId);\n document.removeEventListener('visibilitychange', this.#onVisibilityChange);\n unregisterToast(this);\n }\n\n attributeChangedCallback(name: string, _old: string | null, _val: string | null) {\n if (!this.isConnected) return;\n switch (name) {\n case 'type':\n this.#applyType();\n break;\n case 'duration':\n this.#duration = this.#readDuration();\n this.#remainingTime = this.#duration ?? TOAST_LIFETIME;\n break;\n case 'dismissible':\n this.#applyDismissible();\n break;\n case 'position':\n this.#applyPosition();\n break;\n case 'close-button':\n this.#applyCloseButton();\n break;\n case 'rich-colors':\n this.#applyRichColors();\n break;\n case 'invert':\n this.#applyInvert();\n break;\n }\n }\n\n // ─── Public API ──────────────────────────────────────────────────────────\n\n get toastType(): ToastType {\n return (this.getAttribute('type') as ToastType) || 'default';\n }\n\n /** Imperative dismiss — triggers exit animation, then removes from DOM. */\n dismiss(): void {\n if (this.#removed || this.#pendingRemoval) return;\n this.#pendingRemoval = true;\n this.#removed = true;\n this.setAttribute('data-removed', 'true');\n if (this.#timeoutId) clearTimeout(this.#timeoutId);\n this.dispatchEvent(\n new CustomEvent('sonner-toast-dismissed', { bubbles: true, composed: true }),\n );\n setTimeout(() => {\n this.#restoreFocusIfInside();\n this.#onDismiss?.(this);\n this.remove();\n }, TIME_BEFORE_UNMOUNT);\n }\n\n /** If focus is still inside this toast at dismissal time, move it back to\n * whatever was focused before focus first entered. Otherwise leave focus\n * alone — the user has moved on. */\n #restoreFocusIfInside(): void {\n if (!this.#prevFocus) return;\n const active = document.activeElement;\n if (!active || !this.contains(active)) return;\n const target = this.#prevFocus as HTMLElement;\n if (!target.isConnected || typeof target.focus !== 'function') return;\n target.focus();\n }\n\n /** Apply new content/options. Used by toast.promise() for loading→success/error transitions. */\n update(options: ToastOptions & { title?: ToastContent; type?: ToastType }): void {\n const typeChanged = options.type !== undefined && options.type !== this.toastType;\n const wasUrgent = isUrgentType(this.toastType);\n if (options.type !== undefined) this.setAttribute('type', options.type);\n let timerNeedsReset = false;\n if (options.duration !== undefined) {\n this.setAttribute('duration', String(options.duration));\n this.#duration = options.duration;\n this.#remainingTime = options.duration;\n timerNeedsReset = true;\n } else if (typeChanged) {\n // Type changed without an explicit new duration — discard prior override\n // (e.g. the `Infinity` we set when the toast started life as 'loading')\n // so #effectiveDuration falls back through the attribute or default.\n this.#duration = null;\n this.removeAttribute('duration');\n this.#remainingTime = 0;\n timerNeedsReset = true;\n }\n if (options.dismissible !== undefined) {\n if (options.dismissible) this.setAttribute('dismissible', '');\n else this.removeAttribute('dismissible');\n }\n if (options.position !== undefined) this.setAttribute('position', options.position);\n if (options.closeButton !== undefined) {\n if (options.closeButton) this.setAttribute('close-button', '');\n else this.removeAttribute('close-button');\n }\n if (options.richColors !== undefined) {\n if (options.richColors) this.setAttribute('rich-colors', '');\n else this.removeAttribute('rich-colors');\n }\n if (options.invert !== undefined) {\n if (options.invert) this.setAttribute('invert', '');\n else this.removeAttribute('invert');\n }\n if (options.icon !== undefined) this.setIcon(options.icon);\n if (options.title !== undefined) this.setTitle(options.title);\n if (options.description !== undefined) this.setDescription(options.description);\n if (options.action !== undefined) {\n setButtonSlot(this, 'action', options.action, () => this.dismiss());\n }\n if (options.cancel !== undefined) {\n setButtonSlot(this, 'cancel', options.cancel, () => this.dismiss());\n }\n if (options.className) this.className = options.className;\n if (options.testId !== undefined) this.setAttribute('data-testid', options.testId);\n if (options.closeButtonAriaLabel !== undefined) {\n this.#closeButtonAriaLabel = options.closeButtonAriaLabel || null;\n this.#applyCloseButtonAriaLabel();\n }\n if (options.onDismiss) this.#onDismiss = options.onDismiss;\n if (options.onAutoClose) this.#onAutoClose = options.onAutoClose;\n if (timerNeedsReset) this.#resetTimer();\n // Route urgent post-mount transitions (e.g. promise loading → error)\n // through the toaster's dedicated alert region. Re-evaluation of the\n // toast's own aria-live attribute is unreliable across screen readers;\n // the alert region is fresh and consistent.\n if (this.#mounted && typeChanged && !wasUrgent && isUrgentType(this.toastType)) {\n const titleEl = Array.from(this.children).find((c) => c.getAttribute('slot') === 'title');\n const text = titleEl?.textContent?.trim();\n if (text) {\n const toaster = this.closest('sonner-toaster') as SonnerToasterElement | null;\n toaster?.announceUrgent(text);\n }\n }\n this.dispatchEvent(new CustomEvent('sonner-toast-updated', { bubbles: true, composed: true }));\n }\n\n setTitle(value: ToastContent): void {\n setContent(this, 'title', value);\n this.#applyCloseButtonAriaLabel();\n }\n\n /** Apply the close button's aria-label: explicit override wins, otherwise\n * `Close: <title>` for disambiguation, falling back to `Close toast`. */\n #applyCloseButtonAriaLabel(): void {\n if (this.#closeButtonAriaLabel) {\n this.#closeBtn.setAttribute('aria-label', this.#closeButtonAriaLabel);\n return;\n }\n const titleEl = Array.from(this.children).find((c) => c.getAttribute('slot') === 'title');\n const text = titleEl?.textContent?.trim();\n this.#closeBtn.setAttribute('aria-label', text ? `Close: ${text}` : 'Close toast');\n }\n\n setDescription(value: ToastContent | undefined): void {\n setContent(this, 'description', value);\n }\n\n setIcon(value: Node | string | null | undefined): void {\n for (const child of Array.from(this.children)) {\n if (child.getAttribute('slot') === 'icon') this.removeChild(child);\n }\n if (value == null) return;\n if (value instanceof Node) {\n if (value instanceof Element) value.setAttribute('slot', 'icon');\n this.appendChild(value);\n } else {\n // Parse the HTML string and slot its first element directly — wrapping in a\n // <span> adds inline-baseline vertical wobble that breaks the icon's vertical\n // centering against the title.\n const tpl = document.createElement('template');\n tpl.innerHTML = value;\n const el = tpl.content.firstElementChild;\n if (el) {\n el.setAttribute('slot', 'icon');\n this.appendChild(el);\n }\n }\n }\n\n setHandlers(handlers: {\n onDismiss?: ToastOptions['onDismiss'];\n onAutoClose?: ToastOptions['onAutoClose'];\n }): void {\n this.#onDismiss = handlers.onDismiss;\n this.#onAutoClose = handlers.onAutoClose;\n }\n\n /** Called by the toaster to pause/resume this toast's auto-dismiss timer. */\n setPaused(paused: boolean): void {\n if (paused) this.#pauseFor('toaster');\n else this.#resumeFrom('toaster');\n }\n\n // ─── Internal ────────────────────────────────────────────────────────────\n\n #reflectSlot(name: 'icon' | 'description', slot: HTMLSlotElement) {\n const has = slot.assignedNodes().length > 0;\n if (has) this.setAttribute(`data-has-${name}`, '');\n else this.removeAttribute(`data-has-${name}`);\n }\n\n #applyType() {\n const type = this.toastType;\n this.setAttribute('data-type', type);\n const urgent = isUrgentType(type);\n this.setAttribute('role', urgent ? 'alert' : 'status');\n this.setAttribute('aria-live', urgent ? 'assertive' : 'polite');\n if (type === 'loading') {\n this.setAttribute('data-promise', 'true');\n // The spinner lives in the shadow DOM (see SHADOW_TEMPLATE). CSS reveals it when\n // data-type='loading' and no user icon is slotted. Nothing to do here.\n // Clear any prior default icon left from a previous non-loading type.\n for (const c of Array.from(this.children)) {\n if (c.getAttribute('slot') === 'icon' && c.hasAttribute('data-sonner-default-icon'))\n this.removeChild(c);\n }\n } else {\n this.removeAttribute('data-promise');\n const hasUserIcon = Array.from(this.children).some((c) => {\n if (c.getAttribute('slot') !== 'icon') return false;\n // a previously-set default type icon is marked with data-sonner-default-icon\n return !c.hasAttribute('data-sonner-default-icon');\n });\n if (!hasUserIcon) {\n // Remove prior default icon\n for (const c of Array.from(this.children)) {\n if (c.getAttribute('slot') === 'icon' && c.hasAttribute('data-sonner-default-icon'))\n this.removeChild(c);\n }\n const builtin = getTypeIcon(type);\n if (builtin) {\n // Parse and slot the actual SVG/spinner element directly (no span wrapper).\n const tpl = document.createElement('template');\n tpl.innerHTML = builtin;\n const el = tpl.content.firstElementChild;\n if (el) {\n el.setAttribute('slot', 'icon');\n el.setAttribute('data-sonner-default-icon', '');\n this.appendChild(el);\n }\n }\n }\n }\n }\n\n #applyDismissible() {\n const dismissible = this.getAttribute('dismissible') !== 'false';\n this.setAttribute('data-dismissible', String(dismissible));\n }\n\n #applyPosition() {\n const pos = this.getAttribute('position');\n if (!pos) return;\n const [y, x] = pos.split('-');\n if (y) this.setAttribute('data-y-position', y);\n if (x) this.setAttribute('data-x-position', x);\n }\n\n #applyCloseButton() {\n const show = this.hasAttribute('close-button') && this.getAttribute('close-button') !== 'false';\n this.#closeBtn.hidden = !show;\n }\n\n #applyRichColors() {\n const rich = this.hasAttribute('rich-colors') && this.getAttribute('rich-colors') !== 'false';\n this.setAttribute('data-rich-colors', String(rich));\n }\n\n #applyInvert() {\n const invert = this.hasAttribute('invert') && this.getAttribute('invert') !== 'false';\n this.setAttribute('data-invert', String(invert));\n }\n\n #readDuration(): number | null {\n const raw = this.getAttribute('duration');\n if (raw == null) return null;\n if (raw === 'Infinity') return Infinity;\n const n = Number(raw);\n return Number.isFinite(n) || n === Infinity ? n : null;\n }\n\n #effectiveDuration(): number {\n const explicit = this.#duration ?? this.#readDuration();\n if (explicit !== null) return explicit;\n // No caller-provided duration: loading toasts wait forever (they're meant to be\n // resolved by toast.promise or an explicit dismiss); everything else uses the\n // default lifetime.\n if (this.toastType === 'loading') return Infinity;\n return TOAST_LIFETIME;\n }\n\n #startTimer() {\n if (!this.#mounted || this.#removed) return;\n if (this.#pauseReasons.size > 0) return;\n if (this.#timeoutId !== null) return;\n const dur = this.#effectiveDuration();\n if (dur === Infinity) return;\n this.#remainingTime = this.#remainingTime > 0 ? this.#remainingTime : dur;\n this.#timerStartedAt = Date.now();\n this.#timeoutId = setTimeout(() => {\n this.#timeoutId = null;\n this.#onAutoClose?.(this);\n this.dispatchEvent(\n new CustomEvent('sonner-toast-autoclosed', { bubbles: true, composed: true }),\n );\n this.dismiss();\n }, this.#remainingTime);\n }\n\n /** Add a pause reason. Pauses the timer if it wasn't already paused. */\n #pauseFor(reason: PauseReason) {\n const wasUnpaused = this.#pauseReasons.size === 0;\n this.#pauseReasons.add(reason);\n if (wasUnpaused && this.#timeoutId !== null) {\n clearTimeout(this.#timeoutId);\n this.#timeoutId = null;\n const elapsed = Date.now() - this.#timerStartedAt;\n this.#remainingTime = Math.max(0, this.#remainingTime - elapsed);\n }\n }\n\n /** Remove a pause reason. Resumes the timer when the last reason is cleared. */\n #resumeFrom(reason: PauseReason) {\n if (!this.#pauseReasons.delete(reason)) return;\n if (this.#pauseReasons.size === 0 && !this.#removed) this.#startTimer();\n }\n\n #resetTimer() {\n if (this.#timeoutId) {\n clearTimeout(this.#timeoutId);\n this.#timeoutId = null;\n }\n this.#remainingTime = this.#effectiveDuration();\n this.#startTimer();\n }\n\n #onVisibilityChange = () => {\n if (document.visibilityState === 'hidden') this.#pauseFor('doc-hidden');\n else this.#resumeFrom('doc-hidden');\n };\n\n // ─── Swipe ───────────────────────────────────────────────────────────────\n\n #isDismissible(): boolean {\n return this.getAttribute('dismissible') !== 'false';\n }\n\n #onPointerDown = (event: PointerEvent) => {\n if (event.button === 2) return;\n if (this.toastType === 'loading' || !this.#isDismissible()) return;\n // event.target is retargeted to the host as the event crosses the shadow boundary.\n // composedPath() preserves the actual element clicked inside shadow DOM, so we can\n // detect clicks on the close button or action/cancel buttons and skip swipe handling.\n const realTarget = event.composedPath()[0] as HTMLElement | undefined;\n if (realTarget) {\n const inButton =\n realTarget.tagName === 'BUTTON' ||\n (typeof realTarget.closest === 'function' && realTarget.closest('button'));\n if (inButton) return;\n }\n this.#dragStartTime = Date.now();\n try {\n this.setPointerCapture(event.pointerId);\n } catch {\n /* not capturable; ignore */\n }\n this.setAttribute('data-swiping', 'true');\n this.#pointerStart = { x: event.clientX, y: event.clientY };\n if (!this.#swipeDirections) {\n // Read effective position from data-y-position/data-x-position which the toaster\n // sets on every toast (whether or not the toast has its own `position` attribute).\n const y = this.getAttribute('data-y-position');\n const x = this.getAttribute('data-x-position');\n const dirs: SwipeDirection[] = [];\n if (y === 'top' || y === 'bottom') dirs.push(y);\n if (x === 'left' || x === 'right') dirs.push(x);\n this.#swipeDirections = dirs.length > 0 ? dirs : ['bottom', 'right'];\n }\n };\n\n #onPointerMove = (event: PointerEvent) => {\n if (!this.#pointerStart || !this.#isDismissible()) return;\n if ((window.getSelection()?.toString().length ?? 0) > 0) return;\n\n const yDelta = event.clientY - this.#pointerStart.y;\n const xDelta = event.clientX - this.#pointerStart.x;\n const dirs = this.#swipeDirections!;\n\n if (!this.#swipeDirection && (Math.abs(xDelta) > 1 || Math.abs(yDelta) > 1)) {\n this.#swipeDirection = Math.abs(xDelta) > Math.abs(yDelta) ? 'x' : 'y';\n }\n\n const dampen = (delta: number) => 1 / (1.5 + Math.abs(delta) / 20);\n\n let sx = 0;\n let sy = 0;\n if (this.#swipeDirection === 'y') {\n if (dirs.includes('top') || dirs.includes('bottom')) {\n if ((dirs.includes('top') && yDelta < 0) || (dirs.includes('bottom') && yDelta > 0)) {\n sy = yDelta;\n } else {\n const d = yDelta * dampen(yDelta);\n sy = Math.abs(d) < Math.abs(yDelta) ? d : yDelta;\n }\n }\n } else if (this.#swipeDirection === 'x') {\n if (dirs.includes('left') || dirs.includes('right')) {\n if ((dirs.includes('left') && xDelta < 0) || (dirs.includes('right') && xDelta > 0)) {\n sx = xDelta;\n } else {\n const d = xDelta * dampen(xDelta);\n sx = Math.abs(d) < Math.abs(xDelta) ? d : xDelta;\n }\n }\n }\n\n if (Math.abs(sx) > 0 || Math.abs(sy) > 0) this.setAttribute('data-swiped', 'true');\n this.style.setProperty('--swipe-amount-x', `${sx}px`);\n this.style.setProperty('--swipe-amount-y', `${sy}px`);\n };\n\n #onPointerUp = () => {\n if (this.getAttribute('data-swipe-out') === 'true' || !this.#isDismissible()) {\n this.#pointerStart = null;\n this.#swipeDirection = null;\n this.setAttribute('data-swiping', 'false');\n return;\n }\n const sx = parseFloat(this.style.getPropertyValue('--swipe-amount-x')) || 0;\n const sy = parseFloat(this.style.getPropertyValue('--swipe-amount-y')) || 0;\n const time = Math.max(1, Date.now() - this.#dragStartTime);\n const amount = this.#swipeDirection === 'x' ? sx : sy;\n const velocity = Math.abs(amount) / time;\n\n if (Math.abs(amount) >= SWIPE_THRESHOLD || velocity > SWIPE_VELOCITY_THRESHOLD) {\n if (this.#swipeDirection === 'x') {\n this.setAttribute('data-swipe-direction', sx > 0 ? 'right' : 'left');\n } else {\n this.setAttribute('data-swipe-direction', sy > 0 ? 'down' : 'up');\n }\n this.setAttribute('data-swipe-out', 'true');\n this.dismiss();\n } else {\n this.style.setProperty('--swipe-amount-x', '0px');\n this.style.setProperty('--swipe-amount-y', '0px');\n this.setAttribute('data-swiped', 'false');\n }\n this.setAttribute('data-swiping', 'false');\n this.#pointerStart = null;\n this.#swipeDirection = null;\n };\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('sonner-toast')) {\n customElements.define('sonner-toast', SonnerToast);\n}\n",
|
|
10
|
-
"import { DEFAULT_HOTKEY, GAP, TOAST_WIDTH, VISIBLE_TOASTS_AMOUNT } from './constants.js';\nimport { registerToaster, unregisterToaster } from './registry.js';\nimport { getToasterSheet } from './styles.js';\nimport { SonnerToast } from './sonner-toast.js';\nimport type {\n Position,\n SonnerToastElement,\n SonnerToasterElement,\n Theme,\n ToasterOptions,\n} from './types.js';\n\nconst HTMLElementCtor: typeof HTMLElement =\n typeof HTMLElement !== 'undefined' ? HTMLElement : (class {} as unknown as typeof HTMLElement);\n\nfunction parseOffsetValue(v: string | number | undefined, fallback: string): string {\n if (v == null) return fallback;\n if (typeof v === 'number') return `${v}px`;\n return v;\n}\n\nfunction applyOffsetVars(\n host: HTMLElement,\n opts: ToasterOptions['offset'],\n prefix: string,\n fallback: string,\n) {\n const sides = ['top', 'right', 'bottom', 'left'] as const;\n if (opts == null || typeof opts === 'string' || typeof opts === 'number') {\n const v = parseOffsetValue(opts, fallback);\n for (const side of sides) host.style.setProperty(`${prefix}-${side}`, v);\n } else {\n for (const side of sides) {\n host.style.setProperty(`${prefix}-${side}`, parseOffsetValue(opts[side], fallback));\n }\n }\n}\n\nexport class SonnerToaster extends HTMLElementCtor implements SonnerToasterElement {\n static get observedAttributes() {\n return [\n 'position',\n 'theme',\n 'rich-colors',\n 'expand',\n 'duration',\n 'gap',\n 'visible-toasts',\n 'close-button',\n 'invert',\n 'dir',\n 'offset',\n 'mobile-offset',\n 'hotkey',\n 'container-aria-label',\n ];\n }\n\n #shadow: ShadowRoot;\n #alertAnnouncer!: HTMLDivElement;\n #childObserver: MutationObserver;\n #resizeObserver: ResizeObserver;\n #toasts: SonnerToast[] = [];\n /** Last measured height per toast. We keep the prior value while a toast is mid-removal\n * (data-removed='true') so its shrinking does not corrupt the offsets of survivors. */\n #heights = new Map<SonnerToast, number>();\n /** True during the synchronous measurement window inside #reflow so the ResizeObserver\n * doesn't recursively re-fire while we're toggling style.height to measure naturals. */\n #measuring = false;\n #expanded = false;\n #interacting = false;\n #themeMql: MediaQueryList | null = null;\n #themeMqlHandler: ((e: MediaQueryListEvent | MediaQueryList) => void) | null = null;\n\n constructor() {\n super();\n this.#shadow = this.attachShadow({ mode: 'open' });\n this.#shadow.adoptedStyleSheets = [getToasterSheet()];\n // Dedicated alert region for urgent re-announcements (e.g. promise\n // loading → error). Browser/SR support for changing a toast's own\n // aria-live mid-flight is inconsistent; routing the new text through\n // a fresh, stable live region guarantees the alert is announced.\n this.#shadow.innerHTML =\n '<div data-frame part=\"frame\"><slot></slot></div>' +\n '<div data-alert-announcer role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\" ' +\n 'style=\"position:absolute;left:0;top:0;width:1px;height:1px;margin:-1px;padding:0;' +\n 'overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;' +\n 'pointer-events:none\"></div>';\n this.#alertAnnouncer = this.#shadow.querySelector('[data-alert-announcer]') as HTMLDivElement;\n\n this.#childObserver = new MutationObserver((records) => {\n let changed = false;\n for (const r of records) {\n for (const node of Array.from(r.addedNodes)) {\n if (node instanceof SonnerToast) {\n this.#toasts.unshift(node);\n this.#resizeObserver.observe(node);\n this.#decorateToast(node);\n changed = true;\n }\n }\n for (const node of Array.from(r.removedNodes)) {\n if (node instanceof SonnerToast) {\n this.#toasts = this.#toasts.filter((t) => t !== node);\n this.#heights.delete(node);\n this.#resizeObserver.unobserve(node);\n changed = true;\n }\n }\n }\n if (changed) this.#reflow({ remeasure: true });\n });\n\n // ResizeObserver fires every frame while a height transition is running (because the\n // rendered size IS changing). We must NOT re-measure on those events — doing so would\n // temporarily set style.height='auto' on a mid-transition toast and cancel the\n // animation. RO here only re-applies layout from the cached heights.\n this.#resizeObserver = new ResizeObserver(() => this.#reflow({ remeasure: false }));\n\n this.addEventListener('mouseenter', this.#onPointerEnter);\n this.addEventListener('mouseleave', this.#onPointerLeave);\n this.addEventListener('focusin', this.#onFocusIn);\n this.addEventListener('focusout', this.#onFocusOut);\n this.addEventListener('sonner-toast-dismissed', () => this.#reflow({ remeasure: false }));\n // Content actually changed — re-measure the toast that updated.\n this.addEventListener('sonner-toast-updated', () => this.#reflow({ remeasure: true }));\n this.addEventListener('sonner-toast-mounted', () => this.#reflow({ remeasure: true }));\n }\n\n connectedCallback() {\n if (!this.hasAttribute('tabindex')) this.tabIndex = -1;\n if (!this.hasAttribute('role')) this.setAttribute('role', 'region');\n if (!this.hasAttribute('aria-label'))\n this.setAttribute('aria-label', this.getAttribute('container-aria-label') ?? 'Notifications');\n this.setAttribute('data-sonner-toaster', '');\n this.#applyPosition();\n this.#applyTheme();\n this.#applyDir();\n this.#applyGap();\n this.#applyWidth();\n this.#applyOffsets();\n\n this.#childObserver.observe(this, { childList: true });\n for (const child of Array.from(this.children)) {\n if (child instanceof SonnerToast) {\n this.#toasts.unshift(child);\n this.#resizeObserver.observe(child);\n this.#decorateToast(child);\n }\n }\n document.addEventListener('keydown', this.#onKeyDown);\n window.addEventListener('resize', this.#onWindowResize);\n registerToaster(this);\n this.#reflow({ remeasure: true });\n }\n\n disconnectedCallback() {\n this.#childObserver.disconnect();\n this.#resizeObserver.disconnect();\n document.removeEventListener('keydown', this.#onKeyDown);\n window.removeEventListener('resize', this.#onWindowResize);\n if (this.#themeMql && this.#themeMqlHandler) {\n this.#themeMql.removeEventListener('change', this.#themeMqlHandler);\n }\n unregisterToaster(this);\n }\n\n attributeChangedCallback(name: string, _old: string | null, _val: string | null) {\n if (!this.isConnected) return;\n switch (name) {\n case 'position':\n this.#applyPosition();\n this.#applyToastPositions();\n this.#reflow();\n break;\n case 'theme':\n this.#applyTheme();\n break;\n case 'dir':\n this.#applyDir();\n break;\n case 'gap':\n this.#applyGap();\n this.#reflow();\n break;\n case 'visible-toasts':\n this.#reflow();\n break;\n case 'expand':\n this.#expanded = this.hasAttribute('expand');\n for (const t of this.#toasts) t.setPaused(this.#expanded || this.#interacting);\n this.#reflow();\n break;\n case 'close-button':\n case 'rich-colors':\n case 'invert':\n this.#propagateBoolean(name);\n break;\n case 'offset':\n case 'mobile-offset':\n this.#applyOffsets();\n break;\n case 'container-aria-label':\n this.setAttribute('aria-label', this.getAttribute('container-aria-label') ?? 'Notifications');\n break;\n }\n }\n\n // ─── Public API ──────────────────────────────────────────────────────────\n\n addToast(el: SonnerToastElement): SonnerToastElement {\n this.appendChild(el);\n return el;\n }\n\n /** Re-announce `text` through the dedicated assertive live region. Used when\n * a toast transitions to an urgent type (error/warning) after mount — the\n * toast's own aria-live change is unreliable across screen readers, so we\n * route the alert through a fresh region whose announcement behavior is\n * consistent. The clear-then-set pattern forces SRs that diff content to\n * treat the new text as a new announcement. */\n announceUrgent(text: string): void {\n this.#alertAnnouncer.textContent = '';\n requestAnimationFrame(() => {\n this.#alertAnnouncer.textContent = text;\n });\n }\n\n dismissAll(): void {\n // Iterate live children so toasts appended this tick (before the MutationObserver\n // fires) are still covered.\n for (const child of Array.from(this.children)) {\n if (child instanceof SonnerToast) child.dismiss();\n }\n }\n\n // ─── Configuration application ───────────────────────────────────────────\n\n #getPosition(): Position {\n return (this.getAttribute('position') as Position) || 'bottom-right';\n }\n\n #applyPosition() {\n const [y, x] = this.#getPosition().split('-');\n if (y) this.setAttribute('data-y-position', y);\n if (x) this.setAttribute('data-x-position', x);\n }\n\n #applyTheme() {\n if (this.#themeMql && this.#themeMqlHandler) {\n this.#themeMql.removeEventListener('change', this.#themeMqlHandler);\n this.#themeMql = null;\n this.#themeMqlHandler = null;\n }\n const theme = (this.getAttribute('theme') as Theme) || 'light';\n if (theme === 'system') {\n this.#themeMql = window.matchMedia('(prefers-color-scheme: dark)');\n const apply = (mql: MediaQueryList | MediaQueryListEvent) => {\n this.setAttribute('data-sonner-theme', mql.matches ? 'dark' : 'light');\n };\n this.#themeMqlHandler = apply;\n this.#themeMql.addEventListener('change', apply);\n apply(this.#themeMql);\n } else {\n this.setAttribute('data-sonner-theme', theme);\n }\n }\n\n #applyDir() {\n const dir = this.getAttribute('dir');\n if (dir === 'auto' || !dir) {\n const computed = window.getComputedStyle(document.documentElement).direction || 'ltr';\n this.setAttribute('dir', computed);\n }\n }\n\n #applyGap() {\n const raw = this.getAttribute('gap');\n const gap = raw ? Number(raw) : GAP;\n this.style.setProperty('--gap', `${Number.isFinite(gap) ? gap : GAP}px`);\n }\n\n #applyWidth() {\n this.style.setProperty('--width', `${TOAST_WIDTH}px`);\n }\n\n #applyOffsets() {\n const off = this.getAttribute('offset');\n const mobileOff = this.getAttribute('mobile-offset');\n applyOffsetVars(this, off ?? undefined, '--offset', '24px');\n applyOffsetVars(this, mobileOff ?? undefined, '--mobile-offset', '16px');\n }\n\n #applyToastPositions() {\n for (const t of this.#toasts) {\n if (!t.hasAttribute('position')) {\n const [y, x] = this.#getPosition().split('-');\n if (y) t.setAttribute('data-y-position', y);\n if (x) t.setAttribute('data-x-position', x);\n }\n }\n }\n\n /** Mirror a toaster-level boolean attribute (close-button, rich-colors, invert) onto\n * every existing toast that hasn't set the same attribute itself. Per-toast overrides\n * still win. */\n #propagateBoolean(attr: 'close-button' | 'rich-colors' | 'invert') {\n const on = this.hasAttribute(attr);\n for (const t of this.#toasts) {\n // Skip if the toast explicitly opted out with `attr=\"false\"` — that's a per-toast override.\n if (t.getAttribute(attr) === 'false') continue;\n if (on) t.setAttribute(attr, '');\n else t.removeAttribute(attr);\n }\n }\n\n #decorateToast(toast: SonnerToast) {\n if (!toast.hasAttribute('position')) {\n const [y, x] = this.#getPosition().split('-');\n if (y) toast.setAttribute('data-y-position', y);\n if (x) toast.setAttribute('data-x-position', x);\n }\n if (!toast.hasAttribute('duration')) {\n const inherit = this.getAttribute('duration');\n if (inherit) toast.setAttribute('duration', inherit);\n }\n if (!toast.hasAttribute('close-button') && this.hasAttribute('close-button')) {\n toast.setAttribute('close-button', '');\n }\n if (!toast.hasAttribute('rich-colors') && this.hasAttribute('rich-colors')) {\n toast.setAttribute('rich-colors', '');\n }\n if (!toast.hasAttribute('invert') && this.hasAttribute('invert')) {\n toast.setAttribute('invert', '');\n }\n }\n\n // ─── Stacking math ───────────────────────────────────────────────────────\n\n #reflow(opts: { remeasure: boolean } = { remeasure: false }) {\n const visibleAmount = Number(this.getAttribute('visible-toasts') ?? VISIBLE_TOASTS_AMOUNT);\n\n // Only measure when explicitly requested (toast added / updated / mounted / window\n // resized). Measuring on every reflow corrupts running height transitions, because\n // the temp `style.height='auto'` cancels them.\n if (opts.remeasure) {\n this.#measuring = true;\n for (const t of this.#toasts) {\n if (t.getAttribute('data-removed') === 'true') continue;\n const prior = t.style.height;\n t.style.height = 'auto';\n this.#heights.set(t, t.getBoundingClientRect().height);\n t.style.height = prior;\n }\n this.#measuring = false;\n }\n\n const active = this.#toasts.filter((t) => t.getAttribute('data-removed') !== 'true');\n const frontHeight = active.length > 0 ? (this.#heights.get(active[0]!) ?? 0) : 0;\n const gap = this.#gapPx();\n const expanded = this.#expanded || this.#interacting;\n let cumulative = 0;\n\n // Single inherited value for all toasts — when this changes, every toast's\n // height: var(--front-toast-height) re-resolves and transitions in lockstep.\n this.style.setProperty('--front-toast-height', `${frontHeight}px`);\n\n for (let i = 0; i < active.length; i++) {\n const toast = active[i]!;\n const h = this.#heights.get(toast) ?? 0;\n const isFront = i === 0;\n const offset = i === 0 ? 0 : cumulative + i * gap;\n cumulative += h;\n\n toast.style.setProperty('--index', String(i));\n toast.style.setProperty('--toasts-before', String(i));\n toast.style.setProperty('--z-index', String(active.length - i));\n toast.style.setProperty('--offset', `${offset}px`);\n toast.style.setProperty('--initial-height', `${h}px`);\n // height itself is driven by CSS now (interpolate-size handles auto↔pixel).\n toast.setAttribute('data-index', String(i));\n toast.setAttribute('data-front', String(isFront));\n toast.setAttribute('data-visible', String(i + 1 <= visibleAmount));\n toast.setAttribute('data-expanded', String(expanded));\n // Hide non-front toasts from assistive tech when collapsed: they're\n // visually stacked behind and shouldn't compete with the front toast\n // for screen-reader attention. Expanding the stack reveals them again.\n if (expanded || isFront) toast.removeAttribute('aria-hidden');\n else toast.setAttribute('aria-hidden', 'true');\n }\n }\n\n #gapPx(): number {\n const raw = this.getAttribute('gap');\n const n = raw ? Number(raw) : GAP;\n return Number.isFinite(n) ? n : GAP;\n }\n\n // ─── Hover / expand / hotkey ─────────────────────────────────────────────\n\n #onPointerEnter = () => {\n this.#interacting = true;\n for (const t of this.#toasts) t.setPaused(true);\n this.#reflow();\n };\n\n #onPointerLeave = () => {\n this.#interacting = false;\n for (const t of this.#toasts) t.setPaused(false);\n this.#reflow();\n };\n\n #onFocusIn = () => {\n this.#interacting = true;\n for (const t of this.#toasts) t.setPaused(true);\n this.#reflow();\n };\n\n #onFocusOut = (e: FocusEvent) => {\n const next = e.relatedTarget as Node | null;\n if (next && this.contains(next)) return;\n this.#interacting = false;\n for (const t of this.#toasts) t.setPaused(false);\n this.#reflow();\n };\n\n #onWindowResize = () => this.#reflow({ remeasure: true });\n\n #onKeyDown = (event: KeyboardEvent) => {\n // Don't hijack the hotkey when the user is typing.\n const target = event.target as HTMLElement | null;\n if (target) {\n const tag = target.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || target.isContentEditable) {\n return;\n }\n }\n const hotkey = this.#hotkey();\n const matches = hotkey.every((key) => {\n if (key === 'altKey' || key === 'ctrlKey' || key === 'shiftKey' || key === 'metaKey') {\n return event[key as 'altKey'];\n }\n return event.code === key;\n });\n if (matches) {\n this.#expanded = true;\n for (const t of this.#toasts) t.setPaused(true);\n this.focus();\n this.#reflow();\n return;\n }\n if (event.key === 'Escape' && this.#expanded && this.contains(document.activeElement)) {\n this.#expanded = false;\n for (const t of this.#toasts) t.setPaused(false);\n this.#reflow();\n }\n };\n\n #hotkey(): readonly string[] {\n const raw = this.getAttribute('hotkey');\n if (!raw) return DEFAULT_HOTKEY;\n return raw.split('+').map((s) => s.trim());\n }\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('sonner-toaster')) {\n customElements.define('sonner-toaster', SonnerToaster);\n}\n",
|
|
10
|
+
"import { DEFAULT_HOTKEY, GAP, TOAST_WIDTH, VISIBLE_TOASTS_AMOUNT } from './constants.js';\nimport { registerToaster, unregisterToaster } from './registry.js';\nimport { getToasterSheet } from './styles.js';\nimport { SonnerToast } from './sonner-toast.js';\nimport type {\n Position,\n SonnerToastElement,\n SonnerToasterElement,\n Theme,\n ToasterOptions,\n} from './types.js';\n\nconst HTMLElementCtor: typeof HTMLElement =\n typeof HTMLElement !== 'undefined' ? HTMLElement : (class {} as unknown as typeof HTMLElement);\n\nfunction parseOffsetValue(v: string | number | undefined, fallback: string): string {\n if (v == null) return fallback;\n if (typeof v === 'number') return `${v}px`;\n return v;\n}\n\nfunction applyOffsetVars(\n host: HTMLElement,\n opts: ToasterOptions['offset'],\n prefix: string,\n fallback: string,\n) {\n const sides = ['top', 'right', 'bottom', 'left'] as const;\n if (opts == null || typeof opts === 'string' || typeof opts === 'number') {\n const v = parseOffsetValue(opts, fallback);\n for (const side of sides) host.style.setProperty(`${prefix}-${side}`, v);\n } else {\n for (const side of sides) {\n host.style.setProperty(`${prefix}-${side}`, parseOffsetValue(opts[side], fallback));\n }\n }\n}\n\nexport class SonnerToaster extends HTMLElementCtor implements SonnerToasterElement {\n static get observedAttributes() {\n return [\n 'position',\n 'theme',\n 'rich-colors',\n 'expand',\n 'duration',\n 'gap',\n 'visible-toasts',\n 'close-button',\n 'invert',\n 'dir',\n 'offset',\n 'mobile-offset',\n 'hotkey',\n 'container-aria-label',\n ];\n }\n\n #shadow: ShadowRoot;\n #alertAnnouncer!: HTMLDivElement;\n #childObserver: MutationObserver;\n #resizeObserver: ResizeObserver;\n #toasts: SonnerToast[] = [];\n /** Last measured height per toast. We keep the prior value while a toast is mid-removal\n * (data-removed='true') so its shrinking does not corrupt the offsets of survivors. */\n #heights = new Map<SonnerToast, number>();\n /** True during the synchronous measurement window inside #reflow so the ResizeObserver\n * doesn't recursively re-fire while we're toggling style.height to measure naturals. */\n #measuring = false;\n #expanded = false;\n #interacting = false;\n #themeMql: MediaQueryList | null = null;\n #themeMqlHandler: ((e: MediaQueryListEvent | MediaQueryList) => void) | null = null;\n\n constructor() {\n super();\n this.#shadow = this.attachShadow({ mode: 'open' });\n this.#shadow.adoptedStyleSheets = [getToasterSheet()];\n // Dedicated alert region for urgent re-announcements (e.g. promise\n // loading → error). Browser/SR support for changing a toast's own\n // aria-live mid-flight is inconsistent; routing the new text through\n // a fresh, stable live region guarantees the alert is announced.\n this.#shadow.innerHTML =\n '<div data-frame part=\"frame\"><slot></slot></div>' +\n '<div data-alert-announcer role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\" ' +\n 'style=\"position:absolute;left:0;top:0;width:1px;height:1px;margin:-1px;padding:0;' +\n 'overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;' +\n 'pointer-events:none\"></div>';\n this.#alertAnnouncer = this.#shadow.querySelector('[data-alert-announcer]') as HTMLDivElement;\n\n this.#childObserver = new MutationObserver((records) => {\n let changed = false;\n for (const r of records) {\n for (const node of Array.from(r.addedNodes)) {\n if (node instanceof SonnerToast) {\n this.#toasts.unshift(node);\n this.#resizeObserver.observe(node);\n this.#decorateToast(node);\n changed = true;\n }\n }\n for (const node of Array.from(r.removedNodes)) {\n if (node instanceof SonnerToast) {\n this.#toasts = this.#toasts.filter((t) => t !== node);\n this.#heights.delete(node);\n this.#resizeObserver.unobserve(node);\n changed = true;\n }\n }\n }\n if (changed) this.#reflow({ remeasure: true });\n });\n\n // ResizeObserver fires every frame while a height transition is running (because the\n // rendered size IS changing). We must NOT re-measure on those events — doing so would\n // temporarily set style.height='auto' on a mid-transition toast and cancel the\n // animation. RO here only re-applies layout from the cached heights.\n this.#resizeObserver = new ResizeObserver(() => this.#reflow({ remeasure: false }));\n\n this.addEventListener('mouseenter', this.#onPointerEnter);\n this.addEventListener('mouseleave', this.#onPointerLeave);\n this.addEventListener('focusin', this.#onFocusIn);\n this.addEventListener('focusout', this.#onFocusOut);\n this.addEventListener('sonner-toast-dismissed', () => this.#reflow({ remeasure: false }));\n // Content actually changed — re-measure the toast that updated.\n this.addEventListener('sonner-toast-updated', () => this.#reflow({ remeasure: true }));\n this.addEventListener('sonner-toast-mounted', () => this.#reflow({ remeasure: true }));\n }\n\n connectedCallback() {\n if (!this.hasAttribute('tabindex')) this.tabIndex = -1;\n if (!this.hasAttribute('role')) this.setAttribute('role', 'region');\n if (!this.hasAttribute('aria-label'))\n this.setAttribute('aria-label', this.getAttribute('container-aria-label') ?? 'Notifications');\n this.#applyHotkeyHints();\n this.setAttribute('data-sonner-toaster', '');\n this.#applyPosition();\n this.#applyTheme();\n this.#applyDir();\n this.#applyGap();\n this.#applyWidth();\n this.#applyOffsets();\n\n this.#childObserver.observe(this, { childList: true });\n for (const child of Array.from(this.children)) {\n if (child instanceof SonnerToast) {\n this.#toasts.unshift(child);\n this.#resizeObserver.observe(child);\n this.#decorateToast(child);\n }\n }\n document.addEventListener('keydown', this.#onKeyDown);\n window.addEventListener('resize', this.#onWindowResize);\n registerToaster(this);\n this.#reflow({ remeasure: true });\n }\n\n disconnectedCallback() {\n this.#childObserver.disconnect();\n this.#resizeObserver.disconnect();\n document.removeEventListener('keydown', this.#onKeyDown);\n window.removeEventListener('resize', this.#onWindowResize);\n if (this.#themeMql && this.#themeMqlHandler) {\n this.#themeMql.removeEventListener('change', this.#themeMqlHandler);\n }\n unregisterToaster(this);\n }\n\n attributeChangedCallback(name: string, _old: string | null, _val: string | null) {\n if (!this.isConnected) return;\n switch (name) {\n case 'position':\n this.#applyPosition();\n this.#applyToastPositions();\n this.#reflow();\n break;\n case 'theme':\n this.#applyTheme();\n break;\n case 'dir':\n this.#applyDir();\n break;\n case 'gap':\n this.#applyGap();\n this.#reflow();\n break;\n case 'visible-toasts':\n this.#reflow();\n break;\n case 'expand':\n this.#expanded = this.hasAttribute('expand');\n for (const t of this.#toasts) t.setPaused(this.#expanded || this.#interacting);\n this.#reflow();\n break;\n case 'close-button':\n case 'rich-colors':\n case 'invert':\n this.#propagateBoolean(name);\n break;\n case 'offset':\n case 'mobile-offset':\n this.#applyOffsets();\n break;\n case 'container-aria-label':\n this.setAttribute('aria-label', this.getAttribute('container-aria-label') ?? 'Notifications');\n break;\n case 'hotkey':\n this.#applyHotkeyHints();\n break;\n }\n }\n\n // ─── Public API ──────────────────────────────────────────────────────────\n\n addToast(el: SonnerToastElement): SonnerToastElement {\n this.appendChild(el);\n return el;\n }\n\n /** Re-announce `text` through the dedicated assertive live region. Used when\n * a toast transitions to an urgent type (error/warning) after mount — the\n * toast's own aria-live change is unreliable across screen readers, so we\n * route the alert through a fresh region whose announcement behavior is\n * consistent. The clear-then-set pattern forces SRs that diff content to\n * treat the new text as a new announcement. */\n announceUrgent(text: string): void {\n this.#alertAnnouncer.textContent = '';\n requestAnimationFrame(() => {\n this.#alertAnnouncer.textContent = text;\n });\n }\n\n dismissAll(): void {\n // Iterate live children so toasts appended this tick (before the MutationObserver\n // fires) are still covered.\n for (const child of Array.from(this.children)) {\n if (child instanceof SonnerToast) child.dismiss();\n }\n }\n\n // ─── Configuration application ───────────────────────────────────────────\n\n #getPosition(): Position {\n return (this.getAttribute('position') as Position) || 'bottom-right';\n }\n\n #applyPosition() {\n const [y, x] = this.#getPosition().split('-');\n if (y) this.setAttribute('data-y-position', y);\n if (x) this.setAttribute('data-x-position', x);\n }\n\n #applyTheme() {\n if (this.#themeMql && this.#themeMqlHandler) {\n this.#themeMql.removeEventListener('change', this.#themeMqlHandler);\n this.#themeMql = null;\n this.#themeMqlHandler = null;\n }\n const theme = (this.getAttribute('theme') as Theme) || 'light';\n if (theme === 'system') {\n this.#themeMql = window.matchMedia('(prefers-color-scheme: dark)');\n const apply = (mql: MediaQueryList | MediaQueryListEvent) => {\n this.setAttribute('data-sonner-theme', mql.matches ? 'dark' : 'light');\n };\n this.#themeMqlHandler = apply;\n this.#themeMql.addEventListener('change', apply);\n apply(this.#themeMql);\n } else {\n this.setAttribute('data-sonner-theme', theme);\n }\n }\n\n #applyDir() {\n const dir = this.getAttribute('dir');\n if (dir === 'auto' || !dir) {\n const computed = window.getComputedStyle(document.documentElement).direction || 'ltr';\n this.setAttribute('dir', computed);\n }\n }\n\n #applyGap() {\n const raw = this.getAttribute('gap');\n const gap = raw ? Number(raw) : GAP;\n this.style.setProperty('--gap', `${Number.isFinite(gap) ? gap : GAP}px`);\n }\n\n #applyWidth() {\n this.style.setProperty('--width', `${TOAST_WIDTH}px`);\n }\n\n #applyOffsets() {\n const off = this.getAttribute('offset');\n const mobileOff = this.getAttribute('mobile-offset');\n applyOffsetVars(this, off ?? undefined, '--offset', '24px');\n applyOffsetVars(this, mobileOff ?? undefined, '--mobile-offset', '16px');\n }\n\n #applyToastPositions() {\n for (const t of this.#toasts) {\n if (!t.hasAttribute('position')) {\n const [y, x] = this.#getPosition().split('-');\n if (y) t.setAttribute('data-y-position', y);\n if (x) t.setAttribute('data-x-position', x);\n }\n }\n }\n\n /** Mirror a toaster-level boolean attribute (close-button, rich-colors, invert) onto\n * every existing toast that hasn't set the same attribute itself. Per-toast overrides\n * still win. */\n #propagateBoolean(attr: 'close-button' | 'rich-colors' | 'invert') {\n const on = this.hasAttribute(attr);\n for (const t of this.#toasts) {\n // Skip if the toast explicitly opted out with `attr=\"false\"` — that's a per-toast override.\n if (t.getAttribute(attr) === 'false') continue;\n if (on) t.setAttribute(attr, '');\n else t.removeAttribute(attr);\n }\n }\n\n #decorateToast(toast: SonnerToast) {\n if (!toast.hasAttribute('position')) {\n const [y, x] = this.#getPosition().split('-');\n if (y) toast.setAttribute('data-y-position', y);\n if (x) toast.setAttribute('data-x-position', x);\n }\n if (!toast.hasAttribute('duration')) {\n const inherit = this.getAttribute('duration');\n if (inherit) toast.setAttribute('duration', inherit);\n }\n if (!toast.hasAttribute('close-button') && this.hasAttribute('close-button')) {\n toast.setAttribute('close-button', '');\n }\n if (!toast.hasAttribute('rich-colors') && this.hasAttribute('rich-colors')) {\n toast.setAttribute('rich-colors', '');\n }\n if (!toast.hasAttribute('invert') && this.hasAttribute('invert')) {\n toast.setAttribute('invert', '');\n }\n }\n\n // ─── Stacking math ───────────────────────────────────────────────────────\n\n #reflow(opts: { remeasure: boolean } = { remeasure: false }) {\n const visibleAmount = Number(this.getAttribute('visible-toasts') ?? VISIBLE_TOASTS_AMOUNT);\n\n // Only measure when explicitly requested (toast added / updated / mounted / window\n // resized). Measuring on every reflow corrupts running height transitions, because\n // the temp `style.height='auto'` cancels them.\n if (opts.remeasure) {\n this.#measuring = true;\n for (const t of this.#toasts) {\n if (t.getAttribute('data-removed') === 'true') continue;\n const prior = t.style.height;\n t.style.height = 'auto';\n this.#heights.set(t, t.getBoundingClientRect().height);\n t.style.height = prior;\n }\n this.#measuring = false;\n }\n\n const active = this.#toasts.filter((t) => t.getAttribute('data-removed') !== 'true');\n const frontHeight = active.length > 0 ? (this.#heights.get(active[0]!) ?? 0) : 0;\n const gap = this.#gapPx();\n const expanded = this.#expanded || this.#interacting;\n let cumulative = 0;\n\n // Single inherited value for all toasts — when this changes, every toast's\n // height: var(--front-toast-height) re-resolves and transitions in lockstep.\n this.style.setProperty('--front-toast-height', `${frontHeight}px`);\n\n for (let i = 0; i < active.length; i++) {\n const toast = active[i]!;\n const h = this.#heights.get(toast) ?? 0;\n const isFront = i === 0;\n const offset = i === 0 ? 0 : cumulative + i * gap;\n cumulative += h;\n\n toast.style.setProperty('--index', String(i));\n toast.style.setProperty('--toasts-before', String(i));\n toast.style.setProperty('--z-index', String(active.length - i));\n toast.style.setProperty('--offset', `${offset}px`);\n toast.style.setProperty('--initial-height', `${h}px`);\n // height itself is driven by CSS now (interpolate-size handles auto↔pixel).\n toast.setAttribute('data-index', String(i));\n toast.setAttribute('data-front', String(isFront));\n toast.setAttribute('data-visible', String(i + 1 <= visibleAmount));\n toast.setAttribute('data-expanded', String(expanded));\n // Hide non-front toasts from assistive tech when collapsed: they're\n // visually stacked behind and shouldn't compete with the front toast\n // for screen-reader attention. Expanding the stack reveals them again.\n if (expanded || isFront) toast.removeAttribute('aria-hidden');\n else toast.setAttribute('aria-hidden', 'true');\n }\n }\n\n #gapPx(): number {\n const raw = this.getAttribute('gap');\n const n = raw ? Number(raw) : GAP;\n return Number.isFinite(n) ? n : GAP;\n }\n\n // ─── Hover / expand / hotkey ─────────────────────────────────────────────\n\n #onPointerEnter = () => {\n this.#interacting = true;\n for (const t of this.#toasts) t.setPaused(true);\n this.#reflow();\n };\n\n #onPointerLeave = () => {\n this.#interacting = false;\n for (const t of this.#toasts) t.setPaused(false);\n this.#reflow();\n };\n\n #onFocusIn = () => {\n this.#interacting = true;\n for (const t of this.#toasts) t.setPaused(true);\n this.#reflow();\n };\n\n #onFocusOut = (e: FocusEvent) => {\n const next = e.relatedTarget as Node | null;\n if (next && this.contains(next)) return;\n this.#interacting = false;\n for (const t of this.#toasts) t.setPaused(false);\n this.#reflow();\n };\n\n #onWindowResize = () => this.#reflow({ remeasure: true });\n\n #onKeyDown = (event: KeyboardEvent) => {\n // Defer to consumer handlers that already claimed this event.\n if (event.defaultPrevented) return;\n // Don't hijack the hotkey when the user is typing.\n const target = event.target as HTMLElement | null;\n if (target) {\n const tag = target.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || target.isContentEditable) {\n return;\n }\n }\n const hotkey = this.#hotkey();\n // Empty hotkey opts out entirely (e.g. `hotkey=\"\"` or `hotkey=\"none\"`),\n // but still allow Escape-to-collapse below.\n const allModifiers = ['altKey', 'ctrlKey', 'shiftKey', 'metaKey'] as const;\n const matches =\n hotkey.length > 0 &&\n hotkey.every((key) => {\n if ((allModifiers as readonly string[]).includes(key)) {\n return event[key as 'altKey'];\n }\n return event.code === key;\n }) &&\n // Strict modifier match: unlisted modifiers must not be held, so e.g.\n // Ctrl+Alt+T doesn't accidentally trigger an Alt+T hotkey.\n allModifiers.every((m) => hotkey.includes(m) || !event[m]);\n if (matches) {\n this.#expanded = true;\n for (const t of this.#toasts) t.setPaused(true);\n this.focus();\n this.#reflow();\n return;\n }\n if (event.key === 'Escape' && this.#expanded && this.contains(document.activeElement)) {\n this.#expanded = false;\n for (const t of this.#toasts) t.setPaused(false);\n this.#reflow();\n }\n };\n\n #hotkey(): readonly string[] {\n const raw = this.getAttribute('hotkey');\n if (raw === null) return DEFAULT_HOTKEY;\n // Explicit opt-out: `hotkey=\"\"` or `hotkey=\"none\"`.\n const trimmed = raw.trim();\n if (trimmed === '' || trimmed.toLowerCase() === 'none') return [];\n return trimmed.split('+').map((s) => s.trim());\n }\n\n // Reflect the current hotkey as `aria-keyshortcuts` (for AT) and `title` (for\n // sighted users) so the otherwise-undiscoverable shortcut surfaces somewhere.\n // Only applied when those attributes aren't already set by the consumer.\n // When the hotkey is opted out, remove anything we previously set.\n #applyHotkeyHints() {\n const formatted = formatHotkeyForAria(this.#hotkey());\n if (!formatted) {\n if (this.#ownsAriaKeyshortcuts) {\n this.removeAttribute('aria-keyshortcuts');\n this.#ownsAriaKeyshortcuts = false;\n }\n if (this.#ownsTitle) {\n this.removeAttribute('title');\n this.#ownsTitle = false;\n }\n return;\n }\n if (!this.hasAttribute('aria-keyshortcuts') || this.#ownsAriaKeyshortcuts) {\n this.setAttribute('aria-keyshortcuts', formatted);\n this.#ownsAriaKeyshortcuts = true;\n }\n if (!this.hasAttribute('title') || this.#ownsTitle) {\n this.setAttribute('title', `Press ${formatted} to expand notifications`);\n this.#ownsTitle = true;\n }\n }\n #ownsAriaKeyshortcuts = false;\n #ownsTitle = false;\n}\n\nfunction formatHotkeyForAria(tokens: readonly string[]): string {\n if (tokens.length === 0) return '';\n return tokens\n .map((t) => {\n if (t === 'altKey') return 'Alt';\n if (t === 'ctrlKey') return 'Control';\n if (t === 'shiftKey') return 'Shift';\n if (t === 'metaKey') return 'Meta';\n if (/^Key[A-Z]$/.test(t)) return t.slice(3);\n if (/^Digit[0-9]$/.test(t)) return t.slice(5);\n return t;\n })\n .join('+');\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('sonner-toaster')) {\n customElements.define('sonner-toaster', SonnerToaster);\n}\n",
|
|
11
11
|
"import { defaultToaster, dismissAllToasts, getToast, nextToastId } from './registry.js';\nimport { SonnerToast } from './sonner-toast.js';\nimport { SonnerToaster } from './sonner-toaster.js';\nimport type {\n PromiseOptions,\n SonnerToastElement,\n ToastContent,\n ToastOptions,\n ToastType,\n} from './types.js';\n\ninterface CreateOptions extends ToastOptions {\n title?: ToastContent;\n type?: ToastType;\n}\n\nfunction ensureToaster(toasterId?: string): SonnerToaster {\n if (toasterId) {\n const byId = document.getElementById(toasterId);\n if (byId instanceof SonnerToaster) return byId;\n }\n let host = defaultToaster() as SonnerToaster | undefined;\n if (!host) {\n host = document.createElement('sonner-toaster') as SonnerToaster;\n document.body.appendChild(host);\n }\n return host;\n}\n\nfunction buildOrUpdate(options: CreateOptions): SonnerToastElement {\n const id = options.id ?? nextToastId();\n const existing = getToast(id);\n if (existing) {\n existing.update(options);\n return existing;\n }\n const el = document.createElement('sonner-toast') as SonnerToast;\n el.toastId = id;\n el.update(options);\n el.setHandlers({ onDismiss: options.onDismiss, onAutoClose: options.onAutoClose });\n ensureToaster(options.toasterId).addToast(el);\n return el;\n}\n\nfunction variant(type: ToastType) {\n return (message: ToastContent, opts?: ToastOptions): SonnerToastElement =>\n buildOrUpdate({ ...opts, type, title: message });\n}\n\nfunction basic(message: ToastContent, opts?: ToastOptions): SonnerToastElement {\n return buildOrUpdate({ ...opts, type: 'default', title: message });\n}\n\nfunction dismiss(id?: string | number): void {\n if (id !== undefined) {\n getToast(id)?.dismiss();\n return;\n }\n dismissAllToasts();\n}\n\nfunction custom(\n builder: (id: string | number) => HTMLElement,\n opts?: ToastOptions,\n): SonnerToastElement {\n const id = opts?.id ?? nextToastId();\n const el = document.createElement('sonner-toast') as SonnerToast;\n el.toastId = id;\n el.setAttribute('data-styled', 'false');\n if (opts?.duration !== undefined) el.setAttribute('duration', String(opts.duration));\n if (opts?.dismissible === false) el.setAttribute('dismissible', 'false');\n if (opts?.position) el.setAttribute('position', opts.position);\n if (opts?.testId !== undefined) el.setAttribute('data-testid', opts.testId);\n const content = builder(id);\n el.appendChild(content);\n el.setHandlers({ onDismiss: opts?.onDismiss, onAutoClose: opts?.onAutoClose });\n ensureToaster(opts?.toasterId).addToast(el);\n return el;\n}\n\nasync function resolveContent<T>(\n value: ToastContent | ((arg: T) => ToastContent) | undefined,\n arg: T,\n): Promise<ToastContent | undefined> {\n if (value === undefined) return undefined;\n if (typeof value === 'function') {\n // ToastContent allows zero-arg functions too; distinguish by length.\n return (value as (a: T) => ToastContent).length === 0\n ? (value as () => ToastContent)()\n : (value as (a: T) => ToastContent)(arg);\n }\n return value;\n}\n\nfunction promise<T>(\n promiseOrFn: Promise<T> | (() => Promise<T>),\n options: PromiseOptions<T>,\n): SonnerToastElement & { unwrap: () => Promise<T> } {\n const id = options.id ?? nextToastId();\n // Carry forward everything except the promise-specific resolver fields when building the toast.\n const { loading: _l, success: _s, error: _e, description: _d, finally: _f, ...rest } = options;\n const loadingEl = buildOrUpdate({\n ...rest,\n id,\n type: 'loading',\n title: options.loading,\n duration: Infinity,\n dismissible: options.dismissible ?? false,\n });\n\n const work = Promise.resolve(typeof promiseOrFn === 'function' ? promiseOrFn() : promiseOrFn);\n\n let result: ['resolve', T] | ['reject', unknown] | null = null;\n\n const settled = work\n .then(async (value) => {\n result = ['resolve', value];\n const title = await resolveContent(options.success, value);\n const desc = await resolveContent(options.description, value);\n if (title !== undefined) {\n loadingEl.update({\n ...rest,\n id,\n type: 'success',\n title,\n description: desc,\n duration: options.duration,\n dismissible: options.dismissible ?? true,\n });\n } else {\n loadingEl.dismiss();\n }\n })\n .catch(async (err) => {\n result = ['reject', err];\n const title = await resolveContent(options.error, err);\n const desc = await resolveContent(options.description, err);\n if (title !== undefined) {\n loadingEl.update({\n ...rest,\n id,\n type: 'error',\n title,\n description: desc,\n duration: options.duration,\n dismissible: options.dismissible ?? true,\n });\n } else {\n loadingEl.dismiss();\n }\n })\n .finally(() => options.finally?.());\n\n const unwrap = () =>\n new Promise<T>((resolve, reject) => {\n settled.then(() => {\n if (!result) return reject(new Error('promise toast settled without a result'));\n if (result[0] === 'resolve') resolve(result[1]);\n else reject(result[1]);\n });\n });\n\n return Object.assign(loadingEl, { unwrap });\n}\n\nexport const toast = Object.assign(basic, {\n success: variant('success'),\n error: variant('error'),\n info: variant('info'),\n warning: variant('warning'),\n loading: (message: ToastContent, opts?: ToastOptions) =>\n buildOrUpdate({\n ...opts,\n type: 'loading',\n title: message,\n duration: opts?.duration ?? Infinity,\n }),\n message: basic,\n promise,\n custom,\n dismiss,\n getToast,\n});\n",
|
|
12
12
|
"// Public API: re-exported declaratively so the entry point's exports\n// survive tree-shaking. The window.toast side-effect uses a separately\n// renamed import (`_toast`) — sharing a name with a re-export trips\n// newer Bun bundlers into emitting broken `toast2 as toast` aliases.\nexport { SonnerToast } from './sonner-toast.js';\nexport { SonnerToaster } from './sonner-toaster.js';\nexport { toast } from './toast.js';\n\nimport type { SonnerToast as _SonnerToast } from './sonner-toast.js';\nimport type { SonnerToaster as _SonnerToaster } from './sonner-toaster.js';\nimport { toast as _toast } from './toast.js';\nexport type {\n Position,\n PromiseOptions,\n SonnerToastElement,\n SonnerToasterElement,\n SwipeDirection,\n Theme,\n ToastAction,\n ToastContent,\n ToastOptions,\n ToastType,\n ToasterOptions,\n} from './types.js';\n\nif (typeof window !== 'undefined')\n (window as Window & { toast?: typeof _toast }).toast = _toast;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sonner-toast': _SonnerToast;\n 'sonner-toaster': _SonnerToaster;\n }\n}\n"
|
|
13
13
|
],
|
|
14
|
-
"mappings": "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",
|
|
15
|
-
"debugId": "
|
|
14
|
+
"mappings": "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",
|
|
15
|
+
"debugId": "82842EECA6759D7464756E2164756E21",
|
|
16
16
|
"names": []
|
|
17
17
|
}
|
package/dist/sonner-wc.js
CHANGED
|
@@ -128,6 +128,12 @@ var toaster_default = `:host {
|
|
|
128
128
|
display: block;
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
+
:host(:focus-visible) {
|
|
132
|
+
outline: 2px solid var(--gray9);
|
|
133
|
+
outline-offset: 4px;
|
|
134
|
+
border-radius: var(--border-radius);
|
|
135
|
+
}
|
|
136
|
+
|
|
131
137
|
[data-frame] {
|
|
132
138
|
display: block;
|
|
133
139
|
width: 100%;
|
|
@@ -1507,6 +1513,7 @@ class SonnerToaster extends HTMLElementCtor2 {
|
|
|
1507
1513
|
this.setAttribute("role", "region");
|
|
1508
1514
|
if (!this.hasAttribute("aria-label"))
|
|
1509
1515
|
this.setAttribute("aria-label", this.getAttribute("container-aria-label") ?? "Notifications");
|
|
1516
|
+
this.#applyHotkeyHints();
|
|
1510
1517
|
this.setAttribute("data-sonner-toaster", "");
|
|
1511
1518
|
this.#applyPosition();
|
|
1512
1519
|
this.#applyTheme();
|
|
@@ -1577,6 +1584,9 @@ class SonnerToaster extends HTMLElementCtor2 {
|
|
|
1577
1584
|
case "container-aria-label":
|
|
1578
1585
|
this.setAttribute("aria-label", this.getAttribute("container-aria-label") ?? "Notifications");
|
|
1579
1586
|
break;
|
|
1587
|
+
case "hotkey":
|
|
1588
|
+
this.#applyHotkeyHints();
|
|
1589
|
+
break;
|
|
1580
1590
|
}
|
|
1581
1591
|
}
|
|
1582
1592
|
addToast(el) {
|
|
@@ -1765,6 +1775,8 @@ class SonnerToaster extends HTMLElementCtor2 {
|
|
|
1765
1775
|
};
|
|
1766
1776
|
#onWindowResize = () => this.#reflow({ remeasure: true });
|
|
1767
1777
|
#onKeyDown = (event) => {
|
|
1778
|
+
if (event.defaultPrevented)
|
|
1779
|
+
return;
|
|
1768
1780
|
const target = event.target;
|
|
1769
1781
|
if (target) {
|
|
1770
1782
|
const tag = target.tagName;
|
|
@@ -1773,12 +1785,13 @@ class SonnerToaster extends HTMLElementCtor2 {
|
|
|
1773
1785
|
}
|
|
1774
1786
|
}
|
|
1775
1787
|
const hotkey = this.#hotkey();
|
|
1776
|
-
const
|
|
1777
|
-
|
|
1788
|
+
const allModifiers = ["altKey", "ctrlKey", "shiftKey", "metaKey"];
|
|
1789
|
+
const matches = hotkey.length > 0 && hotkey.every((key) => {
|
|
1790
|
+
if (allModifiers.includes(key)) {
|
|
1778
1791
|
return event[key];
|
|
1779
1792
|
}
|
|
1780
1793
|
return event.code === key;
|
|
1781
|
-
});
|
|
1794
|
+
}) && allModifiers.every((m) => hotkey.includes(m) || !event[m]);
|
|
1782
1795
|
if (matches) {
|
|
1783
1796
|
this.#expanded = true;
|
|
1784
1797
|
for (const t of this.#toasts)
|
|
@@ -1796,10 +1809,56 @@ class SonnerToaster extends HTMLElementCtor2 {
|
|
|
1796
1809
|
};
|
|
1797
1810
|
#hotkey() {
|
|
1798
1811
|
const raw = this.getAttribute("hotkey");
|
|
1799
|
-
if (
|
|
1812
|
+
if (raw === null)
|
|
1800
1813
|
return DEFAULT_HOTKEY;
|
|
1801
|
-
|
|
1814
|
+
const trimmed = raw.trim();
|
|
1815
|
+
if (trimmed === "" || trimmed.toLowerCase() === "none")
|
|
1816
|
+
return [];
|
|
1817
|
+
return trimmed.split("+").map((s) => s.trim());
|
|
1818
|
+
}
|
|
1819
|
+
#applyHotkeyHints() {
|
|
1820
|
+
const formatted = formatHotkeyForAria(this.#hotkey());
|
|
1821
|
+
if (!formatted) {
|
|
1822
|
+
if (this.#ownsAriaKeyshortcuts) {
|
|
1823
|
+
this.removeAttribute("aria-keyshortcuts");
|
|
1824
|
+
this.#ownsAriaKeyshortcuts = false;
|
|
1825
|
+
}
|
|
1826
|
+
if (this.#ownsTitle) {
|
|
1827
|
+
this.removeAttribute("title");
|
|
1828
|
+
this.#ownsTitle = false;
|
|
1829
|
+
}
|
|
1830
|
+
return;
|
|
1831
|
+
}
|
|
1832
|
+
if (!this.hasAttribute("aria-keyshortcuts") || this.#ownsAriaKeyshortcuts) {
|
|
1833
|
+
this.setAttribute("aria-keyshortcuts", formatted);
|
|
1834
|
+
this.#ownsAriaKeyshortcuts = true;
|
|
1835
|
+
}
|
|
1836
|
+
if (!this.hasAttribute("title") || this.#ownsTitle) {
|
|
1837
|
+
this.setAttribute("title", `Press ${formatted} to expand notifications`);
|
|
1838
|
+
this.#ownsTitle = true;
|
|
1839
|
+
}
|
|
1802
1840
|
}
|
|
1841
|
+
#ownsAriaKeyshortcuts = false;
|
|
1842
|
+
#ownsTitle = false;
|
|
1843
|
+
}
|
|
1844
|
+
function formatHotkeyForAria(tokens) {
|
|
1845
|
+
if (tokens.length === 0)
|
|
1846
|
+
return "";
|
|
1847
|
+
return tokens.map((t) => {
|
|
1848
|
+
if (t === "altKey")
|
|
1849
|
+
return "Alt";
|
|
1850
|
+
if (t === "ctrlKey")
|
|
1851
|
+
return "Control";
|
|
1852
|
+
if (t === "shiftKey")
|
|
1853
|
+
return "Shift";
|
|
1854
|
+
if (t === "metaKey")
|
|
1855
|
+
return "Meta";
|
|
1856
|
+
if (/^Key[A-Z]$/.test(t))
|
|
1857
|
+
return t.slice(3);
|
|
1858
|
+
if (/^Digit[0-9]$/.test(t))
|
|
1859
|
+
return t.slice(5);
|
|
1860
|
+
return t;
|
|
1861
|
+
}).join("+");
|
|
1803
1862
|
}
|
|
1804
1863
|
if (typeof customElements !== "undefined" && !customElements.get("sonner-toaster")) {
|
|
1805
1864
|
customElements.define("sonner-toaster", SonnerToaster);
|
|
@@ -1958,5 +2017,5 @@ export {
|
|
|
1958
2017
|
SonnerToast
|
|
1959
2018
|
};
|
|
1960
2019
|
|
|
1961
|
-
//# debugId=
|
|
2020
|
+
//# debugId=EF7F0EA6003CE16A64756E2164756E21
|
|
1962
2021
|
//# sourceMappingURL=sonner-wc.js.map
|
package/dist/sonner-wc.js.map
CHANGED
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
"import type { SonnerToastElement, SonnerToasterElement } from './types.js';\n\n/** Tracks toasts and toasters by id so the toast() helper can find and update them\n * across multiple toasters and from anywhere in the module. */\n\nconst toastsById = new Map<string | number, SonnerToastElement>();\nconst toasters = new Set<SonnerToasterElement>();\n\nlet counter = 1;\n\nexport function nextToastId(): number {\n return counter++;\n}\n\nexport function registerToast(el: SonnerToastElement): void {\n toastsById.set(el.toastId, el);\n}\n\nexport function unregisterToast(el: SonnerToastElement): void {\n const current = toastsById.get(el.toastId);\n if (current === el) toastsById.delete(el.toastId);\n}\n\nexport function getToast(id: string | number): SonnerToastElement | undefined {\n return toastsById.get(id);\n}\n\nexport function registerToaster(el: SonnerToasterElement): void {\n toasters.add(el);\n}\n\nexport function unregisterToaster(el: SonnerToasterElement): void {\n toasters.delete(el);\n}\n\n/** Find a toaster element to host a new toast. Prefer the most-recently-connected one. */\nexport function defaultToaster(): SonnerToasterElement | undefined {\n let last: SonnerToasterElement | undefined;\n for (const t of toasters) last = t;\n return last;\n}\n\nexport function allToasters(): readonly SonnerToasterElement[] {\n return Array.from(toasters);\n}\n\nexport function dismissAllToasts(): void {\n for (const t of toasters) t.dismissAll();\n}\n",
|
|
8
8
|
"/**\n * Stylesheets shared across both custom elements via adoptedStyleSheets.\n *\n * CSS lives in plain `.css` files under `./styles/` so editors give full\n * language support (highlighting, autocomplete, Prettier). Bun's bundler\n * inlines the file contents as strings via the `with { type: 'text' }`\n * import attribute; we then wrap each in a CSSStyleSheet at runtime.\n *\n * Two scopes:\n * - toaster.css: positioning, theme palettes, dir-based vars (cascades into\n * child shadow trees via inherited custom properties).\n * - toast.css: per-toast layout, animations, swipe, rich colors (reads\n * the inherited theme vars set by the toaster).\n */\n\nimport toasterCss from './styles/toaster.css' with { type: 'text' };\nimport toastCss from './styles/toast.css' with { type: 'text' };\n\nlet toasterSheet: CSSStyleSheet | null = null;\nlet toastSheet: CSSStyleSheet | null = null;\n\nexport function getToasterSheet(): CSSStyleSheet {\n if (!toasterSheet) {\n toasterSheet = new CSSStyleSheet();\n toasterSheet.replaceSync(toasterCss);\n }\n return toasterSheet;\n}\n\nexport function getToastSheet(): CSSStyleSheet {\n if (!toastSheet) {\n toastSheet = new CSSStyleSheet();\n toastSheet.replaceSync(toastCss);\n }\n return toastSheet;\n}\n",
|
|
9
9
|
"import {\n TOAST_LIFETIME,\n TIME_BEFORE_UNMOUNT,\n SWIPE_THRESHOLD,\n SWIPE_VELOCITY_THRESHOLD,\n} from './constants.js';\nimport { CLOSE_ICON, getTypeIcon } from './icons.js';\nimport { registerToast, unregisterToast } from './registry.js';\nimport { getToastSheet } from './styles.js';\nimport type {\n SonnerToastElement,\n SonnerToasterElement,\n SwipeDirection,\n ToastAction,\n ToastContent,\n ToastOptions,\n ToastType,\n} from './types.js';\n\n// SSR-safe: when imported in Node without a DOM, fall back to a no-op base class.\n// The element won't function server-side but the import won't crash.\nconst HTMLElementCtor: typeof HTMLElement =\n typeof HTMLElement !== 'undefined' ? HTMLElement : (class {} as unknown as typeof HTMLElement);\n\ntype PauseReason = 'hover-self' | 'focus-self' | 'doc-hidden' | 'toaster';\n\nfunction isUrgentType(type: ToastType): boolean {\n return type === 'error' || type === 'warning';\n}\n\nfunction setContent(host: HTMLElement, slotName: string, value: ToastContent | undefined): void {\n // Remove prior light DOM child(ren) with this slot name.\n for (const child of Array.from(host.children)) {\n if (child.getAttribute('slot') === slotName) host.removeChild(child);\n }\n if (value == null || value === '') return;\n const resolved = typeof value === 'function' ? value() : value;\n if (resolved instanceof Node) {\n if (resolved instanceof Element) resolved.setAttribute('slot', slotName);\n host.appendChild(resolved);\n } else {\n const span = document.createElement('span');\n span.setAttribute('slot', slotName);\n span.textContent = String(resolved);\n host.appendChild(span);\n }\n}\n\nfunction setButtonSlot(\n host: HTMLElement,\n slotName: 'action' | 'cancel',\n value: ToastAction | HTMLElement | undefined,\n defaultCloseHandler: () => void,\n): void {\n for (const child of Array.from(host.children)) {\n if (child.getAttribute('slot') === slotName) host.removeChild(child);\n }\n if (!value) return;\n if (value instanceof HTMLElement) {\n value.setAttribute('slot', slotName);\n host.appendChild(value);\n return;\n }\n const btn = document.createElement('button');\n btn.setAttribute('slot', slotName);\n btn.setAttribute('type', 'button');\n if (slotName === 'cancel') btn.setAttribute('data-cancel', '');\n else btn.setAttribute('data-action', '');\n btn.textContent = value.label;\n btn.addEventListener('click', (e) => {\n value.onClick?.(e as MouseEvent);\n if ((e as MouseEvent).defaultPrevented && slotName === 'action') return;\n defaultCloseHandler();\n });\n host.appendChild(btn);\n}\n\nconst SPINNER_BARS_HTML = Array.from(\n { length: 12 },\n () => '<div class=\"sonner-loading-bar\"></div>',\n).join('');\n\nconst SHADOW_TEMPLATE = `\n <div data-frame part=\"frame\">\n <button type=\"button\" data-close-button part=\"close-button\" hidden aria-label=\"Close toast\"></button>\n <div data-icon part=\"icon\">\n <slot name=\"icon\"></slot>\n <div class=\"sonner-loading-wrapper\" aria-hidden=\"true\">\n <div class=\"sonner-spinner\">${SPINNER_BARS_HTML}</div>\n </div>\n </div>\n <div data-content part=\"content\">\n <div data-title part=\"title\"><slot name=\"title\"></slot></div>\n <div data-description part=\"description\"><slot name=\"description\"></slot></div>\n </div>\n <slot name=\"cancel\"></slot>\n <slot name=\"action\"></slot>\n <slot part=\"custom\"></slot>\n </div>\n`;\n\nexport class SonnerToast extends HTMLElementCtor implements SonnerToastElement {\n static get observedAttributes() {\n return ['type', 'duration', 'dismissible', 'position', 'close-button', 'rich-colors', 'invert'];\n }\n\n toastId: string | number = 0;\n\n #shadow: ShadowRoot;\n #closeBtn!: HTMLButtonElement;\n #iconWrap!: HTMLDivElement;\n #titleWrap!: HTMLDivElement;\n #descWrap!: HTMLDivElement;\n\n #duration: number | null = null;\n #remainingTime = TOAST_LIFETIME;\n #timeoutId: ReturnType<typeof setTimeout> | null = null;\n #timerStartedAt = 0;\n #pauseReasons = new Set<PauseReason>();\n\n #pointerStart: { x: number; y: number } | null = null;\n #dragStartTime = 0;\n #swipeDirection: 'x' | 'y' | null = null;\n #swipeDirections: SwipeDirection[] | null = null;\n\n #mounted = false;\n #removed = false;\n #pendingRemoval = false;\n\n #onDismiss: ToastOptions['onDismiss'];\n #onAutoClose: ToastOptions['onAutoClose'];\n #closeButtonAriaLabel: string | null = null;\n /** Element that had focus immediately before focus first entered this toast.\n * Used to restore focus when the toast is dismissed while focused. */\n #prevFocus: Element | null = null;\n\n constructor() {\n super();\n this.#shadow = this.attachShadow({ mode: 'open' });\n this.#shadow.adoptedStyleSheets = [getToastSheet()];\n const tpl = document.createElement('template');\n tpl.innerHTML = SHADOW_TEMPLATE;\n this.#shadow.appendChild(tpl.content.cloneNode(true));\n this.#closeBtn = this.#shadow.querySelector('[data-close-button]') as HTMLButtonElement;\n this.#iconWrap = this.#shadow.querySelector('[data-icon]') as HTMLDivElement;\n this.#titleWrap = this.#shadow.querySelector('[data-title]') as HTMLDivElement;\n this.#descWrap = this.#shadow.querySelector('[data-description]') as HTMLDivElement;\n this.#closeBtn.innerHTML = CLOSE_ICON;\n this.#closeBtn.addEventListener('click', () => this.dismiss());\n\n // Reflect slot occupancy as host attributes so CSS can collapse empty wrappers.\n // (Browser support for `:host(:has(...))` is uneven; this is the reliable form.)\n const iconSlot = this.#shadow.querySelector('slot[name=\"icon\"]') as HTMLSlotElement;\n const descSlot = this.#shadow.querySelector('slot[name=\"description\"]') as HTMLSlotElement;\n iconSlot.addEventListener('slotchange', () => this.#reflectSlot('icon', iconSlot));\n descSlot.addEventListener('slotchange', () => this.#reflectSlot('description', descSlot));\n\n this.addEventListener('pointerdown', this.#onPointerDown);\n this.addEventListener('pointermove', this.#onPointerMove);\n this.addEventListener('pointerup', this.#onPointerUp);\n this.addEventListener('pointercancel', this.#onPointerUp);\n this.addEventListener('mouseenter', () => this.#pauseFor('hover-self'));\n this.addEventListener('mouseleave', () => this.#resumeFrom('hover-self'));\n this.addEventListener('focusin', (e: FocusEvent) => {\n this.#pauseFor('focus-self');\n // Capture the externally-focused element only once, on first entry.\n if (this.#prevFocus) return;\n const from = e.relatedTarget as Element | null;\n if (from && !this.contains(from)) this.#prevFocus = from;\n });\n this.addEventListener('focusout', () => this.#resumeFrom('focus-self'));\n this.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.#isDismissible()) {\n e.stopPropagation();\n this.dismiss();\n }\n });\n }\n\n connectedCallback() {\n if (!this.toastId) this.toastId = this.getAttribute('id') || 0;\n if (!this.hasAttribute('tabindex')) this.tabIndex = 0;\n this.#applyType(); // sets role/aria-live based on type (error/warning → alert/assertive)\n this.#applyDismissible();\n this.#applyPosition();\n this.#applyRichColors();\n this.#applyInvert();\n this.#applyCloseButton();\n this.setAttribute('data-sonner-toast', '');\n // aria-atomic ensures the whole toast re-announces when its contents\n // change (e.g. promise loading → success), instead of only the diff.\n if (!this.hasAttribute('aria-atomic')) this.setAttribute('aria-atomic', 'true');\n this.setAttribute('data-mounted', 'false');\n this.setAttribute('data-removed', 'false');\n this.setAttribute('data-swiping', 'false');\n this.setAttribute('data-swiped', 'false');\n this.setAttribute('data-swipe-out', 'false');\n if (!this.hasAttribute('data-styled')) this.setAttribute('data-styled', 'true');\n\n registerToast(this);\n\n document.addEventListener('visibilitychange', this.#onVisibilityChange);\n\n // Trigger mount on next frame so transitions kick in.\n requestAnimationFrame(() => {\n this.#mounted = true;\n this.setAttribute('data-mounted', 'true');\n this.dispatchEvent(\n new CustomEvent('sonner-toast-mounted', { bubbles: true, composed: true }),\n );\n this.#startTimer();\n });\n }\n\n disconnectedCallback() {\n if (this.#timeoutId) clearTimeout(this.#timeoutId);\n document.removeEventListener('visibilitychange', this.#onVisibilityChange);\n unregisterToast(this);\n }\n\n attributeChangedCallback(name: string, _old: string | null, _val: string | null) {\n if (!this.isConnected) return;\n switch (name) {\n case 'type':\n this.#applyType();\n break;\n case 'duration':\n this.#duration = this.#readDuration();\n this.#remainingTime = this.#duration ?? TOAST_LIFETIME;\n break;\n case 'dismissible':\n this.#applyDismissible();\n break;\n case 'position':\n this.#applyPosition();\n break;\n case 'close-button':\n this.#applyCloseButton();\n break;\n case 'rich-colors':\n this.#applyRichColors();\n break;\n case 'invert':\n this.#applyInvert();\n break;\n }\n }\n\n // ─── Public API ──────────────────────────────────────────────────────────\n\n get toastType(): ToastType {\n return (this.getAttribute('type') as ToastType) || 'default';\n }\n\n /** Imperative dismiss — triggers exit animation, then removes from DOM. */\n dismiss(): void {\n if (this.#removed || this.#pendingRemoval) return;\n this.#pendingRemoval = true;\n this.#removed = true;\n this.setAttribute('data-removed', 'true');\n if (this.#timeoutId) clearTimeout(this.#timeoutId);\n this.dispatchEvent(\n new CustomEvent('sonner-toast-dismissed', { bubbles: true, composed: true }),\n );\n setTimeout(() => {\n this.#restoreFocusIfInside();\n this.#onDismiss?.(this);\n this.remove();\n }, TIME_BEFORE_UNMOUNT);\n }\n\n /** If focus is still inside this toast at dismissal time, move it back to\n * whatever was focused before focus first entered. Otherwise leave focus\n * alone — the user has moved on. */\n #restoreFocusIfInside(): void {\n if (!this.#prevFocus) return;\n const active = document.activeElement;\n if (!active || !this.contains(active)) return;\n const target = this.#prevFocus as HTMLElement;\n if (!target.isConnected || typeof target.focus !== 'function') return;\n target.focus();\n }\n\n /** Apply new content/options. Used by toast.promise() for loading→success/error transitions. */\n update(options: ToastOptions & { title?: ToastContent; type?: ToastType }): void {\n const typeChanged = options.type !== undefined && options.type !== this.toastType;\n const wasUrgent = isUrgentType(this.toastType);\n if (options.type !== undefined) this.setAttribute('type', options.type);\n let timerNeedsReset = false;\n if (options.duration !== undefined) {\n this.setAttribute('duration', String(options.duration));\n this.#duration = options.duration;\n this.#remainingTime = options.duration;\n timerNeedsReset = true;\n } else if (typeChanged) {\n // Type changed without an explicit new duration — discard prior override\n // (e.g. the `Infinity` we set when the toast started life as 'loading')\n // so #effectiveDuration falls back through the attribute or default.\n this.#duration = null;\n this.removeAttribute('duration');\n this.#remainingTime = 0;\n timerNeedsReset = true;\n }\n if (options.dismissible !== undefined) {\n if (options.dismissible) this.setAttribute('dismissible', '');\n else this.removeAttribute('dismissible');\n }\n if (options.position !== undefined) this.setAttribute('position', options.position);\n if (options.closeButton !== undefined) {\n if (options.closeButton) this.setAttribute('close-button', '');\n else this.removeAttribute('close-button');\n }\n if (options.richColors !== undefined) {\n if (options.richColors) this.setAttribute('rich-colors', '');\n else this.removeAttribute('rich-colors');\n }\n if (options.invert !== undefined) {\n if (options.invert) this.setAttribute('invert', '');\n else this.removeAttribute('invert');\n }\n if (options.icon !== undefined) this.setIcon(options.icon);\n if (options.title !== undefined) this.setTitle(options.title);\n if (options.description !== undefined) this.setDescription(options.description);\n if (options.action !== undefined) {\n setButtonSlot(this, 'action', options.action, () => this.dismiss());\n }\n if (options.cancel !== undefined) {\n setButtonSlot(this, 'cancel', options.cancel, () => this.dismiss());\n }\n if (options.className) this.className = options.className;\n if (options.testId !== undefined) this.setAttribute('data-testid', options.testId);\n if (options.closeButtonAriaLabel !== undefined) {\n this.#closeButtonAriaLabel = options.closeButtonAriaLabel || null;\n this.#applyCloseButtonAriaLabel();\n }\n if (options.onDismiss) this.#onDismiss = options.onDismiss;\n if (options.onAutoClose) this.#onAutoClose = options.onAutoClose;\n if (timerNeedsReset) this.#resetTimer();\n // Route urgent post-mount transitions (e.g. promise loading → error)\n // through the toaster's dedicated alert region. Re-evaluation of the\n // toast's own aria-live attribute is unreliable across screen readers;\n // the alert region is fresh and consistent.\n if (this.#mounted && typeChanged && !wasUrgent && isUrgentType(this.toastType)) {\n const titleEl = Array.from(this.children).find((c) => c.getAttribute('slot') === 'title');\n const text = titleEl?.textContent?.trim();\n if (text) {\n const toaster = this.closest('sonner-toaster') as SonnerToasterElement | null;\n toaster?.announceUrgent(text);\n }\n }\n this.dispatchEvent(new CustomEvent('sonner-toast-updated', { bubbles: true, composed: true }));\n }\n\n setTitle(value: ToastContent): void {\n setContent(this, 'title', value);\n this.#applyCloseButtonAriaLabel();\n }\n\n /** Apply the close button's aria-label: explicit override wins, otherwise\n * `Close: <title>` for disambiguation, falling back to `Close toast`. */\n #applyCloseButtonAriaLabel(): void {\n if (this.#closeButtonAriaLabel) {\n this.#closeBtn.setAttribute('aria-label', this.#closeButtonAriaLabel);\n return;\n }\n const titleEl = Array.from(this.children).find((c) => c.getAttribute('slot') === 'title');\n const text = titleEl?.textContent?.trim();\n this.#closeBtn.setAttribute('aria-label', text ? `Close: ${text}` : 'Close toast');\n }\n\n setDescription(value: ToastContent | undefined): void {\n setContent(this, 'description', value);\n }\n\n setIcon(value: Node | string | null | undefined): void {\n for (const child of Array.from(this.children)) {\n if (child.getAttribute('slot') === 'icon') this.removeChild(child);\n }\n if (value == null) return;\n if (value instanceof Node) {\n if (value instanceof Element) value.setAttribute('slot', 'icon');\n this.appendChild(value);\n } else {\n // Parse the HTML string and slot its first element directly — wrapping in a\n // <span> adds inline-baseline vertical wobble that breaks the icon's vertical\n // centering against the title.\n const tpl = document.createElement('template');\n tpl.innerHTML = value;\n const el = tpl.content.firstElementChild;\n if (el) {\n el.setAttribute('slot', 'icon');\n this.appendChild(el);\n }\n }\n }\n\n setHandlers(handlers: {\n onDismiss?: ToastOptions['onDismiss'];\n onAutoClose?: ToastOptions['onAutoClose'];\n }): void {\n this.#onDismiss = handlers.onDismiss;\n this.#onAutoClose = handlers.onAutoClose;\n }\n\n /** Called by the toaster to pause/resume this toast's auto-dismiss timer. */\n setPaused(paused: boolean): void {\n if (paused) this.#pauseFor('toaster');\n else this.#resumeFrom('toaster');\n }\n\n // ─── Internal ────────────────────────────────────────────────────────────\n\n #reflectSlot(name: 'icon' | 'description', slot: HTMLSlotElement) {\n const has = slot.assignedNodes().length > 0;\n if (has) this.setAttribute(`data-has-${name}`, '');\n else this.removeAttribute(`data-has-${name}`);\n }\n\n #applyType() {\n const type = this.toastType;\n this.setAttribute('data-type', type);\n const urgent = isUrgentType(type);\n this.setAttribute('role', urgent ? 'alert' : 'status');\n this.setAttribute('aria-live', urgent ? 'assertive' : 'polite');\n if (type === 'loading') {\n this.setAttribute('data-promise', 'true');\n // The spinner lives in the shadow DOM (see SHADOW_TEMPLATE). CSS reveals it when\n // data-type='loading' and no user icon is slotted. Nothing to do here.\n // Clear any prior default icon left from a previous non-loading type.\n for (const c of Array.from(this.children)) {\n if (c.getAttribute('slot') === 'icon' && c.hasAttribute('data-sonner-default-icon'))\n this.removeChild(c);\n }\n } else {\n this.removeAttribute('data-promise');\n const hasUserIcon = Array.from(this.children).some((c) => {\n if (c.getAttribute('slot') !== 'icon') return false;\n // a previously-set default type icon is marked with data-sonner-default-icon\n return !c.hasAttribute('data-sonner-default-icon');\n });\n if (!hasUserIcon) {\n // Remove prior default icon\n for (const c of Array.from(this.children)) {\n if (c.getAttribute('slot') === 'icon' && c.hasAttribute('data-sonner-default-icon'))\n this.removeChild(c);\n }\n const builtin = getTypeIcon(type);\n if (builtin) {\n // Parse and slot the actual SVG/spinner element directly (no span wrapper).\n const tpl = document.createElement('template');\n tpl.innerHTML = builtin;\n const el = tpl.content.firstElementChild;\n if (el) {\n el.setAttribute('slot', 'icon');\n el.setAttribute('data-sonner-default-icon', '');\n this.appendChild(el);\n }\n }\n }\n }\n }\n\n #applyDismissible() {\n const dismissible = this.getAttribute('dismissible') !== 'false';\n this.setAttribute('data-dismissible', String(dismissible));\n }\n\n #applyPosition() {\n const pos = this.getAttribute('position');\n if (!pos) return;\n const [y, x] = pos.split('-');\n if (y) this.setAttribute('data-y-position', y);\n if (x) this.setAttribute('data-x-position', x);\n }\n\n #applyCloseButton() {\n const show = this.hasAttribute('close-button') && this.getAttribute('close-button') !== 'false';\n this.#closeBtn.hidden = !show;\n }\n\n #applyRichColors() {\n const rich = this.hasAttribute('rich-colors') && this.getAttribute('rich-colors') !== 'false';\n this.setAttribute('data-rich-colors', String(rich));\n }\n\n #applyInvert() {\n const invert = this.hasAttribute('invert') && this.getAttribute('invert') !== 'false';\n this.setAttribute('data-invert', String(invert));\n }\n\n #readDuration(): number | null {\n const raw = this.getAttribute('duration');\n if (raw == null) return null;\n if (raw === 'Infinity') return Infinity;\n const n = Number(raw);\n return Number.isFinite(n) || n === Infinity ? n : null;\n }\n\n #effectiveDuration(): number {\n const explicit = this.#duration ?? this.#readDuration();\n if (explicit !== null) return explicit;\n // No caller-provided duration: loading toasts wait forever (they're meant to be\n // resolved by toast.promise or an explicit dismiss); everything else uses the\n // default lifetime.\n if (this.toastType === 'loading') return Infinity;\n return TOAST_LIFETIME;\n }\n\n #startTimer() {\n if (!this.#mounted || this.#removed) return;\n if (this.#pauseReasons.size > 0) return;\n if (this.#timeoutId !== null) return;\n const dur = this.#effectiveDuration();\n if (dur === Infinity) return;\n this.#remainingTime = this.#remainingTime > 0 ? this.#remainingTime : dur;\n this.#timerStartedAt = Date.now();\n this.#timeoutId = setTimeout(() => {\n this.#timeoutId = null;\n this.#onAutoClose?.(this);\n this.dispatchEvent(\n new CustomEvent('sonner-toast-autoclosed', { bubbles: true, composed: true }),\n );\n this.dismiss();\n }, this.#remainingTime);\n }\n\n /** Add a pause reason. Pauses the timer if it wasn't already paused. */\n #pauseFor(reason: PauseReason) {\n const wasUnpaused = this.#pauseReasons.size === 0;\n this.#pauseReasons.add(reason);\n if (wasUnpaused && this.#timeoutId !== null) {\n clearTimeout(this.#timeoutId);\n this.#timeoutId = null;\n const elapsed = Date.now() - this.#timerStartedAt;\n this.#remainingTime = Math.max(0, this.#remainingTime - elapsed);\n }\n }\n\n /** Remove a pause reason. Resumes the timer when the last reason is cleared. */\n #resumeFrom(reason: PauseReason) {\n if (!this.#pauseReasons.delete(reason)) return;\n if (this.#pauseReasons.size === 0 && !this.#removed) this.#startTimer();\n }\n\n #resetTimer() {\n if (this.#timeoutId) {\n clearTimeout(this.#timeoutId);\n this.#timeoutId = null;\n }\n this.#remainingTime = this.#effectiveDuration();\n this.#startTimer();\n }\n\n #onVisibilityChange = () => {\n if (document.visibilityState === 'hidden') this.#pauseFor('doc-hidden');\n else this.#resumeFrom('doc-hidden');\n };\n\n // ─── Swipe ───────────────────────────────────────────────────────────────\n\n #isDismissible(): boolean {\n return this.getAttribute('dismissible') !== 'false';\n }\n\n #onPointerDown = (event: PointerEvent) => {\n if (event.button === 2) return;\n if (this.toastType === 'loading' || !this.#isDismissible()) return;\n // event.target is retargeted to the host as the event crosses the shadow boundary.\n // composedPath() preserves the actual element clicked inside shadow DOM, so we can\n // detect clicks on the close button or action/cancel buttons and skip swipe handling.\n const realTarget = event.composedPath()[0] as HTMLElement | undefined;\n if (realTarget) {\n const inButton =\n realTarget.tagName === 'BUTTON' ||\n (typeof realTarget.closest === 'function' && realTarget.closest('button'));\n if (inButton) return;\n }\n this.#dragStartTime = Date.now();\n try {\n this.setPointerCapture(event.pointerId);\n } catch {\n /* not capturable; ignore */\n }\n this.setAttribute('data-swiping', 'true');\n this.#pointerStart = { x: event.clientX, y: event.clientY };\n if (!this.#swipeDirections) {\n // Read effective position from data-y-position/data-x-position which the toaster\n // sets on every toast (whether or not the toast has its own `position` attribute).\n const y = this.getAttribute('data-y-position');\n const x = this.getAttribute('data-x-position');\n const dirs: SwipeDirection[] = [];\n if (y === 'top' || y === 'bottom') dirs.push(y);\n if (x === 'left' || x === 'right') dirs.push(x);\n this.#swipeDirections = dirs.length > 0 ? dirs : ['bottom', 'right'];\n }\n };\n\n #onPointerMove = (event: PointerEvent) => {\n if (!this.#pointerStart || !this.#isDismissible()) return;\n if ((window.getSelection()?.toString().length ?? 0) > 0) return;\n\n const yDelta = event.clientY - this.#pointerStart.y;\n const xDelta = event.clientX - this.#pointerStart.x;\n const dirs = this.#swipeDirections!;\n\n if (!this.#swipeDirection && (Math.abs(xDelta) > 1 || Math.abs(yDelta) > 1)) {\n this.#swipeDirection = Math.abs(xDelta) > Math.abs(yDelta) ? 'x' : 'y';\n }\n\n const dampen = (delta: number) => 1 / (1.5 + Math.abs(delta) / 20);\n\n let sx = 0;\n let sy = 0;\n if (this.#swipeDirection === 'y') {\n if (dirs.includes('top') || dirs.includes('bottom')) {\n if ((dirs.includes('top') && yDelta < 0) || (dirs.includes('bottom') && yDelta > 0)) {\n sy = yDelta;\n } else {\n const d = yDelta * dampen(yDelta);\n sy = Math.abs(d) < Math.abs(yDelta) ? d : yDelta;\n }\n }\n } else if (this.#swipeDirection === 'x') {\n if (dirs.includes('left') || dirs.includes('right')) {\n if ((dirs.includes('left') && xDelta < 0) || (dirs.includes('right') && xDelta > 0)) {\n sx = xDelta;\n } else {\n const d = xDelta * dampen(xDelta);\n sx = Math.abs(d) < Math.abs(xDelta) ? d : xDelta;\n }\n }\n }\n\n if (Math.abs(sx) > 0 || Math.abs(sy) > 0) this.setAttribute('data-swiped', 'true');\n this.style.setProperty('--swipe-amount-x', `${sx}px`);\n this.style.setProperty('--swipe-amount-y', `${sy}px`);\n };\n\n #onPointerUp = () => {\n if (this.getAttribute('data-swipe-out') === 'true' || !this.#isDismissible()) {\n this.#pointerStart = null;\n this.#swipeDirection = null;\n this.setAttribute('data-swiping', 'false');\n return;\n }\n const sx = parseFloat(this.style.getPropertyValue('--swipe-amount-x')) || 0;\n const sy = parseFloat(this.style.getPropertyValue('--swipe-amount-y')) || 0;\n const time = Math.max(1, Date.now() - this.#dragStartTime);\n const amount = this.#swipeDirection === 'x' ? sx : sy;\n const velocity = Math.abs(amount) / time;\n\n if (Math.abs(amount) >= SWIPE_THRESHOLD || velocity > SWIPE_VELOCITY_THRESHOLD) {\n if (this.#swipeDirection === 'x') {\n this.setAttribute('data-swipe-direction', sx > 0 ? 'right' : 'left');\n } else {\n this.setAttribute('data-swipe-direction', sy > 0 ? 'down' : 'up');\n }\n this.setAttribute('data-swipe-out', 'true');\n this.dismiss();\n } else {\n this.style.setProperty('--swipe-amount-x', '0px');\n this.style.setProperty('--swipe-amount-y', '0px');\n this.setAttribute('data-swiped', 'false');\n }\n this.setAttribute('data-swiping', 'false');\n this.#pointerStart = null;\n this.#swipeDirection = null;\n };\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('sonner-toast')) {\n customElements.define('sonner-toast', SonnerToast);\n}\n",
|
|
10
|
-
"import { DEFAULT_HOTKEY, GAP, TOAST_WIDTH, VISIBLE_TOASTS_AMOUNT } from './constants.js';\nimport { registerToaster, unregisterToaster } from './registry.js';\nimport { getToasterSheet } from './styles.js';\nimport { SonnerToast } from './sonner-toast.js';\nimport type {\n Position,\n SonnerToastElement,\n SonnerToasterElement,\n Theme,\n ToasterOptions,\n} from './types.js';\n\nconst HTMLElementCtor: typeof HTMLElement =\n typeof HTMLElement !== 'undefined' ? HTMLElement : (class {} as unknown as typeof HTMLElement);\n\nfunction parseOffsetValue(v: string | number | undefined, fallback: string): string {\n if (v == null) return fallback;\n if (typeof v === 'number') return `${v}px`;\n return v;\n}\n\nfunction applyOffsetVars(\n host: HTMLElement,\n opts: ToasterOptions['offset'],\n prefix: string,\n fallback: string,\n) {\n const sides = ['top', 'right', 'bottom', 'left'] as const;\n if (opts == null || typeof opts === 'string' || typeof opts === 'number') {\n const v = parseOffsetValue(opts, fallback);\n for (const side of sides) host.style.setProperty(`${prefix}-${side}`, v);\n } else {\n for (const side of sides) {\n host.style.setProperty(`${prefix}-${side}`, parseOffsetValue(opts[side], fallback));\n }\n }\n}\n\nexport class SonnerToaster extends HTMLElementCtor implements SonnerToasterElement {\n static get observedAttributes() {\n return [\n 'position',\n 'theme',\n 'rich-colors',\n 'expand',\n 'duration',\n 'gap',\n 'visible-toasts',\n 'close-button',\n 'invert',\n 'dir',\n 'offset',\n 'mobile-offset',\n 'hotkey',\n 'container-aria-label',\n ];\n }\n\n #shadow: ShadowRoot;\n #alertAnnouncer!: HTMLDivElement;\n #childObserver: MutationObserver;\n #resizeObserver: ResizeObserver;\n #toasts: SonnerToast[] = [];\n /** Last measured height per toast. We keep the prior value while a toast is mid-removal\n * (data-removed='true') so its shrinking does not corrupt the offsets of survivors. */\n #heights = new Map<SonnerToast, number>();\n /** True during the synchronous measurement window inside #reflow so the ResizeObserver\n * doesn't recursively re-fire while we're toggling style.height to measure naturals. */\n #measuring = false;\n #expanded = false;\n #interacting = false;\n #themeMql: MediaQueryList | null = null;\n #themeMqlHandler: ((e: MediaQueryListEvent | MediaQueryList) => void) | null = null;\n\n constructor() {\n super();\n this.#shadow = this.attachShadow({ mode: 'open' });\n this.#shadow.adoptedStyleSheets = [getToasterSheet()];\n // Dedicated alert region for urgent re-announcements (e.g. promise\n // loading → error). Browser/SR support for changing a toast's own\n // aria-live mid-flight is inconsistent; routing the new text through\n // a fresh, stable live region guarantees the alert is announced.\n this.#shadow.innerHTML =\n '<div data-frame part=\"frame\"><slot></slot></div>' +\n '<div data-alert-announcer role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\" ' +\n 'style=\"position:absolute;left:0;top:0;width:1px;height:1px;margin:-1px;padding:0;' +\n 'overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;' +\n 'pointer-events:none\"></div>';\n this.#alertAnnouncer = this.#shadow.querySelector('[data-alert-announcer]') as HTMLDivElement;\n\n this.#childObserver = new MutationObserver((records) => {\n let changed = false;\n for (const r of records) {\n for (const node of Array.from(r.addedNodes)) {\n if (node instanceof SonnerToast) {\n this.#toasts.unshift(node);\n this.#resizeObserver.observe(node);\n this.#decorateToast(node);\n changed = true;\n }\n }\n for (const node of Array.from(r.removedNodes)) {\n if (node instanceof SonnerToast) {\n this.#toasts = this.#toasts.filter((t) => t !== node);\n this.#heights.delete(node);\n this.#resizeObserver.unobserve(node);\n changed = true;\n }\n }\n }\n if (changed) this.#reflow({ remeasure: true });\n });\n\n // ResizeObserver fires every frame while a height transition is running (because the\n // rendered size IS changing). We must NOT re-measure on those events — doing so would\n // temporarily set style.height='auto' on a mid-transition toast and cancel the\n // animation. RO here only re-applies layout from the cached heights.\n this.#resizeObserver = new ResizeObserver(() => this.#reflow({ remeasure: false }));\n\n this.addEventListener('mouseenter', this.#onPointerEnter);\n this.addEventListener('mouseleave', this.#onPointerLeave);\n this.addEventListener('focusin', this.#onFocusIn);\n this.addEventListener('focusout', this.#onFocusOut);\n this.addEventListener('sonner-toast-dismissed', () => this.#reflow({ remeasure: false }));\n // Content actually changed — re-measure the toast that updated.\n this.addEventListener('sonner-toast-updated', () => this.#reflow({ remeasure: true }));\n this.addEventListener('sonner-toast-mounted', () => this.#reflow({ remeasure: true }));\n }\n\n connectedCallback() {\n if (!this.hasAttribute('tabindex')) this.tabIndex = -1;\n if (!this.hasAttribute('role')) this.setAttribute('role', 'region');\n if (!this.hasAttribute('aria-label'))\n this.setAttribute('aria-label', this.getAttribute('container-aria-label') ?? 'Notifications');\n this.setAttribute('data-sonner-toaster', '');\n this.#applyPosition();\n this.#applyTheme();\n this.#applyDir();\n this.#applyGap();\n this.#applyWidth();\n this.#applyOffsets();\n\n this.#childObserver.observe(this, { childList: true });\n for (const child of Array.from(this.children)) {\n if (child instanceof SonnerToast) {\n this.#toasts.unshift(child);\n this.#resizeObserver.observe(child);\n this.#decorateToast(child);\n }\n }\n document.addEventListener('keydown', this.#onKeyDown);\n window.addEventListener('resize', this.#onWindowResize);\n registerToaster(this);\n this.#reflow({ remeasure: true });\n }\n\n disconnectedCallback() {\n this.#childObserver.disconnect();\n this.#resizeObserver.disconnect();\n document.removeEventListener('keydown', this.#onKeyDown);\n window.removeEventListener('resize', this.#onWindowResize);\n if (this.#themeMql && this.#themeMqlHandler) {\n this.#themeMql.removeEventListener('change', this.#themeMqlHandler);\n }\n unregisterToaster(this);\n }\n\n attributeChangedCallback(name: string, _old: string | null, _val: string | null) {\n if (!this.isConnected) return;\n switch (name) {\n case 'position':\n this.#applyPosition();\n this.#applyToastPositions();\n this.#reflow();\n break;\n case 'theme':\n this.#applyTheme();\n break;\n case 'dir':\n this.#applyDir();\n break;\n case 'gap':\n this.#applyGap();\n this.#reflow();\n break;\n case 'visible-toasts':\n this.#reflow();\n break;\n case 'expand':\n this.#expanded = this.hasAttribute('expand');\n for (const t of this.#toasts) t.setPaused(this.#expanded || this.#interacting);\n this.#reflow();\n break;\n case 'close-button':\n case 'rich-colors':\n case 'invert':\n this.#propagateBoolean(name);\n break;\n case 'offset':\n case 'mobile-offset':\n this.#applyOffsets();\n break;\n case 'container-aria-label':\n this.setAttribute('aria-label', this.getAttribute('container-aria-label') ?? 'Notifications');\n break;\n }\n }\n\n // ─── Public API ──────────────────────────────────────────────────────────\n\n addToast(el: SonnerToastElement): SonnerToastElement {\n this.appendChild(el);\n return el;\n }\n\n /** Re-announce `text` through the dedicated assertive live region. Used when\n * a toast transitions to an urgent type (error/warning) after mount — the\n * toast's own aria-live change is unreliable across screen readers, so we\n * route the alert through a fresh region whose announcement behavior is\n * consistent. The clear-then-set pattern forces SRs that diff content to\n * treat the new text as a new announcement. */\n announceUrgent(text: string): void {\n this.#alertAnnouncer.textContent = '';\n requestAnimationFrame(() => {\n this.#alertAnnouncer.textContent = text;\n });\n }\n\n dismissAll(): void {\n // Iterate live children so toasts appended this tick (before the MutationObserver\n // fires) are still covered.\n for (const child of Array.from(this.children)) {\n if (child instanceof SonnerToast) child.dismiss();\n }\n }\n\n // ─── Configuration application ───────────────────────────────────────────\n\n #getPosition(): Position {\n return (this.getAttribute('position') as Position) || 'bottom-right';\n }\n\n #applyPosition() {\n const [y, x] = this.#getPosition().split('-');\n if (y) this.setAttribute('data-y-position', y);\n if (x) this.setAttribute('data-x-position', x);\n }\n\n #applyTheme() {\n if (this.#themeMql && this.#themeMqlHandler) {\n this.#themeMql.removeEventListener('change', this.#themeMqlHandler);\n this.#themeMql = null;\n this.#themeMqlHandler = null;\n }\n const theme = (this.getAttribute('theme') as Theme) || 'light';\n if (theme === 'system') {\n this.#themeMql = window.matchMedia('(prefers-color-scheme: dark)');\n const apply = (mql: MediaQueryList | MediaQueryListEvent) => {\n this.setAttribute('data-sonner-theme', mql.matches ? 'dark' : 'light');\n };\n this.#themeMqlHandler = apply;\n this.#themeMql.addEventListener('change', apply);\n apply(this.#themeMql);\n } else {\n this.setAttribute('data-sonner-theme', theme);\n }\n }\n\n #applyDir() {\n const dir = this.getAttribute('dir');\n if (dir === 'auto' || !dir) {\n const computed = window.getComputedStyle(document.documentElement).direction || 'ltr';\n this.setAttribute('dir', computed);\n }\n }\n\n #applyGap() {\n const raw = this.getAttribute('gap');\n const gap = raw ? Number(raw) : GAP;\n this.style.setProperty('--gap', `${Number.isFinite(gap) ? gap : GAP}px`);\n }\n\n #applyWidth() {\n this.style.setProperty('--width', `${TOAST_WIDTH}px`);\n }\n\n #applyOffsets() {\n const off = this.getAttribute('offset');\n const mobileOff = this.getAttribute('mobile-offset');\n applyOffsetVars(this, off ?? undefined, '--offset', '24px');\n applyOffsetVars(this, mobileOff ?? undefined, '--mobile-offset', '16px');\n }\n\n #applyToastPositions() {\n for (const t of this.#toasts) {\n if (!t.hasAttribute('position')) {\n const [y, x] = this.#getPosition().split('-');\n if (y) t.setAttribute('data-y-position', y);\n if (x) t.setAttribute('data-x-position', x);\n }\n }\n }\n\n /** Mirror a toaster-level boolean attribute (close-button, rich-colors, invert) onto\n * every existing toast that hasn't set the same attribute itself. Per-toast overrides\n * still win. */\n #propagateBoolean(attr: 'close-button' | 'rich-colors' | 'invert') {\n const on = this.hasAttribute(attr);\n for (const t of this.#toasts) {\n // Skip if the toast explicitly opted out with `attr=\"false\"` — that's a per-toast override.\n if (t.getAttribute(attr) === 'false') continue;\n if (on) t.setAttribute(attr, '');\n else t.removeAttribute(attr);\n }\n }\n\n #decorateToast(toast: SonnerToast) {\n if (!toast.hasAttribute('position')) {\n const [y, x] = this.#getPosition().split('-');\n if (y) toast.setAttribute('data-y-position', y);\n if (x) toast.setAttribute('data-x-position', x);\n }\n if (!toast.hasAttribute('duration')) {\n const inherit = this.getAttribute('duration');\n if (inherit) toast.setAttribute('duration', inherit);\n }\n if (!toast.hasAttribute('close-button') && this.hasAttribute('close-button')) {\n toast.setAttribute('close-button', '');\n }\n if (!toast.hasAttribute('rich-colors') && this.hasAttribute('rich-colors')) {\n toast.setAttribute('rich-colors', '');\n }\n if (!toast.hasAttribute('invert') && this.hasAttribute('invert')) {\n toast.setAttribute('invert', '');\n }\n }\n\n // ─── Stacking math ───────────────────────────────────────────────────────\n\n #reflow(opts: { remeasure: boolean } = { remeasure: false }) {\n const visibleAmount = Number(this.getAttribute('visible-toasts') ?? VISIBLE_TOASTS_AMOUNT);\n\n // Only measure when explicitly requested (toast added / updated / mounted / window\n // resized). Measuring on every reflow corrupts running height transitions, because\n // the temp `style.height='auto'` cancels them.\n if (opts.remeasure) {\n this.#measuring = true;\n for (const t of this.#toasts) {\n if (t.getAttribute('data-removed') === 'true') continue;\n const prior = t.style.height;\n t.style.height = 'auto';\n this.#heights.set(t, t.getBoundingClientRect().height);\n t.style.height = prior;\n }\n this.#measuring = false;\n }\n\n const active = this.#toasts.filter((t) => t.getAttribute('data-removed') !== 'true');\n const frontHeight = active.length > 0 ? (this.#heights.get(active[0]!) ?? 0) : 0;\n const gap = this.#gapPx();\n const expanded = this.#expanded || this.#interacting;\n let cumulative = 0;\n\n // Single inherited value for all toasts — when this changes, every toast's\n // height: var(--front-toast-height) re-resolves and transitions in lockstep.\n this.style.setProperty('--front-toast-height', `${frontHeight}px`);\n\n for (let i = 0; i < active.length; i++) {\n const toast = active[i]!;\n const h = this.#heights.get(toast) ?? 0;\n const isFront = i === 0;\n const offset = i === 0 ? 0 : cumulative + i * gap;\n cumulative += h;\n\n toast.style.setProperty('--index', String(i));\n toast.style.setProperty('--toasts-before', String(i));\n toast.style.setProperty('--z-index', String(active.length - i));\n toast.style.setProperty('--offset', `${offset}px`);\n toast.style.setProperty('--initial-height', `${h}px`);\n // height itself is driven by CSS now (interpolate-size handles auto↔pixel).\n toast.setAttribute('data-index', String(i));\n toast.setAttribute('data-front', String(isFront));\n toast.setAttribute('data-visible', String(i + 1 <= visibleAmount));\n toast.setAttribute('data-expanded', String(expanded));\n // Hide non-front toasts from assistive tech when collapsed: they're\n // visually stacked behind and shouldn't compete with the front toast\n // for screen-reader attention. Expanding the stack reveals them again.\n if (expanded || isFront) toast.removeAttribute('aria-hidden');\n else toast.setAttribute('aria-hidden', 'true');\n }\n }\n\n #gapPx(): number {\n const raw = this.getAttribute('gap');\n const n = raw ? Number(raw) : GAP;\n return Number.isFinite(n) ? n : GAP;\n }\n\n // ─── Hover / expand / hotkey ─────────────────────────────────────────────\n\n #onPointerEnter = () => {\n this.#interacting = true;\n for (const t of this.#toasts) t.setPaused(true);\n this.#reflow();\n };\n\n #onPointerLeave = () => {\n this.#interacting = false;\n for (const t of this.#toasts) t.setPaused(false);\n this.#reflow();\n };\n\n #onFocusIn = () => {\n this.#interacting = true;\n for (const t of this.#toasts) t.setPaused(true);\n this.#reflow();\n };\n\n #onFocusOut = (e: FocusEvent) => {\n const next = e.relatedTarget as Node | null;\n if (next && this.contains(next)) return;\n this.#interacting = false;\n for (const t of this.#toasts) t.setPaused(false);\n this.#reflow();\n };\n\n #onWindowResize = () => this.#reflow({ remeasure: true });\n\n #onKeyDown = (event: KeyboardEvent) => {\n // Don't hijack the hotkey when the user is typing.\n const target = event.target as HTMLElement | null;\n if (target) {\n const tag = target.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || target.isContentEditable) {\n return;\n }\n }\n const hotkey = this.#hotkey();\n const matches = hotkey.every((key) => {\n if (key === 'altKey' || key === 'ctrlKey' || key === 'shiftKey' || key === 'metaKey') {\n return event[key as 'altKey'];\n }\n return event.code === key;\n });\n if (matches) {\n this.#expanded = true;\n for (const t of this.#toasts) t.setPaused(true);\n this.focus();\n this.#reflow();\n return;\n }\n if (event.key === 'Escape' && this.#expanded && this.contains(document.activeElement)) {\n this.#expanded = false;\n for (const t of this.#toasts) t.setPaused(false);\n this.#reflow();\n }\n };\n\n #hotkey(): readonly string[] {\n const raw = this.getAttribute('hotkey');\n if (!raw) return DEFAULT_HOTKEY;\n return raw.split('+').map((s) => s.trim());\n }\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('sonner-toaster')) {\n customElements.define('sonner-toaster', SonnerToaster);\n}\n",
|
|
10
|
+
"import { DEFAULT_HOTKEY, GAP, TOAST_WIDTH, VISIBLE_TOASTS_AMOUNT } from './constants.js';\nimport { registerToaster, unregisterToaster } from './registry.js';\nimport { getToasterSheet } from './styles.js';\nimport { SonnerToast } from './sonner-toast.js';\nimport type {\n Position,\n SonnerToastElement,\n SonnerToasterElement,\n Theme,\n ToasterOptions,\n} from './types.js';\n\nconst HTMLElementCtor: typeof HTMLElement =\n typeof HTMLElement !== 'undefined' ? HTMLElement : (class {} as unknown as typeof HTMLElement);\n\nfunction parseOffsetValue(v: string | number | undefined, fallback: string): string {\n if (v == null) return fallback;\n if (typeof v === 'number') return `${v}px`;\n return v;\n}\n\nfunction applyOffsetVars(\n host: HTMLElement,\n opts: ToasterOptions['offset'],\n prefix: string,\n fallback: string,\n) {\n const sides = ['top', 'right', 'bottom', 'left'] as const;\n if (opts == null || typeof opts === 'string' || typeof opts === 'number') {\n const v = parseOffsetValue(opts, fallback);\n for (const side of sides) host.style.setProperty(`${prefix}-${side}`, v);\n } else {\n for (const side of sides) {\n host.style.setProperty(`${prefix}-${side}`, parseOffsetValue(opts[side], fallback));\n }\n }\n}\n\nexport class SonnerToaster extends HTMLElementCtor implements SonnerToasterElement {\n static get observedAttributes() {\n return [\n 'position',\n 'theme',\n 'rich-colors',\n 'expand',\n 'duration',\n 'gap',\n 'visible-toasts',\n 'close-button',\n 'invert',\n 'dir',\n 'offset',\n 'mobile-offset',\n 'hotkey',\n 'container-aria-label',\n ];\n }\n\n #shadow: ShadowRoot;\n #alertAnnouncer!: HTMLDivElement;\n #childObserver: MutationObserver;\n #resizeObserver: ResizeObserver;\n #toasts: SonnerToast[] = [];\n /** Last measured height per toast. We keep the prior value while a toast is mid-removal\n * (data-removed='true') so its shrinking does not corrupt the offsets of survivors. */\n #heights = new Map<SonnerToast, number>();\n /** True during the synchronous measurement window inside #reflow so the ResizeObserver\n * doesn't recursively re-fire while we're toggling style.height to measure naturals. */\n #measuring = false;\n #expanded = false;\n #interacting = false;\n #themeMql: MediaQueryList | null = null;\n #themeMqlHandler: ((e: MediaQueryListEvent | MediaQueryList) => void) | null = null;\n\n constructor() {\n super();\n this.#shadow = this.attachShadow({ mode: 'open' });\n this.#shadow.adoptedStyleSheets = [getToasterSheet()];\n // Dedicated alert region for urgent re-announcements (e.g. promise\n // loading → error). Browser/SR support for changing a toast's own\n // aria-live mid-flight is inconsistent; routing the new text through\n // a fresh, stable live region guarantees the alert is announced.\n this.#shadow.innerHTML =\n '<div data-frame part=\"frame\"><slot></slot></div>' +\n '<div data-alert-announcer role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\" ' +\n 'style=\"position:absolute;left:0;top:0;width:1px;height:1px;margin:-1px;padding:0;' +\n 'overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;' +\n 'pointer-events:none\"></div>';\n this.#alertAnnouncer = this.#shadow.querySelector('[data-alert-announcer]') as HTMLDivElement;\n\n this.#childObserver = new MutationObserver((records) => {\n let changed = false;\n for (const r of records) {\n for (const node of Array.from(r.addedNodes)) {\n if (node instanceof SonnerToast) {\n this.#toasts.unshift(node);\n this.#resizeObserver.observe(node);\n this.#decorateToast(node);\n changed = true;\n }\n }\n for (const node of Array.from(r.removedNodes)) {\n if (node instanceof SonnerToast) {\n this.#toasts = this.#toasts.filter((t) => t !== node);\n this.#heights.delete(node);\n this.#resizeObserver.unobserve(node);\n changed = true;\n }\n }\n }\n if (changed) this.#reflow({ remeasure: true });\n });\n\n // ResizeObserver fires every frame while a height transition is running (because the\n // rendered size IS changing). We must NOT re-measure on those events — doing so would\n // temporarily set style.height='auto' on a mid-transition toast and cancel the\n // animation. RO here only re-applies layout from the cached heights.\n this.#resizeObserver = new ResizeObserver(() => this.#reflow({ remeasure: false }));\n\n this.addEventListener('mouseenter', this.#onPointerEnter);\n this.addEventListener('mouseleave', this.#onPointerLeave);\n this.addEventListener('focusin', this.#onFocusIn);\n this.addEventListener('focusout', this.#onFocusOut);\n this.addEventListener('sonner-toast-dismissed', () => this.#reflow({ remeasure: false }));\n // Content actually changed — re-measure the toast that updated.\n this.addEventListener('sonner-toast-updated', () => this.#reflow({ remeasure: true }));\n this.addEventListener('sonner-toast-mounted', () => this.#reflow({ remeasure: true }));\n }\n\n connectedCallback() {\n if (!this.hasAttribute('tabindex')) this.tabIndex = -1;\n if (!this.hasAttribute('role')) this.setAttribute('role', 'region');\n if (!this.hasAttribute('aria-label'))\n this.setAttribute('aria-label', this.getAttribute('container-aria-label') ?? 'Notifications');\n this.#applyHotkeyHints();\n this.setAttribute('data-sonner-toaster', '');\n this.#applyPosition();\n this.#applyTheme();\n this.#applyDir();\n this.#applyGap();\n this.#applyWidth();\n this.#applyOffsets();\n\n this.#childObserver.observe(this, { childList: true });\n for (const child of Array.from(this.children)) {\n if (child instanceof SonnerToast) {\n this.#toasts.unshift(child);\n this.#resizeObserver.observe(child);\n this.#decorateToast(child);\n }\n }\n document.addEventListener('keydown', this.#onKeyDown);\n window.addEventListener('resize', this.#onWindowResize);\n registerToaster(this);\n this.#reflow({ remeasure: true });\n }\n\n disconnectedCallback() {\n this.#childObserver.disconnect();\n this.#resizeObserver.disconnect();\n document.removeEventListener('keydown', this.#onKeyDown);\n window.removeEventListener('resize', this.#onWindowResize);\n if (this.#themeMql && this.#themeMqlHandler) {\n this.#themeMql.removeEventListener('change', this.#themeMqlHandler);\n }\n unregisterToaster(this);\n }\n\n attributeChangedCallback(name: string, _old: string | null, _val: string | null) {\n if (!this.isConnected) return;\n switch (name) {\n case 'position':\n this.#applyPosition();\n this.#applyToastPositions();\n this.#reflow();\n break;\n case 'theme':\n this.#applyTheme();\n break;\n case 'dir':\n this.#applyDir();\n break;\n case 'gap':\n this.#applyGap();\n this.#reflow();\n break;\n case 'visible-toasts':\n this.#reflow();\n break;\n case 'expand':\n this.#expanded = this.hasAttribute('expand');\n for (const t of this.#toasts) t.setPaused(this.#expanded || this.#interacting);\n this.#reflow();\n break;\n case 'close-button':\n case 'rich-colors':\n case 'invert':\n this.#propagateBoolean(name);\n break;\n case 'offset':\n case 'mobile-offset':\n this.#applyOffsets();\n break;\n case 'container-aria-label':\n this.setAttribute('aria-label', this.getAttribute('container-aria-label') ?? 'Notifications');\n break;\n case 'hotkey':\n this.#applyHotkeyHints();\n break;\n }\n }\n\n // ─── Public API ──────────────────────────────────────────────────────────\n\n addToast(el: SonnerToastElement): SonnerToastElement {\n this.appendChild(el);\n return el;\n }\n\n /** Re-announce `text` through the dedicated assertive live region. Used when\n * a toast transitions to an urgent type (error/warning) after mount — the\n * toast's own aria-live change is unreliable across screen readers, so we\n * route the alert through a fresh region whose announcement behavior is\n * consistent. The clear-then-set pattern forces SRs that diff content to\n * treat the new text as a new announcement. */\n announceUrgent(text: string): void {\n this.#alertAnnouncer.textContent = '';\n requestAnimationFrame(() => {\n this.#alertAnnouncer.textContent = text;\n });\n }\n\n dismissAll(): void {\n // Iterate live children so toasts appended this tick (before the MutationObserver\n // fires) are still covered.\n for (const child of Array.from(this.children)) {\n if (child instanceof SonnerToast) child.dismiss();\n }\n }\n\n // ─── Configuration application ───────────────────────────────────────────\n\n #getPosition(): Position {\n return (this.getAttribute('position') as Position) || 'bottom-right';\n }\n\n #applyPosition() {\n const [y, x] = this.#getPosition().split('-');\n if (y) this.setAttribute('data-y-position', y);\n if (x) this.setAttribute('data-x-position', x);\n }\n\n #applyTheme() {\n if (this.#themeMql && this.#themeMqlHandler) {\n this.#themeMql.removeEventListener('change', this.#themeMqlHandler);\n this.#themeMql = null;\n this.#themeMqlHandler = null;\n }\n const theme = (this.getAttribute('theme') as Theme) || 'light';\n if (theme === 'system') {\n this.#themeMql = window.matchMedia('(prefers-color-scheme: dark)');\n const apply = (mql: MediaQueryList | MediaQueryListEvent) => {\n this.setAttribute('data-sonner-theme', mql.matches ? 'dark' : 'light');\n };\n this.#themeMqlHandler = apply;\n this.#themeMql.addEventListener('change', apply);\n apply(this.#themeMql);\n } else {\n this.setAttribute('data-sonner-theme', theme);\n }\n }\n\n #applyDir() {\n const dir = this.getAttribute('dir');\n if (dir === 'auto' || !dir) {\n const computed = window.getComputedStyle(document.documentElement).direction || 'ltr';\n this.setAttribute('dir', computed);\n }\n }\n\n #applyGap() {\n const raw = this.getAttribute('gap');\n const gap = raw ? Number(raw) : GAP;\n this.style.setProperty('--gap', `${Number.isFinite(gap) ? gap : GAP}px`);\n }\n\n #applyWidth() {\n this.style.setProperty('--width', `${TOAST_WIDTH}px`);\n }\n\n #applyOffsets() {\n const off = this.getAttribute('offset');\n const mobileOff = this.getAttribute('mobile-offset');\n applyOffsetVars(this, off ?? undefined, '--offset', '24px');\n applyOffsetVars(this, mobileOff ?? undefined, '--mobile-offset', '16px');\n }\n\n #applyToastPositions() {\n for (const t of this.#toasts) {\n if (!t.hasAttribute('position')) {\n const [y, x] = this.#getPosition().split('-');\n if (y) t.setAttribute('data-y-position', y);\n if (x) t.setAttribute('data-x-position', x);\n }\n }\n }\n\n /** Mirror a toaster-level boolean attribute (close-button, rich-colors, invert) onto\n * every existing toast that hasn't set the same attribute itself. Per-toast overrides\n * still win. */\n #propagateBoolean(attr: 'close-button' | 'rich-colors' | 'invert') {\n const on = this.hasAttribute(attr);\n for (const t of this.#toasts) {\n // Skip if the toast explicitly opted out with `attr=\"false\"` — that's a per-toast override.\n if (t.getAttribute(attr) === 'false') continue;\n if (on) t.setAttribute(attr, '');\n else t.removeAttribute(attr);\n }\n }\n\n #decorateToast(toast: SonnerToast) {\n if (!toast.hasAttribute('position')) {\n const [y, x] = this.#getPosition().split('-');\n if (y) toast.setAttribute('data-y-position', y);\n if (x) toast.setAttribute('data-x-position', x);\n }\n if (!toast.hasAttribute('duration')) {\n const inherit = this.getAttribute('duration');\n if (inherit) toast.setAttribute('duration', inherit);\n }\n if (!toast.hasAttribute('close-button') && this.hasAttribute('close-button')) {\n toast.setAttribute('close-button', '');\n }\n if (!toast.hasAttribute('rich-colors') && this.hasAttribute('rich-colors')) {\n toast.setAttribute('rich-colors', '');\n }\n if (!toast.hasAttribute('invert') && this.hasAttribute('invert')) {\n toast.setAttribute('invert', '');\n }\n }\n\n // ─── Stacking math ───────────────────────────────────────────────────────\n\n #reflow(opts: { remeasure: boolean } = { remeasure: false }) {\n const visibleAmount = Number(this.getAttribute('visible-toasts') ?? VISIBLE_TOASTS_AMOUNT);\n\n // Only measure when explicitly requested (toast added / updated / mounted / window\n // resized). Measuring on every reflow corrupts running height transitions, because\n // the temp `style.height='auto'` cancels them.\n if (opts.remeasure) {\n this.#measuring = true;\n for (const t of this.#toasts) {\n if (t.getAttribute('data-removed') === 'true') continue;\n const prior = t.style.height;\n t.style.height = 'auto';\n this.#heights.set(t, t.getBoundingClientRect().height);\n t.style.height = prior;\n }\n this.#measuring = false;\n }\n\n const active = this.#toasts.filter((t) => t.getAttribute('data-removed') !== 'true');\n const frontHeight = active.length > 0 ? (this.#heights.get(active[0]!) ?? 0) : 0;\n const gap = this.#gapPx();\n const expanded = this.#expanded || this.#interacting;\n let cumulative = 0;\n\n // Single inherited value for all toasts — when this changes, every toast's\n // height: var(--front-toast-height) re-resolves and transitions in lockstep.\n this.style.setProperty('--front-toast-height', `${frontHeight}px`);\n\n for (let i = 0; i < active.length; i++) {\n const toast = active[i]!;\n const h = this.#heights.get(toast) ?? 0;\n const isFront = i === 0;\n const offset = i === 0 ? 0 : cumulative + i * gap;\n cumulative += h;\n\n toast.style.setProperty('--index', String(i));\n toast.style.setProperty('--toasts-before', String(i));\n toast.style.setProperty('--z-index', String(active.length - i));\n toast.style.setProperty('--offset', `${offset}px`);\n toast.style.setProperty('--initial-height', `${h}px`);\n // height itself is driven by CSS now (interpolate-size handles auto↔pixel).\n toast.setAttribute('data-index', String(i));\n toast.setAttribute('data-front', String(isFront));\n toast.setAttribute('data-visible', String(i + 1 <= visibleAmount));\n toast.setAttribute('data-expanded', String(expanded));\n // Hide non-front toasts from assistive tech when collapsed: they're\n // visually stacked behind and shouldn't compete with the front toast\n // for screen-reader attention. Expanding the stack reveals them again.\n if (expanded || isFront) toast.removeAttribute('aria-hidden');\n else toast.setAttribute('aria-hidden', 'true');\n }\n }\n\n #gapPx(): number {\n const raw = this.getAttribute('gap');\n const n = raw ? Number(raw) : GAP;\n return Number.isFinite(n) ? n : GAP;\n }\n\n // ─── Hover / expand / hotkey ─────────────────────────────────────────────\n\n #onPointerEnter = () => {\n this.#interacting = true;\n for (const t of this.#toasts) t.setPaused(true);\n this.#reflow();\n };\n\n #onPointerLeave = () => {\n this.#interacting = false;\n for (const t of this.#toasts) t.setPaused(false);\n this.#reflow();\n };\n\n #onFocusIn = () => {\n this.#interacting = true;\n for (const t of this.#toasts) t.setPaused(true);\n this.#reflow();\n };\n\n #onFocusOut = (e: FocusEvent) => {\n const next = e.relatedTarget as Node | null;\n if (next && this.contains(next)) return;\n this.#interacting = false;\n for (const t of this.#toasts) t.setPaused(false);\n this.#reflow();\n };\n\n #onWindowResize = () => this.#reflow({ remeasure: true });\n\n #onKeyDown = (event: KeyboardEvent) => {\n // Defer to consumer handlers that already claimed this event.\n if (event.defaultPrevented) return;\n // Don't hijack the hotkey when the user is typing.\n const target = event.target as HTMLElement | null;\n if (target) {\n const tag = target.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || target.isContentEditable) {\n return;\n }\n }\n const hotkey = this.#hotkey();\n // Empty hotkey opts out entirely (e.g. `hotkey=\"\"` or `hotkey=\"none\"`),\n // but still allow Escape-to-collapse below.\n const allModifiers = ['altKey', 'ctrlKey', 'shiftKey', 'metaKey'] as const;\n const matches =\n hotkey.length > 0 &&\n hotkey.every((key) => {\n if ((allModifiers as readonly string[]).includes(key)) {\n return event[key as 'altKey'];\n }\n return event.code === key;\n }) &&\n // Strict modifier match: unlisted modifiers must not be held, so e.g.\n // Ctrl+Alt+T doesn't accidentally trigger an Alt+T hotkey.\n allModifiers.every((m) => hotkey.includes(m) || !event[m]);\n if (matches) {\n this.#expanded = true;\n for (const t of this.#toasts) t.setPaused(true);\n this.focus();\n this.#reflow();\n return;\n }\n if (event.key === 'Escape' && this.#expanded && this.contains(document.activeElement)) {\n this.#expanded = false;\n for (const t of this.#toasts) t.setPaused(false);\n this.#reflow();\n }\n };\n\n #hotkey(): readonly string[] {\n const raw = this.getAttribute('hotkey');\n if (raw === null) return DEFAULT_HOTKEY;\n // Explicit opt-out: `hotkey=\"\"` or `hotkey=\"none\"`.\n const trimmed = raw.trim();\n if (trimmed === '' || trimmed.toLowerCase() === 'none') return [];\n return trimmed.split('+').map((s) => s.trim());\n }\n\n // Reflect the current hotkey as `aria-keyshortcuts` (for AT) and `title` (for\n // sighted users) so the otherwise-undiscoverable shortcut surfaces somewhere.\n // Only applied when those attributes aren't already set by the consumer.\n // When the hotkey is opted out, remove anything we previously set.\n #applyHotkeyHints() {\n const formatted = formatHotkeyForAria(this.#hotkey());\n if (!formatted) {\n if (this.#ownsAriaKeyshortcuts) {\n this.removeAttribute('aria-keyshortcuts');\n this.#ownsAriaKeyshortcuts = false;\n }\n if (this.#ownsTitle) {\n this.removeAttribute('title');\n this.#ownsTitle = false;\n }\n return;\n }\n if (!this.hasAttribute('aria-keyshortcuts') || this.#ownsAriaKeyshortcuts) {\n this.setAttribute('aria-keyshortcuts', formatted);\n this.#ownsAriaKeyshortcuts = true;\n }\n if (!this.hasAttribute('title') || this.#ownsTitle) {\n this.setAttribute('title', `Press ${formatted} to expand notifications`);\n this.#ownsTitle = true;\n }\n }\n #ownsAriaKeyshortcuts = false;\n #ownsTitle = false;\n}\n\nfunction formatHotkeyForAria(tokens: readonly string[]): string {\n if (tokens.length === 0) return '';\n return tokens\n .map((t) => {\n if (t === 'altKey') return 'Alt';\n if (t === 'ctrlKey') return 'Control';\n if (t === 'shiftKey') return 'Shift';\n if (t === 'metaKey') return 'Meta';\n if (/^Key[A-Z]$/.test(t)) return t.slice(3);\n if (/^Digit[0-9]$/.test(t)) return t.slice(5);\n return t;\n })\n .join('+');\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('sonner-toaster')) {\n customElements.define('sonner-toaster', SonnerToaster);\n}\n",
|
|
11
11
|
"import { defaultToaster, dismissAllToasts, getToast, nextToastId } from './registry.js';\nimport { SonnerToast } from './sonner-toast.js';\nimport { SonnerToaster } from './sonner-toaster.js';\nimport type {\n PromiseOptions,\n SonnerToastElement,\n ToastContent,\n ToastOptions,\n ToastType,\n} from './types.js';\n\ninterface CreateOptions extends ToastOptions {\n title?: ToastContent;\n type?: ToastType;\n}\n\nfunction ensureToaster(toasterId?: string): SonnerToaster {\n if (toasterId) {\n const byId = document.getElementById(toasterId);\n if (byId instanceof SonnerToaster) return byId;\n }\n let host = defaultToaster() as SonnerToaster | undefined;\n if (!host) {\n host = document.createElement('sonner-toaster') as SonnerToaster;\n document.body.appendChild(host);\n }\n return host;\n}\n\nfunction buildOrUpdate(options: CreateOptions): SonnerToastElement {\n const id = options.id ?? nextToastId();\n const existing = getToast(id);\n if (existing) {\n existing.update(options);\n return existing;\n }\n const el = document.createElement('sonner-toast') as SonnerToast;\n el.toastId = id;\n el.update(options);\n el.setHandlers({ onDismiss: options.onDismiss, onAutoClose: options.onAutoClose });\n ensureToaster(options.toasterId).addToast(el);\n return el;\n}\n\nfunction variant(type: ToastType) {\n return (message: ToastContent, opts?: ToastOptions): SonnerToastElement =>\n buildOrUpdate({ ...opts, type, title: message });\n}\n\nfunction basic(message: ToastContent, opts?: ToastOptions): SonnerToastElement {\n return buildOrUpdate({ ...opts, type: 'default', title: message });\n}\n\nfunction dismiss(id?: string | number): void {\n if (id !== undefined) {\n getToast(id)?.dismiss();\n return;\n }\n dismissAllToasts();\n}\n\nfunction custom(\n builder: (id: string | number) => HTMLElement,\n opts?: ToastOptions,\n): SonnerToastElement {\n const id = opts?.id ?? nextToastId();\n const el = document.createElement('sonner-toast') as SonnerToast;\n el.toastId = id;\n el.setAttribute('data-styled', 'false');\n if (opts?.duration !== undefined) el.setAttribute('duration', String(opts.duration));\n if (opts?.dismissible === false) el.setAttribute('dismissible', 'false');\n if (opts?.position) el.setAttribute('position', opts.position);\n if (opts?.testId !== undefined) el.setAttribute('data-testid', opts.testId);\n const content = builder(id);\n el.appendChild(content);\n el.setHandlers({ onDismiss: opts?.onDismiss, onAutoClose: opts?.onAutoClose });\n ensureToaster(opts?.toasterId).addToast(el);\n return el;\n}\n\nasync function resolveContent<T>(\n value: ToastContent | ((arg: T) => ToastContent) | undefined,\n arg: T,\n): Promise<ToastContent | undefined> {\n if (value === undefined) return undefined;\n if (typeof value === 'function') {\n // ToastContent allows zero-arg functions too; distinguish by length.\n return (value as (a: T) => ToastContent).length === 0\n ? (value as () => ToastContent)()\n : (value as (a: T) => ToastContent)(arg);\n }\n return value;\n}\n\nfunction promise<T>(\n promiseOrFn: Promise<T> | (() => Promise<T>),\n options: PromiseOptions<T>,\n): SonnerToastElement & { unwrap: () => Promise<T> } {\n const id = options.id ?? nextToastId();\n // Carry forward everything except the promise-specific resolver fields when building the toast.\n const { loading: _l, success: _s, error: _e, description: _d, finally: _f, ...rest } = options;\n const loadingEl = buildOrUpdate({\n ...rest,\n id,\n type: 'loading',\n title: options.loading,\n duration: Infinity,\n dismissible: options.dismissible ?? false,\n });\n\n const work = Promise.resolve(typeof promiseOrFn === 'function' ? promiseOrFn() : promiseOrFn);\n\n let result: ['resolve', T] | ['reject', unknown] | null = null;\n\n const settled = work\n .then(async (value) => {\n result = ['resolve', value];\n const title = await resolveContent(options.success, value);\n const desc = await resolveContent(options.description, value);\n if (title !== undefined) {\n loadingEl.update({\n ...rest,\n id,\n type: 'success',\n title,\n description: desc,\n duration: options.duration,\n dismissible: options.dismissible ?? true,\n });\n } else {\n loadingEl.dismiss();\n }\n })\n .catch(async (err) => {\n result = ['reject', err];\n const title = await resolveContent(options.error, err);\n const desc = await resolveContent(options.description, err);\n if (title !== undefined) {\n loadingEl.update({\n ...rest,\n id,\n type: 'error',\n title,\n description: desc,\n duration: options.duration,\n dismissible: options.dismissible ?? true,\n });\n } else {\n loadingEl.dismiss();\n }\n })\n .finally(() => options.finally?.());\n\n const unwrap = () =>\n new Promise<T>((resolve, reject) => {\n settled.then(() => {\n if (!result) return reject(new Error('promise toast settled without a result'));\n if (result[0] === 'resolve') resolve(result[1]);\n else reject(result[1]);\n });\n });\n\n return Object.assign(loadingEl, { unwrap });\n}\n\nexport const toast = Object.assign(basic, {\n success: variant('success'),\n error: variant('error'),\n info: variant('info'),\n warning: variant('warning'),\n loading: (message: ToastContent, opts?: ToastOptions) =>\n buildOrUpdate({\n ...opts,\n type: 'loading',\n title: message,\n duration: opts?.duration ?? Infinity,\n }),\n message: basic,\n promise,\n custom,\n dismiss,\n getToast,\n});\n",
|
|
12
12
|
"// Public API: re-exported declaratively so the entry point's exports\n// survive tree-shaking. The window.toast side-effect uses a separately\n// renamed import (`_toast`) — sharing a name with a re-export trips\n// newer Bun bundlers into emitting broken `toast2 as toast` aliases.\nexport { SonnerToast } from './sonner-toast.js';\nexport { SonnerToaster } from './sonner-toaster.js';\nexport { toast } from './toast.js';\n\nimport type { SonnerToast as _SonnerToast } from './sonner-toast.js';\nimport type { SonnerToaster as _SonnerToaster } from './sonner-toaster.js';\nimport { toast as _toast } from './toast.js';\nexport type {\n Position,\n PromiseOptions,\n SonnerToastElement,\n SonnerToasterElement,\n SwipeDirection,\n Theme,\n ToastAction,\n ToastContent,\n ToastOptions,\n ToastType,\n ToasterOptions,\n} from './types.js';\n\nif (typeof window !== 'undefined')\n (window as Window & { toast?: typeof _toast }).toast = _toast;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sonner-toast': _SonnerToast;\n 'sonner-toaster': _SonnerToaster;\n }\n}\n"
|
|
13
13
|
],
|
|
14
|
-
"mappings": "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",
|
|
15
|
-
"debugId": "
|
|
14
|
+
"mappings": "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",
|
|
15
|
+
"debugId": "EF7F0EA6003CE16A64756E2164756E21",
|
|
16
16
|
"names": []
|
|
17
17
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sonner-wc",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Sonner's toast UX as a framework-agnostic Web Component. Drop in anywhere.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/clickblipclick/sonner-wc.git"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://clickblipclick.github.io/sonner-wc/",
|
|
10
|
+
"bugs": {
|
|
11
|
+
"url": "https://github.com/clickblipclick/sonner-wc/issues"
|
|
12
|
+
},
|
|
5
13
|
"type": "module",
|
|
6
14
|
"main": "./dist/sonner-wc.js",
|
|
7
15
|
"module": "./dist/sonner-wc.js",
|