toastory 0.1.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -1
- package/dist/angular.cjs +1 -3
- package/dist/angular.cjs.map +1 -1
- package/dist/angular.d.cts +12 -5
- package/dist/angular.d.ts +12 -5
- package/dist/angular.js +1 -3
- package/dist/angular.js.map +1 -1
- package/dist/core.cjs +1 -2
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +41 -6
- package/dist/core.d.ts +41 -6
- package/dist/core.js +1 -2
- package/dist/core.js.map +1 -1
- package/dist/{dialog-Buemfm7I.d.ts → dialog-D-y37Xl5.d.ts} +1 -1
- package/dist/{dialog-fziFV6J0.d.cts → dialog-mUI__8O3.d.cts} +1 -1
- package/dist/index.cjs +1 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -5
- package/dist/index.d.ts +6 -5
- package/dist/index.js +1 -6
- package/dist/index.js.map +1 -1
- package/dist/native.cjs +1 -2
- package/dist/native.cjs.map +1 -1
- package/dist/native.d.cts +85 -5
- package/dist/native.d.ts +85 -5
- package/dist/native.js +1 -2
- package/dist/native.js.map +1 -1
- package/dist/react.cjs +1 -3
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +5 -4
- package/dist/react.d.ts +5 -4
- package/dist/react.js +1 -3
- package/dist/react.js.map +1 -1
- package/dist/sound-DLXnQDzO.d.cts +18 -0
- package/dist/sound-UiOhOgA9.d.ts +18 -0
- package/dist/svelte.cjs +1 -3
- package/dist/svelte.cjs.map +1 -1
- package/dist/svelte.d.cts +6 -3
- package/dist/svelte.d.ts +6 -3
- package/dist/svelte.js +1 -3
- package/dist/svelte.js.map +1 -1
- package/dist/themes/_base.css +1 -1
- package/dist/themes/_base.dialog.css +1 -1
- package/dist/themes/_base.toast.css +1 -1
- package/dist/themes/all.css +1 -1
- package/dist/themes/aurora.css +1 -1
- package/dist/themes/aurora.dialog.css +1 -1
- package/dist/themes/aurora.toast.css +1 -1
- package/dist/themes/basic.css +1 -1
- package/dist/themes/basic.dialog.css +1 -1
- package/dist/themes/basic.toast.css +1 -1
- package/dist/themes/brutal.css +1 -1
- package/dist/themes/brutal.dialog.css +1 -1
- package/dist/themes/brutal.toast.css +1 -1
- package/dist/themes/classic-bar.css +1 -1
- package/dist/themes/classic-bar.dialog.css +1 -1
- package/dist/themes/classic-bar.toast.css +1 -1
- package/dist/themes/classic-stack.css +1 -1
- package/dist/themes/classic-stack.dialog.css +1 -1
- package/dist/themes/classic-stack.toast.css +1 -1
- package/dist/themes/dialogs.css +1 -1
- package/dist/themes/dialogs.dialog.css +1 -1
- package/dist/themes/dialogs.toast.css +1 -1
- package/dist/themes/essentials.css +1 -1
- package/dist/themes/essentials.dialog.css +1 -1
- package/dist/themes/essentials.toast.css +1 -1
- package/dist/themes/flat.css +1 -1
- package/dist/themes/flat.dialog.css +1 -1
- package/dist/themes/flat.toast.css +1 -1
- package/dist/themes/gradient-strip.css +1 -1
- package/dist/themes/gradient-strip.dialog.css +1 -1
- package/dist/themes/gradient-strip.toast.css +1 -1
- package/dist/themes/gradient.css +1 -1
- package/dist/themes/gradient.dialog.css +1 -1
- package/dist/themes/gradient.toast.css +1 -1
- package/dist/themes/ios-glass.css +1 -1
- package/dist/themes/ios-glass.dialog.css +1 -1
- package/dist/themes/ios-glass.toast.css +1 -1
- package/dist/themes/liquid-glass.css +1 -1
- package/dist/themes/liquid-glass.dialog.css +1 -1
- package/dist/themes/liquid-glass.toast.css +1 -1
- package/dist/themes/material.css +1 -1
- package/dist/themes/material.dialog.css +1 -1
- package/dist/themes/material.toast.css +1 -1
- package/dist/themes/minimal.css +1 -1
- package/dist/themes/minimal.dialog.css +1 -1
- package/dist/themes/minimal.toast.css +1 -1
- package/dist/themes/neon.css +1 -1
- package/dist/themes/neon.dialog.css +1 -1
- package/dist/themes/neon.toast.css +1 -1
- package/dist/themes/outline.css +1 -1
- package/dist/themes/outline.dialog.css +1 -1
- package/dist/themes/outline.toast.css +1 -1
- package/dist/themes/pastel.css +1 -1
- package/dist/themes/pastel.dialog.css +1 -1
- package/dist/themes/pastel.toast.css +1 -1
- package/dist/themes/pill.css +1 -1
- package/dist/themes/pill.dialog.css +1 -1
- package/dist/themes/pill.toast.css +1 -1
- package/dist/themes/ripple.css +1 -1
- package/dist/themes/ripple.dialog.css +1 -1
- package/dist/themes/ripple.toast.css +1 -1
- package/dist/themes/showcase.css +1 -1
- package/dist/themes/showcase.dialog.css +1 -1
- package/dist/themes/showcase.toast.css +1 -1
- package/dist/themes/sweet.css +1 -1
- package/dist/themes/sweet.dialog.css +1 -1
- package/dist/themes/sweet.toast.css +1 -1
- package/dist/{toast-api-D6WYDtUy.d.cts → toast-api-C5nqvDgA.d.cts} +79 -6
- package/dist/{toast-api-D6WYDtUy.d.ts → toast-api-C5nqvDgA.d.ts} +79 -6
- package/dist/{ui-Cs1AjRNH.d.ts → ui-C1Zh-Kff.d.ts} +4 -2
- package/dist/{ui-D5FwMD8Y.d.cts → ui-D1WECTSn.d.cts} +4 -2
- package/dist/vue.cjs +1 -3
- package/dist/vue.cjs.map +1 -1
- package/dist/vue.d.cts +42 -5
- package/dist/vue.d.ts +42 -5
- package/dist/vue.js +1 -3
- package/dist/vue.js.map +1 -1
- package/package.json +1 -1
package/dist/native.cjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime');var L={now:()=>Date.now(),setTimeout:(o,t)=>{let r=setTimeout(o,t);return ()=>clearTimeout(r)},setInterval:(o,t)=>{let r=setInterval(o,t);return ()=>clearInterval(r)}};var Z=0;function ee(o="gk"){return `${o}-${++Z}`}function U(o,t="gk"){return o!==void 0&&o!==""?o:ee(t)}var N=Object.freeze({theme:"ios-glass",mode:"auto",position:"top-right",duration:4e3,maxVisible:8,gap:12,stack:true,dir:"auto",hotkey:"alt+t",pauseOn:["hover","focus","hidden"],shadow:true,closeButton:false,richColors:false,invert:false,swipe:true,dragThreshold:45,progress:false,closeOnClick:false,exitDuration:250,historyLimit:100,regionLabel:"Notifications",closeLabel:"Close notification",startPaused:false,newestOnTop:true,dedupeWindow:500,container:void 0});function $(o={}){let t=Object.freeze({...N,...G(o)}),r=new Set,c=()=>{r.forEach(l=>l());};return {get:()=>t,set(l){return t=Object.freeze({...t,...G(l)}),c(),t},reset(){t=N,c();},subscribe(l){return r.add(l),()=>{r.delete(l);}}}}function G(o){let t={};for(let r in o)o[r]!==void 0&&(t[r]=o[r]);return t}function _(o,t,r=L){let c=o,l=o,p=0,d,f,g=false,y=false,a=new Map,S=new Set,R=()=>Number.isFinite(l)&&l>0,b=()=>{if(S.size===0)return;let T=w(),h=c>0?Math.max(0,Math.min(1,T/c)):0;for(let E of S)try{E(T,h);}catch(e){console.error(e);}},w=()=>y?0:g&&a.size===0?Math.max(0,l-(r.now()-p)):l,x=()=>{d?.(),d=void 0,f?.(),f=void 0;},C=()=>{x(),!(!R()||a.size>0||y)&&(p=r.now(),d=r.setTimeout(()=>{x(),l=0,y=true,g=false,b(),t();},l),S.size>0&&(f=r.setInterval(()=>{b();},50)));};return {start(){y||!R()||(g=true,a.clear(),C(),b());},pause:(T="manual")=>{y||(a.set(T,(a.get(T)??0)+1),g&&a.size===1&&(l=Math.max(0,l-(r.now()-p)),x(),b()));},resume:(T="manual")=>{if(y)return;let h=a.get(T);h&&(h<=1?a.delete(T):a.set(T,h-1),g&&a.size===0&&R()&&(C(),b()));},clearReasons(){a.clear(),g&&R()&&C();},add(T){if(y||!Number.isFinite(l))return;let h=g&&a.size===0;l=Math.max(1,(h?l-(r.now()-p):l)+T),c=Math.max(c,l),h&&C(),b();},reset(T){y=false,l=c=T!==void 0?T:c,g&&a.size===0&&(R()?C():x()),b();},cancel(){x(),g=false,y=true,l=0;},remaining:w,elapsed(){return Math.max(0,c-w())},isRunning:()=>g&&!y&&!a.size&&R(),isPaused:()=>a.size>0,pausedReasons:()=>[...a.keys()],onTick(T){return S.add(T),g&&a.size===0&&!f&&(f=r.setInterval(b,50)),()=>{S.delete(T),S.size===0&&f&&(f(),f=void 0);}}}}var M=(o,t="polite")=>({color:`var(--gk-${o})`,ariaLive:t}),te={success:M("success"),error:M("error","assertive"),warning:M("warning","assertive"),info:M("info"),loading:{...M("info"),defaults:{duration:0,dismissible:false}},message:M("fg")};function W(){let o=new Map;return {add(t,r={}){let c=typeof t=="string"?t.trim():"";if(!c)throw new TypeError("toastory: invalid type");o.set(c,r);},remove:t=>o.delete(t),get:t=>o.get(t)??te[t],list:()=>[...o.keys()]}}var oe=new Set(["user","swipe","click"]),F=(o,...t)=>{try{o?.(...t);}catch(r){console.error(r);}},re="manual",ie={loading:{duration:0}};function j(o={}){let t=o.config??$(),r=o.clock??L,c=o.now??(()=>r.now()),l=o.types??W(),p=new Map,d=[],f=[],g=[],y=new Set,a=()=>{f=d.map(e=>p.get(e)?.record).filter(Boolean),y.forEach(e=>e());},S=e=>`${e.container??""}|${e.position}`,R=(e,n,i,s)=>{let m=t.get(),u=n.type??"default",v={...ie[u],...l.get(u)?.defaults,...n},k=v.duration??m.duration,O=Number.isFinite(k)&&k>0?k:0,D=v.important||u==="error",A=c();return {...v,id:e,type:u,duration:O,position:v.position??m.position,ariaLive:v.ariaLive??(D?"assertive":"polite"),role:v.role??(D?"alert":"status"),createdAt:i?.createdAt??A,updatedAt:A,revision:(i?.revision??-1)+1,timerEpoch:i?.timerEpoch??0,count:i?.count??1,visible:i?.visible??false,dismissed:false,pausedBy:i?.pausedBy??(m.startPaused?[re]:[]),remaining:i?.remaining??(O||1/0),custom:s}},b=e=>e.record.duration===0?1/0:e.timer.remaining(),w=e=>{if(e.dedupe===false)return;if(typeof e.dedupe=="string")return e.dedupe;let n=typeof e.title=="string"?e.title:"",i=typeof e.description=="string"?e.description:"";return n||i?`${e.type??"default"}|${n}|${i}`:void 0},x=()=>{let e=t.get(),n=new Map;for(let i of d){let s=p.get(i);if(!s||s.record.dismissed)continue;let m=S(s.record),u=n.get(m)??0,v=!!s.record.important;u<e.maxVisible||v?(s.record.visible||(s.record={...s.record,visible:true},!s.record.pausedBy.length&&s.record.duration>0&&s.timer.start()),v||n.set(m,u+1)):s.record.visible&&(s.record={...s.record,visible:false},s.timer.pause());}},C=e=>{e.exitHandle?.(),e.timer.cancel(),p.delete(e.record.id),d=d.filter(n=>n!==e.record.id),g=[{...e.record,dismissed:true},...g].slice(0,t.get().historyLimit),x(),h(),a(),e.closedFired||(e.closedFired=true,F(e.record.onClose,e.record,e.reason??"api"));},z=(e,n)=>{if(e.record.dismissed||e.record.dismissible===false&&oe.has(n))return;e.reason=n,e.record={...e.record,dismissed:true,remaining:0,revision:e.record.revision+1},e.timer.cancel(),!e.dismissFired&&n!=="auto"&&(e.dismissFired=true,F(e.record.onDismiss,e.record,n)),x(),h(),a();let i=t.get().exitDuration;i<=0||!e.record.visible?C(e):e.exitHandle=r.setTimeout(()=>C(e),i);},H=(e,n)=>{let{custom:i,...s}=n,m=R(e,s,void 0,i),u={opts:s,custom:i,record:m,timer:void 0,dedupeKey:w(s),exitHandle:void 0,reason:void 0,openedFired:false,closedFired:false,dismissFired:false,autoCloseFired:false};return u.timer=_(m.duration,()=>{u.autoCloseFired||(u.autoCloseFired=true,F(u.record.onAutoClose,u.record)),z(u,"auto");},r),m.pausedBy.length&&u.timer.pause(),u},T=e=>{e.timer.cancel(),e.record.duration>0&&(e.timer.reset(e.record.duration),e.record.visible&&!e.record.pausedBy.length&&e.timer.start()),e.record={...e.record,timerEpoch:e.record.timerEpoch+1,remaining:b(e)};},h=()=>{for(let e of d){let n=p.get(e);n&&n.record.visible&&!n.openedFired&&!n.record.dismissed&&(n.openedFired=true,F(n.record.onOpen,n.record));}},E={config:t,types:l,add(e){let n=U(e.id),i=p.get(n);if(i&&!i.record.dismissed){let{custom:u,...v}=e;return E.update(n,v),u&&(i.custom=u,i.record={...i.record,custom:u},a()),n}i&&C(i);let s=w(e);if(s!==void 0){for(let u of p.values())if(u.dedupeKey===s&&!u.record.dismissed)return u.record={...u.record,count:u.record.count+1,revision:u.record.revision+1,updatedAt:c()},T(u),a(),u.record.id}let m=H(n,e);return p.set(n,m),d=[...d,n],x(),a(),h(),n},update(e,n){let i=p.get(e);if(!i||i.record.dismissed)return false;let{resetTimer:s=true,...m}=n,u={...i.opts};m.type!==void 0&&m.type!==i.record.type&&(delete u.duration,delete u.ariaLive,delete u.role,delete u.icon);let v=false;for(let D in m){let A=m[D];A!==void 0&&(i.opts[D]!==A&&(v=true),u[D]=A);}if(!v&&m.type===void 0&&m.position===void 0)return true;i.opts=u,i.dedupeKey=w(u);let k=R(e,u,i.record,i.custom),O=k.position!==i.record.position;return i.record=k,O&&(i.record={...i.record,visible:false},x()),s||O?T(i):i.record={...i.record,remaining:b(i)},a(),h(),true},dismiss(e,n="api"){if(e===void 0)return E.dismissAll(n);let i=p.get(e);i&&z(i,n);},dismissAll(e="api"){for(let n of p.values())z(n,e);},pause(e,n){let i=e===void 0?[...p.values()]:[p.get(e)].filter(s=>!!s);for(let s of i)s.record.pausedBy.includes(n)||(s.timer.pause(n),s.record={...s.record,pausedBy:[...s.record.pausedBy,n],remaining:b(s)});a();},resume(e,n){let i=e===void 0?[...p.values()]:[p.get(e)].filter(s=>!!s);for(let s of i){if(!s.record.pausedBy.includes(n))continue;s.timer.resume(n);let m=s.record.pausedBy.filter(u=>u!==n);s.record={...s.record,pausedBy:m,remaining:b(s)},!m.length&&s.record.visible&&s.record.duration>0&&s.timer.start();}a();},extend(e,n){let i=p.get(e);!i||i.record.dismissed||(i.timer.add(n),i.record={...i.record,remaining:b(i),timerEpoch:i.record.timerEpoch+1,revision:i.record.revision+1},a());},getRemaining(e){let n=p.get(e);return n?b(n):0},getToasts:()=>f,getHistory:()=>g,clear(){for(let e of p.values())e.exitHandle?.(),e.timer.cancel();p.clear(),d=[],f=[],a();},clearHistory(){g=[],a();},subscribe(e){return y.add(e),()=>{y.delete(e);}}};return E}function K(o){return typeof o=="string"?{title:o}:o}function ne(o){return o instanceof Error?o.message:String(o)}function V(o,t,r,c={}){let l;try{l=typeof t=="function"?t():t;}catch(a){l=Promise.reject(a);}let{id:p,...d}=c,f=K(r.loading),g=o.add({...d,id:p,...f,type:"loading",duration:0}),y=(a,S,R)=>{let b=typeof r.description=="function"?r.description(a==="success"?{status:a,value:R}:{status:a,error:R}):r.description;o.update(g,{duration:d.duration??o.config.get().duration,...K(S),type:a,...b!==void 0?{description:b}:{},resetTimer:true});};return l.then(a=>{r.success===void 0?o.dismiss(g):y("success",typeof r.success=="function"?r.success(a):r.success,a);}).catch(a=>{y("error",r.error===void 0?ne(a):typeof r.error=="function"?r.error(a):r.error,a);}).finally(()=>{try{r.finally?.();}catch(a){console.error(a);}}),{id:g,unwrap:()=>l}}function J(o){let t=c=>(l,p={})=>{let d={type:c,...p};return p.type!==void 0&&(d.type=p.type),l!==void 0&&(p.title===void 0?d.title=l:p.description===void 0&&(d.description=l)),o.add(d)},r=t();return r.success=t("success"),r.error=t("error"),r.info=t("info"),r.warning=t("warning"),r.loading=t("loading"),r.message=t("message"),r.custom=(c,l)=>o.add({...l,custom:c}),r.update=o.update,r.dismiss=o.dismiss,r.dismissAll=o.dismissAll,r.getToasts=o.getToasts,r.getHistory=o.getHistory,r.types=o.types,r.promise=(c,l,p)=>V(o,c,l,p),r}function Q(o={}){let t=j({config:o.config});return {store:t,toast:J(t)}}var I;function B(){return I||(I=Q()),I}async function ae(o){try{let t=await import('expo-haptics');if(!t)return;o==="success"?await t.notificationAsync(t.NotificationFeedbackType.Success):o==="error"?await t.notificationAsync(t.NotificationFeedbackType.Error):o==="warning"?await t.notificationAsync(t.NotificationFeedbackType.Warning):await t.impactAsync(t.ImpactFeedbackStyle.Light);}catch{}}function de(){let t=B().toast,r=l=>(p,d={})=>{let f=d.type??"default";return ae(f),l(p,d)},c=r(t);return c.success=r(t.success),c.error=r(t.error),c.info=r(t.info),c.warning=r(t.warning),c.loading=r(t.loading),c.message=r(t.message),c.promise=t.promise,c.custom=t.custom,c.update=t.update,c.dismiss=t.dismiss,c.dismissAll=t.dismissAll,c.getToasts=t.getToasts,c.getHistory=t.getHistory,Object.defineProperty(c,"types",{value:t.types,enumerable:true}),c}var q=de();function ce(o){return B().store.config.set(o)}function le(){I&&(I.store.clear(),I.store.clearHistory(),I.store.config.reset());}var Le={toast:q,configure:ce,reset:le};function Fe({children:o}){return jsxRuntime.jsx(jsxRuntime.Fragment,{children:o})}function Be(o){let[t,r]=react.useState([]);react.useEffect(()=>{let d=B();r(d.store.getToasts());let f=d.store.subscribe(()=>{r(d.store.getToasts());});return ()=>f()},[]);let c=react.useMemo(()=>t.filter(d=>d.visible),[t]);if(c.length===0)return null;let l=o.position??"top",p=l==="bottom"?{bottom:o.offset??50}:l==="center"?{top:"50%",transform:"translateY(-50%)"}:{top:o.offset??50};return jsxRuntime.jsx("div",{style:{position:"absolute",...p,left:16,right:16,zIndex:99999,display:"flex",flexDirection:"column",alignItems:"center",gap:8,...o.style},children:c.map(d=>jsxRuntime.jsxs("div",{style:{backgroundColor:"rgba(28, 28, 30, 0.88)",padding:14,borderRadius:16,minWidth:200,maxWidth:"100%",boxShadow:"0 8px 24px rgba(0, 0, 0, 0.25)",display:"flex",flexDirection:"column",gap:4},children:[d.badge?jsxRuntime.jsx("div",{style:{fontSize:11,fontWeight:"600",color:"#38bdf8",textTransform:"uppercase",letterSpacing:"0.04em"},children:typeof d.badge=="string"?d.badge:d.badge.label??""}):null,d.title?jsxRuntime.jsx("div",{style:{color:"#fff",fontWeight:"600",fontSize:15},children:String(d.title)}):null,d.description?jsxRuntime.jsx("div",{style:{color:"#aaa",fontSize:13,marginTop:2},children:String(d.description)}):null,d.progressValue!==void 0?jsxRuntime.jsx("div",{style:{height:3,backgroundColor:"rgba(255,255,255,0.15)",borderRadius:3,marginTop:6,overflow:"hidden"},children:jsxRuntime.jsx("div",{style:{height:"100%",width:`${Math.round(d.progressValue*100)}%`,backgroundColor:"#38bdf8"}})}):null,d.actions&&d.actions.length>0?jsxRuntime.jsx("div",{style:{display:"flex",gap:8,marginTop:8,justifyContent:"flex-end"},children:d.actions.map((f,g)=>jsxRuntime.jsx("button",{type:"button",onClick:f.onClick?y=>f.onClick?.(y.nativeEvent):void 0,style:{fontSize:12,fontWeight:"600",padding:"4px 10px",borderRadius:8,border:"none",backgroundColor:"rgba(255, 255, 255, 0.12)",color:"#fff",cursor:"pointer"},children:f.label??f.text??"Action"},g))}):null]},String(d.id)))})}function He(){let[o,t]=react.useState([]);return react.useEffect(()=>{let r=B();return t(r.store.getToasts()),r.store.subscribe(()=>{t(r.store.getToasts());})},[]),{toast:q,toasts:o}}exports.GlazeProvider=Fe;exports.Toaster=Be;exports.configure=ce;exports.resetNativeEngine=le;exports.toast=q;exports.ui=Le;exports.useNativeToast=He;//# sourceMappingURL=native.cjs.map
|
|
2
|
-
//# sourceMappingURL=native.cjs.map
|
|
1
|
+
function e(e){const t={};for(const o in e)void 0!==e[o]&&(t[o]=e[o]);return t}function t(e){const t=t=>(o,r={})=>{const i={type:t,...r};return void 0!==r.type&&(i.type=r.type),void 0!==o&&(void 0===r.title?i.title=o:void 0===r.description&&(i.description=o)),e.add(i)};return Object.assign(t(),{success:t("success"),error:t("error"),info:t("info"),warning:t("warning"),loading:t("loading"),message:t("message"),custom(t,o){return e.add({...o,custom:t})},update:e.update,dismiss:e.dismiss,dismissAll:e.dismissAll,getToasts:e.getToasts,getHistory:e.getHistory,types:e.types,promise(t,o,r){return((e,t,o,r={})=>{let i;try{i="function"==typeof t?t():t}catch(e){i=Promise.reject(e)}const{id:s,...n}=r,a=v(o.loading),c=e.add({...n,id:s,...a,type:"loading",duration:0}),d=(t,r,i)=>{const s="function"==typeof o.description?o.description("success"===t?{status:t,value:i}:{status:t,error:i}):o.description;e.update(c,{duration:n.duration??e.config.get().duration,...v(r),type:t,...void 0!==s?{description:s}:{},resetTimer:1})};return i.then(t=>{void 0===o.success?e.dismiss(c):d("success","function"==typeof o.success?o.success(t):o.success,t)}).catch(e=>{var t;d("error",void 0===o.error?(t=e)instanceof Error?t.message:t+"":"function"==typeof o.error?o.error(e):o.error,e)}).finally(()=>{try{o.finally?.()}catch(e){console.error(e)}}),{id:c,unwrap:()=>i}})(e,t,o,r)}})}function o(e,t,o,r,i){const s=e.currentTime+r,n=o*(1+.008*(Math.random()-.5));for(const[o,r,a]of h){const c=e.createOscillator(),d=e.createGain();c.frequency.value=n*o,d.gain.setValueAtTime(1e-4,s),d.gain.linearRampToValueAtTime(r*i,s+.015),d.gain.exponentialRampToValueAtTime(1e-4,s+a),c.connect(d).connect(t),c.start(s),c.stop(s+a+.05)}}function r(e,t=.5){if(!e||"undefined"==typeof window)return;const r=1==e?"info":e+"",i=Math.min(1,Math.max(0,t));if(/^(https?:|data:audio|blob:)/.test(r)){try{const e=new Audio(r);e.volume=i,e.play().catch(()=>{})}catch{}return}const s=b[r],n=s&&("undefined"!=typeof window?window.AudioContext||window.webkitAudioContext:void 0);if(s&&n)try{if(a??(a=new n),"suspended"===a.state&&a.resume(),"closed"===a.state)return;const e=a.createGain();e.gain.value=.45*i;const t=a.createBiquadFilter();t.frequency.value=1300,e.connect(t).connect(a.destination);for(const[t,r,i]of s)o(a,e,t,r,i);setTimeout(()=>t.disconnect(),900)}catch{}}function i(){return c||(c=((o={})=>{const r=((t={})=>{const o=t.config??((t={})=>{let o=Object.freeze({...f,...e(t)});const r=new Set,i=()=>{r.forEach(e=>e())};return{get(){return o},set(t){const r={...o,...e(t)};return Object.keys(r).some(e=>r[e]!==o[e])&&(o=Object.freeze(r),i()),o},reset(){o=f,i()},subscribe:e=>(r.add(e),()=>{r.delete(e)})}})(),r=t.clock??u,i=t.now??r.now,s=t.types??(()=>{const e=new Map;return{add(t,o={}){const r="string"==typeof t?t.trim():"";if(!r)throw new TypeError("toastory: invalid type");e.set(r,o)},remove(t){return e.delete(t)},get(t){return e.get(t)??g[t]},list(){return[...e.keys()]}}})(),n=new Map;let a=[],c=[],d=[];const l=new Set,m=()=>{c=a.map(e=>n.get(e)?.record).filter(Boolean),l.forEach(e=>e())},v=(e,t,r,n)=>{const a=o.get(),c=t.type??"default",d={...s.get(c)?.defaults,...t};d.title??(d.title=d.text1),d.description??(d.description=d.text2),d.onOpen??(d.onOpen=d.onShow),d.onClose??(d.onClose=d.onHide),!d.actions&&d.buttons&&(d.actions=d.buttons.map(e=>({label:e.label,onClick:t=>(e.onClick??e.onPress)?.({preventDefault:()=>t.preventDefault(),defaultPrevented:t.defaultPrevented}),autoDismiss:e.autoDismiss,kind:e.kind})));const l=0==d.autoHide?0:d.duration??d.visibilityTime??a.duration,u=Number.isFinite(l)&&l>0?l:0,p=d.important||"error"===c,f=i();return{...d,id:e,type:c,duration:u,position:d.position??a.position,ariaLive:d.ariaLive??(p?"assertive":"polite"),role:d.role??(p?"alert":"status"),createdAt:r?.createdAt??f,updatedAt:f,revision:(r?.revision??-1)+1,timerEpoch:r?.timerEpoch??0,count:r?.count??1,visible:r?.visible??0,dismissed:0,pausedBy:r?.pausedBy??(a.startPaused?["manual"]:[]),remaining:r?.remaining??(u||1/0),custom:n}},b=e=>0===e.record.duration?1/0:e.timer.remaining(),h=e=>{if(0==e.dedupe)return;if("string"==typeof e.dedupe)return e.dedupe;const t=e.title??e.text1,o=e.description??e.text2,r="string"==typeof t?t:"",i="string"==typeof o?o:"";return r||i?`${e.type??"default"}|${r}|${i}`:void 0},x=()=>{const e=o.get(),t=new Map;for(const o of a){const r=n.get(o);if(!r||r.record.dismissed)continue;const i=`${r.record.container??""}|${r.record.position}`,s=t.get(i)??0,a=!!r.record.important;s<e.maxVisible||a?(r.record.visible||(r.record={...r.record,visible:1},!r.record.pausedBy.length&&r.record.duration>0&&r.timer.start()),a||t.set(i,s+1)):r.record.visible&&(r.record={...r.record,visible:0},r.timer.pause())}},w=e=>{e.exitHandle?.(),e.timer.cancel(),n.delete(e.record.id),a=a.filter(t=>t!==e.record.id),d=[{...e.record,dismissed:1},...d].slice(0,o.get().historyLimit),x(),j(),m(),2&e.flags||(e.flags|=2,y(e.record.onClose,e.record,e.reason??"api"))},T=(e,t)=>{if(e.record.dismissed)return;if(0==e.record.dismissible&&("user"===(i=t)||"swipe"===i||"click"===i))return;var i;e.reason=t,e.record={...e.record,dismissed:1,remaining:0,revision:e.record.revision+1},e.timer.cancel(),4&e.flags||"auto"===t||(e.flags|=4,y(e.record.onDismiss,e.record,t)),x(),j(),m();const s=o.get().exitDuration;s>0&&e.record.visible?e.exitHandle=r.setTimeout(()=>w(e),s):w(e)},k=e=>{e.timer.cancel(),e.record.duration>0&&(e.timer.reset(e.record.duration),e.record.visible&&!e.record.pausedBy.length&&e.timer.start()),e.record={...e.record,timerEpoch:e.record.timerEpoch+1,remaining:b(e)}},j=()=>{for(const e of a){const t=n.get(e);!t||!t.record.visible||1&t.flags||t.record.dismissed||(t.flags|=1,y(t.record.onOpen,t.record))}},O={config:o,types:s,add(e){const t=((e,t="gk")=>void 0!==e&&""!==e?e:((e="gk")=>`${e}-${++p}`)(t))(e.id),o=n.get(t);if(o&&!o.record.dismissed){const{custom:r,...i}=e;return O.update(t,i),r&&(o.custom=r,o.record={...o.record,custom:r},m()),t}o&&w(o);const s=h(e);if(void 0!==s)for(const e of n.values())if(e.dedupeKey===s&&!e.record.dismissed)return e.record={...e.record,count:e.record.count+1,revision:e.record.revision+1,updatedAt:i()},k(e),m(),e.record.id;const c=((e,t)=>{const{custom:o,...i}=t,s=v(e,i,void 0,o),n={opts:i,custom:o,record:s,timer:void 0,dedupeKey:h(i),exitHandle:void 0,reason:void 0,flags:0};return n.timer=((e,t,o=u)=>{let r,i,s=e,n=e,a=0,c=0,d=0;const l=new Map,p=new Set,f=()=>Number.isFinite(n)&&n>0,m=()=>c&&!l.size,g=()=>d?0:m()?Math.max(0,n-(o.now()-a)):n,y=()=>{if(!p.size)return;const e=g(),t=s>0?Math.max(0,Math.min(1,e/s)):0;for(const o of p)try{o(e,t)}catch(e){console.error(e)}},v=()=>{r?.(),i?.(),r=i=void 0},b=()=>{v(),!f()||l.size||d||(a=o.now(),r=o.setTimeout(()=>{v(),n=0,d=1,c=0,y(),t()},n),p.size&&(i=o.setInterval(y,50)))};return{start(){!d&&f()&&(c=1,l.clear(),b(),y())},pause(e="manual"){d||(l.set(e,(l.get(e)??0)+1),c&&1===l.size&&(n=Math.max(0,n-(o.now()-a)),v(),y()))},resume(e="manual"){const t=!d&&l.get(e);t&&(t>1?l.set(e,t-1):l.delete(e),m()&&f()&&(b(),y()))},clearReasons(){l.clear(),c&&f()&&b()},add(e){if(d||!Number.isFinite(n))return;const t=m();n=Math.max(1,g()+e),s=Math.max(s,n),t&&b(),y()},reset(e){d=0,n=s=e??s,m()&&(f()?b():v()),y()},cancel(){v(),p.clear(),c=0,d=1,n=0},remaining:g,elapsed:()=>Math.max(0,s-g()),isRunning:()=>m()&&!d&&f(),isPaused:()=>l.size>0,pausedReasons:()=>[...l.keys()],onTick(e){return p.add(e),m()&&!i&&(i=o.setInterval(y,50)),()=>{p.delete(e),!p.size&&i&&(i(),i=void 0)}}}})(s.duration,()=>{8&n.flags||(n.flags|=8,y(n.record.onAutoClose,n.record)),T(n,"auto")},r),s.pausedBy.length&&n.timer.pause(),n})(t,e);return n.set(t,c),a=[...a,t],x(),m(),j(),t},update(e,t){const o=n.get(e);if(!o||o.record.dismissed)return 0;const{resetTimer:r=1,...i}=t,s={...o.opts};void 0!==i.type&&i.type!==o.record.type&&(delete s.duration,delete s.ariaLive,delete s.role,delete s.icon);let a=0;for(const e in i){const t=i[e];void 0!==t&&(o.opts[e]!==t&&(a=1),s[e]=t)}if(!a&&void 0===i.type&&void 0===i.position)return 1;o.opts=s,o.dedupeKey=h(s);const c=v(e,s,o.record,o.custom),d=c.position!==o.record.position;return o.record=c,d&&(o.record={...o.record,visible:0},x()),r||d?k(o):o.record={...o.record,remaining:b(o)},m(),j(),1},dismiss(e,t="api"){if(void 0===e)return O.dismissAll(t);const o=n.get(e);o&&T(o,t)},dismissAll(e="api"){for(const t of n.values())T(t,e)},pause(e,t){const o=void 0!==e?[n.get(e)]:n.values();for(const e of o)e&&!e.record.pausedBy.includes(t)&&(e.timer.pause(t),e.record={...e.record,pausedBy:[...e.record.pausedBy,t],remaining:b(e)});m()},resume(e,t){const o=void 0!==e?[n.get(e)]:n.values();for(const e of o){if(!e||!e.record.pausedBy.includes(t))continue;e.timer.resume(t);const o=e.record.pausedBy.filter(e=>e!==t);e.record={...e.record,pausedBy:o,remaining:b(e)},!o.length&&e.record.visible&&e.record.duration>0&&e.timer.start()}m()},extend(e,t){const o=n.get(e);o&&!o.record.dismissed&&(o.timer.add(t),o.record={...o.record,remaining:b(o),timerEpoch:o.record.timerEpoch+1,revision:o.record.revision+1},m())},getRemaining(e){const t=n.get(e);return t?b(t):0},getToasts:()=>c,getHistory:()=>d,clear(){for(const e of n.values())e.exitHandle?.(),e.timer.cancel();n.clear(),a=[],c=[],m()},clearHistory(){d=[],m()},subscribe(e){return l.add(e),()=>{l.delete(e)}}};return O})({config:o.config});return{store:r,toast:t(r)}})()),c}function s(e){return i().store.config.set(e)}function n(){c&&(c.store.clear(),c.store.clearHistory(),c.store.config.reset())}Object.defineProperty(exports,"__esModule",{value:1});var a,c,d=require("react"),l=require("react/jsx-runtime"),u={now(){return Date.now()},setTimeout(e,t){const o=setTimeout(e,t);return()=>clearTimeout(o)},setInterval(e,t){const o=setInterval(e,t);return()=>clearInterval(o)}},p=0,f=Object.freeze({theme:"ios-glass",mode:"auto",position:"top-right",duration:4e3,maxVisible:8,gap:12,stack:1,dir:"auto",hotkey:"alt+t",pauseOn:["hover","focus","hidden"],shadow:1,closeButton:0,richColors:0,invert:0,swipe:1,dragThreshold:45,progress:0,closeOnClick:0,exitDuration:250,historyLimit:100,regionLabel:"Notifications",closeLabel:"Close notification",startPaused:0,newestOnTop:1,dedupeWindow:500,sound:0,soundVolume:.5,container:void 0}),m=(e,t="polite")=>({color:`var(--gk-${e})`,ariaLive:t}),g={success:m("success"),error:m("error","assertive"),warning:m("warning","assertive"),info:m("info"),loading:{...m("info"),defaults:{duration:0,dismissible:0}},message:m("fg")},y=(e,t,o)=>{try{e?.(t,o)}catch(e){console.error(e)}},v=e=>"string"==typeof e?{title:e}:e,b={success:[[392,0,1],[523,.1,1]],error:[[233,0,1],[185,.13,1]],warning:[[349,0,.8],[349,.16,.6]],info:[[466,0,.9]],ding:[[659,0,.9],[880,.08,1]],pop:[[440,0,.7],[880,.03,.9]],chime:[[523,0,.8],[659,.09,.85],[784,.18,1]],bell:[[587,0,1],[1175,.04,.5]],message:[[440,0,.8],[659,.12,.9]],bubble:[[330,0,.6],[494,.06,.8]],marimba:[[523,0,1],[659,.06,.9],[784,.12,1],[1047,.18,.8]],crystal:[[880,0,.8],[1319,.08,.9],[1760,.16,.7]],subtle:[[440,0,.6]],harp:[[392,0,.7],[494,.05,.8],[587,.1,.9],[784,.15,1]]},h=[[1,.6,.5],[2,.06,.15]],x=r,w=(()=>{const e=i().toast,t=e=>(t,o={})=>((async e=>{try{const t=await(import("expo-haptics"));if(!t)return;"success"===e?await t.notificationAsync(t.NotificationFeedbackType.Success):"error"===e?await t.notificationAsync(t.NotificationFeedbackType.Error):"warning"===e?await t.notificationAsync(t.NotificationFeedbackType.Warning):await t.impactAsync(t.ImpactFeedbackStyle.Light)}catch{}})(o.type??"default"),e(t,o)),o=t(e);return o.success=t(e.success),o.error=t(e.error),o.info=t(e.info),o.warning=t(e.warning),o.loading=t(e.loading),o.message=t(e.message),o.promise=e.promise,o.custom=e.custom,o.update=e.update,o.dismiss=e.dismiss,o.dismissAll=e.dismissAll,o.getToasts=e.getToasts,o.getHistory=e.getHistory,Object.defineProperty(o,"types",{value:e.types,enumerable:1}),o})(),T=null,k=Object.assign(w,{show(e){if("string"==typeof e)return w(e);const{type:t="success",text1:o,text2:r,position:i="top",autoHide:s=1,visibilityTime:n,topOffset:a,bottomOffset:c,keyboardOffset:d,onShow:l,onHide:u,onPress:p,...f}=e,m=f,g=0==s?0:n??m.duration??4e3,y="top"===i?"top-center":"bottom"===i?"bottom-center":i;return w(o??m.title,{...m,type:t,title:o??m.title,description:r??m.description,duration:g,position:y,topOffset:a,bottomOffset:c,keyboardOffset:d,onOpen:l?()=>l():m.onOpen,onClose:u?()=>u():m.onClose,onPress:p?()=>p():m.onPress})},hide(e){void 0!==e?w.dismiss(e):w.dismissAll()},setRef(e){T=e},getRef:()=>T}),j=k,O={toast:w,configure:s,reset:n};exports.GlazeProvider=({children:e})=>l.jsx(l.Fragment,{children:e}),exports.Toast=k,exports.Toaster=e=>{const[t,o]=d.useState([]);d.useEffect(()=>{const e=i();o(e.store.getToasts());const t=e.store.subscribe(()=>{o(e.store.getToasts())});return()=>t()},[]);const r=d.useMemo(()=>t.filter(e=>e.visible),[t]);if(0===r.length)return null;const s=e.position??"top-center",n=s.startsWith("bottom"),a="center"===s||"middle"===s,c=s.endsWith("left"),u=s.endsWith("right"),p=e.topOffset??e.offset??50,f=e.bottomOffset??e.offset??50,m=n?{bottom:f}:a?{top:"50%",transform:"translateY(-50%)"}:{top:p},g=c?{alignItems:"flex-start"}:u?{alignItems:"flex-end"}:{alignItems:"center"},y=e.visibleToasts??4,v=r.slice(0,y);return l.jsx("div",{style:{position:"absolute",...m,...g,left:16,right:16,zIndex:99999,display:"flex",flexDirection:"column",gap:e.gap??8,...e.style},children:v.map(t=>l.jsxs("div",{onClick(){t.onPress&&t.onPress(t)},style:{backgroundColor:"rgba(28, 28, 30, 0.88)",padding:14,borderRadius:16,minWidth:200,maxWidth:"100%",boxShadow:"0 8px 24px rgba(0, 0, 0, 0.25)",display:"flex",flexDirection:"column",gap:4,position:"relative",cursor:t.onPress?"pointer":void 0,...e.toastStyle},children:[t.image?l.jsx("div",{style:{borderRadius:10,overflow:"hidden",marginBottom:4},children:l.jsx("img",{src:"string"==typeof t.image?t.image:t.image.src,alt:"",style:{width:"100%",maxHeight:120,objectFit:"cover"}})}):null,e.closeButton||t.closeButton||t.closeText||t.discardText?l.jsx("button",{type:"button",onClick(e){e.stopPropagation(),i().toast.dismiss(t.id)},"aria-label":t.closeButtonLabel??"Close notification",style:{position:"absolute",top:8,right:10,background:"transparent",border:"none",color:"rgba(255,255,255,0.6)",cursor:"pointer",fontSize:t.closeText||t.discardText?12:16,fontWeight:t.closeText||t.discardText?"600":"normal",padding:"2px 6px",lineHeight:1},children:t.closeText??t.discardText??"×"}):null,t.character||t.robotVariant?l.jsxs("div",{style:{fontSize:11,fontWeight:"700",color:"#a78bfa",textTransform:"uppercase",letterSpacing:"0.05em",marginBottom:2},children:["[",t.character??t.robotVariant,"]"]}):null,t.badge?l.jsx("div",{style:{fontSize:11,fontWeight:"600",color:"#38bdf8",textTransform:"uppercase",letterSpacing:"0.04em"},children:"string"==typeof t.badge?t.badge:t.badge.label??""}):null,t.title?l.jsx("div",{style:{color:"#fff",fontWeight:"600",fontSize:15},children:t.title+""}):null,t.description?l.jsx("div",{style:{color:"#aaa",fontSize:13,marginTop:2},children:t.description+""}):null,void 0!==t.progressValue?l.jsx("div",{style:{height:3,backgroundColor:"rgba(255,255,255,0.15)",borderRadius:3,marginTop:6,overflow:"hidden"},children:l.jsx("div",{style:{height:"100%",width:Math.round(100*t.progressValue)+"%",backgroundColor:"#38bdf8"}})}):null,t.actions&&t.actions.length>0?l.jsx("div",{style:{display:"flex",gap:8,marginTop:8,justifyContent:"flex-end"},children:t.actions.map((e,t)=>l.jsx("button",{type:"button",onClick:e.onClick?t=>e.onClick?.(t.nativeEvent):void 0,style:{fontSize:12,fontWeight:"600",padding:"4px 10px",borderRadius:8,border:"none",backgroundColor:"rgba(255, 255, 255, 0.12)",color:"#fff",cursor:"pointer"},children:e.label??e.text??"Action"},t))}):null]},t.id+""))})},exports.chime=x,exports.configure=s,exports.default=j,exports.nativeSpring={glide:{damping:32,stiffness:170,mass:1},snappy:{damping:24,stiffness:280,mass:.8}},exports.nativeTiming={normal:{duration:300},exit:{duration:200}},exports.playSound=r,exports.resetNativeEngine=n,exports.toast=w,exports.ui=O,exports.useNativeToast=()=>{const[e,t]=d.useState([]);return d.useEffect(()=>{const e=i();return t(e.store.getToasts()),e.store.subscribe(()=>{t(e.store.getToasts())})},[]),{toast:w,toasts:e}};//# sourceMappingURL=native.cjs.map
|
package/dist/native.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/clock.ts","../src/core/ids.ts","../src/core/config.ts","../src/core/timer.ts","../src/core/types-registry.ts","../src/core/toast-manager.ts","../src/core/promise.ts","../src/core/toast-api.ts","../src/core/index.ts","../src/native/index.tsx"],"names":["defaultClock","fn","ms","t","counter","nextId","p","normalizeId","id","DEFAULT_CONFIG","createConfigStore","initial","current","stripUndefined","listeners","emit","listener","patch","value","out","k","createTimer","duration","onDone","clock","totalDuration","remainingMs","startedAt","cancelTimeout","cancelInterval","started","done","pauseReasons","tickListeners","isLive","notifyTick","rem","getRemaining","frac","err","stopTimers","arm","reason","count","live","callback","tDef","color","ariaLive","BUILT_IN_TYPES","createTypeRegistry","custom","name","definition","USER_REASONS","safeCall","args","MANUAL_PAUSE","BUILTIN_DEFAULTS","createToastManager","options","config","now","types","entries","order","snapshot","history","regionOf","record","build","opts","previous","cfg","type","merged","rawDuration","urgent","stamp","remainingOf","entry","dedupeKeyOf","d","promote","counts","key","used","isImportant","finalize","flushOpened","dismissEntry","exit","makeEntry","input","restartTimer","store","existing","other","resetTimer","rest","next","changed","rebuilt","positionChanged","list","e","nextPausedBy","toPatch","message","errorText","error","runPromiseToast","messages","promise","requestedId","base","loadingPatch","settle","raw","payload","desc","createToastApi","make","api","renderer","createToastEngine","nativeEngine","getNativeEngine","triggerHaptic","Haptics","createNativeToastApi","baseToast","wrap","msg","nativeApi","toast","configure","resetNativeEngine","ui","GlazeProvider","children","jsx","Fragment","Toaster","props","toastsList","setToastsList","useState","useEffect","engine","unsub","visibleToasts","useMemo","position","posStyle","item","jsxs","act","i","useNativeToast"],"mappings":"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","file":"native.cjs","sourcesContent":["/**\n * Injectable clock and scheduler interface.\n * Abstracts time and timers so tests and headless engines can run deterministically.\n */\nexport interface Clock {\n /** Returns the current timestamp in milliseconds. */\n now(): number;\n /**\n * Schedules a callback after `ms` milliseconds.\n * @returns A cancellation function.\n */\n setTimeout(fn: () => void, ms: number): () => void;\n /**\n * Schedules a recurring callback every `ms` milliseconds.\n * @returns A cancellation function.\n */\n setInterval(fn: () => void, ms: number): () => void;\n}\n\n/** Default system clock using standard global timer functions. */\nexport const defaultClock: Clock = {\n now: () => Date.now(),\n setTimeout: (fn, ms) => {\n const t = setTimeout(fn, ms);\n return () => clearTimeout(t);\n },\n setInterval: (fn, ms) => {\n const t = setInterval(fn, ms);\n return () => clearInterval(t);\n },\n};\n","import type { ToastId } from './types';\n\nlet counter = 0;\n\n/**\n * Returns a collision-safe, incremental unique identifier.\n * @param prefix Optional prefix for the id (default: 'gk').\n */\nexport function nextId(p = 'gk'): string {\n return `${p}-${++counter}`;\n}\n\n/**\n * Normalizes an optional user-provided id, generating an incremental id if omitted.\n * @param id User-supplied id or undefined.\n * @param prefix Prefix used when generating an id.\n */\nexport function normalizeId(id: ToastId | undefined, p = 'gk'): ToastId {\n return id !== undefined && id !== '' ? id : nextId(p);\n}\n\n/**\n * Resets the internal counter. Useful for deterministic test execution.\n */\nexport function resetIdCounter(): void {\n counter = 0;\n}\n","import type { GlazeConfig, Listener, Unsubscribe } from './types';\n\n/** Library default configuration. */\nexport const DEFAULT_CONFIG: Readonly<GlazeConfig> = Object.freeze({\n theme: 'ios-glass',\n mode: 'auto',\n position: 'top-right',\n duration: 4000,\n maxVisible: 8,\n gap: 12,\n stack: true,\n dir: 'auto',\n hotkey: 'alt+t',\n pauseOn: ['hover', 'focus', 'hidden'],\n shadow: true,\n closeButton: false,\n richColors: false,\n invert: false,\n swipe: true,\n dragThreshold: 45,\n progress: false,\n closeOnClick: false,\n exitDuration: 250,\n historyLimit: 100,\n regionLabel: 'Notifications',\n closeLabel: 'Close notification',\n startPaused: false,\n newestOnTop: true,\n dedupeWindow: 500,\n container: undefined,\n} satisfies GlazeConfig);\n\n/** Observable configuration container holding immutable snapshots. */\nexport interface ConfigStore {\n /** Returns the current immutable configuration snapshot. */\n get(): Readonly<GlazeConfig>;\n /** Merges a partial configuration and notifies subscribers. Returns the updated snapshot. */\n set(patch: Partial<GlazeConfig>): Readonly<GlazeConfig>;\n /** Restores library defaults. */\n reset(): void;\n /** Subscribes to configuration changes. */\n subscribe(listener: Listener): Unsubscribe;\n}\n\n/**\n * Resolves an option according to precedence:\n * Call option > Theme default > Global config > Library default.\n */\nexport const resolvePrecedence = <T>(\n callVal: T | undefined,\n themeVal: T | undefined,\n globalVal: T | undefined,\n defaultVal: T,\n): T => callVal ?? themeVal ?? globalVal ?? defaultVal;\n\n/** Creates an isolated, immutable configuration store. */\nexport function createConfigStore(initial: Partial<GlazeConfig> = {}): ConfigStore {\n let current: Readonly<GlazeConfig> = Object.freeze({\n ...DEFAULT_CONFIG,\n ...stripUndefined(initial),\n });\n const listeners = new Set<Listener>();\n\n const emit = (): void => {\n listeners.forEach((listener) => listener());\n };\n\n return {\n get: () => current,\n set(patch) {\n current = Object.freeze({ ...current, ...stripUndefined(patch) });\n emit();\n return current;\n },\n reset() {\n current = DEFAULT_CONFIG;\n emit();\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n\nfunction stripUndefined<T extends object>(value: T): Partial<T> {\n const out: Partial<T> = {};\n for (const k in value) if (value[k] !== undefined) out[k] = value[k];\n return out;\n}\n","import type { Clock } from './clock';\nimport { defaultClock } from './clock';\n\nexport interface PausableTimer {\n /** Starts or resumes the countdown. No effect when already running or finished. */\n start(): void;\n /**\n * Pauses the timer for a named reason (reference-counted).\n * @param reason The pause trigger identifier, e.g. 'hover', 'focus', 'hidden', 'manual'.\n */\n pause(reason?: string): void;\n /**\n * Resumes the timer for a named reason (decrements reference count).\n * Restarts the countdown when all pause reasons are cleared.\n */\n resume(reason?: string): void;\n /** Adds milliseconds to the remaining countdown (or subtracts if negative). */\n add(ms: number): void;\n /** Resets the countdown duration and restarts if previously active. */\n reset(ms?: number): void;\n /** Permanently cancels and tears down the timer. */\n cancel(): void;\n /** Current milliseconds remaining on the countdown. */\n remaining(): number;\n /** Current milliseconds elapsed on the countdown. */\n elapsed(): number;\n /** Whether the countdown is actively ticking. */\n isRunning(): boolean;\n /** Whether the countdown is held by one or more pause reasons. */\n isPaused(): boolean;\n /** List of all currently active pause reason names. */\n pausedReasons(): string[];\n /** Clears all pause reasons and resumes if started. */\n clearReasons(): void;\n /** Registers a progress tick listener called while ticking. */\n onTick(callback: (remaining: number, fraction: number) => void): () => void;\n}\n\n/**\n * Creates a pausable countdown timer with reference-counted pause reasons.\n *\n * @param duration Total countdown duration in milliseconds.\n * @param onDone Callback fired when countdown reaches zero.\n * @param clock Injectable clock/scheduler (defaults to defaultClock).\n */\nexport function createTimer(\n duration: number,\n onDone: () => void,\n clock: Clock = defaultClock,\n): PausableTimer {\n let totalDuration = duration;\n let remainingMs = duration;\n let startedAt = 0;\n let cancelTimeout: (() => void) | undefined;\n let cancelInterval: (() => void) | undefined;\n let started = false;\n let done = false;\n\n // Reference-counted pause reasons: reason -> count\n const pauseReasons = new Map<string, number>();\n const tickListeners = new Set<(remaining: number, fraction: number) => void>();\n\n const isLive = (): boolean => Number.isFinite(remainingMs) && remainingMs > 0;\n\n const notifyTick = (): void => {\n if (tickListeners.size === 0) return;\n const rem = getRemaining();\n const frac = totalDuration > 0 ? Math.max(0, Math.min(1, rem / totalDuration)) : 0;\n for (const listener of tickListeners) {\n try {\n listener(rem, frac);\n } catch (err) {\n console.error(err);\n }\n }\n };\n\n const getRemaining = (): number => {\n if (done) return 0;\n if (started && pauseReasons.size === 0) {\n return Math.max(0, remainingMs - (clock.now() - startedAt));\n }\n return remainingMs;\n };\n\n const stopTimers = (): void => {\n cancelTimeout?.();\n cancelTimeout = undefined;\n cancelInterval?.();\n cancelInterval = undefined;\n };\n\n const arm = (): void => {\n stopTimers();\n if (!isLive() || pauseReasons.size > 0 || done) return;\n\n startedAt = clock.now();\n cancelTimeout = clock.setTimeout(() => {\n stopTimers();\n remainingMs = 0;\n done = true;\n started = false;\n notifyTick();\n onDone();\n }, remainingMs);\n\n if (tickListeners.size > 0) {\n cancelInterval = clock.setInterval(() => {\n notifyTick();\n }, 50);\n }\n };\n\n const pauseTimer = (reason = 'manual'): void => {\n if (done) return;\n pauseReasons.set(reason, (pauseReasons.get(reason) ?? 0) + 1);\n\n if (started && pauseReasons.size === 1) {\n remainingMs = Math.max(0, remainingMs - (clock.now() - startedAt));\n stopTimers();\n notifyTick();\n }\n };\n\n const resumeTimer = (reason = 'manual'): void => {\n if (done) return;\n const count = pauseReasons.get(reason);\n if (!count) return;\n\n if (count <= 1) pauseReasons.delete(reason);\n else pauseReasons.set(reason, count - 1);\n\n if (started && pauseReasons.size === 0 && isLive()) {\n arm();\n notifyTick();\n }\n };\n\n return {\n start() {\n if (done || !isLive()) return;\n started = true;\n pauseReasons.clear();\n arm();\n notifyTick();\n },\n pause: pauseTimer,\n resume: resumeTimer,\n clearReasons() {\n pauseReasons.clear();\n if (started && isLive()) arm();\n },\n add(ms: number) {\n if (done || !Number.isFinite(remainingMs)) return;\n const live = started && pauseReasons.size === 0;\n remainingMs = Math.max(\n 1,\n (live ? remainingMs - (clock.now() - startedAt) : remainingMs) + ms,\n );\n totalDuration = Math.max(totalDuration, remainingMs);\n if (live) arm();\n notifyTick();\n },\n reset(ms?: number) {\n done = false;\n remainingMs = totalDuration = ms !== undefined ? ms : totalDuration;\n if (started && pauseReasons.size === 0) {\n if (isLive()) arm();\n else stopTimers();\n }\n notifyTick();\n },\n cancel() {\n stopTimers();\n started = false;\n done = true;\n remainingMs = 0;\n },\n remaining: getRemaining,\n elapsed() {\n return Math.max(0, totalDuration - getRemaining());\n },\n isRunning: () => started && !done && !pauseReasons.size && isLive(),\n isPaused: () => pauseReasons.size > 0,\n pausedReasons: () => [...pauseReasons.keys()],\n onTick(callback) {\n tickListeners.add(callback);\n if (started && pauseReasons.size === 0 && !cancelInterval) {\n cancelInterval = clock.setInterval(notifyTick, 50);\n }\n return () => {\n tickListeners.delete(callback);\n if (tickListeners.size === 0 && cancelInterval) {\n cancelInterval();\n cancelInterval = undefined;\n }\n };\n },\n };\n}\n","import type { ToastTypeDefinition } from './types';\n\n/** Registry of custom and built-in toast types. */\nexport interface TypeRegistry {\n /**\n * Registers or replaces a toast type.\n * @param name Non-empty type name.\n * @param definition Defaults, icon, color tokens, default duration, ariaLive.\n */\n add(name: string, definition?: ToastTypeDefinition): void;\n /** Removes a type. Returns whether it existed. */\n remove(name: string): boolean;\n /** Looks a type up. */\n get(name: string): ToastTypeDefinition | undefined;\n /** Lists registered custom type names. */\n list(): string[];\n}\n\nconst tDef = (color: string, ariaLive: 'polite' | 'assertive' = 'polite') => ({\n color: `var(--gk-${color})`,\n ariaLive,\n});\n\nconst BUILT_IN_TYPES: Record<string, ToastTypeDefinition> = {\n success: tDef('success'),\n error: tDef('error', 'assertive'),\n warning: tDef('warning', 'assertive'),\n info: tDef('info'),\n loading: { ...tDef('info'), defaults: { duration: 0, dismissible: false } },\n message: tDef('fg'),\n};\n\n/** Creates a type registry. */\nexport function createTypeRegistry(): TypeRegistry {\n const custom = new Map<string, ToastTypeDefinition>();\n\n return {\n add(name, definition = {}) {\n const k = typeof name === 'string' ? name.trim() : '';\n if (!k) throw new TypeError('toastory: invalid type');\n custom.set(k, definition);\n },\n remove: (name) => custom.delete(name),\n get: (name) => custom.get(name) ?? BUILT_IN_TYPES[name],\n list: () => [...custom.keys()],\n };\n}\n","import type { Clock } from './clock';\nimport { defaultClock } from './clock';\nimport type { ConfigStore } from './config';\nimport { createConfigStore } from './config';\nimport { normalizeId } from './ids';\nimport { createTimer } from './timer';\nimport type { PausableTimer } from './timer';\nimport { createTypeRegistry } from './types-registry';\nimport type { TypeRegistry } from './types-registry';\nimport type {\n CloseReason,\n Listener,\n ToastCustomRenderer,\n ToastId,\n ToastOptions,\n ToastPatch,\n ToastRecord,\n Unsubscribe,\n} from './types';\n\n/** Reasons that originate from a person and are blocked on non-dismissible toasts. */\nconst USER_REASONS = new Set<CloseReason>(['user', 'swipe', 'click']);\n\nconst safeCall = <A extends unknown[]>(\n fn: ((...args: A) => void) | undefined,\n ...args: A\n): void => {\n try {\n fn?.(...args);\n } catch (err) {\n console.error(err);\n }\n};\n\n/** Pause reason used by `startPaused`. */\nexport const MANUAL_PAUSE = 'manual';\n\n/** Options for creating a toast manager / store. */\nexport interface ToastManagerOptions {\n config?: ConfigStore;\n clock?: Clock;\n now?: () => number;\n types?: TypeRegistry;\n}\n\nexport type ToastStoreOptions = ToastManagerOptions;\n\n/** Input for adding a toast. */\nexport interface AddToastInput extends ToastOptions {\n custom?: ToastCustomRenderer;\n}\n\ninterface Entry {\n opts: ToastOptions;\n custom: ToastCustomRenderer | undefined;\n record: ToastRecord;\n timer: PausableTimer;\n dedupeKey: string | undefined;\n exitHandle: (() => void) | undefined;\n reason: CloseReason | undefined;\n openedFired: boolean;\n closedFired: boolean;\n dismissFired: boolean;\n autoCloseFired: boolean;\n}\n\nconst BUILTIN_DEFAULTS: Readonly<Record<string, ToastOptions>> = {\n loading: { duration: 0 },\n};\n\n/** State container for toasts. Pure logic: no DOM, no framework. */\nexport interface ToastManager {\n add(input: AddToastInput): ToastId;\n update(id: ToastId, patch: ToastPatch): boolean;\n dismiss(id?: ToastId, reason?: CloseReason): void;\n dismissAll(reason?: CloseReason): void;\n pause(id: ToastId | undefined, reason: string): void;\n resume(id: ToastId | undefined, reason: string): void;\n extend(id: ToastId, ms: number): void;\n getRemaining(id: ToastId): number;\n getToasts(): readonly ToastRecord[];\n getHistory(): readonly ToastRecord[];\n clear(): void;\n clearHistory(): void;\n subscribe(listener: Listener): Unsubscribe;\n readonly config: ConfigStore;\n readonly types: TypeRegistry;\n}\n\nexport type ToastStore = ToastManager;\n\nexport function createToastManager(options: ToastManagerOptions = {}): ToastManager {\n const config = options.config ?? createConfigStore();\n const clock = options.clock ?? defaultClock;\n const now = options.now ?? (() => clock.now());\n const types = options.types ?? createTypeRegistry();\n\n const entries = new Map<ToastId, Entry>();\n let order: ToastId[] = [];\n let snapshot: readonly ToastRecord[] = [];\n let history: readonly ToastRecord[] = [];\n const listeners = new Set<Listener>();\n\n const emit = (): void => {\n snapshot = order.map((id) => entries.get(id)?.record).filter(Boolean) as ToastRecord[];\n listeners.forEach((listener) => listener());\n };\n\n const regionOf = (record: ToastRecord): string => `${record.container ?? ''}|${record.position}`;\n\n const build = (\n id: ToastId,\n opts: ToastOptions,\n previous: ToastRecord | undefined,\n custom: ToastCustomRenderer | undefined,\n ): ToastRecord => {\n const cfg = config.get();\n const type = opts.type ?? 'default';\n const merged: ToastOptions = {\n ...BUILTIN_DEFAULTS[type],\n ...types.get(type)?.defaults,\n ...opts,\n };\n const rawDuration = merged.duration ?? cfg.duration;\n const duration = Number.isFinite(rawDuration) && rawDuration > 0 ? rawDuration : 0;\n const urgent = merged.important || type === 'error';\n const stamp = now();\n\n const record: ToastRecord = {\n ...merged,\n id,\n type,\n duration,\n position: merged.position ?? cfg.position,\n ariaLive: merged.ariaLive ?? (urgent ? 'assertive' : 'polite'),\n role: merged.role ?? (urgent ? 'alert' : 'status'),\n createdAt: previous?.createdAt ?? stamp,\n updatedAt: stamp,\n revision: (previous?.revision ?? -1) + 1,\n timerEpoch: previous?.timerEpoch ?? 0,\n count: previous?.count ?? 1,\n visible: previous?.visible ?? false,\n dismissed: false,\n pausedBy: previous?.pausedBy ?? (cfg.startPaused ? [MANUAL_PAUSE] : []),\n remaining: previous?.remaining ?? (duration ? duration : Infinity),\n custom,\n };\n return record;\n };\n\n const remainingOf = (entry: Entry): number => {\n return entry.record.duration === 0 ? Infinity : entry.timer.remaining();\n };\n\n const dedupeKeyOf = (opts: ToastOptions): string | undefined => {\n if (opts.dedupe === false) return;\n if (typeof opts.dedupe === 'string') return opts.dedupe;\n const t = typeof opts.title === 'string' ? opts.title : '';\n const d = typeof opts.description === 'string' ? opts.description : '';\n return t || d ? `${opts.type ?? 'default'}|${t}|${d}` : undefined;\n };\n\n const promote = (): void => {\n const cfg = config.get();\n const counts = new Map<string, number>();\n for (const id of order) {\n const entry = entries.get(id);\n if (!entry || entry.record.dismissed) continue;\n const key = regionOf(entry.record);\n const used = counts.get(key) ?? 0;\n const isImportant = !!entry.record.important;\n if (used < cfg.maxVisible || isImportant) {\n if (!entry.record.visible) {\n entry.record = { ...entry.record, visible: true };\n if (!entry.record.pausedBy.length && entry.record.duration > 0) {\n entry.timer.start();\n }\n }\n if (!isImportant) counts.set(key, used + 1);\n } else if (entry.record.visible) {\n entry.record = { ...entry.record, visible: false };\n entry.timer.pause();\n }\n }\n };\n\n const finalize = (entry: Entry): void => {\n entry.exitHandle?.();\n entry.timer.cancel();\n entries.delete(entry.record.id);\n order = order.filter((id) => id !== entry.record.id);\n history = [{ ...entry.record, dismissed: true }, ...history].slice(\n 0,\n config.get().historyLimit,\n );\n promote();\n flushOpened();\n emit();\n if (!entry.closedFired) {\n entry.closedFired = true;\n safeCall(entry.record.onClose, entry.record, entry.reason ?? 'api');\n }\n };\n\n const dismissEntry = (entry: Entry, reason: CloseReason): void => {\n if (entry.record.dismissed) return;\n if (entry.record.dismissible === false && USER_REASONS.has(reason)) return;\n entry.reason = reason;\n entry.record = {\n ...entry.record,\n dismissed: true,\n remaining: 0,\n revision: entry.record.revision + 1,\n };\n entry.timer.cancel();\n\n if (!entry.dismissFired && reason !== 'auto') {\n entry.dismissFired = true;\n safeCall(entry.record.onDismiss, entry.record, reason);\n }\n\n promote();\n flushOpened();\n emit();\n\n const exit = config.get().exitDuration;\n if (exit <= 0 || !entry.record.visible) {\n finalize(entry);\n } else {\n entry.exitHandle = clock.setTimeout(() => finalize(entry), exit);\n }\n };\n\n const makeEntry = (id: ToastId, input: AddToastInput): Entry => {\n const { custom, ...opts } = input;\n const record = build(id, opts, undefined, custom);\n const entry: Entry = {\n opts,\n custom,\n record,\n timer: undefined as unknown as PausableTimer,\n dedupeKey: dedupeKeyOf(opts),\n exitHandle: undefined,\n reason: undefined,\n openedFired: false,\n closedFired: false,\n dismissFired: false,\n autoCloseFired: false,\n };\n entry.timer = createTimer(\n record.duration,\n () => {\n if (!entry.autoCloseFired) {\n entry.autoCloseFired = true;\n safeCall(entry.record.onAutoClose, entry.record);\n }\n dismissEntry(entry, 'auto');\n },\n clock,\n );\n if (record.pausedBy.length) entry.timer.pause();\n return entry;\n };\n\n const restartTimer = (entry: Entry): void => {\n entry.timer.cancel();\n if (entry.record.duration > 0) {\n entry.timer.reset(entry.record.duration);\n if (entry.record.visible && !entry.record.pausedBy.length) entry.timer.start();\n }\n entry.record = {\n ...entry.record,\n timerEpoch: entry.record.timerEpoch + 1,\n remaining: remainingOf(entry),\n };\n };\n\n const flushOpened = (): void => {\n for (const id of order) {\n const entry = entries.get(id);\n if (entry && entry.record.visible && !entry.openedFired && !entry.record.dismissed) {\n entry.openedFired = true;\n safeCall(entry.record.onOpen, entry.record);\n }\n }\n };\n\n const store: ToastManager = {\n config,\n types,\n\n add(input: AddToastInput): ToastId {\n const id = normalizeId(input.id);\n const existing = entries.get(id);\n if (existing && !existing.record.dismissed) {\n const { custom, ...patch } = input;\n store.update(id, patch);\n if (custom) {\n existing.custom = custom;\n existing.record = { ...existing.record, custom };\n emit();\n }\n return id;\n }\n if (existing) finalize(existing);\n\n const key = dedupeKeyOf(input);\n if (key !== undefined) {\n for (const other of entries.values()) {\n if (other.dedupeKey === key && !other.record.dismissed) {\n other.record = {\n ...other.record,\n count: other.record.count + 1,\n revision: other.record.revision + 1,\n updatedAt: now(),\n };\n restartTimer(other);\n emit();\n return other.record.id;\n }\n }\n }\n\n const entry = makeEntry(id, input);\n entries.set(id, entry);\n order = [...order, id];\n promote();\n emit();\n flushOpened();\n return id;\n },\n\n update(id, patch) {\n const entry = entries.get(id);\n if (!entry || entry.record.dismissed) return false;\n const { resetTimer = true, ...rest } = patch;\n const next: ToastOptions = { ...entry.opts };\n if (rest.type !== undefined && rest.type !== entry.record.type) {\n delete next.duration;\n delete next.ariaLive;\n delete next.role;\n delete next.icon;\n }\n let changed = false;\n for (const key in rest) {\n const value = (rest as Record<string, unknown>)[key];\n if (value !== undefined) {\n if ((entry.opts as Record<string, unknown>)[key] !== value) changed = true;\n (next as Record<string, unknown>)[key] = value;\n }\n }\n if (!changed && rest.type === undefined && rest.position === undefined) return true;\n entry.opts = next;\n entry.dedupeKey = dedupeKeyOf(next);\n const rebuilt = build(id, next, entry.record, entry.custom);\n const positionChanged = rebuilt.position !== entry.record.position;\n entry.record = rebuilt;\n if (positionChanged) {\n entry.record = { ...entry.record, visible: false };\n promote();\n }\n if (resetTimer || positionChanged) restartTimer(entry);\n else {\n entry.record = {\n ...entry.record,\n remaining: remainingOf(entry),\n };\n }\n emit();\n flushOpened();\n return true;\n },\n\n dismiss(id, reason = 'api') {\n if (id === undefined) return store.dismissAll(reason);\n const entry = entries.get(id);\n if (entry) dismissEntry(entry, reason);\n },\n\n dismissAll(reason = 'api') {\n for (const entry of entries.values()) dismissEntry(entry, reason);\n },\n\n pause(id, reason) {\n const list =\n id === undefined\n ? [...entries.values()]\n : [entries.get(id)].filter((e): e is Entry => Boolean(e));\n for (const entry of list) {\n if (entry.record.pausedBy.includes(reason)) continue;\n entry.timer.pause(reason);\n entry.record = {\n ...entry.record,\n pausedBy: [...entry.record.pausedBy, reason],\n remaining: remainingOf(entry),\n };\n }\n emit();\n },\n\n resume(id, reason) {\n const list =\n id === undefined\n ? [...entries.values()]\n : [entries.get(id)].filter((e): e is Entry => Boolean(e));\n for (const entry of list) {\n if (!entry.record.pausedBy.includes(reason)) continue;\n entry.timer.resume(reason);\n const nextPausedBy = entry.record.pausedBy.filter((value) => value !== reason);\n entry.record = {\n ...entry.record,\n pausedBy: nextPausedBy,\n remaining: remainingOf(entry),\n };\n if (!nextPausedBy.length && entry.record.visible && entry.record.duration > 0) {\n entry.timer.start();\n }\n }\n emit();\n },\n\n extend(id, ms) {\n const entry = entries.get(id);\n if (!entry || entry.record.dismissed) return;\n entry.timer.add(ms);\n entry.record = {\n ...entry.record,\n remaining: remainingOf(entry),\n timerEpoch: entry.record.timerEpoch + 1,\n revision: entry.record.revision + 1,\n };\n emit();\n },\n\n getRemaining(id) {\n const entry = entries.get(id);\n return entry ? remainingOf(entry) : 0;\n },\n\n getToasts: () => snapshot,\n getHistory: () => history,\n\n clear() {\n for (const entry of entries.values()) {\n entry.exitHandle?.();\n entry.timer.cancel();\n }\n entries.clear();\n order = [];\n snapshot = [];\n emit();\n },\n\n clearHistory() {\n history = [];\n emit();\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n\n return store;\n}\n\nexport const createToastStore = createToastManager;\n","import type { PromiseHandle, PromiseMessages, ToastId, ToastOptions, ToastPatch } from './types';\nimport type { ToastStore } from './toast-manager';\n\nfunction toPatch(message: string | ToastPatch): ToastPatch {\n return typeof message === 'string' ? { title: message } : message;\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * Handles async promise toasts: displays loading state, resolves to success or error,\n * calls lifecycle hooks, and provides `unwrap()` returning the raw promise result.\n */\nexport function runPromiseToast<T>(\n store: ToastStore,\n input: Promise<T> | (() => Promise<T>),\n messages: PromiseMessages<T>,\n options: ToastOptions = {},\n): PromiseHandle<T> {\n let promise: Promise<T>;\n try {\n promise = typeof input === 'function' ? input() : input;\n } catch (error) {\n promise = Promise.reject(error);\n }\n\n const { id: requestedId, ...base } = options;\n const loadingPatch = toPatch(messages.loading);\n\n const id: ToastId = store.add({\n ...base,\n id: requestedId,\n ...loadingPatch,\n type: 'loading',\n duration: 0,\n });\n\n const settle = (type: 'success' | 'error', raw: unknown, payload: unknown): void => {\n const desc =\n typeof messages.description === 'function'\n ? messages.description(\n type === 'success'\n ? { status: type, value: payload as T }\n : { status: type, error: payload },\n )\n : messages.description;\n store.update(id, {\n duration: base.duration ?? store.config.get().duration,\n ...toPatch(raw as string | ToastPatch),\n type,\n ...(desc !== undefined ? { description: desc } : {}),\n resetTimer: true,\n });\n };\n\n promise\n .then((value) => {\n if (messages.success === undefined) {\n store.dismiss(id);\n } else {\n settle(\n 'success',\n typeof messages.success === 'function' ? messages.success(value) : messages.success,\n value,\n );\n }\n })\n .catch((error: unknown) => {\n settle(\n 'error',\n messages.error === undefined\n ? errorText(error)\n : typeof messages.error === 'function'\n ? messages.error(error)\n : messages.error,\n error,\n );\n })\n .finally(() => {\n try {\n void messages.finally?.();\n } catch (err) {\n console.error(err);\n }\n });\n\n return {\n id,\n unwrap: () => promise,\n };\n}\n","import { runPromiseToast } from './promise';\nimport type { ToastStore } from './toast-manager';\nimport type {\n PromiseHandle,\n PromiseMessage,\n PromiseMessages,\n PromiseOutcome,\n Renderable,\n ToastCustomRenderer,\n ToastId,\n ToastOptions,\n ToastPatch,\n ToastRecord,\n} from './types';\nimport type { TypeRegistry } from './types-registry';\n\nexport type { PromiseHandle, PromiseMessage, PromiseMessages, PromiseOutcome };\n\n/** Callable toast function shape shared by all entry points. */\nexport type ToastFn = (message?: Renderable, options?: ToastOptions) => ToastId;\n\n/** The `ui.toast` API. */\nexport interface ToastApi extends ToastFn {\n /** Success toast. */\n success: ToastFn;\n /** Error toast. Uses an assertive live region. */\n error: ToastFn;\n /** Informational toast. */\n info: ToastFn;\n /** Warning toast. */\n warning: ToastFn;\n /** Loading toast with indefinite duration. */\n loading: ToastFn;\n /** Neutral message toast. */\n message: ToastFn;\n /** Custom renderer. */\n custom: (renderer: ToastCustomRenderer, options?: ToastOptions) => ToastId;\n /** Updates an existing toast. */\n update: (id: ToastId, patch: ToastPatch) => boolean;\n /** Dismisses one toast, or all when id is omitted. */\n dismiss: (id?: ToastId) => void;\n /** Dismisses every toast in every region. */\n dismissAll: () => void;\n /** Tracks a promise with loading, success and error states. */\n promise: <T>(\n input: Promise<T> | (() => Promise<T>),\n messages: PromiseMessages<T>,\n options?: ToastOptions,\n ) => PromiseHandle<T>;\n /** Returns a snapshot of active and queued toasts. */\n getToasts: () => readonly ToastRecord[];\n /** Returns closed toasts up to `config.historyLimit`. */\n getHistory: () => readonly ToastRecord[];\n /** Registry of custom toast types. */\n readonly types: TypeRegistry;\n}\n\n/** Builds the `ui.toast` API on top of a store/manager. */\nexport function createToastApi(store: ToastStore): ToastApi {\n const make =\n (type?: ToastOptions['type']): ToastFn =>\n (message, options = {}) => {\n const input: ToastOptions = { type, ...options };\n if (options.type !== undefined) input.type = options.type;\n if (message !== undefined) {\n if (options.title === undefined) input.title = message;\n else if (options.description === undefined) input.description = message;\n }\n return store.add(input);\n };\n\n const api = make() as ToastApi;\n api.success = make('success');\n api.error = make('error');\n api.info = make('info');\n api.warning = make('warning');\n api.loading = make('loading');\n api.message = make('message');\n\n api.custom = (renderer, options) => store.add({ ...options, custom: renderer });\n api.update = store.update;\n api.dismiss = store.dismiss;\n api.dismissAll = store.dismissAll;\n api.getToasts = store.getToasts;\n api.getHistory = store.getHistory;\n (api as unknown as { types: TypeRegistry }).types = store.types;\n api.promise = (input, messages, options) => runPromiseToast(store, input, messages, options);\n\n return api;\n}\n","export { defaultClock } from './clock';\nexport type { Clock } from './clock';\n\nexport { nextId, normalizeId, resetIdCounter } from './ids';\n\nexport { createStore } from './store';\nexport type { Store } from './types';\n\nexport { createTimer } from './timer';\nexport type { PausableTimer } from './timer';\n\nexport { createTypeRegistry } from './types-registry';\nexport type { TypeRegistry } from './types-registry';\n\nexport {\n decideAriaLive,\n decideDialogLabels,\n decideDialogRole,\n decideFocusTarget,\n decideToastRole,\n} from './a11y-rules';\n\nexport { createConfigStore, DEFAULT_CONFIG, resolvePrecedence } from './config';\nexport type { ConfigStore } from './config';\n\nexport { createToastManager, createToastStore, MANUAL_PAUSE } from './toast-manager';\nexport type { AddToastInput, ToastManager, ToastManagerOptions, ToastStore } from './toast-manager';\n\nexport { runPromiseToast } from './promise';\n\nexport { createDialogManager } from './dialog-manager';\nexport type { DialogManager, DialogQueueItem, HeadlessDialogController } from './dialog-manager';\n\nexport { createDialogController, runSteps } from './dialog';\nexport type { DialogController, DialogPromise, StepsResult } from './dialog';\n\nexport { createToastApi } from './toast-api';\nexport type {\n PromiseHandle,\n PromiseMessage,\n PromiseMessages,\n PromiseOutcome,\n ToastApi,\n ToastFn,\n} from './toast-api';\n\nexport type * from './types';\n\nimport type { Clock } from './clock';\nimport { defaultClock } from './clock';\nimport type { ConfigStore } from './config';\nimport { createConfigStore } from './config';\nimport { runSteps } from './dialog';\nimport type { StepsResult } from './dialog';\nimport { createDialogManager } from './dialog-manager';\nimport type { DialogManager } from './dialog-manager';\nimport { createToastManager } from './toast-manager';\nimport type { ToastStore } from './toast-manager';\nimport { createToastApi } from './toast-api';\nimport type { ToastApi } from './toast-api';\nimport type {\n BottomSheetHandle,\n BottomSheetOptions,\n DialogHandle,\n DialogOptions,\n DialogResult,\n GlazeConfig,\n LoadingHandle,\n LoadingOptions,\n SheetOptions,\n ToastRecord,\n} from './types';\n\n/**\n * Renderer interface for bridging the framework-agnostic core to UI adapters.\n * If a call happens before a renderer is registered, it queues and replays upon registration.\n */\nexport interface Renderer {\n openDialog?(options: DialogOptions, handle: DialogHandle): Promise<DialogResult> | undefined;\n openSheet?(options: SheetOptions): Promise<DialogResult>;\n openBottomSheet?(options: BottomSheetOptions): BottomSheetHandle;\n openLoading?(options: LoadingOptions): LoadingHandle;\n mountToast?(record: ToastRecord): void;\n}\n\n/** Complete framework-agnostic UI feedback toolkit. */\nexport interface CoreUI {\n /** Toast notifications API. */\n readonly toast: ToastApi;\n /** Global configuration store. */\n readonly config: ConfigStore;\n /** Toast state manager. */\n readonly toastStore: ToastStore;\n /** Headless dialog manager. */\n readonly dialogManager: DialogManager;\n\n /** Opens a confirm dialog. */\n confirm(options: DialogOptions | string): Promise<DialogResult>;\n /** Opens an informational alert dialog. */\n alert(options: DialogOptions | string): Promise<DialogResult>;\n /** Opens a prompt dialog for user text/value input. */\n prompt(options: DialogOptions | string): Promise<DialogResult>;\n /** Runs a multi-step dialog sequence. */\n steps(steps: readonly DialogOptions[], backLabel?: string): Promise<StepsResult>;\n /** Opens an action sheet. */\n sheet(options: SheetOptions): Promise<DialogResult>;\n /** Opens a bottom sheet. */\n bottomSheet(options: BottomSheetOptions): BottomSheetHandle;\n /** Opens a loading overlay. */\n loading(options?: LoadingOptions | string): LoadingHandle;\n\n /** Merges global configuration. */\n configure(patch: Partial<GlazeConfig>): Readonly<GlazeConfig>;\n /** Returns the current configuration snapshot. */\n getConfig(): Readonly<GlazeConfig>;\n /** Clears all active toasts and dialogs. */\n clear(): void;\n\n /** Registers a concrete UI renderer, replaying any calls queued during hydration. */\n registerRenderer(renderer: Renderer): void;\n /** Returns the active renderer if registered. */\n getRenderer(): Renderer | undefined;\n}\n\nexport interface CreateUIOptions {\n config?: ConfigStore;\n clock?: Clock;\n}\n\n/**\n * Creates an isolated, framework-agnostic CoreUI instance.\n * Useful for multi-tenant applications, microfrontends, and isolated tests.\n */\nexport function createUI(options: CreateUIOptions = {}): CoreUI {\n const clock = options.clock ?? defaultClock;\n const config = options.config ?? createConfigStore();\n const toastStore = createToastManager({ config, clock });\n const toast = createToastApi(toastStore);\n const dialogManager = createDialogManager(clock);\n\n let activeRenderer: Renderer | undefined;\n const replayQueue: (() => void)[] = [];\n\n const toDialogOptions = (opts: DialogOptions | string): DialogOptions =>\n typeof opts === 'string' ? { title: opts } : { ...opts };\n\n const runDlg = (merged: DialogOptions): Promise<DialogResult> => {\n const handle = dialogManager.open(merged);\n if (activeRenderer?.openDialog) void activeRenderer.openDialog(merged, handle);\n else replayQueue.push(() => void activeRenderer?.openDialog?.(merged, handle));\n return handle.result;\n };\n\n const DISMISSED: DialogResult = {\n isConfirmed: false,\n isDenied: false,\n isDismissed: true,\n value: undefined,\n dismiss: 'close',\n };\n\n const ui: CoreUI = {\n toast,\n config,\n toastStore,\n dialogManager,\n\n confirm: (opts) =>\n runDlg({\n confirmButton: { show: true },\n cancelButton: { show: true },\n ...toDialogOptions(opts),\n }),\n\n alert: (opts) =>\n runDlg({\n confirmButton: { show: true },\n cancelButton: { show: false },\n denyButton: { show: false },\n ...toDialogOptions(opts),\n }),\n\n prompt: (opts) =>\n runDlg({\n input: 'text',\n confirmButton: { show: true },\n cancelButton: { show: true },\n ...toDialogOptions(opts),\n }),\n\n steps(stepList, backLabel = 'Back') {\n return runSteps(stepList, (s) => ui.confirm(s), backLabel);\n },\n\n sheet: (opts) =>\n activeRenderer?.openSheet\n ? activeRenderer.openSheet(opts)\n : new Promise((res) => {\n replayQueue.push(() =>\n activeRenderer?.openSheet\n ? void activeRenderer.openSheet(opts).then(res)\n : res(DISMISSED),\n );\n }),\n\n bottomSheet(opts) {\n if (activeRenderer?.openBottomSheet) return activeRenderer.openBottomSheet(opts);\n let live: BottomSheetHandle | undefined;\n return {\n body: undefined,\n close: (r) => live?.close(r),\n snapTo: (i) => live?.snapTo(i),\n update: (p) => live?.update(p),\n result: new Promise((res) => {\n replayQueue.push(() =>\n activeRenderer?.openBottomSheet\n ? void (live = activeRenderer.openBottomSheet(opts)).result.then(res)\n : res(DISMISSED),\n );\n }),\n };\n },\n\n loading(loadingOpts = {}) {\n const opts = typeof loadingOpts === 'string' ? { text: loadingOpts } : loadingOpts;\n if (activeRenderer?.openLoading) return activeRenderer.openLoading(opts);\n let live: LoadingHandle | undefined, done: () => void;\n const closed = new Promise<void>((res) => {\n done = res;\n });\n replayQueue.push(() =>\n activeRenderer?.openLoading\n ? void (live = activeRenderer.openLoading(opts)).closed.then(done)\n : done(),\n );\n return {\n update: (p) => live?.update(p),\n close: () => {\n live?.close();\n done();\n },\n closed,\n };\n },\n\n configure: (patch) => config.set(patch),\n getConfig: () => config.get(),\n\n clear() {\n toastStore.clear();\n dialogManager.clear();\n replayQueue.length = 0;\n },\n\n registerRenderer(renderer) {\n activeRenderer = renderer;\n while (replayQueue.length > 0) {\n const replay = replayQueue.shift();\n replay?.();\n }\n },\n\n getRenderer: () => activeRenderer,\n };\n\n return ui;\n}\n\nlet defaultUI: CoreUI | undefined;\nconst def = (): CoreUI => (defaultUI ??= createUI());\n\n/** Default singleton instance of the CoreUI toolkit. */\nexport const ui: CoreUI = {\n get toast() {\n return def().toast;\n },\n get config() {\n return def().config;\n },\n get toastStore() {\n return def().toastStore;\n },\n get dialogManager() {\n return def().dialogManager;\n },\n confirm: (o) => def().confirm(o),\n alert: (o) => def().alert(o),\n prompt: (o) => def().prompt(o),\n steps: (s, b) => def().steps(s, b),\n sheet: (o) => def().sheet(o),\n bottomSheet: (o) => def().bottomSheet(o),\n loading: (o) => def().loading(o),\n configure: (p) => def().configure(p),\n getConfig: () => def().getConfig(),\n clear: () => def().clear(),\n registerRenderer: (r) => def().registerRenderer(r),\n getRenderer: () => def().getRenderer(),\n};\n\n/** Registers the renderer with the default UI instance. */\nexport function registerRenderer(renderer: Renderer): void {\n def().registerRenderer(renderer);\n}\n\n/** Backward-compatible ToastEngine interface. */\nexport interface ToastEngine {\n store: ToastStore;\n toast: ToastApi;\n}\n\n/** Backward-compatible factory for ToastEngine. */\nexport function createToastEngine(options: { config?: ConfigStore } = {}): ToastEngine {\n const store = createToastManager({ config: options.config });\n return { store, toast: createToastApi(store) };\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport type {\n GlazeConfig,\n ToastApi,\n ToastOptions,\n ToastRecord,\n ToastStore,\n Unsubscribe,\n} from '../core';\nimport { createToastEngine } from '../core';\n\n/** Native engine holder for React Native environments. */\nlet nativeEngine: { store: ToastStore; toast: ToastApi } | undefined;\n\nfunction getNativeEngine(): { store: ToastStore; toast: ToastApi } {\n if (!nativeEngine) {\n nativeEngine = createToastEngine();\n }\n return nativeEngine;\n}\n\n/** Triggers optional haptic feedback on supported Expo devices. */\nasync function triggerHaptic(type: string): Promise<void> {\n try {\n // Dynamic optional import for expo-haptics\n // @ts-expect-error expo-haptics is an optional peer dependency that may not be installed at compile time\n const Haptics = await import('expo-haptics');\n if (!Haptics) return;\n if (type === 'success') {\n await Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success);\n } else if (type === 'error') {\n await Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error);\n } else if (type === 'warning') {\n await Haptics.notificationAsync(Haptics.NotificationFeedbackType.Warning);\n } else {\n await Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n }\n } catch {\n // expo-haptics is an optional peer dependency, gracefully ignore when not installed\n }\n}\n\n/**\n * Creates the React Native `toast` API with haptics integration.\n */\nfunction createNativeToastApi(): ToastApi {\n const engine = getNativeEngine();\n const baseToast = engine.toast;\n\n const wrap =\n (fn: (msg?: unknown, opts?: ToastOptions) => string | number) =>\n (msg?: unknown, opts: ToastOptions = {}) => {\n const type = opts.type ?? 'default';\n void triggerHaptic(type);\n return fn(msg, opts);\n };\n\n const nativeApi = wrap(baseToast) as ToastApi;\n nativeApi.success = wrap(baseToast.success);\n nativeApi.error = wrap(baseToast.error);\n nativeApi.info = wrap(baseToast.info);\n nativeApi.warning = wrap(baseToast.warning);\n nativeApi.loading = wrap(baseToast.loading);\n nativeApi.message = wrap(baseToast.message);\n\n nativeApi.promise = baseToast.promise;\n nativeApi.custom = baseToast.custom;\n nativeApi.update = baseToast.update;\n nativeApi.dismiss = baseToast.dismiss;\n nativeApi.dismissAll = baseToast.dismissAll;\n nativeApi.getToasts = baseToast.getToasts;\n nativeApi.getHistory = baseToast.getHistory;\n Object.defineProperty(nativeApi, 'types', { value: baseToast.types, enumerable: true });\n\n return nativeApi;\n}\n\n/** Native toast API. */\nexport const toast: ToastApi = createNativeToastApi();\n\n/** Configuration function for React Native. */\nexport function configure(patch: Partial<GlazeConfig>): Readonly<GlazeConfig> {\n return getNativeEngine().store.config.set(patch);\n}\n\n/** Resets the native engine for tests. */\nexport function resetNativeEngine(): void {\n if (nativeEngine) {\n nativeEngine.store.clear();\n nativeEngine.store.clearHistory();\n nativeEngine.store.config.reset();\n }\n}\n\n/** Native UI namespace. */\nexport const ui = {\n toast,\n configure,\n reset: resetNativeEngine,\n};\n\nexport interface NativeToasterProps {\n /** Toast placement. Defaults to 'top'. */\n position?: 'top' | 'bottom' | 'center';\n /** Optional top/bottom inset offset. */\n offset?: number;\n /** Toast container style. */\n style?: Record<string, unknown>;\n}\n\nexport interface GlazeProviderProps {\n children?: React.ReactNode;\n}\n\n/** Root provider for React Native toastory overlay hosting. */\nexport function GlazeProvider({ children }: GlazeProviderProps): React.JSX.Element {\n return <>{children}</>;\n}\n\n/**\n * React Native Toast Renderer component.\n * Renders glass toasts with optional Expo BlurView and gesture animations.\n */\nexport function Toaster(props: NativeToasterProps): React.JSX.Element | null {\n const [toastsList, setToastsList] = useState<readonly ToastRecord[]>([]);\n\n useEffect(() => {\n const engine = getNativeEngine();\n setToastsList(engine.store.getToasts());\n const unsub: Unsubscribe = engine.store.subscribe(() => {\n setToastsList(engine.store.getToasts());\n });\n return () => unsub();\n }, []);\n\n const visibleToasts = useMemo(() => toastsList.filter((t) => t.visible), [toastsList]);\n\n if (visibleToasts.length === 0) return null;\n\n const position = props.position ?? 'top';\n const posStyle: React.CSSProperties =\n position === 'bottom'\n ? { bottom: props.offset ?? 50 }\n : position === 'center'\n ? { top: '50%', transform: 'translateY(-50%)' }\n : { top: props.offset ?? 50 };\n\n return (\n <div\n style={\n {\n position: 'absolute',\n ...posStyle,\n left: 16,\n right: 16,\n zIndex: 99999,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 8,\n ...props.style,\n } as React.CSSProperties\n }\n >\n {visibleToasts.map((item) => (\n <div\n key={String(item.id)}\n style={\n {\n backgroundColor: 'rgba(28, 28, 30, 0.88)',\n padding: 14,\n borderRadius: 16,\n minWidth: 200,\n maxWidth: '100%',\n boxShadow: '0 8px 24px rgba(0, 0, 0, 0.25)',\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n } as React.CSSProperties\n }\n >\n {item.badge ? (\n <div\n style={\n {\n fontSize: 11,\n fontWeight: '600',\n color: '#38bdf8',\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n } as React.CSSProperties\n }\n >\n {typeof item.badge === 'string'\n ? item.badge\n : ((item.badge as { label?: string }).label ?? '')}\n </div>\n ) : null}\n {item.title ? (\n <div style={{ color: '#fff', fontWeight: '600', fontSize: 15 }}>\n {String(item.title)}\n </div>\n ) : null}\n {item.description ? (\n <div style={{ color: '#aaa', fontSize: 13, marginTop: 2 }}>\n {String(item.description)}\n </div>\n ) : null}\n {item.progressValue !== undefined ? (\n <div\n style={\n {\n height: 3,\n backgroundColor: 'rgba(255,255,255,0.15)',\n borderRadius: 3,\n marginTop: 6,\n overflow: 'hidden',\n } as React.CSSProperties\n }\n >\n <div\n style={\n {\n height: '100%',\n width: `${Math.round(item.progressValue * 100)}%`,\n backgroundColor: '#38bdf8',\n } as React.CSSProperties\n }\n />\n </div>\n ) : null}\n {item.actions && item.actions.length > 0 ? (\n <div\n style={\n {\n display: 'flex',\n gap: 8,\n marginTop: 8,\n justifyContent: 'flex-end',\n } as React.CSSProperties\n }\n >\n {item.actions.map((act, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={act.onClick ? (e) => act.onClick?.(e.nativeEvent) : undefined}\n style={\n {\n fontSize: 12,\n fontWeight: '600',\n padding: '4px 10px',\n borderRadius: 8,\n border: 'none',\n backgroundColor: 'rgba(255, 255, 255, 0.12)',\n color: '#fff',\n cursor: 'pointer',\n } as React.CSSProperties\n }\n >\n {act.label ?? act.text ?? 'Action'}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n ))}\n </div>\n );\n}\n\n/** React Native hook for reactive toast state. */\nexport function useNativeToast(): {\n toast: ToastApi;\n toasts: readonly ToastRecord[];\n} {\n const [toastsList, setToastsList] = useState<readonly ToastRecord[]>([]);\n\n useEffect(() => {\n const engine = getNativeEngine();\n setToastsList(engine.store.getToasts());\n return engine.store.subscribe(() => {\n setToastsList(engine.store.getToasts());\n });\n }, []);\n\n return { toast, toasts: toastsList };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/clock.ts","../src/core/ids.ts","../src/core/config.ts","../src/core/timer.ts","../src/core/types-registry.ts","../src/core/toast-manager.ts","../src/core/promise.ts","../src/core/toast-api.ts","../src/core/index.ts","../src/web/sound.ts","../src/native/index.tsx"],"names":["useState","useEffect","useMemo","jsx","jsxs"],"mappings":"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","file":"native.cjs","sourcesContent":["/**\n * Injectable clock and scheduler interface.\n * Abstracts time and timers so tests and headless engines can run deterministically.\n */\nexport interface Clock {\n /** Returns the current timestamp in milliseconds. */\n now(): number;\n /**\n * Schedules a callback after `ms` milliseconds.\n * @returns A cancellation function.\n */\n setTimeout(fn: () => void, ms: number): () => void;\n /**\n * Schedules a recurring callback every `ms` milliseconds.\n * @returns A cancellation function.\n */\n setInterval(fn: () => void, ms: number): () => void;\n}\n\n/** Default system clock using standard global timer functions. */\nexport const defaultClock: Clock = {\n now: () => Date.now(),\n setTimeout: (fn, ms) => {\n const t = setTimeout(fn, ms);\n return () => clearTimeout(t);\n },\n setInterval: (fn, ms) => {\n const t = setInterval(fn, ms);\n return () => clearInterval(t);\n },\n};\n","import type { ToastId } from './types';\n\nlet counter = 0;\n\n/**\n * Returns a collision-safe, incremental unique identifier.\n * @param prefix Optional prefix for the id (default: 'gk').\n */\nexport function nextId(p = 'gk'): string {\n return `${p}-${++counter}`;\n}\n\n/**\n * Normalizes an optional user-provided id, generating an incremental id if omitted.\n * @param id User-supplied id or undefined.\n * @param prefix Prefix used when generating an id.\n */\nexport function normalizeId(id: ToastId | undefined, p = 'gk'): ToastId {\n return id !== undefined && id !== '' ? id : nextId(p);\n}\n\n/**\n * Resets the internal counter. Useful for deterministic test execution.\n */\nexport function resetIdCounter(): void {\n counter = 0;\n}\n","import type { GlazeConfig, Listener, Unsubscribe } from './types';\n\n/** Library default configuration. */\nexport const DEFAULT_CONFIG: Readonly<GlazeConfig> = Object.freeze({\n theme: 'ios-glass',\n mode: 'auto',\n position: 'top-right',\n duration: 4000,\n maxVisible: 8,\n gap: 12,\n stack: true,\n dir: 'auto',\n hotkey: 'alt+t',\n pauseOn: ['hover', 'focus', 'hidden'],\n shadow: true,\n closeButton: false,\n richColors: false,\n invert: false,\n swipe: true,\n dragThreshold: 45,\n progress: false,\n closeOnClick: false,\n exitDuration: 250,\n historyLimit: 100,\n regionLabel: 'Notifications',\n closeLabel: 'Close notification',\n startPaused: false,\n newestOnTop: true,\n dedupeWindow: 500,\n sound: false,\n soundVolume: 0.5,\n container: undefined,\n} satisfies GlazeConfig);\n\n/** Observable configuration container holding immutable snapshots. */\nexport interface ConfigStore {\n /** Returns the current immutable configuration snapshot. */\n get(): Readonly<GlazeConfig>;\n /** Merges a partial configuration and notifies subscribers. Returns the updated snapshot. */\n set(patch: Partial<GlazeConfig>): Readonly<GlazeConfig>;\n /** Restores library defaults. */\n reset(): void;\n /** Subscribes to configuration changes. */\n subscribe(listener: Listener): Unsubscribe;\n}\n\n/**\n * Resolves an option according to precedence:\n * Call option > Theme default > Global config > Library default.\n */\nexport const resolvePrecedence = <T>(\n callVal: T | undefined,\n themeVal: T | undefined,\n globalVal: T | undefined,\n defaultVal: T,\n): T => callVal ?? themeVal ?? globalVal ?? defaultVal;\n\n/** Creates an isolated, immutable configuration store. */\nexport function createConfigStore(initial: Partial<GlazeConfig> = {}): ConfigStore {\n let current: Readonly<GlazeConfig> = Object.freeze({\n ...DEFAULT_CONFIG,\n ...stripUndefined(initial),\n });\n const listeners = new Set<Listener>();\n\n const emit = (): void => {\n listeners.forEach((listener) => listener());\n };\n\n return {\n get: () => current,\n set(patch) {\n const next = { ...current, ...stripUndefined(patch) };\n if ((Object.keys(next) as (keyof GlazeConfig)[]).some((k) => next[k] !== current[k])) {\n current = Object.freeze(next);\n emit();\n }\n return current;\n },\n reset() {\n current = DEFAULT_CONFIG;\n emit();\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n\nfunction stripUndefined<T extends object>(value: T): Partial<T> {\n const out: Partial<T> = {};\n for (const k in value) if (value[k] !== undefined) out[k] = value[k];\n return out;\n}\n","import type { Clock } from './clock';\nimport { defaultClock } from './clock';\n\nexport interface PausableTimer {\n /** Starts or resumes the countdown. No effect when already running or finished. */\n start(): void;\n /**\n * Pauses the timer for a named reason (reference-counted).\n * @param reason The pause trigger identifier, e.g. 'hover', 'focus', 'hidden', 'manual'.\n */\n pause(reason?: string): void;\n /**\n * Resumes the timer for a named reason (decrements reference count).\n * Restarts the countdown when all pause reasons are cleared.\n */\n resume(reason?: string): void;\n /** Adds milliseconds to the remaining countdown (or subtracts if negative). */\n add(ms: number): void;\n /** Resets the countdown duration and restarts if previously active. */\n reset(ms?: number): void;\n /** Permanently cancels and tears down the timer. */\n cancel(): void;\n /** Current milliseconds remaining on the countdown. */\n remaining(): number;\n /** Current milliseconds elapsed on the countdown. */\n elapsed(): number;\n /** Whether the countdown is actively ticking. */\n isRunning(): boolean;\n /** Whether the countdown is held by one or more pause reasons. */\n isPaused(): boolean;\n /** List of all currently active pause reason names. */\n pausedReasons(): string[];\n /** Clears all pause reasons and resumes if started. */\n clearReasons(): void;\n /** Registers a progress tick listener called while ticking. */\n onTick(callback: (remaining: number, fraction: number) => void): () => void;\n}\n\n/**\n * Creates a pausable countdown timer with reference-counted pause reasons.\n *\n * @param duration Total countdown duration in milliseconds.\n * @param onDone Callback fired when countdown reaches zero.\n * @param clock Injectable clock/scheduler (defaults to defaultClock).\n */\nexport function createTimer(\n duration: number,\n onDone: () => void,\n clock: Clock = defaultClock,\n): PausableTimer {\n let total = duration;\n let remMs = duration;\n let startedAt = 0;\n let cancelT: (() => void) | undefined;\n let cancelI: (() => void) | undefined;\n let started = false;\n let done = false;\n\n const reasons = new Map<string, number>();\n const ticks = new Set<(remaining: number, fraction: number) => void>();\n\n const isLive = (): boolean => Number.isFinite(remMs) && remMs > 0;\n const active = (): boolean => started && !reasons.size;\n\n const getRem = (): number =>\n done ? 0 : active() ? Math.max(0, remMs - (clock.now() - startedAt)) : remMs;\n\n const notifyTick = (): void => {\n if (!ticks.size) return;\n const r = getRem();\n const f = total > 0 ? Math.max(0, Math.min(1, r / total)) : 0;\n for (const cb of ticks) {\n try {\n cb(r, f);\n } catch (err) {\n console.error(err);\n }\n }\n };\n\n const stop = (): void => {\n cancelT?.();\n cancelI?.();\n cancelT = cancelI = undefined;\n };\n\n const arm = (): void => {\n stop();\n if (!isLive() || reasons.size || done) return;\n startedAt = clock.now();\n cancelT = clock.setTimeout(() => {\n stop();\n remMs = 0;\n done = true;\n started = false;\n notifyTick();\n onDone();\n }, remMs);\n if (ticks.size) cancelI = clock.setInterval(notifyTick, 50);\n };\n\n return {\n start() {\n if (done || !isLive()) return;\n started = true;\n reasons.clear();\n arm();\n notifyTick();\n },\n pause(reason = 'manual') {\n if (done) return;\n reasons.set(reason, (reasons.get(reason) ?? 0) + 1);\n if (started && reasons.size === 1) {\n remMs = Math.max(0, remMs - (clock.now() - startedAt));\n stop();\n notifyTick();\n }\n },\n resume(reason = 'manual') {\n const c = !done && reasons.get(reason);\n if (!c) return;\n if (c <= 1) reasons.delete(reason);\n else reasons.set(reason, c - 1);\n if (active() && isLive()) {\n arm();\n notifyTick();\n }\n },\n clearReasons() {\n reasons.clear();\n if (started && isLive()) arm();\n },\n add(ms: number) {\n if (done || !Number.isFinite(remMs)) return;\n const live = active();\n remMs = Math.max(1, getRem() + ms);\n total = Math.max(total, remMs);\n if (live) arm();\n notifyTick();\n },\n reset(ms?: number) {\n done = false;\n remMs = total = ms ?? total;\n if (active()) {\n if (isLive()) arm();\n else stop();\n }\n notifyTick();\n },\n cancel() {\n stop();\n ticks.clear();\n started = false;\n done = true;\n remMs = 0;\n },\n remaining: getRem,\n elapsed: () => Math.max(0, total - getRem()),\n isRunning: () => active() && !done && isLive(),\n isPaused: () => reasons.size > 0,\n pausedReasons: () => [...reasons.keys()],\n onTick(cb) {\n ticks.add(cb);\n if (active() && !cancelI) cancelI = clock.setInterval(notifyTick, 50);\n return () => {\n ticks.delete(cb);\n if (!ticks.size && cancelI) {\n cancelI();\n cancelI = undefined;\n }\n };\n },\n };\n}\n","import type { ToastTypeDefinition } from './types';\n\n/** Registry of custom and built-in toast types. */\nexport interface TypeRegistry {\n /**\n * Registers or replaces a toast type.\n * @param name Non-empty type name.\n * @param definition Defaults, icon, color tokens, default duration, ariaLive.\n */\n add(name: string, definition?: ToastTypeDefinition): void;\n /** Removes a type. Returns whether it existed. */\n remove(name: string): boolean;\n /** Looks a type up. */\n get(name: string): ToastTypeDefinition | undefined;\n /** Lists registered custom type names. */\n list(): string[];\n}\n\nconst tDef = (color: string, ariaLive: 'polite' | 'assertive' = 'polite') => ({\n color: `var(--gk-${color})`,\n ariaLive,\n});\n\nconst BUILT_IN_TYPES: Record<string, ToastTypeDefinition> = {\n success: tDef('success'),\n error: tDef('error', 'assertive'),\n warning: tDef('warning', 'assertive'),\n info: tDef('info'),\n loading: { ...tDef('info'), defaults: { duration: 0, dismissible: false } },\n message: tDef('fg'),\n};\n\n/** Creates a type registry. */\nexport function createTypeRegistry(): TypeRegistry {\n const custom = new Map<string, ToastTypeDefinition>();\n\n return {\n add(name, definition = {}) {\n const k = typeof name === 'string' ? name.trim() : '';\n if (!k) throw new TypeError('toastory: invalid type');\n custom.set(k, definition);\n },\n remove: (name) => custom.delete(name),\n get: (name) => custom.get(name) ?? BUILT_IN_TYPES[name],\n list: () => [...custom.keys()],\n };\n}\n","import type { Clock } from './clock';\nimport { defaultClock } from './clock';\nimport type { ConfigStore } from './config';\nimport { createConfigStore } from './config';\nimport { normalizeId } from './ids';\nimport { createTimer } from './timer';\nimport type { PausableTimer } from './timer';\nimport { createTypeRegistry } from './types-registry';\nimport type { TypeRegistry } from './types-registry';\nimport type {\n CloseReason,\n Listener,\n ToastCustomRenderer,\n ToastId,\n ToastOptions,\n ToastPatch,\n ToastRecord,\n Unsubscribe,\n} from './types';\n\n/** Reasons that originate from a person and are blocked on non-dismissible toasts. */\nconst isUser = (r: CloseReason): boolean => r === 'user' || r === 'swipe' || r === 'click';\n\nconst safeCall = <A, B>(fn?: (a: A, b: B) => void, a?: A, b?: B): void => {\n try {\n fn?.(a as A, b as B);\n } catch (err) {\n console.error(err);\n }\n};\n\n/** Pause reason used by `startPaused`. */\nexport const MANUAL_PAUSE = 'manual';\n\n/** Options for creating a toast manager / store. */\nexport interface ToastManagerOptions {\n config?: ConfigStore;\n clock?: Clock;\n now?: () => number;\n types?: TypeRegistry;\n}\n\nexport type ToastStoreOptions = ToastManagerOptions;\n\n/** Input for adding a toast. */\nexport interface AddToastInput extends ToastOptions {\n custom?: ToastCustomRenderer;\n}\n\ninterface Entry {\n opts: ToastOptions;\n custom: ToastCustomRenderer | undefined;\n record: ToastRecord;\n timer: PausableTimer;\n dedupeKey: string | undefined;\n exitHandle: (() => void) | undefined;\n reason: CloseReason | undefined;\n flags: number;\n}\n\n/** State container for toasts. Pure logic: no DOM, no framework. */\nexport interface ToastManager {\n add(input: AddToastInput): ToastId;\n update(id: ToastId, patch: ToastPatch): boolean;\n dismiss(id?: ToastId, reason?: CloseReason): void;\n dismissAll(reason?: CloseReason): void;\n pause(id: ToastId | undefined, reason: string): void;\n resume(id: ToastId | undefined, reason: string): void;\n extend(id: ToastId, ms: number): void;\n getRemaining(id: ToastId): number;\n getToasts(): readonly ToastRecord[];\n getHistory(): readonly ToastRecord[];\n clear(): void;\n clearHistory(): void;\n subscribe(listener: Listener): Unsubscribe;\n readonly config: ConfigStore;\n readonly types: TypeRegistry;\n}\n\nexport type ToastStore = ToastManager;\n\nexport function createToastManager(options: ToastManagerOptions = {}): ToastManager {\n const config = options.config ?? createConfigStore();\n const clock = options.clock ?? defaultClock;\n const now = options.now ?? clock.now;\n const types = options.types ?? createTypeRegistry();\n\n const entries = new Map<ToastId, Entry>();\n let order: ToastId[] = [];\n let snapshot: readonly ToastRecord[] = [];\n let history: readonly ToastRecord[] = [];\n const listeners = new Set<Listener>();\n\n const emit = (): void => {\n snapshot = order.map((id) => entries.get(id)?.record).filter(Boolean) as ToastRecord[];\n listeners.forEach((listener) => listener());\n };\n\n const build = (\n id: ToastId,\n opts: ToastOptions,\n previous: ToastRecord | undefined,\n custom: ToastCustomRenderer | undefined,\n ): ToastRecord => {\n const cfg = config.get();\n const type = opts.type ?? 'default';\n const merged: ToastOptions = {\n ...types.get(type)?.defaults,\n ...opts,\n };\n merged.title ??= merged.text1;\n merged.description ??= merged.text2;\n merged.onOpen ??= merged.onShow;\n merged.onClose ??= merged.onHide;\n if (!merged.actions && merged.buttons) {\n merged.actions = merged.buttons.map((b) => ({\n label: b.label,\n onClick: (e: MouseEvent) =>\n (b.onClick ?? b.onPress)?.({\n preventDefault: () => e.preventDefault(),\n defaultPrevented: e.defaultPrevented,\n }),\n autoDismiss: b.autoDismiss,\n kind: b.kind,\n }));\n }\n const rawDuration =\n merged.autoHide === false ? 0 : (merged.duration ?? merged.visibilityTime ?? cfg.duration);\n const duration = Number.isFinite(rawDuration) && rawDuration > 0 ? rawDuration : 0;\n const urgent = merged.important || type === 'error';\n const stamp = now();\n\n const record: ToastRecord = {\n ...merged,\n id,\n type,\n duration,\n position: merged.position ?? cfg.position,\n ariaLive: merged.ariaLive ?? (urgent ? 'assertive' : 'polite'),\n role: merged.role ?? (urgent ? 'alert' : 'status'),\n createdAt: previous?.createdAt ?? stamp,\n updatedAt: stamp,\n revision: (previous?.revision ?? -1) + 1,\n timerEpoch: previous?.timerEpoch ?? 0,\n count: previous?.count ?? 1,\n visible: previous?.visible ?? false,\n dismissed: false,\n pausedBy: previous?.pausedBy ?? (cfg.startPaused ? [MANUAL_PAUSE] : []),\n remaining: previous?.remaining ?? (duration || Infinity),\n custom,\n };\n return record;\n };\n\n const remainingOf = (entry: Entry): number => {\n return entry.record.duration === 0 ? Infinity : entry.timer.remaining();\n };\n\n const dedupeKeyOf = (opts: ToastOptions): string | undefined => {\n if (opts.dedupe === false) return;\n if (typeof opts.dedupe === 'string') return opts.dedupe;\n const titleVal = opts.title ?? opts.text1;\n const descVal = opts.description ?? opts.text2;\n const t = typeof titleVal === 'string' ? titleVal : '';\n const d = typeof descVal === 'string' ? descVal : '';\n return t || d ? `${opts.type ?? 'default'}|${t}|${d}` : undefined;\n };\n\n const promote = (): void => {\n const cfg = config.get();\n const counts = new Map<string, number>();\n for (const id of order) {\n const entry = entries.get(id);\n if (!entry || entry.record.dismissed) continue;\n const key = `${entry.record.container ?? ''}|${entry.record.position}`;\n const used = counts.get(key) ?? 0;\n const isImportant = !!entry.record.important;\n if (used < cfg.maxVisible || isImportant) {\n if (!entry.record.visible) {\n entry.record = { ...entry.record, visible: true };\n if (!entry.record.pausedBy.length && entry.record.duration > 0) {\n entry.timer.start();\n }\n }\n if (!isImportant) counts.set(key, used + 1);\n } else if (entry.record.visible) {\n entry.record = { ...entry.record, visible: false };\n entry.timer.pause();\n }\n }\n };\n\n const finalize = (entry: Entry): void => {\n entry.exitHandle?.();\n entry.timer.cancel();\n entries.delete(entry.record.id);\n order = order.filter((id) => id !== entry.record.id);\n history = [{ ...entry.record, dismissed: true }, ...history].slice(\n 0,\n config.get().historyLimit,\n );\n promote();\n flushOpened();\n emit();\n if (!(entry.flags & 2)) {\n entry.flags |= 2;\n safeCall(entry.record.onClose, entry.record, entry.reason ?? 'api');\n }\n };\n\n const dismissEntry = (entry: Entry, reason: CloseReason): void => {\n if (entry.record.dismissed) return;\n if (entry.record.dismissible === false && isUser(reason)) return;\n entry.reason = reason;\n entry.record = {\n ...entry.record,\n dismissed: true,\n remaining: 0,\n revision: entry.record.revision + 1,\n };\n entry.timer.cancel();\n\n if (!(entry.flags & 4) && reason !== 'auto') {\n entry.flags |= 4;\n safeCall(entry.record.onDismiss, entry.record, reason);\n }\n\n promote();\n flushOpened();\n emit();\n\n const exit = config.get().exitDuration;\n if (exit <= 0 || !entry.record.visible) {\n finalize(entry);\n } else {\n entry.exitHandle = clock.setTimeout(() => finalize(entry), exit);\n }\n };\n\n const makeEntry = (id: ToastId, input: AddToastInput): Entry => {\n const { custom, ...opts } = input;\n const record = build(id, opts, undefined, custom);\n const entry: Entry = {\n opts,\n custom,\n record,\n timer: undefined as unknown as PausableTimer,\n dedupeKey: dedupeKeyOf(opts),\n exitHandle: undefined,\n reason: undefined,\n flags: 0,\n };\n entry.timer = createTimer(\n record.duration,\n () => {\n if (!(entry.flags & 8)) {\n entry.flags |= 8;\n safeCall(entry.record.onAutoClose, entry.record);\n }\n dismissEntry(entry, 'auto');\n },\n clock,\n );\n if (record.pausedBy.length) entry.timer.pause();\n return entry;\n };\n\n const restartTimer = (entry: Entry): void => {\n entry.timer.cancel();\n if (entry.record.duration > 0) {\n entry.timer.reset(entry.record.duration);\n if (entry.record.visible && !entry.record.pausedBy.length) entry.timer.start();\n }\n entry.record = {\n ...entry.record,\n timerEpoch: entry.record.timerEpoch + 1,\n remaining: remainingOf(entry),\n };\n };\n\n const flushOpened = (): void => {\n for (const id of order) {\n const entry = entries.get(id);\n if (entry && entry.record.visible && !(entry.flags & 1) && !entry.record.dismissed) {\n entry.flags |= 1;\n safeCall(entry.record.onOpen, entry.record);\n }\n }\n };\n\n const store: ToastManager = {\n config,\n types,\n\n add(input: AddToastInput): ToastId {\n const id = normalizeId(input.id);\n const existing = entries.get(id);\n if (existing && !existing.record.dismissed) {\n const { custom, ...patch } = input;\n store.update(id, patch);\n if (custom) {\n existing.custom = custom;\n existing.record = { ...existing.record, custom };\n emit();\n }\n return id;\n }\n if (existing) finalize(existing);\n\n const key = dedupeKeyOf(input);\n if (key !== undefined) {\n for (const other of entries.values()) {\n if (other.dedupeKey === key && !other.record.dismissed) {\n other.record = {\n ...other.record,\n count: other.record.count + 1,\n revision: other.record.revision + 1,\n updatedAt: now(),\n };\n restartTimer(other);\n emit();\n return other.record.id;\n }\n }\n }\n\n const entry = makeEntry(id, input);\n entries.set(id, entry);\n order = [...order, id];\n promote();\n emit();\n flushOpened();\n return id;\n },\n\n update(id, patch) {\n const entry = entries.get(id);\n if (!entry || entry.record.dismissed) return false;\n const { resetTimer = true, ...rest } = patch;\n const next: ToastOptions = { ...entry.opts };\n if (rest.type !== undefined && rest.type !== entry.record.type) {\n delete next.duration;\n delete next.ariaLive;\n delete next.role;\n delete next.icon;\n }\n let changed = false;\n for (const key in rest) {\n const value = (rest as Record<string, unknown>)[key];\n if (value !== undefined) {\n if ((entry.opts as Record<string, unknown>)[key] !== value) changed = true;\n (next as Record<string, unknown>)[key] = value;\n }\n }\n if (!changed && rest.type === undefined && rest.position === undefined) return true;\n entry.opts = next;\n entry.dedupeKey = dedupeKeyOf(next);\n const rebuilt = build(id, next, entry.record, entry.custom);\n const positionChanged = rebuilt.position !== entry.record.position;\n entry.record = rebuilt;\n if (positionChanged) {\n entry.record = { ...entry.record, visible: false };\n promote();\n }\n if (resetTimer || positionChanged) restartTimer(entry);\n else {\n entry.record = {\n ...entry.record,\n remaining: remainingOf(entry),\n };\n }\n emit();\n flushOpened();\n return true;\n },\n\n dismiss(id, reason = 'api') {\n if (id === undefined) return store.dismissAll(reason);\n const entry = entries.get(id);\n if (entry) dismissEntry(entry, reason);\n },\n\n dismissAll(reason = 'api') {\n for (const entry of entries.values()) dismissEntry(entry, reason);\n },\n\n pause(id, reason) {\n const targets = id !== undefined ? [entries.get(id)] : entries.values();\n for (const entry of targets) {\n if (!entry || entry.record.pausedBy.includes(reason)) continue;\n entry.timer.pause(reason);\n entry.record = {\n ...entry.record,\n pausedBy: [...entry.record.pausedBy, reason],\n remaining: remainingOf(entry),\n };\n }\n emit();\n },\n\n resume(id, reason) {\n const targets = id !== undefined ? [entries.get(id)] : entries.values();\n for (const entry of targets) {\n if (!entry || !entry.record.pausedBy.includes(reason)) continue;\n entry.timer.resume(reason);\n const nextPausedBy = entry.record.pausedBy.filter((value) => value !== reason);\n entry.record = {\n ...entry.record,\n pausedBy: nextPausedBy,\n remaining: remainingOf(entry),\n };\n if (!nextPausedBy.length && entry.record.visible && entry.record.duration > 0) {\n entry.timer.start();\n }\n }\n emit();\n },\n\n extend(id, ms) {\n const entry = entries.get(id);\n if (!entry || entry.record.dismissed) return;\n entry.timer.add(ms);\n entry.record = {\n ...entry.record,\n remaining: remainingOf(entry),\n timerEpoch: entry.record.timerEpoch + 1,\n revision: entry.record.revision + 1,\n };\n emit();\n },\n\n getRemaining(id) {\n const entry = entries.get(id);\n return entry ? remainingOf(entry) : 0;\n },\n\n getToasts: () => snapshot,\n getHistory: () => history,\n\n clear() {\n for (const entry of entries.values()) {\n entry.exitHandle?.();\n entry.timer.cancel();\n }\n entries.clear();\n order = [];\n snapshot = [];\n emit();\n },\n\n clearHistory() {\n history = [];\n emit();\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n\n return store;\n}\n\nexport const createToastStore = createToastManager;\n","import type { PromiseHandle, PromiseMessages, ToastId, ToastOptions, ToastPatch } from './types';\nimport type { ToastStore } from './toast-manager';\n\nconst toPatch = (m: string | ToastPatch): ToastPatch => (typeof m === 'string' ? { title: m } : m);\n\nconst errorText = (e: unknown): string => (e instanceof Error ? e.message : String(e));\n\n/**\n * Handles async promise toasts: displays loading state, resolves to success or error,\n * calls lifecycle hooks, and provides `unwrap()` returning the raw promise result.\n */\nexport function runPromiseToast<T>(\n store: ToastStore,\n input: Promise<T> | (() => Promise<T>),\n messages: PromiseMessages<T>,\n options: ToastOptions = {},\n): PromiseHandle<T> {\n let promise: Promise<T>;\n try {\n promise = typeof input === 'function' ? input() : input;\n } catch (error) {\n promise = Promise.reject(error);\n }\n\n const { id: requestedId, ...base } = options;\n const loadingPatch = toPatch(messages.loading);\n\n const id: ToastId = store.add({\n ...base,\n id: requestedId,\n ...loadingPatch,\n type: 'loading',\n duration: 0,\n });\n\n const settle = (type: 'success' | 'error', raw: unknown, payload: unknown): void => {\n const desc =\n typeof messages.description === 'function'\n ? messages.description(\n type === 'success'\n ? { status: type, value: payload as T }\n : { status: type, error: payload },\n )\n : messages.description;\n store.update(id, {\n duration: base.duration ?? store.config.get().duration,\n ...toPatch(raw as string | ToastPatch),\n type,\n ...(desc !== undefined ? { description: desc } : {}),\n resetTimer: true,\n });\n };\n\n promise\n .then((value) => {\n if (messages.success === undefined) {\n store.dismiss(id);\n } else {\n settle(\n 'success',\n typeof messages.success === 'function' ? messages.success(value) : messages.success,\n value,\n );\n }\n })\n .catch((error: unknown) => {\n settle(\n 'error',\n messages.error === undefined\n ? errorText(error)\n : typeof messages.error === 'function'\n ? messages.error(error)\n : messages.error,\n error,\n );\n })\n .finally(() => {\n try {\n void messages.finally?.();\n } catch (err) {\n console.error(err);\n }\n });\n\n return {\n id,\n unwrap: () => promise,\n };\n}\n","import { runPromiseToast } from './promise';\nimport type { ToastStore } from './toast-manager';\nimport type {\n PromiseHandle,\n PromiseMessage,\n PromiseMessages,\n PromiseOutcome,\n Renderable,\n ToastCustomRenderer,\n ToastId,\n ToastOptions,\n ToastPatch,\n ToastRecord,\n} from './types';\nimport type { TypeRegistry } from './types-registry';\n\nexport type { PromiseHandle, PromiseMessage, PromiseMessages, PromiseOutcome };\n\n/** Callable toast function shape shared by all entry points. */\nexport type ToastFn = (message?: Renderable, options?: ToastOptions) => ToastId;\n\n/** The `ui.toast` API. */\nexport interface ToastApi extends ToastFn {\n /** Success toast. */\n success: ToastFn;\n /** Error toast. Uses an assertive live region. */\n error: ToastFn;\n /** Informational toast. */\n info: ToastFn;\n /** Warning toast. */\n warning: ToastFn;\n /** Loading toast with indefinite duration. */\n loading: ToastFn;\n /** Neutral message toast. */\n message: ToastFn;\n /** Custom renderer. */\n custom: (renderer: ToastCustomRenderer, options?: ToastOptions) => ToastId;\n /** Updates an existing toast. */\n update: (id: ToastId, patch: ToastPatch) => boolean;\n /** Dismisses one toast, or all when id is omitted. */\n dismiss: (id?: ToastId) => void;\n /** Dismisses every toast in every region. */\n dismissAll: () => void;\n /** Tracks a promise with loading, success and error states. */\n promise: <T>(\n input: Promise<T> | (() => Promise<T>),\n messages: PromiseMessages<T>,\n options?: ToastOptions,\n ) => PromiseHandle<T>;\n /** Returns a snapshot of active and queued toasts. */\n getToasts: () => readonly ToastRecord[];\n /** Returns closed toasts up to `config.historyLimit`. */\n getHistory: () => readonly ToastRecord[];\n /** Registry of custom toast types. */\n readonly types: TypeRegistry;\n}\n\n/** Builds the `ui.toast` API on top of a store/manager. */\nexport function createToastApi(store: ToastStore): ToastApi {\n const make =\n (type?: ToastOptions['type']): ToastFn =>\n (message, options = {}) => {\n const input: ToastOptions = { type, ...options };\n if (options.type !== undefined) input.type = options.type;\n if (message !== undefined) {\n if (options.title === undefined) input.title = message;\n else if (options.description === undefined) input.description = message;\n }\n return store.add(input);\n };\n\n return Object.assign(make() as ToastApi, {\n success: make('success'),\n error: make('error'),\n info: make('info'),\n warning: make('warning'),\n loading: make('loading'),\n message: make('message'),\n custom: (renderer: ToastCustomRenderer, options?: ToastOptions) =>\n store.add({ ...options, custom: renderer }),\n update: store.update,\n dismiss: store.dismiss,\n dismissAll: store.dismissAll,\n getToasts: store.getToasts,\n getHistory: store.getHistory,\n types: store.types,\n promise: <T>(\n input: Promise<T> | (() => Promise<T>),\n messages: PromiseMessages<T>,\n options?: ToastOptions,\n ) => runPromiseToast(store, input, messages, options),\n });\n}\n","export { defaultClock } from './clock';\nexport type { Clock } from './clock';\n\nexport { nextId, normalizeId, resetIdCounter } from './ids';\n\nexport { createStore } from './store';\nexport type { Store } from './types';\n\nexport { createTimer } from './timer';\nexport type { PausableTimer } from './timer';\n\nexport { createTypeRegistry } from './types-registry';\nexport type { TypeRegistry } from './types-registry';\n\nexport {\n decideAriaLive,\n decideDialogLabels,\n decideDialogRole,\n decideFocusTarget,\n decideToastRole,\n} from './a11y-rules';\n\nexport { createConfigStore, DEFAULT_CONFIG, resolvePrecedence } from './config';\nexport type { ConfigStore } from './config';\n\nexport { createToastManager, createToastStore, MANUAL_PAUSE } from './toast-manager';\nexport type { AddToastInput, ToastManager, ToastManagerOptions, ToastStore } from './toast-manager';\n\nexport { runPromiseToast } from './promise';\n\nexport { createDialogManager } from './dialog-manager';\nexport type { DialogManager, DialogQueueItem, HeadlessDialogController } from './dialog-manager';\n\nexport { createDialogController, runSteps } from './dialog';\nexport type { DialogController, DialogPromise, StepsResult } from './dialog';\n\nexport { createToastApi } from './toast-api';\nexport type {\n PromiseHandle,\n PromiseMessage,\n PromiseMessages,\n PromiseOutcome,\n ToastApi,\n ToastFn,\n} from './toast-api';\n\nexport { springEasing, Spring, springPosition, runSpringTask } from './spring';\nexport type { SpringConfig } from './spring';\n\nexport type * from './types';\n\nimport type { Clock } from './clock';\nimport { defaultClock } from './clock';\nimport type { ConfigStore } from './config';\nimport { createConfigStore } from './config';\nimport { runSteps } from './dialog';\nimport type { StepsResult } from './dialog';\nimport { createDialogManager } from './dialog-manager';\nimport type { DialogManager } from './dialog-manager';\nimport { createToastManager } from './toast-manager';\nimport type { ToastStore } from './toast-manager';\nimport { createToastApi } from './toast-api';\nimport type { ToastApi } from './toast-api';\nimport type {\n BottomSheetHandle,\n BottomSheetOptions,\n DialogHandle,\n DialogOptions,\n DialogResult,\n GlazeConfig,\n LoadingHandle,\n LoadingOptions,\n SheetOptions,\n ToastRecord,\n} from './types';\n\n/**\n * Renderer interface for bridging the framework-agnostic core to UI adapters.\n * If a call happens before a renderer is registered, it queues and replays upon registration.\n */\nexport interface Renderer {\n openDialog?(options: DialogOptions, handle: DialogHandle): Promise<DialogResult> | undefined;\n openSheet?(options: SheetOptions): Promise<DialogResult>;\n openBottomSheet?(options: BottomSheetOptions): BottomSheetHandle;\n openLoading?(options: LoadingOptions): LoadingHandle;\n mountToast?(record: ToastRecord): void;\n}\n\n/** Complete framework-agnostic UI feedback toolkit. */\nexport interface CoreUI {\n /** Toast notifications API. */\n readonly toast: ToastApi;\n /** Global configuration store. */\n readonly config: ConfigStore;\n /** Toast state manager. */\n readonly toastStore: ToastStore;\n /** Headless dialog manager. */\n readonly dialogManager: DialogManager;\n\n /** Opens a confirm dialog. */\n confirm(options: DialogOptions | string): Promise<DialogResult>;\n /** Opens an informational alert dialog. */\n alert(options: DialogOptions | string): Promise<DialogResult>;\n /** Opens a prompt dialog for user text/value input. */\n prompt(options: DialogOptions | string): Promise<DialogResult>;\n /** Runs a multi-step dialog sequence. */\n steps(steps: readonly DialogOptions[], backLabel?: string): Promise<StepsResult>;\n /** Opens an action sheet. */\n sheet(options: SheetOptions): Promise<DialogResult>;\n /** Opens a bottom sheet. */\n bottomSheet(options: BottomSheetOptions): BottomSheetHandle;\n /** Opens a loading overlay. */\n loading(options?: LoadingOptions | string): LoadingHandle;\n\n /** Merges global configuration. */\n configure(patch: Partial<GlazeConfig>): Readonly<GlazeConfig>;\n /** Returns the current configuration snapshot. */\n getConfig(): Readonly<GlazeConfig>;\n /** Clears all active toasts and dialogs. */\n clear(): void;\n\n /** Registers a concrete UI renderer, replaying any calls queued during hydration. */\n registerRenderer(renderer: Renderer): void;\n /** Returns the active renderer if registered. */\n getRenderer(): Renderer | undefined;\n}\n\nexport interface CreateUIOptions {\n config?: ConfigStore;\n clock?: Clock;\n}\n\n/**\n * Creates an isolated, framework-agnostic CoreUI instance.\n * Useful for multi-tenant applications, microfrontends, and isolated tests.\n */\nexport function createUI(options: CreateUIOptions = {}): CoreUI {\n const clock = options.clock ?? defaultClock;\n const config = options.config ?? createConfigStore();\n const toastStore = createToastManager({ config, clock });\n const toast = createToastApi(toastStore);\n const dialogManager = createDialogManager(clock);\n\n let renderer: Renderer | undefined;\n const q: (() => void)[] = [];\n const toOpts = (o: DialogOptions | string): DialogOptions =>\n typeof o === 'string' ? { title: o } : { ...o };\n\n const runDlg = (m: DialogOptions): Promise<DialogResult> => {\n const h = dialogManager.open(m);\n if (renderer?.openDialog) void renderer.openDialog(m, h);\n else q.push(() => void renderer?.openDialog?.(m, h));\n return h.result;\n };\n\n const DISMISSED: DialogResult = {\n isConfirmed: false,\n isDenied: false,\n isDismissed: true,\n value: undefined,\n dismiss: 'close',\n };\n\n const ui: CoreUI = {\n toast,\n config,\n toastStore,\n dialogManager,\n confirm: (o) =>\n runDlg({ confirmButton: { show: true }, cancelButton: { show: true }, ...toOpts(o) }),\n alert: (o) =>\n runDlg({\n confirmButton: { show: true },\n cancelButton: { show: false },\n denyButton: { show: false },\n ...toOpts(o),\n }),\n prompt: (o) =>\n runDlg({\n input: 'text',\n confirmButton: { show: true },\n cancelButton: { show: true },\n ...toOpts(o),\n }),\n steps: (list, back = 'Back') => runSteps(list, (s) => ui.confirm(s), back),\n sheet: (o) =>\n renderer?.openSheet\n ? renderer.openSheet(o)\n : new Promise((res) => {\n q.push(() =>\n renderer?.openSheet ? void renderer.openSheet(o).then(res) : res(DISMISSED),\n );\n }),\n bottomSheet(o) {\n if (renderer?.openBottomSheet) return renderer.openBottomSheet(o);\n let live: BottomSheetHandle | undefined;\n return {\n body: undefined,\n close: (r) => live?.close(r),\n snapTo: (i) => live?.snapTo(i),\n update: (p) => live?.update(p),\n result: new Promise((res) => {\n q.push(() =>\n renderer?.openBottomSheet\n ? void (live = renderer.openBottomSheet(o)).result.then(res)\n : res(DISMISSED),\n );\n }),\n };\n },\n loading(loadingOpts = {}) {\n const o = typeof loadingOpts === 'string' ? { text: loadingOpts } : loadingOpts;\n if (renderer?.openLoading) return renderer.openLoading(o);\n let live: LoadingHandle | undefined, done: () => void;\n const closed = new Promise<void>((res) => {\n done = res;\n });\n q.push(() =>\n renderer?.openLoading ? void (live = renderer.openLoading(o)).closed.then(done) : done(),\n );\n return {\n update: (p) => live?.update(p),\n close: () => {\n live?.close();\n done();\n },\n closed,\n };\n },\n configure: (p) => config.set(p),\n getConfig: () => config.get(),\n clear() {\n toastStore.clear();\n dialogManager.clear();\n q.length = 0;\n },\n registerRenderer(r) {\n renderer = r;\n while (q.length) q.shift()?.();\n },\n getRenderer: () => renderer,\n };\n\n return ui;\n}\n\nlet defaultUI: CoreUI | undefined;\nconst def = (): CoreUI => (defaultUI ??= createUI());\n\n/** Default singleton instance of the CoreUI toolkit. */\nexport const ui: CoreUI = {\n get toast() {\n return def().toast;\n },\n get config() {\n return def().config;\n },\n get toastStore() {\n return def().toastStore;\n },\n get dialogManager() {\n return def().dialogManager;\n },\n confirm: (o) => def().confirm(o),\n alert: (o) => def().alert(o),\n prompt: (o) => def().prompt(o),\n steps: (s, b) => def().steps(s, b),\n sheet: (o) => def().sheet(o),\n bottomSheet: (o) => def().bottomSheet(o),\n loading: (o) => def().loading(o),\n configure: (p) => def().configure(p),\n getConfig: () => def().getConfig(),\n clear: () => def().clear(),\n registerRenderer: (r) => def().registerRenderer(r),\n getRenderer: () => def().getRenderer(),\n};\n\n/** Registers the renderer with the default UI instance. */\nexport function registerRenderer(renderer: Renderer): void {\n def().registerRenderer(renderer);\n}\n\n/** Backward-compatible ToastEngine interface. */\nexport interface ToastEngine {\n store: ToastStore;\n toast: ToastApi;\n}\n\n/** Backward-compatible factory for ToastEngine. */\nexport function createToastEngine(options: { config?: ConfigStore } = {}): ToastEngine {\n const store = createToastManager({ config: options.config });\n return { store, toast: createToastApi(store) };\n}\n","import type { BuiltInSoundCue, SoundCue, ToastType } from '../core';\n\n/** A single frequency note in a sound cue: [frequency in Hz, start offset in seconds, gain level 0..1]. */\nexport type SoundNote = [frequency: number, offset: number, level: number];\n\nlet audioCtx: AudioContext | undefined;\n\n/** Built-in melodic sound cues synthesized with Web Audio partials. */\nconst CUES: Record<string, SoundNote[]> = {\n success: [\n [392, 0, 1],\n [523, 0.1, 1],\n ],\n error: [\n [233, 0, 1],\n [185, 0.13, 1],\n ],\n warning: [\n [349, 0, 0.8],\n [349, 0.16, 0.6],\n ],\n info: [[466, 0, 0.9]],\n ding: [\n [659, 0, 0.9],\n [880, 0.08, 1],\n ],\n pop: [\n [440, 0, 0.7],\n [880, 0.03, 0.9],\n ],\n chime: [\n [523, 0, 0.8],\n [659, 0.09, 0.85],\n [784, 0.18, 1],\n ],\n bell: [\n [587, 0, 1],\n [1175, 0.04, 0.5],\n ],\n message: [\n [440, 0, 0.8],\n [659, 0.12, 0.9],\n ],\n bubble: [\n [330, 0, 0.6],\n [494, 0.06, 0.8],\n ],\n marimba: [\n [523, 0, 1],\n [659, 0.06, 0.9],\n [784, 0.12, 1],\n [1047, 0.18, 0.8],\n ],\n crystal: [\n [880, 0, 0.8],\n [1319, 0.08, 0.9],\n [1760, 0.16, 0.7],\n ],\n subtle: [[440, 0, 0.6]],\n harp: [\n [392, 0, 0.7],\n [494, 0.05, 0.8],\n [587, 0.1, 0.9],\n [784, 0.15, 1],\n ],\n};\n\nconst getAudioCtxClass = () =>\n typeof window !== 'undefined'\n ? window.AudioContext ||\n (window as unknown as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext\n : undefined;\n\n/** Returns whether Web Audio is available in the current environment. */\nexport const isAudioSupported = (): boolean => Boolean(getAudioCtxClass());\n\n/** Returns the list of registered sound cue names. */\nexport const getSoundCues = (): readonly string[] => Object.keys(CUES);\n\n/** Registers or overrides a sound cue with custom frequency partials. */\nexport const registerSoundCue = (name: string, notes: SoundNote[]): void => {\n CUES[name] = notes;\n};\n\nconst MALLET = [\n [1, 0.6, 0.5],\n [2, 0.06, 0.15],\n] as const;\n\nfunction playTone(c: AudioContext, out: AudioNode, freq: number, at: number, level: number): void {\n const t = c.currentTime + at;\n const f = freq * (1 + (Math.random() - 0.5) * 0.008);\n for (const [m, gain, decay] of MALLET) {\n const osc = c.createOscillator();\n const g = c.createGain();\n osc.frequency.value = f * m;\n g.gain.setValueAtTime(1e-4, t);\n g.gain.linearRampToValueAtTime(gain * level, t + 0.015);\n g.gain.exponentialRampToValueAtTime(1e-4, t + decay);\n osc.connect(g).connect(out);\n osc.start(t);\n osc.stop(t + decay + 0.05);\n }\n}\n\nexport function playSound(cueOrType?: SoundCue | ToastType | boolean | string, volume = 0.5): void {\n if (!cueOrType || typeof window === 'undefined') return;\n const target = cueOrType === true ? 'info' : String(cueOrType);\n const vol = Math.min(1, Math.max(0, volume));\n\n if (/^(https?:|data:audio|blob:)/.test(target)) {\n try {\n const a = new Audio(target);\n a.volume = vol;\n void a.play().catch(() => undefined);\n } catch {\n // ignore\n }\n return;\n }\n\n const notes = CUES[target];\n const Ctx = notes && getAudioCtxClass();\n if (!notes || !Ctx) return;\n\n try {\n audioCtx ??= new Ctx();\n if (audioCtx.state === 'suspended') void audioCtx.resume();\n if (audioCtx.state === 'closed') return;\n\n const master = audioCtx.createGain();\n master.gain.value = vol * 0.45;\n const soften = audioCtx.createBiquadFilter();\n soften.frequency.value = 1300;\n master.connect(soften).connect(audioCtx.destination);\n\n for (const [freq, offset, level] of notes) playTone(audioCtx, master, freq, offset, level);\n setTimeout(() => soften.disconnect(), 900);\n } catch {\n // ignore\n }\n}\n\n/** Alias for playSound for backward compatibility with chime references. */\nexport const chime = playSound;\n\n/** Helper to resolve which sound to play for a toast record. */\nexport function resolveToastSound(\n recordSound: boolean | SoundCue | string | ((type: ToastType) => void) | undefined,\n globalSound: boolean | SoundCue | undefined,\n toastType: ToastType,\n): SoundCue | string | undefined {\n if (recordSound === false) return undefined;\n if (typeof recordSound === 'string') return recordSound;\n if (typeof recordSound === 'function') {\n try {\n recordSound(toastType);\n } catch {\n // Ignore errors in custom generator\n }\n return undefined;\n }\n if (recordSound === true || globalSound === true) {\n return CUES[toastType]\n ? (toastType as BuiltInSoundCue)\n : toastType === 'loading'\n ? 'bubble'\n : 'info';\n }\n return typeof globalSound === 'string' ? globalSound : undefined;\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport type {\n GlazeConfig,\n ToastApi,\n ToastOptions,\n ToastRecord,\n ToastStore,\n Unsubscribe,\n} from '../core';\nimport { createToastEngine } from '../core';\n\n/** Native engine holder for React Native environments. */\nlet nativeEngine: { store: ToastStore; toast: ToastApi } | undefined;\n\nfunction getNativeEngine(): { store: ToastStore; toast: ToastApi } {\n if (!nativeEngine) {\n nativeEngine = createToastEngine();\n }\n return nativeEngine;\n}\n\n/** Triggers optional haptic feedback on supported Expo devices. */\nasync function triggerHaptic(type: string): Promise<void> {\n try {\n // Dynamic optional import for expo-haptics\n // @ts-expect-error expo-haptics is an optional peer dependency that may not be installed at compile time\n const Haptics = await import('expo-haptics');\n if (!Haptics) return;\n if (type === 'success') {\n await Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success);\n } else if (type === 'error') {\n await Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error);\n } else if (type === 'warning') {\n await Haptics.notificationAsync(Haptics.NotificationFeedbackType.Warning);\n } else {\n await Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n }\n } catch {\n // expo-haptics is an optional peer dependency, gracefully ignore when not installed\n }\n}\n\n/**\n * Creates the React Native `toast` API with haptics integration.\n */\nfunction createNativeToastApi(): ToastApi {\n const engine = getNativeEngine();\n const baseToast = engine.toast;\n\n const wrap =\n (fn: (msg?: unknown, opts?: ToastOptions) => string | number) =>\n (msg?: unknown, opts: ToastOptions = {}) => {\n const type = opts.type ?? 'default';\n void triggerHaptic(type);\n return fn(msg, opts);\n };\n\n const nativeApi = wrap(baseToast) as ToastApi;\n nativeApi.success = wrap(baseToast.success);\n nativeApi.error = wrap(baseToast.error);\n nativeApi.info = wrap(baseToast.info);\n nativeApi.warning = wrap(baseToast.warning);\n nativeApi.loading = wrap(baseToast.loading);\n nativeApi.message = wrap(baseToast.message);\n\n nativeApi.promise = baseToast.promise;\n nativeApi.custom = baseToast.custom;\n nativeApi.update = baseToast.update;\n nativeApi.dismiss = baseToast.dismiss;\n nativeApi.dismissAll = baseToast.dismissAll;\n nativeApi.getToasts = baseToast.getToasts;\n nativeApi.getHistory = baseToast.getHistory;\n Object.defineProperty(nativeApi, 'types', { value: baseToast.types, enumerable: true });\n\n return nativeApi;\n}\n\n/** Native toast API. */\nexport const toast: ToastApi = createNativeToastApi();\n\nexport interface ToastShowParams {\n type?: 'success' | 'error' | 'info' | 'warning' | 'loading' | string;\n text1?: string | React.ReactNode;\n text2?: string | React.ReactNode;\n position?: 'top' | 'bottom' | 'center' | string;\n autoHide?: boolean;\n visibilityTime?: number;\n topOffset?: number;\n bottomOffset?: number;\n keyboardOffset?: number;\n onShow?: () => void;\n onHide?: () => void;\n onPress?: () => void;\n props?: Record<string, unknown>;\n id?: string | number;\n swipeable?: boolean;\n image?: string;\n closeButton?: boolean;\n closeText?: string;\n discardText?: string;\n [key: string]: unknown;\n}\n\nlet toastRef: unknown = null;\n\n/**\n * Full react-native-toast-message v2.5.2 drop-in compatible interface.\n * Allows instant migration from react-native-toast-message with zero code changes.\n */\nexport const Toast = Object.assign(toast, {\n show(params: ToastShowParams | string): string | number {\n if (typeof params === 'string') {\n return toast(params);\n }\n const {\n type = 'success',\n text1,\n text2,\n position = 'top',\n autoHide = true,\n visibilityTime,\n topOffset,\n bottomOffset,\n keyboardOffset,\n onShow,\n onHide,\n onPress,\n ...rest\n } = params;\n\n const restOpts = rest as ToastOptions;\n const duration: number = autoHide === false ? 0 : (visibilityTime ?? restOpts.duration ?? 4000);\n const nativePos =\n position === 'top' ? 'top-center' : position === 'bottom' ? 'bottom-center' : position;\n\n return toast(text1 ?? (restOpts.title as string | undefined), {\n ...restOpts,\n type: type as ToastOptions['type'],\n title: text1 ?? restOpts.title,\n description: text2 ?? restOpts.description,\n duration,\n position: nativePos as ToastOptions['position'],\n topOffset,\n bottomOffset,\n keyboardOffset,\n onOpen: onShow ? () => onShow() : restOpts.onOpen,\n onClose: onHide ? () => onHide() : restOpts.onClose,\n onPress: onPress ? () => onPress() : restOpts.onPress,\n });\n },\n hide(id?: string | number): void {\n if (id !== undefined) toast.dismiss(id);\n else toast.dismissAll();\n },\n setRef(ref: unknown): void {\n toastRef = ref;\n },\n getRef(): unknown {\n return toastRef;\n },\n});\n\nexport default Toast;\n\n/** Configuration function for React Native. */\nexport function configure(patch: Partial<GlazeConfig>): Readonly<GlazeConfig> {\n return getNativeEngine().store.config.set(patch);\n}\n\n/** Resets the native engine for tests. */\nexport function resetNativeEngine(): void {\n if (nativeEngine) {\n nativeEngine.store.clear();\n nativeEngine.store.clearHistory();\n nativeEngine.store.config.reset();\n }\n}\n\n/** Native UI namespace. */\nexport const ui = {\n toast,\n configure,\n reset: resetNativeEngine,\n};\n\n/** Spring physics animation presets inspired by expo-dynamic-toast. */\nexport const nativeSpring = {\n glide: { damping: 32, stiffness: 170, mass: 1 },\n snappy: { damping: 24, stiffness: 280, mass: 0.8 },\n} as const;\n\n/** Native timing presets for animations. */\nexport const nativeTiming = {\n normal: { duration: 300 },\n exit: { duration: 200 },\n} as const;\n\nexport interface NativeToasterProps {\n /** Toast placement across 7 positions (top-left, top-center, top-right, center, bottom-left, bottom-center, bottom-right). Defaults to 'top-center'. */\n position?:\n | 'top'\n | 'bottom'\n | 'center'\n | 'middle'\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n /** Optional top/bottom inset offset. */\n offset?: number;\n /** Distance in pixels from top screen boundary (react-native-toast-message compatible). */\n topOffset?: number;\n /** Distance in pixels from bottom screen boundary (react-native-toast-message compatible). */\n bottomOffset?: number;\n /** Distance in pixels above soft keyboard (react-native-toast-message compatible). */\n keyboardOffset?: number;\n /** Gap between stacked toasts in pixels. Defaults to 8. */\n gap?: number;\n /** Maximum number of visible toasts. Defaults to 4. */\n visibleToasts?: number;\n /** Whether stacked toasts expand on tap. */\n expand?: boolean;\n /** Whether close button is displayed. */\n closeButton?: boolean;\n /** Whether swipe to dismiss is enabled. Defaults to true. */\n swipeToDismiss?: boolean;\n /** Spring animation preset or configuration. */\n spring?: 'glide' | 'snappy' | { damping: number; stiffness: number; mass: number };\n /** Toast container style. */\n style?: Record<string, unknown>;\n /** Individual toast card style. */\n toastStyle?: Record<string, unknown>;\n}\n\nexport interface GlazeProviderProps {\n children?: React.ReactNode;\n}\n\n/** Root provider for React Native toastory overlay hosting. */\nexport function GlazeProvider({ children }: GlazeProviderProps): React.JSX.Element {\n return <>{children}</>;\n}\n\n/**\n * React Native Toast Renderer component.\n * Renders glass toasts with optional Expo BlurView and gesture animations.\n */\nexport function Toaster(props: NativeToasterProps): React.JSX.Element | null {\n const [toastsList, setToastsList] = useState<readonly ToastRecord[]>([]);\n\n useEffect(() => {\n const engine = getNativeEngine();\n setToastsList(engine.store.getToasts());\n const unsub: Unsubscribe = engine.store.subscribe(() => {\n setToastsList(engine.store.getToasts());\n });\n return () => unsub();\n }, []);\n\n const visibleToasts = useMemo(() => toastsList.filter((t) => t.visible), [toastsList]);\n\n if (visibleToasts.length === 0) return null;\n\n const position = props.position ?? 'top-center';\n const isBottom = position.startsWith('bottom');\n const isCenter = position === 'center' || position === 'middle';\n const isLeft = position.endsWith('left');\n const isRight = position.endsWith('right');\n\n const topOffset = props.topOffset ?? props.offset ?? 50;\n const bottomOffset = props.bottomOffset ?? props.offset ?? 50;\n\n const posStyle: React.CSSProperties = isBottom\n ? { bottom: bottomOffset }\n : isCenter\n ? { top: '50%', transform: 'translateY(-50%)' }\n : { top: topOffset };\n\n const alignStyle: React.CSSProperties = isLeft\n ? { alignItems: 'flex-start' }\n : isRight\n ? { alignItems: 'flex-end' }\n : { alignItems: 'center' };\n\n const maxVisible = props.visibleToasts ?? 4;\n const displayed = visibleToasts.slice(0, maxVisible);\n\n return (\n <div\n style={\n {\n position: 'absolute',\n ...posStyle,\n ...alignStyle,\n left: 16,\n right: 16,\n zIndex: 99999,\n display: 'flex',\n flexDirection: 'column',\n gap: props.gap ?? 8,\n ...props.style,\n } as React.CSSProperties\n }\n >\n {displayed.map((item) => (\n <div\n key={String(item.id)}\n onClick={() => {\n if (item.onPress) item.onPress(item);\n }}\n style={\n {\n backgroundColor: 'rgba(28, 28, 30, 0.88)',\n padding: 14,\n borderRadius: 16,\n minWidth: 200,\n maxWidth: '100%',\n boxShadow: '0 8px 24px rgba(0, 0, 0, 0.25)',\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n position: 'relative',\n cursor: item.onPress ? 'pointer' : undefined,\n ...props.toastStyle,\n } as React.CSSProperties\n }\n >\n {item.image ? (\n <div style={{ borderRadius: 10, overflow: 'hidden', marginBottom: 4 }}>\n <img\n src={typeof item.image === 'string' ? item.image : item.image.src}\n alt=\"\"\n style={{ width: '100%', maxHeight: 120, objectFit: 'cover' }}\n />\n </div>\n ) : null}\n {props.closeButton || item.closeButton || item.closeText || item.discardText ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n getNativeEngine().toast.dismiss(item.id);\n }}\n aria-label={item.closeButtonLabel ?? 'Close notification'}\n style={\n {\n position: 'absolute',\n top: 8,\n right: 10,\n background: 'transparent',\n border: 'none',\n color: 'rgba(255,255,255,0.6)',\n cursor: 'pointer',\n fontSize: item.closeText || item.discardText ? 12 : 16,\n fontWeight: item.closeText || item.discardText ? '600' : 'normal',\n padding: '2px 6px',\n lineHeight: 1,\n } as React.CSSProperties\n }\n >\n {item.closeText ?? item.discardText ?? '×'}\n </button>\n ) : null}\n {item.character || item.robotVariant ? (\n <div\n style={\n {\n fontSize: 11,\n fontWeight: '700',\n color: '#a78bfa',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n marginBottom: 2,\n } as React.CSSProperties\n }\n >\n [{item.character ?? item.robotVariant}]\n </div>\n ) : null}\n {item.badge ? (\n <div\n style={\n {\n fontSize: 11,\n fontWeight: '600',\n color: '#38bdf8',\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n } as React.CSSProperties\n }\n >\n {typeof item.badge === 'string'\n ? item.badge\n : ((item.badge as { label?: string }).label ?? '')}\n </div>\n ) : null}\n {item.title ? (\n <div style={{ color: '#fff', fontWeight: '600', fontSize: 15 }}>\n {String(item.title)}\n </div>\n ) : null}\n {item.description ? (\n <div style={{ color: '#aaa', fontSize: 13, marginTop: 2 }}>\n {String(item.description)}\n </div>\n ) : null}\n {item.progressValue !== undefined ? (\n <div\n style={\n {\n height: 3,\n backgroundColor: 'rgba(255,255,255,0.15)',\n borderRadius: 3,\n marginTop: 6,\n overflow: 'hidden',\n } as React.CSSProperties\n }\n >\n <div\n style={\n {\n height: '100%',\n width: `${Math.round(item.progressValue * 100)}%`,\n backgroundColor: '#38bdf8',\n } as React.CSSProperties\n }\n />\n </div>\n ) : null}\n {item.actions && item.actions.length > 0 ? (\n <div\n style={\n {\n display: 'flex',\n gap: 8,\n marginTop: 8,\n justifyContent: 'flex-end',\n } as React.CSSProperties\n }\n >\n {item.actions.map((act, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={act.onClick ? (e) => act.onClick?.(e.nativeEvent) : undefined}\n style={\n {\n fontSize: 12,\n fontWeight: '600',\n padding: '4px 10px',\n borderRadius: 8,\n border: 'none',\n backgroundColor: 'rgba(255, 255, 255, 0.12)',\n color: '#fff',\n cursor: 'pointer',\n } as React.CSSProperties\n }\n >\n {act.label ?? act.text ?? 'Action'}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n ))}\n </div>\n );\n}\n\n/** React Native hook for reactive toast state. */\nexport function useNativeToast(): {\n toast: ToastApi;\n toasts: readonly ToastRecord[];\n} {\n const [toastsList, setToastsList] = useState<readonly ToastRecord[]>([]);\n\n useEffect(() => {\n const engine = getNativeEngine();\n setToastsList(engine.store.getToasts());\n return engine.store.subscribe(() => {\n setToastsList(engine.store.getToasts());\n });\n }, []);\n\n return { toast, toasts: toastsList };\n}\n\nexport { playSound, chime } from '../web/sound';\nexport type { SoundNote } from '../web/sound';\n"]}
|