@lerx/promise-modal 0.0.3 → 0.0.5

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.
@@ -1,2 +1,2 @@
1
- export declare const Anchor: import("react").MemoExoticComponent<() => import("react/jsx-runtime").JSX.Element>;
1
+ export declare const Anchor: import("react").MemoExoticComponent<import("react").ComponentType<import("@winglet/react-utils/dist/@aileron/types").Dictionary>>;
2
2
  //# sourceMappingURL=Anchor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Anchor.d.ts","sourceRoot":"","sources":["../../../src/components/Anchor/Anchor.tsx"],"names":[],"mappings":"AAWA,eAAO,MAAM,MAAM,oFA0BjB,CAAC"}
1
+ {"version":3,"file":"Anchor.d.ts","sourceRoot":"","sources":["../../../src/components/Anchor/Anchor.tsx"],"names":[],"mappings":"AAuCA,eAAO,MAAM,MAAM,mIAAuC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const root: string;
2
+ //# sourceMappingURL=classNames.emotion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classNames.emotion.d.ts","sourceRoot":"","sources":["../../../src/components/Anchor/classNames.emotion.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI,QAOf,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const root: string;
2
+ export declare const active: string;
3
+ export declare const visible: string;
4
+ //# sourceMappingURL=classNames.emotion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classNames.emotion.d.ts","sourceRoot":"","sources":["../../../src/components/Background/classNames.emotion.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI,QAOf,CAAC;AACH,eAAO,MAAM,MAAM,QAOjB,CAAC;AACH,eAAO,MAAM,OAAO,QAOlB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const fallback: string;
2
+ export declare const frame: string;
3
+ //# sourceMappingURL=classNames.emotion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classNames.emotion.d.ts","sourceRoot":"","sources":["../../../src/components/FallbackComponents/classNames.emotion.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,QAOnB,CAAC;AACH,eAAO,MAAM,KAAK,QAOhB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const root: string;
2
+ export declare const active: string;
3
+ //# sourceMappingURL=classNames.emotion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classNames.emotion.d.ts","sourceRoot":"","sources":["../../../src/components/Foreground/classNames.emotion.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI,QAOf,CAAC;AACH,eAAO,MAAM,MAAM,QAOjB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"PromptInner.d.ts","sourceRoot":"","sources":["../../../../src/components/Foreground/components/PromptInner.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,UAAU,gBAAgB,CAAC,CAAC,EAAE,CAAC;IAC7B,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxB,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC,CAAC;CACpE;AAED,eAAO,MAAM,WAAW,wCACrB,CAAC,EAAE,CAAC,uBAAuB,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,8CAwGnD,CAAC"}
1
+ {"version":3,"file":"PromptInner.d.ts","sourceRoot":"","sources":["../../../../src/components/Foreground/components/PromptInner.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,UAAU,gBAAgB,CAAC,CAAC,EAAE,CAAC;IAC7B,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxB,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC,CAAC;CACpE;AAED,eAAO,MAAM,WAAW,wCACrB,CAAC,EAAE,CAAC,uBAAuB,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,8CAwGnD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const root: string;
2
+ //# sourceMappingURL=classNames.emotion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classNames.emotion.d.ts","sourceRoot":"","sources":["../../../src/components/Presenter/classNames.emotion.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI,QAOf,CAAC"}
package/dist/index.cjs.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var e=require("react/jsx-runtime"),n=require("react"),o=require("react-dom"),t=require("@winglet/react-utils"),r=require("@winglet/common-utils"),i=require("clsx"),l=require("/Users/Vincent/Workspace/altovion/node_modules/style-inject/dist/style-inject.es.js");const s={current:[]},a={current:e=>{s.current.push(e)}},c={current:null},u={get prerender(){return s.current},clearPrerender(){s.current=[]},open(e){a.current(e)},setupOpen(e){a.current=e},anchor(e,n="modal-anchor"){if(c.current){const e=document.getElementById(c.current.id);if(e)return e}const o=document.createElement(e);return o.setAttribute("id",`${n}-${r.getRandomNumber()}`),document.body.appendChild(o),c.current=o,o}},d="300ms",m="rgba(0, 0, 0, 0.5)";var b="Background-module__active___Zi50h",p="Background-module__visible___tAN9F";l(".Background-module__root___zat-I{display:none;inset:0;pointer-events:none;position:fixed;z-index:-999}.Background-module__root___zat-I.Background-module__active___Zi50h{pointer-events:all!important}.Background-module__root___zat-I.Background-module__visible___tAN9F{align-items:center;display:flex;justify-content:center}.Background-module__root___zat-I>*{pointer-events:none}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJhY2tncm91bmQubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQ0FDRSxZQUFhLENBRWIsT0FBUSxDQUVSLG1CQUFvQixDQUhwQixjQUFlLENBRWYsWUFFRixDQUVBLG1FQUNFLDRCQUNGLENBRUEsb0VBRUUsa0JBQW1CLENBRG5CLFlBQWEsQ0FFYixzQkFDRixDQUVBLG1DQUNFLG1CQUNGIiwiZmlsZSI6IkJhY2tncm91bmQubW9kdWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5yb290IHtcbiAgZGlzcGxheTogbm9uZTtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBpbnNldDogMDtcbiAgei1pbmRleDogLTk5OTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5yb290LmFjdGl2ZSB7XG4gIHBvaW50ZXItZXZlbnRzOiBhbGwgIWltcG9ydGFudDtcbn1cblxuLnJvb3QudmlzaWJsZSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4ucm9vdCA+ICoge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbiJdfQ== */");const f=({modalId:o,onChangeOrder:t})=>{const{BackgroundComponent:r}=K(),{modal:l,onClose:s,onChange:a,onConfirm:c,onDestroy:u}=M(o),d=n.useCallback((e=>{l&&l.closeOnBackdropClick&&l.visible&&s(),e.stopPropagation()}),[l,s]);if(!l)return null;const m=l.manualDestroy?l.alive:l.visible;return e.jsx("div",{className:i("Background-module__root___zat-I",{[p]:m,[b]:l.closeOnBackdropClick&&m}),onClick:d,children:r&&e.jsx(r,{id:l.id,type:l.type,alive:l.alive,visible:l.visible,initiator:l.initiator,manualDestroy:l.manualDestroy,closeOnBackdropClick:l.closeOnBackdropClick,background:l.background,onChange:a,onConfirm:c,onClose:s,onDestroy:u,onChangeOrder:t})})};var C="Foreground-module__active___f-kK8";l(".Foreground-module__root___Go3o8{display:none;inset:0;pointer-events:none;position:fixed;z-index:1}.Foreground-module__root___Go3o8.Foreground-module__active___f-kK8{align-items:center;display:flex!important;justify-content:center}.Foreground-module__root___Go3o8.Foreground-module__active___f-kK8>*{pointer-events:all!important}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZvcmVncm91bmQubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQ0FFRSxZQUFhLENBRWIsT0FBUSxDQUhSLG1CQUFvQixDQUVwQixjQUFlLENBRWYsU0FDRixDQUVBLG1FQUdFLGtCQUFtQixDQUZuQixzQkFBd0IsQ0FDeEIsc0JBRUYsQ0FFQSxxRUFDRSw0QkFDRiIsImZpbGUiOiJGb3JlZ3JvdW5kLm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIucm9vdCB7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBkaXNwbGF5OiBub25lO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIGluc2V0OiAwO1xuICB6LWluZGV4OiAxO1xufVxuXG4ucm9vdC5hY3RpdmUge1xuICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4ucm9vdC5hY3RpdmUgPiAqIHtcbiAgcG9pbnRlci1ldmVudHM6IGFsbCAhaW1wb3J0YW50O1xufVxuIl19 */");const h=n.memo((({modal:o,handlers:i})=>{const{title:l,subtitle:s,content:a,footer:c}=n.useMemo((()=>o),[o]),{onConfirm:u}=n.useMemo((()=>i),[i]),d=t.useHandle(u),{TitleComponent:m,SubtitleComponent:b,ContentComponent:p,FooterComponent:f}=K();return e.jsxs(n.Fragment,{children:[l&&(r.isString(l)?e.jsx(m,{children:l}):l),s&&(r.isString(s)?e.jsx(b,{children:s}):s),a&&(r.isString(a)?e.jsx(p,{children:a}):t.renderComponent(a,{onConfirm:d})),!1!==c&&("function"==typeof c?c({onConfirm:d}):e.jsx(f,{onConfirm:d,confirmLabel:c?.confirm,hideConfirm:c?.hideConfirm}))]})})),g=n.memo((({modal:o,handlers:i})=>{const{title:l,subtitle:s,content:a,footer:c}=n.useMemo((()=>o),[o]),{onConfirm:u,onClose:d}=n.useMemo((()=>i),[i]),m=t.useHandle(u),b=t.useHandle(d),{TitleComponent:p,SubtitleComponent:f,ContentComponent:C,FooterComponent:h}=K();return e.jsxs(n.Fragment,{children:[l&&(r.isString(l)?e.jsx(p,{children:l}):l),s&&(r.isString(s)?e.jsx(f,{children:s}):s),a&&(r.isString(a)?e.jsx(C,{children:a}):t.renderComponent(a,{onConfirm:m,onCancel:b})),!1!==c&&("function"==typeof c?c({onConfirm:m,onCancel:b}):e.jsx(h,{onConfirm:m,onCancel:b,confirmLabel:c?.confirm,cancelLabel:c?.cancel,hideConfirm:c?.hideConfirm,hideCancel:c?.hideCancel}))]})})),y=n.memo((({modal:o,handlers:i})=>{const{Input:l,defaultValue:s,disabled:a,title:c,subtitle:u,content:d,footer:m}=n.useMemo((()=>({...o,Input:n.memo(o.Input)})),[o]),[b,p]=n.useState(s),{onChange:f,onClose:C,onConfirm:h}=n.useMemo((()=>i),[i]),g=t.useHandle(C),y=t.useHandle((e=>{const n=r.isFunction(e)?e(b):e;p(n),f(n)})),v=n.useCallback((()=>{setTimeout((()=>{h()}))}),[h]),k=n.useMemo((()=>!!b&&!!a?.(b)),[a,b]),{TitleComponent:x,SubtitleComponent:I,ContentComponent:B,FooterComponent:F}=K();return e.jsxs(n.Fragment,{children:[c&&(r.isString(c)?e.jsx(x,{children:c}):c),u&&(r.isString(u)?e.jsx(I,{children:u}):u),d&&(r.isString(d)?e.jsx(B,{children:d}):t.renderComponent(d,{onConfirm:v,onCancel:g})),l&&e.jsx(l,{defaultValue:s,value:b,onChange:y,onConfirm:v}),!1!==m&&("function"==typeof m?m({onConfirm:v,onCancel:g,onChange:y,value:b,disabled:k}):e.jsx(F,{onConfirm:v,onCancel:g,disabled:k,confirmLabel:m?.confirm,cancelLabel:m?.cancel,hideConfirm:m?.hideConfirm,hideCancel:m?.hideCancel}))]})})),v=({modalId:n,onChangeOrder:o})=>{const{ForegroundComponent:t}=K(),{modal:r,onChange:l,onConfirm:s,onClose:a,onDestroy:c}=M(n);return r?e.jsx("div",{className:i("Foreground-module__root___Go3o8",{[C]:r.manualDestroy?r.alive:r.visible}),children:e.jsxs(t,{id:r.id,type:r.type,alive:r.alive,visible:r.visible,initiator:r.initiator,manualDestroy:r.manualDestroy,closeOnBackdropClick:r.closeOnBackdropClick,background:r.background,onChange:l,onConfirm:s,onClose:a,onDestroy:c,onChangeOrder:o,children:["alert"===r.type&&e.jsx(h,{modal:r,handlers:{onConfirm:s}}),"confirm"===r.type&&e.jsx(g,{modal:r,handlers:{onConfirm:s,onClose:a}}),"prompt"===r.type&&e.jsx(y,{modal:r,handlers:{onChange:l,onConfirm:s,onClose:a}})]})}):null},k=e=>{const[n,o]=t.useTick();return t.useOnMount((()=>{if(e)return e.subscribe(o)})),n};l(".Presenter-module__modal___HyHFW{inset:0;overflow:hidden;pointer-events:none;position:fixed}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlByZXNlbnRlci5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlDQUVFLE9BQVEsQ0FFUixlQUFnQixDQURoQixtQkFBb0IsQ0FGcEIsY0FJRiIsImZpbGUiOiJQcmVzZW50ZXIubW9kdWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5tb2RhbCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgaW5zZXQ6IDA7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuIl19 */");let x=1;const I=n.memo((({modalId:o})=>{const r=n.useRef(null),{modal:i}=M(o);k(i);const l=t.useHandle((()=>{r.current&&(r.current.style.zIndex=""+x++)}));return e.jsxs("div",{ref:r,className:"Presenter-module__modal___HyHFW",children:[e.jsx(f,{modalId:o,onChangeOrder:l}),e.jsx(v,{modalId:o,onChangeOrder:l})]})})),B=(e=0)=>{const{modalIds:o,getModalNode:t}=N();return n.useMemo((()=>{let e=0;for(const n of o)t(n)?.visible&&e++;return e}),[t,o,e])};
1
+ "use strict";var e=require("react/jsx-runtime"),n=require("react"),t=require("react-dom"),o=require("@winglet/react-utils"),r=require("@winglet/common-utils"),i=require("@emotion/css");const s={current:[]},a={current:e=>{s.current.push(e)}},l={current:null},c={get prerender(){return s.current},clearPrerender(){s.current=[]},open(e){a.current(e)},setupOpen(e){a.current=e},anchor(e,n="modal-anchor"){if(l.current){const e=document.getElementById(l.current.id);if(e)return e}const t=document.createElement(e);return t.setAttribute("id",`${n}-${r.getRandomNumber()}`),document.body.appendChild(t),l.current=t,t}},u="300ms",d="rgba(0, 0, 0, 0.5)";function m(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}const p=i.css("production"===process.env.NODE_ENV?{name:"u7uu4v",styles:"display:none;position:fixed;inset:0;z-index:-999;pointer-events:none;>*{pointer-events:none;}"}:{name:"1p2ejpq-root",styles:"display:none;position:fixed;inset:0;z-index:-999;pointer-events:none;>*{pointer-events:none;};label:root;",toString:m}),f=i.css("production"===process.env.NODE_ENV?{name:"10wde3l",styles:"pointer-events:all!important"}:{name:"3a0g0-active",styles:"pointer-events:all!important;label:active;",toString:m}),b=i.css("production"===process.env.NODE_ENV?{name:"1wnowod",styles:"display:flex;align-items:center;justify-content:center"}:{name:"xppew7-visible",styles:"display:flex;align-items:center;justify-content:center;label:visible;",toString:m}),h=({modalId:t,onChangeOrder:o})=>{const{BackgroundComponent:r}=se(),{modal:s,onClose:a,onChange:l,onConfirm:c,onDestroy:u}=Y(t),d=n.useCallback((e=>{s&&s.closeOnBackdropClick&&s.visible&&a(),e.stopPropagation()}),[s,a]);if(!s)return null;const m=s.manualDestroy?s.alive:s.visible;return e.jsx("div",{className:i.cx(p,{[b]:m,[f]:s.closeOnBackdropClick&&m}),onClick:d,children:r&&e.jsx(r,{id:s.id,type:s.type,alive:s.alive,visible:s.visible,initiator:s.initiator,manualDestroy:s.manualDestroy,closeOnBackdropClick:s.closeOnBackdropClick,background:s.background,onChange:l,onConfirm:c,onClose:a,onDestroy:u,onChangeOrder:o})})};function C(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}const y=i.css("production"===process.env.NODE_ENV?{name:"12g0hx0",styles:"pointer-events:none;display:none;position:fixed;inset:0;z-index:1"}:{name:"10jnv7e-root",styles:"pointer-events:none;display:none;position:fixed;inset:0;z-index:1;label:root;",toString:C}),v=i.css("production"===process.env.NODE_ENV?{name:"16yx055",styles:"display:flex!important;justify-content:center;align-items:center;>*{pointer-events:all;}"}:{name:"127acw3-active",styles:"display:flex!important;justify-content:center;align-items:center;>*{pointer-events:all;};label:active;",toString:C}),g=n.memo((({modal:t,handlers:i})=>{const{title:s,subtitle:a,content:l,footer:c}=n.useMemo((()=>t),[t]),{onConfirm:u}=n.useMemo((()=>i),[i]),d=o.useHandle(u),{TitleComponent:m,SubtitleComponent:p,ContentComponent:f,FooterComponent:b}=se();return e.jsxs(n.Fragment,{children:[s&&(r.isString(s)?e.jsx(m,{children:s}):s),a&&(r.isString(a)?e.jsx(p,{children:a}):a),l&&(r.isString(l)?e.jsx(f,{children:l}):o.renderComponent(l,{onConfirm:d})),!1!==c&&("function"==typeof c?c({onConfirm:d}):e.jsx(b,{onConfirm:d,confirmLabel:c?.confirm,hideConfirm:c?.hideConfirm}))]})})),k=n.memo((({modal:t,handlers:i})=>{const{title:s,subtitle:a,content:l,footer:c}=n.useMemo((()=>t),[t]),{onConfirm:u,onClose:d}=n.useMemo((()=>i),[i]),m=o.useHandle(u),p=o.useHandle(d),{TitleComponent:f,SubtitleComponent:b,ContentComponent:h,FooterComponent:C}=se();return e.jsxs(n.Fragment,{children:[s&&(r.isString(s)?e.jsx(f,{children:s}):s),a&&(r.isString(a)?e.jsx(b,{children:a}):a),l&&(r.isString(l)?e.jsx(h,{children:l}):o.renderComponent(l,{onConfirm:m,onCancel:p})),!1!==c&&("function"==typeof c?c({onConfirm:m,onCancel:p}):e.jsx(C,{onConfirm:m,onCancel:p,confirmLabel:c?.confirm,cancelLabel:c?.cancel,hideConfirm:c?.hideConfirm,hideCancel:c?.hideCancel}))]})})),x=n.memo((({modal:t,handlers:i})=>{const{Input:s,defaultValue:a,disabled:l,title:c,subtitle:u,content:d,footer:m}=n.useMemo((()=>({...t,Input:n.memo(o.withErrorBoundary(t.Input))})),[t]),[p,f]=n.useState(a),{onChange:b,onClose:h,onConfirm:C}=n.useMemo((()=>i),[i]),y=o.useHandle(h),v=o.useHandle((e=>{const n=r.isFunction(e)?e(p):e;f(n),b(n)})),g=n.useCallback((()=>{setTimeout((()=>{C()}))}),[C]),k=n.useMemo((()=>!!p&&!!l?.(p)),[l,p]),{TitleComponent:x,SubtitleComponent:j,ContentComponent:O,FooterComponent:w}=se();return e.jsxs(n.Fragment,{children:[c&&(r.isString(c)?e.jsx(x,{children:c}):c),u&&(r.isString(u)?e.jsx(j,{children:u}):u),d&&(r.isString(d)?e.jsx(O,{children:d}):o.renderComponent(d,{onConfirm:g,onCancel:y})),s&&e.jsx(s,{defaultValue:a,value:p,onChange:v,onConfirm:g}),!1!==m&&("function"==typeof m?m({onConfirm:g,onCancel:y,onChange:v,value:p,disabled:k}):e.jsx(w,{onConfirm:g,onCancel:y,disabled:k,confirmLabel:m?.confirm,cancelLabel:m?.cancel,hideConfirm:m?.hideConfirm,hideCancel:m?.hideCancel}))]})})),j=({modalId:n,onChangeOrder:t})=>{const{ForegroundComponent:o}=se(),{modal:r,onChange:s,onConfirm:a,onClose:l,onDestroy:c}=Y(n);return r?e.jsx("div",{className:i.cx(y,{[v]:r.manualDestroy?r.alive:r.visible}),children:e.jsxs(o,{id:r.id,type:r.type,alive:r.alive,visible:r.visible,initiator:r.initiator,manualDestroy:r.manualDestroy,closeOnBackdropClick:r.closeOnBackdropClick,background:r.background,onChange:s,onConfirm:a,onClose:l,onDestroy:c,onChangeOrder:t,children:["alert"===r.type&&e.jsx(g,{modal:r,handlers:{onConfirm:a}}),"confirm"===r.type&&e.jsx(k,{modal:r,handlers:{onConfirm:a,onClose:l}}),"prompt"===r.type&&e.jsx(x,{modal:r,handlers:{onChange:s,onConfirm:a,onClose:l}})]})}):null},O=e=>{const[n,t]=o.useTick();return o.useOnMount((()=>{if(e)return e.subscribe(t)})),n},w=i.css("production"===process.env.NODE_ENV?{name:"13dmkf4",styles:"position:fixed;inset:0;pointer-events:none;overflow:hidden"}:{name:"1kdr2v-root",styles:"position:fixed;inset:0;pointer-events:none;overflow:hidden;label:root;",toString:function(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}});let D=1;const B=n.memo((({modalId:t})=>{const r=n.useRef(null),{modal:i}=Y(t);O(i);const s=o.useHandle((()=>{r.current&&(r.current.style.zIndex=""+D++)}));return e.jsxs("div",{ref:r,className:w,children:[e.jsx(h,{modalId:t,onChangeOrder:s}),e.jsx(j,{modalId:t,onChangeOrder:s})]})})),P=(e=0)=>{const{modalIds:t,getModalNode:o}=W();return n.useMemo((()=>{let e=0;for(const n of t)o(n)?.visible&&e++;return e}),[o,t,e])};
2
2
  /******************************************************************************
3
3
  Copyright (c) Microsoft Corporation.
4
4
 
@@ -14,5 +14,5 @@ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
14
  PERFORMANCE OF THIS SOFTWARE.
15
15
  ***************************************************************************** */
16
16
  /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
17
- function F(e,n,o,t){if("a"===o&&!t)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof n?e!==n||!t:!n.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===o?t:"a"===o?t.call(e):t?t.value:n.get(e)}function _(e,n,o,t,r){if("m"===t)throw new TypeError("Private method is not writable");if("a"===t&&!r)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof n?e!==n||!r:!n.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===t?r.call(e,o):r?r.value=o:n.set(e,o),o}var j,Q,G,O,w;"function"==typeof SuppressedError&&SuppressedError;class D{get alive(){return F(this,j,"f")}get visible(){return F(this,Q,"f")}constructor({id:e,initiator:n,title:o,subtitle:t,background:r,manualDestroy:i=!1,closeOnBackdropClick:l=!0,resolve:s}){Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"initiator",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"title",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"subtitle",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"background",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"manualDestroy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"closeOnBackdropClick",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),j.set(this,void 0),Q.set(this,void 0),G.set(this,void 0),O.set(this,[]),this.id=e,this.initiator=n,this.title=o,this.subtitle=t,this.background=r,this.manualDestroy=i,this.closeOnBackdropClick=l,_(this,j,!0,"f"),_(this,Q,!0,"f"),_(this,G,s,"f")}subscribe(e){return F(this,O,"f").push(e),()=>{_(this,O,F(this,O,"f").filter((n=>n!==e)),"f")}}publish(){for(const e of F(this,O,"f"))e()}resolve(e){F(this,G,"f").call(this,e)}onDestroy(){const e=!0===F(this,j,"f");_(this,j,!1,"f"),this.manualDestroy&&e&&this.publish()}onShow(){const e=!1===F(this,Q,"f");_(this,Q,!0,"f"),e&&this.publish()}onHide(){const e=!0===F(this,Q,"f");_(this,Q,!1,"f"),e&&this.publish()}}j=new WeakMap,Q=new WeakMap,G=new WeakMap,O=new WeakMap;class V extends D{constructor({id:e,initiator:n,type:o,subtype:t,title:r,subtitle:i,content:l,footer:s,background:a,manualDestroy:c,closeOnBackdropClick:u,resolve:d}){super({id:e,initiator:n,title:r,subtitle:i,background:a,manualDestroy:c,closeOnBackdropClick:u,resolve:d}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"subtype",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"content",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"footer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.type=o,this.subtype=t,this.content=l,this.footer=s}onClose(){this.resolve(null)}onConfirm(){this.resolve(null)}}class Z extends D{constructor({id:e,initiator:n,type:o,subtype:t,title:r,subtitle:i,content:l,footer:s,background:a,manualDestroy:c,closeOnBackdropClick:u,resolve:d}){super({id:e,initiator:n,title:r,subtitle:i,background:a,manualDestroy:c,closeOnBackdropClick:u,resolve:d}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"subtype",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"content",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"footer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.type=o,this.subtype=t,this.content=l,this.footer=s}onClose(){this.resolve(!1)}onConfirm(){this.resolve(!0)}}class U extends D{constructor({id:e,initiator:n,type:o,title:t,subtitle:r,content:i,defaultValue:l,Input:s,disabled:a,returnOnCancel:c,footer:u,background:d,manualDestroy:m,closeOnBackdropClick:b,resolve:p}){super({id:e,initiator:n,title:t,subtitle:r,background:d,manualDestroy:m,closeOnBackdropClick:b,resolve:p}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"content",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"defaultValue",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"Input",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"disabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"returnOnCancel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"footer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),w.set(this,void 0),this.type=o,this.content=i,this.Input=s,this.defaultValue=l,_(this,w,l,"f"),this.disabled=a,this.returnOnCancel=c,this.footer=u}onChange(e){_(this,w,e,"f")}onConfirm(){this.resolve(F(this,w,"f")??null)}onClose(){this.returnOnCancel?this.resolve(F(this,w,"f")??null):this.resolve(null)}}w=new WeakMap;const W=e=>{switch(e.type){case"alert":return new V(e);case"confirm":return new Z(e);case"prompt":return new U(e)}throw new Error(`Unknown modal: ${e.type}`,{modal:e})},R=/^\s*(\d+)\s*(ms|s|m|h)\s*$/,L=e=>{const[,n,o]=e.match(R)||[];if(!n||!o)return 0;const t=parseInt(n);return"ms"===o?t:"s"===o?1e3*t:"m"===o?60*t*1e3:"h"===o?60*t*60*1e3:0},z=n.createContext({modalIds:[],getModalNode:r.undefinedFunction,onChange:r.undefinedFunction,onConfirm:r.undefinedFunction,onClose:r.undefinedFunction,onDestroy:r.undefinedFunction,setUpdater:r.undefinedFunction,getModal:()=>({modal:void 0,onConfirm:r.undefinedFunction,onClose:r.undefinedFunction,onChange:r.undefinedFunction,onDestroy:r.undefinedFunction})}),X=n.memo((({pathname:o,children:r})=>{const i=n.useRef(new Map),[l,s]=n.useState([]),a=t.useReference(l),c=n.useRef(o),d=n.useRef(0),m=ee(),b=n.useMemo((()=>L(m.duration)),[m]);t.useOnMountLayout((()=>{const{manualDestroy:e,closeOnBackdropClick:n}=m;for(const o of u.prerender){const t=W({...o,id:d.current++,initiator:c.current,manualDestroy:void 0!==o.manualDestroy?o.manualDestroy:e,closeOnBackdropClick:void 0!==o.closeOnBackdropClick?o.closeOnBackdropClick:n});i.current.set(t.id,t),s((e=>[...e,t.id]))}u.setupOpen((o=>{const t=W({...o,id:d.current++,initiator:c.current,manualDestroy:void 0!==o.manualDestroy?o.manualDestroy:e,closeOnBackdropClick:void 0!==o.closeOnBackdropClick?o.closeOnBackdropClick:n});i.current.set(t.id,t),s((e=>[...e.filter((e=>{const n=!i.current.get(e)?.alive;return n&&i.current.delete(e),!n})),t.id]))})),u.clearPrerender()})),n.useLayoutEffect((()=>{for(const e of a.current){const n=i.current.get(e);n?.alive&&(n.initiator===o?n.onShow():n.onHide())}c.current=o}),[a,o]);const p=n.useCallback((e=>i.current.get(e)),[]),f=n.useCallback((e=>{const n=i.current.get(e);n&&(n.onDestroy(),C.current?.())}),[]),C=n.useRef(),h=n.useCallback((e=>{const n=i.current.get(e);n&&(n.onHide(),C.current?.(),n.manualDestroy||setTimeout((()=>{n.onDestroy()}),b))}),[b]),g=n.useCallback(((e,n)=>{const o=i.current.get(e);o&&"prompt"===o.type&&o.onChange(n)}),[]),y=n.useCallback((e=>{const n=i.current.get(e);n&&(n.onConfirm(),h(e))}),[h]),v=n.useCallback((e=>{const n=i.current.get(e);n&&(n.onClose(),h(e))}),[h]),k=n.useCallback((e=>({modal:p(e),onConfirm:()=>y(e),onClose:()=>v(e),onChange:n=>g(e,n),onDestroy:()=>f(e)})),[p,y,v,g,f]),x=n.useMemo((()=>({modalIds:l,getModalNode:p,onChange:g,onConfirm:y,onClose:v,onDestroy:f,getModal:k,setUpdater:e=>{C.current=e}})),[l,k,p,g,y,v,f]);return e.jsx(z.Provider,{value:x,children:r})})),N=()=>n.useContext(z),M=e=>{const{getModal:o}=N();return n.useMemo((()=>o(e)),[e,o])};l(".Anchor-module__root___7N-Qo{align-items:center;display:flex;inset:0;justify-content:center;pointer-events:none;position:fixed;transition:background-color ease-in-out;z-index:1000}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkFuY2hvci5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZCQUVFLGtCQUFtQixDQURuQixZQUFhLENBSWIsT0FBUSxDQUZSLHNCQUF1QixDQUd2QixtQkFBb0IsQ0FGcEIsY0FBZSxDQUlmLHVDQUF3QyxDQUR4QyxZQUVGIiwiZmlsZSI6IkFuY2hvci5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnJvb3Qge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBpbnNldDogMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHotaW5kZXg6IDEwMDA7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgZWFzZS1pbi1vdXQ7XG59XG4iXX0= */");const J=n.memo((()=>{const[o,r]=t.useTick(),{modalIds:i,setUpdater:l}=N();n.useEffect((()=>{l(r)}),[l,r]);const{options:s}=K(),a=B(o);return e.jsx("div",{className:"Anchor-module__root___7N-Qo",style:{transitionDuration:s.duration,backgroundColor:a?s.backdrop:"transparent"},children:i.map((n=>e.jsx(I,{modalId:n},n)))})}));var S="styles-module__fallback___g8MEI";l(".styles-module__fallback___g8MEI{margin:unset}.styles-module__frame___1mKAZ{align-items:center;background-color:#fff;border:1px solid #000;display:flex;flex-direction:column;gap:10px;justify-content:center;padding:20px 80px}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0eWxlcy5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlDQUNFLFlBQ0YsQ0FFQSw4QkFJRSxrQkFBbUIsQ0FDbkIscUJBQXVCLENBR3ZCLHFCQUF1QixDQVB2QixZQUFhLENBQ2IscUJBQXNCLENBS3RCLFFBQVMsQ0FKVCxzQkFBdUIsQ0FHdkIsaUJBR0YiLCJmaWxlIjoic3R5bGVzLm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuZmFsbGJhY2sge1xuICBtYXJnaW46IHVuc2V0O1xufVxuXG4uZnJhbWUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gIHBhZGRpbmc6IDIwcHggODBweDtcbiAgZ2FwOiAxMHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcbn1cbiJdfQ== */");const Y=({children:n})=>e.jsx("h2",{className:S,children:n}),P=({children:n})=>e.jsx("h3",{className:S,children:n}),H=({children:n})=>e.jsx("div",{className:S,children:n}),E=({confirmLabel:n,hideConfirm:o=!1,cancelLabel:t,hideCancel:r=!1,disabled:i,onConfirm:l,onCancel:s})=>e.jsxs("div",{children:[!o&&e.jsx("button",{onClick:l,disabled:i,children:n||"확인"}),!r&&"function"==typeof s&&e.jsx("button",{onClick:s,children:t||"취소"})]}),A=n.forwardRef((({id:o,onChangeOrder:t,children:r},i)=>{const l=B(),[s,a]=n.useMemo((()=>{const e=l>1;return[e?Math.floor(o/5)%3*100:0,e?o%5*35:0]}),[l,o]);return e.jsx("div",{ref:i,className:"styles-module__frame___1mKAZ",onClick:t,style:{marginBottom:`calc(25vh + ${s}px)`,marginLeft:`${s}px`,transform:`translate(${a}px, ${a}px)`},children:r})})),T=()=>{const[e,o]=n.useState(window.location.pathname);return n.useLayoutEffect((()=>{let n;const t=()=>{n&&cancelAnimationFrame(n),e!==window.location.pathname?o(window.location.pathname):n=requestAnimationFrame(t)};return n=requestAnimationFrame(t),()=>{n&&cancelAnimationFrame(n)}}),[e]),{pathname:e}},q=n.createContext({ForegroundComponent:A,TitleComponent:Y,SubtitleComponent:P,ContentComponent:H,FooterComponent:E,options:{duration:d,backdrop:m,manualDestroy:!1,closeOnBackdropClick:!0}}),$=n.memo((({ForegroundComponent:r,BackgroundComponent:i,TitleComponent:l,SubtitleComponent:s,ContentComponent:a,FooterComponent:c,options:b,usePathname:p,children:f})=>{const{pathname:C}=(p||T)(),[,h]=t.useTick(),g=n.useRef(null);t.useOnMount((()=>(g.current=u.anchor("div"),h(),()=>{g.current&&g.current.remove()})));const y=n.useMemo((()=>({BackgroundComponent:i,ForegroundComponent:r||A,TitleComponent:l||Y,SubtitleComponent:s||P,ContentComponent:n.memo(a||H),FooterComponent:n.memo(c||E),options:{duration:d,backdrop:m,closeOnBackdropClick:!0,manualDestroy:!1,...b}})),[r,i,a,c,s,l,b]);return e.jsxs(q.Provider,{value:y,children:[f,g.current&&o.createPortal(e.jsx(X,{pathname:C,children:e.jsx(J,{})}),g.current)]})})),K=()=>n.useContext(q),ee=()=>{const{options:e}=n.useContext(q);return e};exports.ModalProvider=$,exports.alert=({subtype:e,title:n,subtitle:o,content:t,background:r,footer:i,manualDestroy:l,closeOnBackdropClick:s})=>new Promise(((a,c)=>{try{u.open({type:"alert",subtype:e,resolve:()=>a(),title:n,subtitle:o,content:t,background:r,footer:i,manualDestroy:l,closeOnBackdropClick:s})}catch(e){c(e)}})),exports.confirm=({subtype:e,title:n,subtitle:o,content:t,background:r,footer:i,manualDestroy:l,closeOnBackdropClick:s})=>new Promise(((a,c)=>{try{u.open({type:"confirm",subtype:e,resolve:e=>a(e??!1),title:n,subtitle:o,content:t,background:r,footer:i,manualDestroy:l,closeOnBackdropClick:s})}catch(e){c(e)}})),exports.prompt=({defaultValue:e,title:n,subtitle:o,content:t,Input:r,disabled:i,returnOnCancel:l,background:s,footer:a,manualDestroy:c,closeOnBackdropClick:d})=>new Promise(((m,b)=>{try{u.open({type:"prompt",resolve:e=>m(e),title:n,subtitle:o,content:t,Input:({defaultValue:e,onChange:n,onConfirm:o})=>r({defaultValue:e,onChange:n,onConfirm:o}),defaultValue:e,disabled:i,returnOnCancel:l,background:s,footer:a,manualDestroy:c,closeOnBackdropClick:d})}catch(e){b(e)}})),exports.useDestroyAfter=(e,o)=>{const{modal:t,onDestroy:i}=M(e),l=k(t),s=n.useRef({modal:t,onDestroy:i,milliseconds:r.isString(o)?L(o):o});n.useEffect((()=>{const{modal:e,onDestroy:n,milliseconds:o}=s.current;if(!e||e.visible||!e.alive)return;const t=setTimeout((()=>{n()}),o);return()=>{t&&clearTimeout(t)}}),[l])},exports.useModalBackdrop=()=>{const{backdrop:e}=ee();return e},exports.useModalDuration=()=>{const{duration:e}=ee();return{duration:e,milliseconds:L(e)}},exports.useModalOptions=ee,exports.useSubscribeModal=k;
17
+ function N(e,n,t,o){if("a"===t&&!o)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof n?e!==n||!o:!n.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===t?o:"a"===t?o.call(e):o?o.value:n.get(e)}function E(e,n,t,o,r){if("m"===o)throw new TypeError("Private method is not writable");if("a"===o&&!r)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof n?e!==n||!r:!n.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===o?r.call(e,t):r?r.value=t:n.set(e,t),t}var M,S,F,I,T;"function"==typeof SuppressedError&&SuppressedError;class V{get alive(){return N(this,M,"f")}get visible(){return N(this,S,"f")}constructor({id:e,initiator:n,title:t,subtitle:o,background:r,manualDestroy:i=!1,closeOnBackdropClick:s=!0,resolve:a}){Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"initiator",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"title",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"subtitle",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"background",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"manualDestroy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"closeOnBackdropClick",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),M.set(this,void 0),S.set(this,void 0),F.set(this,void 0),I.set(this,[]),this.id=e,this.initiator=n,this.title=t,this.subtitle=o,this.background=r,this.manualDestroy=i,this.closeOnBackdropClick=s,E(this,M,!0,"f"),E(this,S,!0,"f"),E(this,F,a,"f")}subscribe(e){return N(this,I,"f").push(e),()=>{E(this,I,N(this,I,"f").filter((n=>n!==e)),"f")}}publish(){for(const e of N(this,I,"f"))e()}resolve(e){N(this,F,"f").call(this,e)}onDestroy(){const e=!0===N(this,M,"f");E(this,M,!1,"f"),this.manualDestroy&&e&&this.publish()}onShow(){const e=!1===N(this,S,"f");E(this,S,!0,"f"),e&&this.publish()}onHide(){const e=!0===N(this,S,"f");E(this,S,!1,"f"),e&&this.publish()}}M=new WeakMap,S=new WeakMap,F=new WeakMap,I=new WeakMap;class L extends V{constructor({id:e,initiator:n,type:t,subtype:o,title:r,subtitle:i,content:s,footer:a,background:l,manualDestroy:c,closeOnBackdropClick:u,resolve:d}){super({id:e,initiator:n,title:r,subtitle:i,background:l,manualDestroy:c,closeOnBackdropClick:u,resolve:d}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"subtype",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"content",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"footer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.type=t,this.subtype=o,this.content=s,this.footer=a}onClose(){this.resolve(null)}onConfirm(){this.resolve(null)}}class R extends V{constructor({id:e,initiator:n,type:t,subtype:o,title:r,subtitle:i,content:s,footer:a,background:l,manualDestroy:c,closeOnBackdropClick:u,resolve:d}){super({id:e,initiator:n,title:r,subtitle:i,background:l,manualDestroy:c,closeOnBackdropClick:u,resolve:d}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"subtype",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"content",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"footer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.type=t,this.subtype=o,this.content=s,this.footer=a}onClose(){this.resolve(!1)}onConfirm(){this.resolve(!0)}}class q extends V{constructor({id:e,initiator:n,type:t,title:o,subtitle:r,content:i,defaultValue:s,Input:a,disabled:l,returnOnCancel:c,footer:u,background:d,manualDestroy:m,closeOnBackdropClick:p,resolve:f}){super({id:e,initiator:n,title:o,subtitle:r,background:d,manualDestroy:m,closeOnBackdropClick:p,resolve:f}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"content",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"defaultValue",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"Input",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"disabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"returnOnCancel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"footer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),T.set(this,void 0),this.type=t,this.content=i,this.Input=a,this.defaultValue=s,E(this,T,s,"f"),this.disabled=l,this.returnOnCancel=c,this.footer=u}onChange(e){E(this,T,e,"f")}onConfirm(){this.resolve(N(this,T,"f")??null)}onClose(){this.returnOnCancel?this.resolve(N(this,T,"f")??null):this.resolve(null)}}T=new WeakMap;const H=e=>{switch(e.type){case"alert":return new L(e);case"confirm":return new R(e);case"prompt":return new q(e)}throw new Error(`Unknown modal: ${e.type}`,{modal:e})},_=/^\s*(\d+)\s*(ms|s|m|h)\s*$/,$=e=>{const[,n,t]=e.match(_)||[];if(!n||!t)return 0;const o=parseInt(n);return"ms"===t?o:"s"===t?1e3*o:"m"===t?60*o*1e3:"h"===t?60*o*60*1e3:0},z=n.createContext({modalIds:[],getModalNode:r.undefinedFunction,onChange:r.undefinedFunction,onConfirm:r.undefinedFunction,onClose:r.undefinedFunction,onDestroy:r.undefinedFunction,setUpdater:r.undefinedFunction,getModal:()=>({modal:void 0,onConfirm:r.undefinedFunction,onClose:r.undefinedFunction,onChange:r.undefinedFunction,onDestroy:r.undefinedFunction})}),A=n.memo((({pathname:t,children:r})=>{const i=n.useRef(new Map),[s,a]=n.useState([]),l=o.useReference(s),u=n.useRef(t),d=n.useRef(0),m=ae(),p=n.useMemo((()=>$(m.duration)),[m]);o.useOnMountLayout((()=>{const{manualDestroy:e,closeOnBackdropClick:n}=m;for(const t of c.prerender){const o=H({...t,id:d.current++,initiator:u.current,manualDestroy:void 0!==t.manualDestroy?t.manualDestroy:e,closeOnBackdropClick:void 0!==t.closeOnBackdropClick?t.closeOnBackdropClick:n});i.current.set(o.id,o),a((e=>[...e,o.id]))}c.setupOpen((t=>{const o=H({...t,id:d.current++,initiator:u.current,manualDestroy:void 0!==t.manualDestroy?t.manualDestroy:e,closeOnBackdropClick:void 0!==t.closeOnBackdropClick?t.closeOnBackdropClick:n});i.current.set(o.id,o),a((e=>[...e.filter((e=>{const n=!i.current.get(e)?.alive;return n&&i.current.delete(e),!n})),o.id]))})),c.clearPrerender()})),n.useLayoutEffect((()=>{for(const e of l.current){const n=i.current.get(e);n?.alive&&(n.initiator===t?n.onShow():n.onHide())}u.current=t}),[l,t]);const f=n.useCallback((e=>i.current.get(e)),[]),b=n.useCallback((e=>{const n=i.current.get(e);n&&(n.onDestroy(),h.current?.())}),[]),h=n.useRef(),C=n.useCallback((e=>{const n=i.current.get(e);n&&(n.onHide(),h.current?.(),n.manualDestroy||setTimeout((()=>{n.onDestroy()}),p))}),[p]),y=n.useCallback(((e,n)=>{const t=i.current.get(e);t&&"prompt"===t.type&&t.onChange(n)}),[]),v=n.useCallback((e=>{const n=i.current.get(e);n&&(n.onConfirm(),C(e))}),[C]),g=n.useCallback((e=>{const n=i.current.get(e);n&&(n.onClose(),C(e))}),[C]),k=n.useCallback((e=>({modal:f(e),onConfirm:()=>v(e),onClose:()=>g(e),onChange:n=>y(e,n),onDestroy:()=>b(e)})),[f,v,g,y,b]),x=n.useMemo((()=>({modalIds:s,getModalNode:f,onChange:y,onConfirm:v,onClose:g,onDestroy:b,getModal:k,setUpdater:e=>{h.current=e}})),[s,k,f,y,v,g,b]);return e.jsx(z.Provider,{value:x,children:r})})),W=()=>n.useContext(z),Y=e=>{const{getModal:t}=W();return n.useMemo((()=>t(e)),[e,t])},U=i.css("production"===process.env.NODE_ENV?{name:"2hpasy",styles:"display:flex;align-items:center;justify-content:center;position:fixed;inset:0;pointer-events:none;z-index:1000;transition:background-color ease-in-out"}:{name:"khha1y-root",styles:"display:flex;align-items:center;justify-content:center;position:fixed;inset:0;pointer-events:none;z-index:1000;transition:background-color ease-in-out;label:root;",toString:function(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}}),G=n.memo(o.withErrorBoundary((()=>{const[t,r]=o.useTick(),{modalIds:i,setUpdater:s}=W();n.useEffect((()=>{s(r)}),[s,r]);const{options:a}=se(),l=P(t);return e.jsx("div",{className:U,style:{transitionDuration:a.duration,backgroundColor:l?a.backdrop:"transparent"},children:i.map((n=>e.jsx(B,{modalId:n},n)))})})));function J(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}const K=i.css("production"===process.env.NODE_ENV?{name:"131j9g2",styles:"margin:unset"}:{name:"1w3kbco-fallback",styles:"margin:unset;label:fallback;",toString:J}),Q=i.css("production"===process.env.NODE_ENV?{name:"1kuk3a3",styles:"display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:white;padding:20px 80px;gap:10px;border:1px solid black"}:{name:"16dbbea-frame",styles:"display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:white;padding:20px 80px;gap:10px;border:1px solid black;label:frame;",toString:J}),X=({children:n})=>e.jsx("h2",{className:K,children:n}),Z=({children:n})=>e.jsx("h3",{className:K,children:n}),ee=({children:n})=>e.jsx("div",{className:K,children:n}),ne=({confirmLabel:n,hideConfirm:t=!1,cancelLabel:o,hideCancel:r=!1,disabled:i,onConfirm:s,onCancel:a})=>e.jsxs("div",{children:[!t&&e.jsx("button",{onClick:s,disabled:i,children:n||"확인"}),!r&&"function"==typeof a&&e.jsx("button",{onClick:a,children:o||"취소"})]}),te=n.forwardRef((({id:t,onChangeOrder:o,children:r},i)=>{const s=P(),[a,l]=n.useMemo((()=>{const e=s>1;return[e?Math.floor(t/5)%3*100:0,e?t%5*35:0]}),[s,t]);return e.jsx("div",{ref:i,className:Q,onClick:o,style:{marginBottom:`calc(25vh + ${a}px)`,marginLeft:`${a}px`,transform:`translate(${l}px, ${l}px)`},children:r})})),oe=()=>{const[e,t]=n.useState(window.location.pathname);return n.useLayoutEffect((()=>{let n;const o=()=>{n&&cancelAnimationFrame(n),e!==window.location.pathname?t(window.location.pathname):n=requestAnimationFrame(o)};return n=requestAnimationFrame(o),()=>{n&&cancelAnimationFrame(n)}}),[e]),{pathname:e}},re=n.createContext({ForegroundComponent:te,TitleComponent:X,SubtitleComponent:Z,ContentComponent:ee,FooterComponent:ne,options:{duration:u,backdrop:d,manualDestroy:!1,closeOnBackdropClick:!0}}),ie=n.memo((({ForegroundComponent:r,BackgroundComponent:i,TitleComponent:s,SubtitleComponent:a,ContentComponent:l,FooterComponent:m,options:p,usePathname:f,children:b})=>{const{pathname:h}=(f||oe)(),[,C]=o.useTick(),y=n.useRef(null);o.useOnMount((()=>(y.current=c.anchor("div"),C(),()=>{y.current&&y.current.remove()})));const v=n.useMemo((()=>({BackgroundComponent:i,ForegroundComponent:r||te,TitleComponent:s||X,SubtitleComponent:a||Z,ContentComponent:n.memo(l||ee),FooterComponent:n.memo(m||ne),options:{duration:u,backdrop:d,closeOnBackdropClick:!0,manualDestroy:!1,...p}})),[r,i,l,m,a,s,p]);return e.jsxs(re.Provider,{value:v,children:[b,y.current&&t.createPortal(e.jsx(A,{pathname:h,children:e.jsx(G,{})}),y.current)]})})),se=()=>n.useContext(re),ae=()=>{const{options:e}=n.useContext(re);return e};exports.ModalProvider=ie,exports.alert=({subtype:e,title:n,subtitle:t,content:o,background:r,footer:i,manualDestroy:s,closeOnBackdropClick:a})=>new Promise(((l,u)=>{try{c.open({type:"alert",subtype:e,resolve:()=>l(),title:n,subtitle:t,content:o,background:r,footer:i,manualDestroy:s,closeOnBackdropClick:a})}catch(e){u(e)}})),exports.confirm=({subtype:e,title:n,subtitle:t,content:o,background:r,footer:i,manualDestroy:s,closeOnBackdropClick:a})=>new Promise(((l,u)=>{try{c.open({type:"confirm",subtype:e,resolve:e=>l(e??!1),title:n,subtitle:t,content:o,background:r,footer:i,manualDestroy:s,closeOnBackdropClick:a})}catch(e){u(e)}})),exports.prompt=({defaultValue:e,title:n,subtitle:t,content:o,Input:r,disabled:i,returnOnCancel:s,background:a,footer:l,manualDestroy:u,closeOnBackdropClick:d})=>new Promise(((m,p)=>{try{c.open({type:"prompt",resolve:e=>m(e),title:n,subtitle:t,content:o,Input:({defaultValue:e,onChange:n,onConfirm:t})=>r({defaultValue:e,onChange:n,onConfirm:t}),defaultValue:e,disabled:i,returnOnCancel:s,background:a,footer:l,manualDestroy:u,closeOnBackdropClick:d})}catch(e){p(e)}})),exports.useDestroyAfter=(e,t)=>{const{modal:o,onDestroy:i}=Y(e),s=O(o),a=n.useRef({modal:o,onDestroy:i,milliseconds:r.isString(t)?$(t):t});n.useEffect((()=>{const{modal:e,onDestroy:n,milliseconds:t}=a.current;if(!e||e.visible||!e.alive)return;const o=setTimeout((()=>{n()}),t);return()=>{o&&clearTimeout(o)}}),[s])},exports.useModalBackdrop=()=>{const{backdrop:e}=ae();return e},exports.useModalDuration=()=>{const{duration:e}=ae();return{duration:e,milliseconds:$(e)}},exports.useModalOptions=ae,exports.useSubscribeModal=O;
18
18
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/app/ModalManager.ts","../src/app/constant.ts","../src/components/Background/Background.tsx","../src/components/Foreground/components/AlertInner.tsx","../src/components/Foreground/components/ConfirmInner.tsx","../src/components/Foreground/components/PromptInner.tsx","../src/components/Foreground/Foreground.tsx","../src/hooks/useSubscribeModal.ts","../src/components/Presenter/Presenter.tsx","../src/hooks/useActiveModalCount.ts","../src/core/node/ModalNode/AbstractBaseNode.ts","../src/core/node/ModalNode/AlertNode.ts","../src/core/node/ModalNode/ConfirmNode.ts","../src/core/node/ModalNode/PromptNode.ts","../src/core/node/nodeFactory.ts","../src/helpers/getMillisecondsFromDuration.ts","../src/providers/ModalDataContext/ModalDataContext.ts","../src/providers/ModalDataContext/ModalDataContextProvider.tsx","../src/providers/ModalDataContext/useModalDataContext.ts","../src/components/Anchor/Anchor.tsx","../src/components/FallbackComponents/FallbackTitle.tsx","../src/components/FallbackComponents/FallbackSubtitle.tsx","../src/components/FallbackComponents/FallbackContent.tsx","../src/components/FallbackComponents/FallbackFooter.tsx","../src/components/FallbackComponents/FallbackForegroundFrame.tsx","../src/hooks/useDefaultPathname.ts","../src/providers/ModalContext/ModalContext.ts","../src/providers/ModalContext/ModalContextProvider.tsx","../src/providers/ModalContext/useModalContext.ts","../src/core/handle/alert.ts","../src/core/handle/confirm.ts","../src/core/handle/prompt.ts","../src/hooks/useDestroyAfter.ts"],"sourcesContent":["import { MutableRefObject } from 'react';\n\nimport { getRandomNumber } from '@winglet/common-utils';\n\nimport type { Fn } from '@aileron/types';\n\nimport type { Modal } from '@/promise-modal/types';\n\nconst prerenderListRef: MutableRefObject<Modal[]> = {\n current: [],\n};\n\nconst openModalRef: MutableRefObject<Fn<[Modal], void>> = {\n current: (modal: Modal) => {\n prerenderListRef.current.push(modal);\n },\n};\n\nconst anchorRef: MutableRefObject<HTMLElement | null> = {\n current: null,\n};\n\nexport const ModalManager = {\n get prerender() {\n return prerenderListRef.current;\n },\n clearPrerender() {\n prerenderListRef.current = [];\n },\n open(modal: Modal) {\n openModalRef.current(modal);\n },\n setupOpen(open: (modal: Modal) => void) {\n openModalRef.current = open;\n },\n anchor(name: string, label = 'modal-anchor'): HTMLElement {\n if (anchorRef.current) {\n const anchor = document.getElementById(anchorRef.current.id);\n if (anchor) return anchor;\n }\n const node = document.createElement(name);\n node.setAttribute('id', `${label}-${getRandomNumber()}`);\n document.body.appendChild(node);\n anchorRef.current = node;\n return node;\n },\n};\n","import type { Color, Duration } from '@aileron/types';\n\nexport const DEFAULT_ANIMATION_DURATION: Duration = '300ms';\n\nexport const DEFAULT_BACKDROP_COLOR: Color = 'rgba(0, 0, 0, 0.5)';\n","import { type MouseEvent, useCallback } from 'react';\n\nimport cx from 'clsx';\n\nimport { useModal, useModalContext } from '@/promise-modal/providers';\nimport type { ModalLayerProps } from '@/promise-modal/types';\n\nimport styles from './Background.module.css';\n\nexport const Background = ({ modalId, onChangeOrder }: ModalLayerProps) => {\n const { BackgroundComponent } = useModalContext();\n const { modal, onClose, onChange, onConfirm, onDestroy } = useModal(modalId);\n\n const handleClose = useCallback(\n (event: MouseEvent) => {\n if (modal && modal.closeOnBackdropClick && modal.visible) onClose();\n event.stopPropagation();\n },\n [modal, onClose],\n );\n\n if (!modal) return null;\n\n const visible = modal.manualDestroy ? modal.alive : modal.visible;\n\n return (\n <div\n className={cx(styles.root, {\n [styles.visible]: visible,\n [styles.active]: modal.closeOnBackdropClick && visible,\n })}\n onClick={handleClose}\n >\n {BackgroundComponent && (\n <BackgroundComponent\n id={modal.id}\n type={modal.type}\n alive={modal.alive}\n visible={modal.visible}\n initiator={modal.initiator}\n manualDestroy={modal.manualDestroy}\n closeOnBackdropClick={modal.closeOnBackdropClick}\n background={modal.background}\n onChange={onChange}\n onConfirm={onConfirm}\n onClose={onClose}\n onDestroy={onDestroy}\n onChangeOrder={onChangeOrder}\n />\n )}\n </div>\n );\n};\n","import { Fragment, memo, useMemo } from 'react';\n\nimport { isString } from '@winglet/common-utils';\nimport { renderComponent, useHandle } from '@winglet/react-utils';\n\nimport type { AlertNode } from '@/promise-modal/core';\nimport { useModalContext } from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface AlertInnerProps<B> {\n modal: AlertNode<B>;\n handlers: Pick<ModalActions, 'onConfirm'>;\n}\n\nexport const AlertInner = memo(\n <B,>({ modal, handlers }: AlertInnerProps<B>) => {\n const { title, subtitle, content, footer } = useMemo(() => modal, [modal]);\n const { onConfirm } = useMemo(() => handlers, [handlers]);\n\n const handleConfirm = useHandle(onConfirm);\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useModalContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? <TitleComponent>{title}</TitleComponent> : title)}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent>{subtitle}</SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent>{content}</ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n })\n ))}\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({ onConfirm: handleConfirm })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n confirmLabel={footer?.confirm}\n hideConfirm={footer?.hideConfirm}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { Fragment, memo, useMemo } from 'react';\n\nimport { isString } from '@winglet/common-utils';\nimport { renderComponent, useHandle } from '@winglet/react-utils';\n\nimport type { ConfirmNode } from '@/promise-modal/core';\nimport { useModalContext } from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface ConfirmInnerProps<B> {\n modal: ConfirmNode<B>;\n handlers: Pick<ModalActions, 'onConfirm' | 'onClose'>;\n}\n\nexport const ConfirmInner = memo(\n <B,>({ modal, handlers }: ConfirmInnerProps<B>) => {\n const { title, subtitle, content, footer } = useMemo(() => modal, [modal]);\n const { onConfirm, onClose } = useMemo(() => handlers, [handlers]);\n\n const handleConfirm = useHandle(onConfirm);\n const handleClose = useHandle(onClose);\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useModalContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? <TitleComponent>{title}</TitleComponent> : title)}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent>{subtitle}</SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent>{content}</ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n onCancel: handleClose,\n })\n ))}\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n onConfirm: handleConfirm,\n onCancel: handleClose,\n })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n onCancel={handleClose}\n confirmLabel={footer?.confirm}\n cancelLabel={footer?.cancel}\n hideConfirm={footer?.hideConfirm}\n hideCancel={footer?.hideCancel}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { Fragment, memo, useCallback, useMemo, useState } from 'react';\n\nimport { isFunction, isString } from '@winglet/common-utils';\nimport { renderComponent, useHandle } from '@winglet/react-utils';\n\nimport type { PromptNode } from '@/promise-modal/core';\nimport { useModalContext } from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface PromptInnerProps<T, B> {\n modal: PromptNode<T, B>;\n handlers: Pick<ModalActions, 'onChange' | 'onClose' | 'onConfirm'>;\n}\n\nexport const PromptInner = memo(\n <T, B>({ modal, handlers }: PromptInnerProps<T, B>) => {\n const {\n Input,\n defaultValue,\n disabled: checkDisabled,\n title,\n subtitle,\n content,\n footer,\n } = useMemo(\n () => ({\n ...modal,\n Input: memo(modal.Input),\n }),\n [modal],\n );\n\n const [value, setValue] = useState<T | undefined>(defaultValue);\n\n const { onChange, onClose, onConfirm } = useMemo(\n () => handlers,\n [handlers],\n );\n\n const handleClose = useHandle(onClose);\n const handleChange = useHandle(\n (inputValue?: T | ((prevState: T | undefined) => T | undefined)) => {\n const input = isFunction(inputValue) ? inputValue(value) : inputValue;\n setValue(input);\n onChange(input);\n },\n );\n\n const handleConfirm = useCallback(() => {\n // NOTE: wait for the next tick to ensure the value is updated\n setTimeout(() => {\n onConfirm();\n });\n }, [onConfirm]);\n\n const disabled = useMemo(\n () => (value ? !!checkDisabled?.(value) : false),\n [checkDisabled, value],\n );\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useModalContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? <TitleComponent>{title}</TitleComponent> : title)}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent>{subtitle}</SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent>{content}</ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n onCancel: handleClose,\n })\n ))}\n\n {Input && (\n <Input\n defaultValue={defaultValue}\n value={value}\n onChange={handleChange}\n onConfirm={handleConfirm}\n />\n )}\n\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n onConfirm: handleConfirm,\n onCancel: handleClose,\n onChange: handleChange,\n value,\n disabled,\n })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n onCancel={handleClose}\n disabled={disabled}\n confirmLabel={footer?.confirm}\n cancelLabel={footer?.cancel}\n hideConfirm={footer?.hideConfirm}\n hideCancel={footer?.hideCancel}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import cx from 'clsx';\n\nimport { useModal, useModalContext } from '@/promise-modal/providers';\nimport type { ModalLayerProps } from '@/promise-modal/types';\n\nimport styles from './Foreground.module.css';\nimport { AlertInner, ConfirmInner, PromptInner } from './components';\n\nexport const Foreground = ({ modalId, onChangeOrder }: ModalLayerProps) => {\n const { ForegroundComponent } = useModalContext();\n\n const { modal, onChange, onConfirm, onClose, onDestroy } = useModal(modalId);\n\n if (!modal) return null;\n\n return (\n <div\n className={cx(styles.root, {\n [styles.active]: modal.manualDestroy ? modal.alive : modal.visible,\n })}\n >\n <ForegroundComponent\n id={modal.id}\n type={modal.type}\n alive={modal.alive}\n visible={modal.visible}\n initiator={modal.initiator}\n manualDestroy={modal.manualDestroy}\n closeOnBackdropClick={modal.closeOnBackdropClick}\n background={modal.background}\n onChange={onChange}\n onConfirm={onConfirm}\n onClose={onClose}\n onDestroy={onDestroy}\n onChangeOrder={onChangeOrder}\n >\n {modal.type === 'alert' && (\n <AlertInner modal={modal} handlers={{ onConfirm }} />\n )}\n {modal.type === 'confirm' && (\n <ConfirmInner modal={modal} handlers={{ onConfirm, onClose }} />\n )}\n {modal.type === 'prompt' && (\n <PromptInner\n modal={modal}\n handlers={{ onChange, onConfirm, onClose }}\n />\n )}\n </ForegroundComponent>\n </div>\n );\n};\n","import { useOnMount, useTick } from '@winglet/react-utils';\n\nimport type { ModalNode } from '@/promise-modal/core';\n\nexport const useSubscribeModal = (modal?: ModalNode) => {\n const [tick, update] = useTick();\n useOnMount(() => {\n if (!modal) return;\n const unsubscribe = modal.subscribe(update);\n return unsubscribe;\n });\n return tick;\n};\n","import { memo, useRef } from 'react';\n\nimport { useHandle } from '@winglet/react-utils';\n\nimport { Background } from '@/promise-modal/components/Background';\nimport { Foreground } from '@/promise-modal/components/Foreground';\nimport { useSubscribeModal } from '@/promise-modal/hooks/useSubscribeModal';\nimport { useModal } from '@/promise-modal/providers';\nimport type { ModalIdProps } from '@/promise-modal/types';\n\nimport styles from './Presenter.module.css';\n\nlet zIndex = 1;\n\nexport const Presenter = memo(({ modalId }: ModalIdProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { modal } = useModal(modalId);\n useSubscribeModal(modal);\n const handleChangeOrder = useHandle(() => {\n if (ref.current) {\n ref.current.style.zIndex = `${zIndex++}`;\n }\n });\n return (\n <div ref={ref} className={styles.modal}>\n <Background modalId={modalId} onChangeOrder={handleChangeOrder} />\n <Foreground modalId={modalId} onChangeOrder={handleChangeOrder} />\n </div>\n );\n});\n","import { useMemo } from 'react';\n\nimport { useModalDataContext } from '../providers';\n\nexport const useActiveModalCount = (tick: string | number = 0) => {\n const { modalIds, getModalNode } = useModalDataContext();\n return useMemo(() => {\n let count = 0;\n for (const id of modalIds) {\n if (getModalNode(id)?.visible) count++;\n }\n return count;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getModalNode, modalIds, tick]);\n};\n","import type { ReactNode } from 'react';\n\nimport type { Fn } from '@aileron/types';\n\nimport type {\n BaseModal,\n ManagedEntity,\n ModalBackground,\n} from '@/promise-modal/types';\n\ntype BaseNodeProps<T, B> = BaseModal<T, B> & ManagedEntity;\n\nexport abstract class BaseNode<T, B> {\n readonly id: number;\n readonly initiator: string;\n\n readonly title?: ReactNode;\n readonly subtitle?: ReactNode;\n readonly background?: ModalBackground<B>;\n\n readonly manualDestroy: boolean;\n readonly closeOnBackdropClick: boolean;\n\n #alive: boolean;\n get alive() {\n return this.#alive;\n }\n #visible: boolean;\n get visible() {\n return this.#visible;\n }\n\n #resolve: (result: T | null) => void;\n #listeners: Fn[] = [];\n\n constructor({\n id,\n initiator,\n title,\n subtitle,\n background,\n manualDestroy = false,\n closeOnBackdropClick = true,\n resolve,\n }: BaseNodeProps<T, B>) {\n this.id = id;\n this.initiator = initiator;\n this.title = title;\n this.subtitle = subtitle;\n this.background = background;\n this.manualDestroy = manualDestroy;\n this.closeOnBackdropClick = closeOnBackdropClick;\n\n this.#alive = true;\n this.#visible = true;\n this.#resolve = resolve;\n }\n\n subscribe(listener: Fn) {\n this.#listeners.push(listener);\n return () => {\n this.#listeners = this.#listeners.filter((l) => l !== listener);\n };\n }\n publish() {\n for (const listener of this.#listeners) listener();\n }\n protected resolve(result: T | null) {\n this.#resolve(result);\n }\n onDestroy() {\n const needPublish = this.#alive === true;\n this.#alive = false;\n if (this.manualDestroy && needPublish) this.publish();\n }\n onShow() {\n const needPublish = this.#visible === false;\n this.#visible = true;\n if (needPublish) this.publish();\n }\n onHide() {\n const needPublish = this.#visible === true;\n this.#visible = false;\n if (needPublish) this.publish();\n }\n abstract onClose(): void;\n abstract onConfirm(): void;\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n AlertContentProps,\n AlertFooterRender,\n AlertModal,\n FooterOptions,\n ManagedEntity,\n} from '@/promise-modal/types';\n\nimport { BaseNode } from './AbstractBaseNode';\n\ntype AlertNodeProps<B> = AlertModal<B> & ManagedEntity;\n\nexport class AlertNode<B> extends BaseNode<null, B> {\n readonly type: 'alert';\n readonly subtype?: 'info' | 'success' | 'warning' | 'error';\n readonly content?: ReactNode | ComponentType<AlertContentProps>;\n readonly footer?:\n | AlertFooterRender\n | Pick<FooterOptions, 'confirm' | 'hideConfirm'>\n | false;\n\n constructor({\n id,\n initiator,\n type,\n subtype,\n title,\n subtitle,\n content,\n footer,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n }: AlertNodeProps<B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n });\n this.type = type;\n this.subtype = subtype;\n this.content = content;\n this.footer = footer;\n }\n onClose() {\n this.resolve(null);\n }\n onConfirm() {\n this.resolve(null);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n ConfirmContentProps,\n ConfirmFooterRender,\n ConfirmModal,\n FooterOptions,\n ManagedEntity,\n} from '@/promise-modal/types';\n\nimport { BaseNode } from './AbstractBaseNode';\n\ntype ConfirmNodeProps<B> = ConfirmModal<B> & ManagedEntity;\n\nexport class ConfirmNode<B> extends BaseNode<boolean, B> {\n readonly type: 'confirm';\n readonly subtype?: 'info' | 'success' | 'warning' | 'error';\n readonly content?: ReactNode | ComponentType<ConfirmContentProps>;\n readonly footer?: ConfirmFooterRender | FooterOptions | false;\n\n constructor({\n id,\n initiator,\n type,\n subtype,\n title,\n subtitle,\n content,\n footer,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n }: ConfirmNodeProps<B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n });\n this.type = type;\n this.subtype = subtype;\n this.content = content;\n this.footer = footer;\n }\n onClose() {\n this.resolve(false);\n }\n onConfirm() {\n this.resolve(true);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n FooterOptions,\n ManagedEntity,\n PromptContentProps,\n PromptFooterRender,\n PromptInputProps,\n PromptModal,\n} from '@/promise-modal/types';\n\nimport { BaseNode } from './AbstractBaseNode';\n\ntype PromptNodeProps<T, B> = PromptModal<T, B> & ManagedEntity;\n\nexport class PromptNode<T, B> extends BaseNode<T, B> {\n readonly type: 'prompt';\n readonly content?: ReactNode | ComponentType<PromptContentProps>;\n readonly defaultValue: T | undefined;\n readonly Input: (props: PromptInputProps<T>) => ReactNode;\n readonly disabled?: (value: T) => boolean;\n readonly returnOnCancel?: boolean;\n readonly footer?: PromptFooterRender<T> | FooterOptions | false;\n #value: T | undefined;\n\n constructor({\n id,\n initiator,\n type,\n title,\n subtitle,\n content,\n defaultValue,\n Input,\n disabled,\n returnOnCancel,\n footer,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n }: PromptNodeProps<T, B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n });\n this.type = type;\n this.content = content;\n this.Input = Input;\n this.defaultValue = defaultValue;\n this.#value = defaultValue;\n this.disabled = disabled;\n this.returnOnCancel = returnOnCancel;\n this.footer = footer;\n }\n\n onChange(value: T) {\n this.#value = value;\n }\n onConfirm() {\n this.resolve(this.#value ?? null);\n }\n onClose() {\n if (this.returnOnCancel) this.resolve(this.#value ?? null);\n else this.resolve(null);\n }\n}\n","import type { ManagedModal } from '@/promise-modal/types';\n\nimport { AlertNode, ConfirmNode, PromptNode } from './ModalNode';\n\nexport const nodeFactory = <T, B>(modal: ManagedModal<T, B>) => {\n switch (modal.type) {\n case 'alert':\n return new AlertNode<B>(modal);\n case 'confirm':\n return new ConfirmNode<B>(modal);\n case 'prompt':\n return new PromptNode<T, B>(modal);\n }\n // @ts-expect-error: This state is unreachable by design and should NEVER occur.\n throw new Error(`Unknown modal: ${modal.type}`, { modal });\n};\n","const DURATION_REGEX = /^\\s*(\\d+)\\s*(ms|s|m|h)\\s*$/;\n\nexport const getMillisecondsFromDuration = (input: string) => {\n const [, durationString, unit] = input.match(DURATION_REGEX) || [];\n if (!durationString || !unit) return 0;\n const duration = parseInt(durationString);\n if (unit === 'ms') return duration;\n if (unit === 's') return duration * 1000;\n if (unit === 'm') return duration * 60 * 1000;\n if (unit === 'h') return duration * 60 * 60 * 1000;\n else return 0;\n};\n","import { createContext } from 'react';\n\nimport { undefinedFunction } from '@winglet/common-utils';\n\nimport type { Fn } from '@aileron/types';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport type { ModalActions, ModalHandlersWithId } from '@/promise-modal/types';\n\nexport interface ModalDataContextProps extends ModalHandlersWithId {\n modalIds: ModalNode['id'][];\n getModal: Fn<[id: ModalNode['id']], ModalActions>;\n getModalNode: Fn<[id: ModalNode['id']], ModalNode | undefined>;\n setUpdater: Fn<[updater: Fn]>;\n}\n\nexport const ModalDataContext = createContext<ModalDataContextProps>({\n modalIds: [],\n getModalNode: undefinedFunction,\n onChange: undefinedFunction,\n onConfirm: undefinedFunction,\n onClose: undefinedFunction,\n onDestroy: undefinedFunction,\n setUpdater: undefinedFunction,\n getModal: () => ({\n modal: undefined,\n onConfirm: undefinedFunction,\n onClose: undefinedFunction,\n onChange: undefinedFunction,\n onDestroy: undefinedFunction,\n }),\n});\n","import {\n type PropsWithChildren,\n memo,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { useOnMountLayout, useReference } from '@winglet/react-utils';\n\nimport type { Fn } from '@aileron/types';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport { type ModalNode, nodeFactory } from '@/promise-modal/core';\nimport { getMillisecondsFromDuration } from '@/promise-modal/helpers/getMillisecondsFromDuration';\nimport { useModalOptions } from '@/promise-modal/providers';\nimport type { Modal } from '@/promise-modal/types';\n\nimport { ModalDataContext } from './ModalDataContext';\n\ninterface ModalDataContextProviderProps {\n pathname: string;\n}\n\nexport const ModalDataContextProvider = memo(\n ({\n pathname,\n children,\n }: PropsWithChildren<ModalDataContextProviderProps>) => {\n const modalDictionary = useRef<Map<ModalNode['id'], ModalNode>>(new Map());\n\n const [modalIds, setModalIds] = useState<ModalNode['id'][]>([]);\n const modalIdsRef = useReference(modalIds);\n\n const initiator = useRef(pathname);\n const modalIdSequence = useRef(0);\n\n const options = useModalOptions();\n\n const duration = useMemo(\n () => getMillisecondsFromDuration(options.duration),\n [options],\n );\n\n useOnMountLayout(() => {\n const { manualDestroy, closeOnBackdropClick } = options;\n\n for (const data of ModalManager.prerender) {\n const modal = nodeFactory({\n ...data,\n id: modalIdSequence.current++,\n initiator: initiator.current,\n manualDestroy:\n data.manualDestroy !== undefined\n ? data.manualDestroy\n : manualDestroy,\n closeOnBackdropClick:\n data.closeOnBackdropClick !== undefined\n ? data.closeOnBackdropClick\n : closeOnBackdropClick,\n });\n modalDictionary.current.set(modal.id, modal);\n setModalIds((ids) => [...ids, modal.id]);\n }\n\n ModalManager.setupOpen((data: Modal) => {\n const modal = nodeFactory({\n ...data,\n id: modalIdSequence.current++,\n initiator: initiator.current,\n manualDestroy:\n data.manualDestroy !== undefined\n ? data.manualDestroy\n : manualDestroy,\n closeOnBackdropClick:\n data.closeOnBackdropClick !== undefined\n ? data.closeOnBackdropClick\n : closeOnBackdropClick,\n });\n modalDictionary.current.set(modal.id, modal);\n setModalIds((ids) => {\n const aliveIds = ids.filter((id) => {\n const destroyed = !modalDictionary.current.get(id)?.alive;\n if (destroyed) modalDictionary.current.delete(id);\n return !destroyed;\n });\n return [...aliveIds, modal.id];\n });\n });\n ModalManager.clearPrerender();\n });\n\n useLayoutEffect(() => {\n for (const id of modalIdsRef.current) {\n const modal = modalDictionary.current.get(id);\n if (!modal?.alive) continue;\n if (modal.initiator === pathname) modal.onShow();\n else modal.onHide();\n }\n initiator.current = pathname;\n }, [modalIdsRef, pathname]);\n\n const getModalNode = useCallback((modalId: ModalNode['id']) => {\n return modalDictionary.current.get(modalId);\n }, []);\n\n const onDestroy = useCallback((modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onDestroy();\n updaterRef.current?.();\n }, []);\n\n const updaterRef = useRef<Fn>();\n const hideModal = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onHide();\n updaterRef.current?.();\n if (!modal.manualDestroy)\n setTimeout(() => {\n modal.onDestroy();\n }, duration);\n },\n [duration],\n );\n\n const onChange = useCallback((modalId: ModalNode['id'], value: any) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n if (modal.type === 'prompt') modal.onChange(value);\n }, []);\n\n const onConfirm = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onConfirm();\n hideModal(modalId);\n },\n [hideModal],\n );\n\n const onClose = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onClose();\n hideModal(modalId);\n },\n [hideModal],\n );\n\n const getModal = useCallback(\n (modalId: ModalNode['id']) => ({\n modal: getModalNode(modalId),\n onConfirm: () => onConfirm(modalId),\n onClose: () => onClose(modalId),\n onChange: (value: any) => onChange(modalId, value),\n onDestroy: () => onDestroy(modalId),\n }),\n [getModalNode, onConfirm, onClose, onChange, onDestroy],\n );\n\n const value = useMemo(() => {\n return {\n modalIds,\n getModalNode,\n onChange,\n onConfirm,\n onClose,\n onDestroy,\n getModal,\n setUpdater: (updater: Fn) => {\n updaterRef.current = updater;\n },\n };\n }, [\n modalIds,\n getModal,\n getModalNode,\n onChange,\n onConfirm,\n onClose,\n onDestroy,\n ]);\n\n return (\n <ModalDataContext.Provider value={value}>\n {children}\n </ModalDataContext.Provider>\n );\n },\n);\n","import { useContext, useMemo } from 'react';\n\nimport type { ManagedModal } from '@/promise-modal/types';\n\nimport { ModalDataContext } from './ModalDataContext';\n\nexport const useModalDataContext = () => useContext(ModalDataContext);\n\nexport const useModal = (id: ManagedModal['id']) => {\n const { getModal } = useModalDataContext();\n return useMemo(() => getModal(id), [id, getModal]);\n};\n","import { memo, useEffect } from 'react';\n\nimport { useTick } from '@winglet/react-utils';\n\nimport { Presenter } from '@/promise-modal/components/Presenter';\nimport { useActiveModalCount } from '@/promise-modal/hooks/useActiveModalCount';\nimport { useModalContext } from '@/promise-modal/providers';\nimport { useModalDataContext } from '@/promise-modal/providers/ModalDataContext';\n\nimport styles from './Anchor.module.css';\n\nexport const Anchor = memo(() => {\n const [key, update] = useTick();\n\n const { modalIds, setUpdater } = useModalDataContext();\n\n useEffect(() => {\n setUpdater(update);\n }, [setUpdater, update]);\n\n const { options } = useModalContext();\n\n const dimmed = useActiveModalCount(key);\n\n return (\n <div\n className={styles.root}\n style={{\n transitionDuration: options.duration,\n backgroundColor: dimmed ? options.backdrop : 'transparent',\n }}\n >\n {modalIds.map((id) => {\n return <Presenter key={id} modalId={id} />;\n })}\n </div>\n );\n});\n","import type { PropsWithChildren } from 'react';\n\nimport styles from './styles.module.css';\n\nexport const FallbackTitle = ({ children }: PropsWithChildren) => {\n return <h2 className={styles.fallback}>{children}</h2>;\n};\n","import type { PropsWithChildren } from 'react';\n\nimport styles from './styles.module.css';\n\nexport const FallbackSubtitle = ({ children }: PropsWithChildren) => {\n return <h3 className={styles.fallback}>{children}</h3>;\n};\n","import type { PropsWithChildren } from 'react';\n\nimport styles from './styles.module.css';\n\nexport const FallbackContent = ({ children }: PropsWithChildren) => {\n return <div className={styles.fallback}>{children}</div>;\n};\n","import type { FooterComponentProps } from '@/promise-modal/types';\n\nexport const FallbackFooter = ({\n confirmLabel,\n hideConfirm = false,\n cancelLabel,\n hideCancel = false,\n disabled,\n onConfirm,\n onCancel,\n}: FooterComponentProps) => {\n return (\n <div>\n {!hideConfirm && (\n <button onClick={onConfirm} disabled={disabled}>\n {confirmLabel || '확인'}\n </button>\n )}\n\n {!hideCancel && typeof onCancel === 'function' && (\n <button onClick={onCancel}>{cancelLabel || '취소'}</button>\n )}\n </div>\n );\n};\n","import {\n type ForwardedRef,\n type PropsWithChildren,\n forwardRef,\n useMemo,\n} from 'react';\n\nimport { useActiveModalCount } from '@/promise-modal/hooks/useActiveModalCount';\nimport type { ModalFrameProps } from '@/promise-modal/types';\n\nimport styles from './styles.module.css';\n\nconst MAX_MODAL_COUNT = 5;\nconst MAX_MODAL_LEVEL = 3;\n\nexport const FallbackForegroundFrame = forwardRef(\n (\n { id, onChangeOrder, children }: PropsWithChildren<ModalFrameProps>,\n ref: ForwardedRef<HTMLDivElement>,\n ) => {\n const activeCount = useActiveModalCount();\n const [level, offset] = useMemo(() => {\n const stacked = activeCount > 1;\n const level = stacked\n ? (Math.floor(id / MAX_MODAL_COUNT) % MAX_MODAL_LEVEL) * 100\n : 0;\n const offset = stacked ? (id % MAX_MODAL_COUNT) * 35 : 0;\n return [level, offset];\n }, [activeCount, id]);\n\n return (\n <div\n ref={ref}\n className={styles.frame}\n onClick={onChangeOrder}\n style={{\n marginBottom: `calc(25vh + ${level}px)`,\n marginLeft: `${level}px`,\n transform: `translate(${offset}px, ${offset}px)`,\n }}\n >\n {children}\n </div>\n );\n },\n);\n","import { useLayoutEffect, useState } from 'react';\n\nexport const usePathname = () => {\n const [pathname, setPathname] = useState(window.location.pathname);\n\n useLayoutEffect(() => {\n let requestId: number;\n\n const checkPathname = () => {\n if (requestId) cancelAnimationFrame(requestId);\n if (pathname !== window.location.pathname) {\n setPathname(window.location.pathname);\n } else {\n requestId = requestAnimationFrame(checkPathname);\n }\n };\n\n requestId = requestAnimationFrame(checkPathname);\n\n return () => {\n if (requestId) cancelAnimationFrame(requestId);\n };\n }, [pathname]);\n\n return { pathname };\n};\n","import {\n type ComponentType,\n type PropsWithChildren,\n createContext,\n} from 'react';\n\nimport type { Color, Duration } from '@aileron/types';\n\nimport {\n DEFAULT_ANIMATION_DURATION,\n DEFAULT_BACKDROP_COLOR,\n} from '@/promise-modal/app/constant';\nimport {\n FallbackContent,\n FallbackFooter,\n FallbackForegroundFrame,\n FallbackSubtitle,\n FallbackTitle,\n} from '@/promise-modal/components/FallbackComponents';\nimport type {\n FooterComponentProps,\n ModalFrameProps,\n} from '@/promise-modal/types';\n\nexport interface ModalContextProps {\n ForegroundComponent: ComponentType<PropsWithChildren<ModalFrameProps>>;\n BackgroundComponent?: ComponentType<ModalFrameProps>;\n TitleComponent: ComponentType<PropsWithChildren>;\n SubtitleComponent: ComponentType<PropsWithChildren>;\n ContentComponent: ComponentType<PropsWithChildren>;\n FooterComponent: ComponentType<FooterComponentProps>;\n options: {\n duration: Duration;\n backdrop: Color;\n manualDestroy: boolean;\n closeOnBackdropClick: boolean;\n };\n}\n\nexport const ModalContext = createContext<ModalContextProps>({\n ForegroundComponent: FallbackForegroundFrame,\n TitleComponent: FallbackTitle,\n SubtitleComponent: FallbackSubtitle,\n ContentComponent: FallbackContent,\n FooterComponent: FallbackFooter,\n options: {\n duration: DEFAULT_ANIMATION_DURATION,\n backdrop: DEFAULT_BACKDROP_COLOR,\n manualDestroy: false,\n closeOnBackdropClick: true,\n },\n});\n","import {\n type ComponentType,\n type PropsWithChildren,\n memo,\n useMemo,\n useRef,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\n\nimport { useOnMount, useTick } from '@winglet/react-utils';\n\nimport type { Color, Duration } from '@aileron/types';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport {\n DEFAULT_ANIMATION_DURATION,\n DEFAULT_BACKDROP_COLOR,\n} from '@/promise-modal/app/constant';\nimport { Anchor } from '@/promise-modal/components/Anchor';\nimport {\n FallbackContent,\n FallbackFooter,\n FallbackForegroundFrame,\n FallbackSubtitle,\n FallbackTitle,\n} from '@/promise-modal/components/FallbackComponents';\nimport { usePathname as useDefaultPathname } from '@/promise-modal/hooks/useDefaultPathname';\nimport type {\n FooterComponentProps,\n ModalFrameProps,\n} from '@/promise-modal/types';\n\nimport { ModalDataContextProvider } from '../ModalDataContext';\nimport { ModalContext } from './ModalContext';\n\ninterface ModalContextProviderProps {\n BackgroundComponent?: ComponentType<ModalFrameProps>;\n ForegroundComponent?: ComponentType<ModalFrameProps>;\n TitleComponent?: ComponentType<PropsWithChildren>;\n SubtitleComponent?: ComponentType<PropsWithChildren>;\n ContentComponent?: ComponentType<PropsWithChildren>;\n FooterComponent?: ComponentType<FooterComponentProps>;\n options?: {\n /** Modal transition time(ms, s) */\n duration?: Duration;\n /** Modal backdrop color */\n backdrop?: Color;\n /** Whether to destroy the modal manually */\n manualDestroy?: boolean;\n /** Whether to close the modal when the backdrop is clicked */\n closeOnBackdropClick?: boolean;\n };\n usePathname?: () => { pathname: string };\n}\n\nexport const ModalContextProvider = memo(\n ({\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n usePathname,\n children,\n }: PropsWithChildren<ModalContextProviderProps>) => {\n const { pathname } = (usePathname || useDefaultPathname)();\n const [, update] = useTick();\n const portalRef = useRef<HTMLElement | null>(null);\n\n useOnMount(() => {\n portalRef.current = ModalManager.anchor('div');\n update();\n return () => {\n if (portalRef.current) {\n portalRef.current.remove();\n }\n };\n });\n\n const value = useMemo(\n () => ({\n BackgroundComponent,\n ForegroundComponent: ForegroundComponent || FallbackForegroundFrame,\n TitleComponent: TitleComponent || FallbackTitle,\n SubtitleComponent: SubtitleComponent || FallbackSubtitle,\n ContentComponent: memo(ContentComponent || FallbackContent),\n FooterComponent: memo(FooterComponent || FallbackFooter),\n options: {\n duration: DEFAULT_ANIMATION_DURATION,\n backdrop: DEFAULT_BACKDROP_COLOR,\n closeOnBackdropClick: true,\n manualDestroy: false,\n ...options,\n } satisfies ModalContextProviderProps['options'],\n }),\n [\n ForegroundComponent,\n BackgroundComponent,\n ContentComponent,\n FooterComponent,\n SubtitleComponent,\n TitleComponent,\n options,\n ],\n );\n\n return (\n <ModalContext.Provider value={value}>\n {children}\n {portalRef.current &&\n createPortal(\n <ModalDataContextProvider pathname={pathname}>\n <Anchor />\n </ModalDataContextProvider>,\n portalRef.current,\n )}\n </ModalContext.Provider>\n );\n },\n);\n","import { useContext } from 'react';\n\nimport { getMillisecondsFromDuration } from '@/promise-modal/helpers/getMillisecondsFromDuration';\n\nimport { ModalContext } from './ModalContext';\n\nexport const useModalContext = () => useContext(ModalContext);\n\nexport const useModalOptions = () => {\n const { options } = useContext(ModalContext);\n return options;\n};\n\nexport const useModalDuration = () => {\n const { duration } = useModalOptions();\n return { duration, milliseconds: getMillisecondsFromDuration(duration) };\n};\n\nexport const useModalBackdrop = () => {\n const { backdrop } = useModalOptions();\n return backdrop;\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n AlertContentProps,\n AlertFooterRender,\n FooterOptions,\n ModalBackground,\n} from '@/promise-modal/types';\n\ninterface AlertProps<B> {\n subtype?: 'info' | 'success' | 'warning' | 'error';\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<AlertContentProps>;\n background?: ModalBackground<B>;\n footer?:\n | AlertFooterRender\n | Pick<FooterOptions, 'confirm' | 'hideConfirm'>\n | false;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n}\n\nexport const alert = <B = any>({\n subtype,\n title,\n subtitle,\n content,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n}: AlertProps<B>) => {\n return new Promise<void>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'alert',\n subtype,\n resolve: () => resolve(),\n title,\n subtitle,\n content,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n ConfirmContentProps,\n ConfirmFooterRender,\n FooterOptions,\n ModalBackground,\n} from '@/promise-modal/types';\n\ninterface ConfirmProps<B> {\n subtype?: 'info' | 'success' | 'warning' | 'error';\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<ConfirmContentProps>;\n background?: ModalBackground<B>;\n footer?: ConfirmFooterRender | FooterOptions | false;\n closeOnBackdropClick?: boolean;\n manualDestroy?: boolean;\n}\n\nexport const confirm = <B = any>({\n subtype,\n title,\n subtitle,\n content,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n}: ConfirmProps<B>) => {\n return new Promise<boolean>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'confirm',\n subtype,\n resolve: (result) => resolve(result ?? false),\n title,\n subtitle,\n content,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n FooterOptions,\n ModalBackground,\n PromptContentProps,\n PromptFooterRender,\n PromptInputProps,\n} from '@/promise-modal/types';\n\nimport { ModalManager } from '../../app/ModalManager';\n\ninterface PromptProps<T, B = any> {\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<PromptContentProps>;\n Input: (props: PromptInputProps<T>) => ReactNode;\n defaultValue?: T;\n disabled?: (value: T) => boolean;\n returnOnCancel?: boolean;\n background?: ModalBackground<B>;\n footer?: PromptFooterRender<T> | FooterOptions | false;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n}\n\nexport const prompt = <T, B = any>({\n defaultValue,\n title,\n subtitle,\n content,\n Input,\n disabled,\n returnOnCancel,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n}: PromptProps<T, B>) => {\n return new Promise<T>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'prompt',\n resolve: (result) => resolve(result as T),\n title,\n subtitle,\n content,\n Input: ({ defaultValue, onChange, onConfirm }: PromptInputProps<T>) =>\n Input({\n defaultValue,\n onChange,\n onConfirm,\n }),\n defaultValue,\n disabled,\n returnOnCancel,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import { useEffect, useRef } from 'react';\n\nimport { isString } from '@winglet/common-utils';\n\nimport type { Duration } from '@aileron/types';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport { getMillisecondsFromDuration } from '@/promise-modal/helpers/getMillisecondsFromDuration';\n\nimport { useModal } from '../providers';\nimport { useSubscribeModal } from './useSubscribeModal';\n\nexport const useDestroyAfter = (\n modalId: ModalNode['id'],\n duration: Duration | number,\n) => {\n const { modal, onDestroy } = useModal(modalId);\n const tick = useSubscribeModal(modal);\n\n const reference = useRef({\n modal,\n onDestroy,\n milliseconds: isString(duration)\n ? getMillisecondsFromDuration(duration)\n : duration,\n });\n\n useEffect(() => {\n const { modal, onDestroy, milliseconds } = reference.current;\n if (!modal || modal.visible || !modal.alive) return;\n const timer = setTimeout(() => {\n onDestroy();\n }, milliseconds);\n return () => {\n if (timer) clearTimeout(timer);\n };\n }, [tick]);\n};\n"],"names":["prerenderListRef","current","openModalRef","modal","push","anchorRef","ModalManager","prerender","clearPrerender","open","setupOpen","anchor","name","label","document","getElementById","id","node","createElement","setAttribute","getRandomNumber","body","appendChild","DEFAULT_ANIMATION_DURATION","DEFAULT_BACKDROP_COLOR","Background","modalId","onChangeOrder","BackgroundComponent","useModalContext","onClose","onChange","onConfirm","onDestroy","useModal","handleClose","useCallback","event","closeOnBackdropClick","visible","stopPropagation","manualDestroy","alive","_jsx","className","cx","styles$4_visible","styles","styles$4_active","onClick","children","type","initiator","background","AlertInner","memo","handlers","title","subtitle","content","footer","useMemo","handleConfirm","useHandle","TitleComponent","SubtitleComponent","ContentComponent","FooterComponent","_jsxs","Fragment","isString","jsx","renderComponent","confirmLabel","confirm","hideConfirm","ConfirmInner","onCancel","cancelLabel","cancel","hideCancel","PromptInner","Input","defaultValue","disabled","checkDisabled","value","setValue","useState","handleChange","inputValue","input","isFunction","setTimeout","Foreground","ForegroundComponent","styles$3_active","useSubscribeModal","tick","update","useTick","useOnMount","subscribe","zIndex","Presenter","ref","useRef","handleChangeOrder","style","useActiveModalCount","modalIds","getModalNode","useModalDataContext","count","BaseNode","__classPrivateFieldGet","this","_BaseNode_alive","_BaseNode_visible","constructor","resolve","Object","defineProperty","set","_BaseNode_resolve","_BaseNode_listeners","__classPrivateFieldSet","listener","filter","l","publish","result","call","needPublish","onShow","onHide","AlertNode","subtype","super","ConfirmNode","PromptNode","returnOnCancel","_PromptNode_value","nodeFactory","Error","DURATION_REGEX","getMillisecondsFromDuration","durationString","unit","match","duration","parseInt","ModalDataContext","createContext","undefinedFunction","setUpdater","getModal","undefined","ModalDataContextProvider","pathname","modalDictionary","Map","setModalIds","modalIdsRef","useReference","modalIdSequence","options","useModalOptions","useOnMountLayout","data","ids","destroyed","get","delete","useLayoutEffect","updaterRef","hideModal","updater","Provider","useContext","Anchor","key","useEffect","dimmed","transitionDuration","backgroundColor","backdrop","map","FallbackTitle","FallbackSubtitle","FallbackContent","FallbackFooter","FallbackForegroundFrame","forwardRef","activeCount","level","offset","stacked","Math","floor","marginBottom","marginLeft","transform","usePathname","setPathname","window","location","requestId","checkPathname","cancelAnimationFrame","requestAnimationFrame","ModalContext","ModalContextProvider","useDefaultPathname","portalRef","remove","jsxs","createPortal","Promise","reject","error","reference","milliseconds","timer","clearTimeout"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/app/ModalManager.ts","../src/app/constant.ts","../src/components/Background/classNames.emotion.ts","../src/components/Background/Background.tsx","../src/components/Foreground/classNames.emotion.ts","../src/components/Foreground/components/AlertInner.tsx","../src/components/Foreground/components/ConfirmInner.tsx","../src/components/Foreground/components/PromptInner.tsx","../src/components/Foreground/Foreground.tsx","../src/hooks/useSubscribeModal.ts","../src/components/Presenter/classNames.emotion.ts","../src/components/Presenter/Presenter.tsx","../src/hooks/useActiveModalCount.ts","../src/core/node/ModalNode/AbstractBaseNode.ts","../src/core/node/ModalNode/AlertNode.ts","../src/core/node/ModalNode/ConfirmNode.ts","../src/core/node/ModalNode/PromptNode.ts","../src/core/node/nodeFactory.ts","../src/helpers/getMillisecondsFromDuration.ts","../src/providers/ModalDataContext/ModalDataContext.ts","../src/providers/ModalDataContext/ModalDataContextProvider.tsx","../src/providers/ModalDataContext/useModalDataContext.ts","../src/components/Anchor/classNames.emotion.ts","../src/components/Anchor/Anchor.tsx","../src/components/FallbackComponents/classNames.emotion.ts","../src/components/FallbackComponents/FallbackTitle.tsx","../src/components/FallbackComponents/FallbackSubtitle.tsx","../src/components/FallbackComponents/FallbackContent.tsx","../src/components/FallbackComponents/FallbackFooter.tsx","../src/components/FallbackComponents/FallbackForegroundFrame.tsx","../src/hooks/useDefaultPathname.ts","../src/providers/ModalContext/ModalContext.ts","../src/providers/ModalContext/ModalContextProvider.tsx","../src/providers/ModalContext/useModalContext.ts","../src/core/handle/alert.ts","../src/core/handle/confirm.ts","../src/core/handle/prompt.ts","../src/hooks/useDestroyAfter.ts"],"sourcesContent":["import { MutableRefObject } from 'react';\n\nimport { getRandomNumber } from '@winglet/common-utils';\n\nimport type { Fn } from '@aileron/types';\n\nimport type { Modal } from '@/promise-modal/types';\n\nconst prerenderListRef: MutableRefObject<Modal[]> = {\n current: [],\n};\n\nconst openModalRef: MutableRefObject<Fn<[Modal], void>> = {\n current: (modal: Modal) => {\n prerenderListRef.current.push(modal);\n },\n};\n\nconst anchorRef: MutableRefObject<HTMLElement | null> = {\n current: null,\n};\n\nexport const ModalManager = {\n get prerender() {\n return prerenderListRef.current;\n },\n clearPrerender() {\n prerenderListRef.current = [];\n },\n open(modal: Modal) {\n openModalRef.current(modal);\n },\n setupOpen(open: (modal: Modal) => void) {\n openModalRef.current = open;\n },\n anchor(name: string, label = 'modal-anchor'): HTMLElement {\n if (anchorRef.current) {\n const anchor = document.getElementById(anchorRef.current.id);\n if (anchor) return anchor;\n }\n const node = document.createElement(name);\n node.setAttribute('id', `${label}-${getRandomNumber()}`);\n document.body.appendChild(node);\n anchorRef.current = node;\n return node;\n },\n};\n","import type { Color, Duration } from '@aileron/types';\n\nexport const DEFAULT_ANIMATION_DURATION: Duration = '300ms';\n\nexport const DEFAULT_BACKDROP_COLOR: Color = 'rgba(0, 0, 0, 0.5)';\n","import { css } from '@emotion/css';\n\nexport const root = css`\n display: none;\n position: fixed;\n inset: 0;\n z-index: -999;\n pointer-events: none;\n > * {\n pointer-events: none;\n }\n`;\n\nexport const active = css`\n pointer-events: all !important;\n`;\n\nexport const visible = css`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n","import { type MouseEvent, useCallback } from 'react';\n\nimport { cx } from '@emotion/css';\n\nimport { useModal, useModalContext } from '@/promise-modal/providers';\nimport type { ModalLayerProps } from '@/promise-modal/types';\n\nimport { active, root, visible } from './classNames.emotion';\n\nexport const Background = ({ modalId, onChangeOrder }: ModalLayerProps) => {\n const { BackgroundComponent } = useModalContext();\n const { modal, onClose, onChange, onConfirm, onDestroy } = useModal(modalId);\n\n const handleClose = useCallback(\n (event: MouseEvent) => {\n if (modal && modal.closeOnBackdropClick && modal.visible) onClose();\n event.stopPropagation();\n },\n [modal, onClose],\n );\n\n if (!modal) return null;\n\n const isVisible = modal.manualDestroy ? modal.alive : modal.visible;\n\n return (\n <div\n className={cx(root, {\n [visible]: isVisible,\n [active]: modal.closeOnBackdropClick && isVisible,\n })}\n onClick={handleClose}\n >\n {BackgroundComponent && (\n <BackgroundComponent\n id={modal.id}\n type={modal.type}\n alive={modal.alive}\n visible={modal.visible}\n initiator={modal.initiator}\n manualDestroy={modal.manualDestroy}\n closeOnBackdropClick={modal.closeOnBackdropClick}\n background={modal.background}\n onChange={onChange}\n onConfirm={onConfirm}\n onClose={onClose}\n onDestroy={onDestroy}\n onChangeOrder={onChangeOrder}\n />\n )}\n </div>\n );\n};\n","import { css } from '@emotion/css';\n\nexport const root = css`\n pointer-events: none;\n display: none;\n position: fixed;\n inset: 0;\n z-index: 1;\n`;\n\nexport const active = css`\n display: flex !important;\n justify-content: center;\n align-items: center;\n > * {\n pointer-events: all;\n }\n`;\n","import { Fragment, memo, useMemo } from 'react';\n\nimport { isString } from '@winglet/common-utils';\nimport { renderComponent, useHandle } from '@winglet/react-utils';\n\nimport type { AlertNode } from '@/promise-modal/core';\nimport { useModalContext } from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface AlertInnerProps<B> {\n modal: AlertNode<B>;\n handlers: Pick<ModalActions, 'onConfirm'>;\n}\n\nexport const AlertInner = memo(\n <B,>({ modal, handlers }: AlertInnerProps<B>) => {\n const { title, subtitle, content, footer } = useMemo(() => modal, [modal]);\n const { onConfirm } = useMemo(() => handlers, [handlers]);\n\n const handleConfirm = useHandle(onConfirm);\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useModalContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? <TitleComponent>{title}</TitleComponent> : title)}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent>{subtitle}</SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent>{content}</ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n })\n ))}\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({ onConfirm: handleConfirm })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n confirmLabel={footer?.confirm}\n hideConfirm={footer?.hideConfirm}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { Fragment, memo, useMemo } from 'react';\n\nimport { isString } from '@winglet/common-utils';\nimport { renderComponent, useHandle } from '@winglet/react-utils';\n\nimport type { ConfirmNode } from '@/promise-modal/core';\nimport { useModalContext } from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface ConfirmInnerProps<B> {\n modal: ConfirmNode<B>;\n handlers: Pick<ModalActions, 'onConfirm' | 'onClose'>;\n}\n\nexport const ConfirmInner = memo(\n <B,>({ modal, handlers }: ConfirmInnerProps<B>) => {\n const { title, subtitle, content, footer } = useMemo(() => modal, [modal]);\n const { onConfirm, onClose } = useMemo(() => handlers, [handlers]);\n\n const handleConfirm = useHandle(onConfirm);\n const handleClose = useHandle(onClose);\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useModalContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? <TitleComponent>{title}</TitleComponent> : title)}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent>{subtitle}</SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent>{content}</ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n onCancel: handleClose,\n })\n ))}\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n onConfirm: handleConfirm,\n onCancel: handleClose,\n })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n onCancel={handleClose}\n confirmLabel={footer?.confirm}\n cancelLabel={footer?.cancel}\n hideConfirm={footer?.hideConfirm}\n hideCancel={footer?.hideCancel}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { Fragment, memo, useCallback, useMemo, useState } from 'react';\n\nimport { isFunction, isString } from '@winglet/common-utils';\nimport {\n renderComponent,\n useHandle,\n withErrorBoundary,\n} from '@winglet/react-utils';\n\nimport type { PromptNode } from '@/promise-modal/core';\nimport { useModalContext } from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface PromptInnerProps<T, B> {\n modal: PromptNode<T, B>;\n handlers: Pick<ModalActions, 'onChange' | 'onClose' | 'onConfirm'>;\n}\n\nexport const PromptInner = memo(\n <T, B>({ modal, handlers }: PromptInnerProps<T, B>) => {\n const {\n Input,\n defaultValue,\n disabled: checkDisabled,\n title,\n subtitle,\n content,\n footer,\n } = useMemo(\n () => ({\n ...modal,\n Input: memo(withErrorBoundary(modal.Input)),\n }),\n [modal],\n );\n\n const [value, setValue] = useState<T | undefined>(defaultValue);\n\n const { onChange, onClose, onConfirm } = useMemo(\n () => handlers,\n [handlers],\n );\n\n const handleClose = useHandle(onClose);\n const handleChange = useHandle(\n (inputValue?: T | ((prevState: T | undefined) => T | undefined)) => {\n const input = isFunction(inputValue) ? inputValue(value) : inputValue;\n setValue(input);\n onChange(input);\n },\n );\n\n const handleConfirm = useCallback(() => {\n // NOTE: wait for the next tick to ensure the value is updated\n setTimeout(() => {\n onConfirm();\n });\n }, [onConfirm]);\n\n const disabled = useMemo(\n () => (value ? !!checkDisabled?.(value) : false),\n [checkDisabled, value],\n );\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useModalContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? <TitleComponent>{title}</TitleComponent> : title)}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent>{subtitle}</SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent>{content}</ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n onCancel: handleClose,\n })\n ))}\n\n {Input && (\n <Input\n defaultValue={defaultValue}\n value={value}\n onChange={handleChange}\n onConfirm={handleConfirm}\n />\n )}\n\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n onConfirm: handleConfirm,\n onCancel: handleClose,\n onChange: handleChange,\n value,\n disabled,\n })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n onCancel={handleClose}\n disabled={disabled}\n confirmLabel={footer?.confirm}\n cancelLabel={footer?.cancel}\n hideConfirm={footer?.hideConfirm}\n hideCancel={footer?.hideCancel}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { cx } from '@emotion/css';\n\nimport { useModal, useModalContext } from '@/promise-modal/providers';\nimport type { ModalLayerProps } from '@/promise-modal/types';\n\nimport { active, root } from './classNames.emotion';\nimport { AlertInner, ConfirmInner, PromptInner } from './components';\n\nexport const Foreground = ({ modalId, onChangeOrder }: ModalLayerProps) => {\n const { ForegroundComponent } = useModalContext();\n\n const { modal, onChange, onConfirm, onClose, onDestroy } = useModal(modalId);\n\n if (!modal) return null;\n\n return (\n <div\n className={cx(root, {\n [active]: modal.manualDestroy ? modal.alive : modal.visible,\n })}\n >\n <ForegroundComponent\n id={modal.id}\n type={modal.type}\n alive={modal.alive}\n visible={modal.visible}\n initiator={modal.initiator}\n manualDestroy={modal.manualDestroy}\n closeOnBackdropClick={modal.closeOnBackdropClick}\n background={modal.background}\n onChange={onChange}\n onConfirm={onConfirm}\n onClose={onClose}\n onDestroy={onDestroy}\n onChangeOrder={onChangeOrder}\n >\n {modal.type === 'alert' && (\n <AlertInner modal={modal} handlers={{ onConfirm }} />\n )}\n {modal.type === 'confirm' && (\n <ConfirmInner modal={modal} handlers={{ onConfirm, onClose }} />\n )}\n {modal.type === 'prompt' && (\n <PromptInner\n modal={modal}\n handlers={{ onChange, onConfirm, onClose }}\n />\n )}\n </ForegroundComponent>\n </div>\n );\n};\n","import { useOnMount, useTick } from '@winglet/react-utils';\n\nimport type { ModalNode } from '@/promise-modal/core';\n\nexport const useSubscribeModal = (modal?: ModalNode) => {\n const [tick, update] = useTick();\n useOnMount(() => {\n if (!modal) return;\n const unsubscribe = modal.subscribe(update);\n return unsubscribe;\n });\n return tick;\n};\n","import { css } from '@emotion/css';\n\nexport const root = css`\n position: fixed;\n inset: 0;\n pointer-events: none;\n overflow: hidden;\n`;\n","import { memo, useRef } from 'react';\n\nimport { useHandle } from '@winglet/react-utils';\n\nimport { Background } from '@/promise-modal/components/Background';\nimport { Foreground } from '@/promise-modal/components/Foreground';\nimport { useSubscribeModal } from '@/promise-modal/hooks/useSubscribeModal';\nimport { useModal } from '@/promise-modal/providers';\nimport type { ModalIdProps } from '@/promise-modal/types';\n\nimport { root } from './classNames.emotion';\n\nlet zIndex = 1;\n\nexport const Presenter = memo(({ modalId }: ModalIdProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { modal } = useModal(modalId);\n useSubscribeModal(modal);\n const handleChangeOrder = useHandle(() => {\n if (ref.current) {\n ref.current.style.zIndex = `${zIndex++}`;\n }\n });\n return (\n <div ref={ref} className={root}>\n <Background modalId={modalId} onChangeOrder={handleChangeOrder} />\n <Foreground modalId={modalId} onChangeOrder={handleChangeOrder} />\n </div>\n );\n});\n","import { useMemo } from 'react';\n\nimport { useModalDataContext } from '../providers';\n\nexport const useActiveModalCount = (tick: string | number = 0) => {\n const { modalIds, getModalNode } = useModalDataContext();\n return useMemo(() => {\n let count = 0;\n for (const id of modalIds) {\n if (getModalNode(id)?.visible) count++;\n }\n return count;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getModalNode, modalIds, tick]);\n};\n","import type { ReactNode } from 'react';\n\nimport type { Fn } from '@aileron/types';\n\nimport type {\n BaseModal,\n ManagedEntity,\n ModalBackground,\n} from '@/promise-modal/types';\n\ntype BaseNodeProps<T, B> = BaseModal<T, B> & ManagedEntity;\n\nexport abstract class BaseNode<T, B> {\n readonly id: number;\n readonly initiator: string;\n\n readonly title?: ReactNode;\n readonly subtitle?: ReactNode;\n readonly background?: ModalBackground<B>;\n\n readonly manualDestroy: boolean;\n readonly closeOnBackdropClick: boolean;\n\n #alive: boolean;\n get alive() {\n return this.#alive;\n }\n #visible: boolean;\n get visible() {\n return this.#visible;\n }\n\n #resolve: (result: T | null) => void;\n #listeners: Fn[] = [];\n\n constructor({\n id,\n initiator,\n title,\n subtitle,\n background,\n manualDestroy = false,\n closeOnBackdropClick = true,\n resolve,\n }: BaseNodeProps<T, B>) {\n this.id = id;\n this.initiator = initiator;\n this.title = title;\n this.subtitle = subtitle;\n this.background = background;\n this.manualDestroy = manualDestroy;\n this.closeOnBackdropClick = closeOnBackdropClick;\n\n this.#alive = true;\n this.#visible = true;\n this.#resolve = resolve;\n }\n\n subscribe(listener: Fn) {\n this.#listeners.push(listener);\n return () => {\n this.#listeners = this.#listeners.filter((l) => l !== listener);\n };\n }\n publish() {\n for (const listener of this.#listeners) listener();\n }\n protected resolve(result: T | null) {\n this.#resolve(result);\n }\n onDestroy() {\n const needPublish = this.#alive === true;\n this.#alive = false;\n if (this.manualDestroy && needPublish) this.publish();\n }\n onShow() {\n const needPublish = this.#visible === false;\n this.#visible = true;\n if (needPublish) this.publish();\n }\n onHide() {\n const needPublish = this.#visible === true;\n this.#visible = false;\n if (needPublish) this.publish();\n }\n abstract onClose(): void;\n abstract onConfirm(): void;\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n AlertContentProps,\n AlertFooterRender,\n AlertModal,\n FooterOptions,\n ManagedEntity,\n} from '@/promise-modal/types';\n\nimport { BaseNode } from './AbstractBaseNode';\n\ntype AlertNodeProps<B> = AlertModal<B> & ManagedEntity;\n\nexport class AlertNode<B> extends BaseNode<null, B> {\n readonly type: 'alert';\n readonly subtype?: 'info' | 'success' | 'warning' | 'error';\n readonly content?: ReactNode | ComponentType<AlertContentProps>;\n readonly footer?:\n | AlertFooterRender\n | Pick<FooterOptions, 'confirm' | 'hideConfirm'>\n | false;\n\n constructor({\n id,\n initiator,\n type,\n subtype,\n title,\n subtitle,\n content,\n footer,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n }: AlertNodeProps<B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n });\n this.type = type;\n this.subtype = subtype;\n this.content = content;\n this.footer = footer;\n }\n onClose() {\n this.resolve(null);\n }\n onConfirm() {\n this.resolve(null);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n ConfirmContentProps,\n ConfirmFooterRender,\n ConfirmModal,\n FooterOptions,\n ManagedEntity,\n} from '@/promise-modal/types';\n\nimport { BaseNode } from './AbstractBaseNode';\n\ntype ConfirmNodeProps<B> = ConfirmModal<B> & ManagedEntity;\n\nexport class ConfirmNode<B> extends BaseNode<boolean, B> {\n readonly type: 'confirm';\n readonly subtype?: 'info' | 'success' | 'warning' | 'error';\n readonly content?: ReactNode | ComponentType<ConfirmContentProps>;\n readonly footer?: ConfirmFooterRender | FooterOptions | false;\n\n constructor({\n id,\n initiator,\n type,\n subtype,\n title,\n subtitle,\n content,\n footer,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n }: ConfirmNodeProps<B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n });\n this.type = type;\n this.subtype = subtype;\n this.content = content;\n this.footer = footer;\n }\n onClose() {\n this.resolve(false);\n }\n onConfirm() {\n this.resolve(true);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n FooterOptions,\n ManagedEntity,\n PromptContentProps,\n PromptFooterRender,\n PromptInputProps,\n PromptModal,\n} from '@/promise-modal/types';\n\nimport { BaseNode } from './AbstractBaseNode';\n\ntype PromptNodeProps<T, B> = PromptModal<T, B> & ManagedEntity;\n\nexport class PromptNode<T, B> extends BaseNode<T, B> {\n readonly type: 'prompt';\n readonly content?: ReactNode | ComponentType<PromptContentProps>;\n readonly defaultValue: T | undefined;\n readonly Input: (props: PromptInputProps<T>) => ReactNode;\n readonly disabled?: (value: T) => boolean;\n readonly returnOnCancel?: boolean;\n readonly footer?: PromptFooterRender<T> | FooterOptions | false;\n #value: T | undefined;\n\n constructor({\n id,\n initiator,\n type,\n title,\n subtitle,\n content,\n defaultValue,\n Input,\n disabled,\n returnOnCancel,\n footer,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n }: PromptNodeProps<T, B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n });\n this.type = type;\n this.content = content;\n this.Input = Input;\n this.defaultValue = defaultValue;\n this.#value = defaultValue;\n this.disabled = disabled;\n this.returnOnCancel = returnOnCancel;\n this.footer = footer;\n }\n\n onChange(value: T) {\n this.#value = value;\n }\n onConfirm() {\n this.resolve(this.#value ?? null);\n }\n onClose() {\n if (this.returnOnCancel) this.resolve(this.#value ?? null);\n else this.resolve(null);\n }\n}\n","import type { ManagedModal } from '@/promise-modal/types';\n\nimport { AlertNode, ConfirmNode, PromptNode } from './ModalNode';\n\nexport const nodeFactory = <T, B>(modal: ManagedModal<T, B>) => {\n switch (modal.type) {\n case 'alert':\n return new AlertNode<B>(modal);\n case 'confirm':\n return new ConfirmNode<B>(modal);\n case 'prompt':\n return new PromptNode<T, B>(modal);\n }\n // @ts-expect-error: This state is unreachable by design and should NEVER occur.\n throw new Error(`Unknown modal: ${modal.type}`, { modal });\n};\n","const DURATION_REGEX = /^\\s*(\\d+)\\s*(ms|s|m|h)\\s*$/;\n\nexport const getMillisecondsFromDuration = (input: string) => {\n const [, durationString, unit] = input.match(DURATION_REGEX) || [];\n if (!durationString || !unit) return 0;\n const duration = parseInt(durationString);\n if (unit === 'ms') return duration;\n if (unit === 's') return duration * 1000;\n if (unit === 'm') return duration * 60 * 1000;\n if (unit === 'h') return duration * 60 * 60 * 1000;\n else return 0;\n};\n","import { createContext } from 'react';\n\nimport { undefinedFunction } from '@winglet/common-utils';\n\nimport type { Fn } from '@aileron/types';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport type { ModalActions, ModalHandlersWithId } from '@/promise-modal/types';\n\nexport interface ModalDataContextProps extends ModalHandlersWithId {\n modalIds: ModalNode['id'][];\n getModal: Fn<[id: ModalNode['id']], ModalActions>;\n getModalNode: Fn<[id: ModalNode['id']], ModalNode | undefined>;\n setUpdater: Fn<[updater: Fn]>;\n}\n\nexport const ModalDataContext = createContext<ModalDataContextProps>({\n modalIds: [],\n getModalNode: undefinedFunction,\n onChange: undefinedFunction,\n onConfirm: undefinedFunction,\n onClose: undefinedFunction,\n onDestroy: undefinedFunction,\n setUpdater: undefinedFunction,\n getModal: () => ({\n modal: undefined,\n onConfirm: undefinedFunction,\n onClose: undefinedFunction,\n onChange: undefinedFunction,\n onDestroy: undefinedFunction,\n }),\n});\n","import {\n type PropsWithChildren,\n memo,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { useOnMountLayout, useReference } from '@winglet/react-utils';\n\nimport type { Fn } from '@aileron/types';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport { type ModalNode, nodeFactory } from '@/promise-modal/core';\nimport { getMillisecondsFromDuration } from '@/promise-modal/helpers/getMillisecondsFromDuration';\nimport { useModalOptions } from '@/promise-modal/providers';\nimport type { Modal } from '@/promise-modal/types';\n\nimport { ModalDataContext } from './ModalDataContext';\n\ninterface ModalDataContextProviderProps {\n pathname: string;\n}\n\nexport const ModalDataContextProvider = memo(\n ({\n pathname,\n children,\n }: PropsWithChildren<ModalDataContextProviderProps>) => {\n const modalDictionary = useRef<Map<ModalNode['id'], ModalNode>>(new Map());\n\n const [modalIds, setModalIds] = useState<ModalNode['id'][]>([]);\n const modalIdsRef = useReference(modalIds);\n\n const initiator = useRef(pathname);\n const modalIdSequence = useRef(0);\n\n const options = useModalOptions();\n\n const duration = useMemo(\n () => getMillisecondsFromDuration(options.duration),\n [options],\n );\n\n useOnMountLayout(() => {\n const { manualDestroy, closeOnBackdropClick } = options;\n\n for (const data of ModalManager.prerender) {\n const modal = nodeFactory({\n ...data,\n id: modalIdSequence.current++,\n initiator: initiator.current,\n manualDestroy:\n data.manualDestroy !== undefined\n ? data.manualDestroy\n : manualDestroy,\n closeOnBackdropClick:\n data.closeOnBackdropClick !== undefined\n ? data.closeOnBackdropClick\n : closeOnBackdropClick,\n });\n modalDictionary.current.set(modal.id, modal);\n setModalIds((ids) => [...ids, modal.id]);\n }\n\n ModalManager.setupOpen((data: Modal) => {\n const modal = nodeFactory({\n ...data,\n id: modalIdSequence.current++,\n initiator: initiator.current,\n manualDestroy:\n data.manualDestroy !== undefined\n ? data.manualDestroy\n : manualDestroy,\n closeOnBackdropClick:\n data.closeOnBackdropClick !== undefined\n ? data.closeOnBackdropClick\n : closeOnBackdropClick,\n });\n modalDictionary.current.set(modal.id, modal);\n setModalIds((ids) => {\n const aliveIds = ids.filter((id) => {\n const destroyed = !modalDictionary.current.get(id)?.alive;\n if (destroyed) modalDictionary.current.delete(id);\n return !destroyed;\n });\n return [...aliveIds, modal.id];\n });\n });\n ModalManager.clearPrerender();\n });\n\n useLayoutEffect(() => {\n for (const id of modalIdsRef.current) {\n const modal = modalDictionary.current.get(id);\n if (!modal?.alive) continue;\n if (modal.initiator === pathname) modal.onShow();\n else modal.onHide();\n }\n initiator.current = pathname;\n }, [modalIdsRef, pathname]);\n\n const getModalNode = useCallback((modalId: ModalNode['id']) => {\n return modalDictionary.current.get(modalId);\n }, []);\n\n const onDestroy = useCallback((modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onDestroy();\n updaterRef.current?.();\n }, []);\n\n const updaterRef = useRef<Fn>();\n const hideModal = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onHide();\n updaterRef.current?.();\n if (!modal.manualDestroy)\n setTimeout(() => {\n modal.onDestroy();\n }, duration);\n },\n [duration],\n );\n\n const onChange = useCallback((modalId: ModalNode['id'], value: any) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n if (modal.type === 'prompt') modal.onChange(value);\n }, []);\n\n const onConfirm = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onConfirm();\n hideModal(modalId);\n },\n [hideModal],\n );\n\n const onClose = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onClose();\n hideModal(modalId);\n },\n [hideModal],\n );\n\n const getModal = useCallback(\n (modalId: ModalNode['id']) => ({\n modal: getModalNode(modalId),\n onConfirm: () => onConfirm(modalId),\n onClose: () => onClose(modalId),\n onChange: (value: any) => onChange(modalId, value),\n onDestroy: () => onDestroy(modalId),\n }),\n [getModalNode, onConfirm, onClose, onChange, onDestroy],\n );\n\n const value = useMemo(() => {\n return {\n modalIds,\n getModalNode,\n onChange,\n onConfirm,\n onClose,\n onDestroy,\n getModal,\n setUpdater: (updater: Fn) => {\n updaterRef.current = updater;\n },\n };\n }, [\n modalIds,\n getModal,\n getModalNode,\n onChange,\n onConfirm,\n onClose,\n onDestroy,\n ]);\n\n return (\n <ModalDataContext.Provider value={value}>\n {children}\n </ModalDataContext.Provider>\n );\n },\n);\n","import { useContext, useMemo } from 'react';\n\nimport type { ManagedModal } from '@/promise-modal/types';\n\nimport { ModalDataContext } from './ModalDataContext';\n\nexport const useModalDataContext = () => useContext(ModalDataContext);\n\nexport const useModal = (id: ManagedModal['id']) => {\n const { getModal } = useModalDataContext();\n return useMemo(() => getModal(id), [id, getModal]);\n};\n","import { css } from '@emotion/css';\n\nexport const root = css`\n display: flex;\n align-items: center;\n justify-content: center;\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 1000;\n transition: background-color ease-in-out;\n`;\n","import { memo, useEffect } from 'react';\n\nimport { useTick, withErrorBoundary } from '@winglet/react-utils';\n\nimport { Presenter } from '@/promise-modal/components/Presenter';\nimport { useActiveModalCount } from '@/promise-modal/hooks/useActiveModalCount';\nimport { useModalContext } from '@/promise-modal/providers';\nimport { useModalDataContext } from '@/promise-modal/providers/ModalDataContext';\n\nimport { root } from './classNames.emotion';\n\nconst AnchorInner = () => {\n const [key, update] = useTick();\n\n const { modalIds, setUpdater } = useModalDataContext();\n\n useEffect(() => {\n setUpdater(update);\n }, [setUpdater, update]);\n\n const { options } = useModalContext();\n\n const dimmed = useActiveModalCount(key);\n\n return (\n <div\n className={root}\n style={{\n transitionDuration: options.duration,\n backgroundColor: dimmed ? options.backdrop : 'transparent',\n }}\n >\n {modalIds.map((id) => {\n return <Presenter key={id} modalId={id} />;\n })}\n </div>\n );\n};\n\nexport const Anchor = memo(withErrorBoundary(AnchorInner));\n","import { css } from '@emotion/css';\n\nexport const fallback = css`\n margin: unset;\n`;\n\nexport const frame = css`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n background-color: white;\n padding: 20px 80px;\n gap: 10px;\n border: 1px solid black;\n`;\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackTitle = ({ children }: PropsWithChildren) => {\n return <h2 className={fallback}>{children}</h2>;\n};\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackSubtitle = ({ children }: PropsWithChildren) => {\n return <h3 className={fallback}>{children}</h3>;\n};\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackContent = ({ children }: PropsWithChildren) => {\n return <div className={fallback}>{children}</div>;\n};\n","import type { FooterComponentProps } from '@/promise-modal/types';\n\nexport const FallbackFooter = ({\n confirmLabel,\n hideConfirm = false,\n cancelLabel,\n hideCancel = false,\n disabled,\n onConfirm,\n onCancel,\n}: FooterComponentProps) => {\n return (\n <div>\n {!hideConfirm && (\n <button onClick={onConfirm} disabled={disabled}>\n {confirmLabel || '확인'}\n </button>\n )}\n\n {!hideCancel && typeof onCancel === 'function' && (\n <button onClick={onCancel}>{cancelLabel || '취소'}</button>\n )}\n </div>\n );\n};\n","import {\n type ForwardedRef,\n type PropsWithChildren,\n forwardRef,\n useMemo,\n} from 'react';\n\nimport { useActiveModalCount } from '@/promise-modal/hooks/useActiveModalCount';\nimport type { ModalFrameProps } from '@/promise-modal/types';\n\nimport { frame } from './classNames.emotion';\n\nconst MAX_MODAL_COUNT = 5;\nconst MAX_MODAL_LEVEL = 3;\n\nexport const FallbackForegroundFrame = forwardRef(\n (\n { id, onChangeOrder, children }: PropsWithChildren<ModalFrameProps>,\n ref: ForwardedRef<HTMLDivElement>,\n ) => {\n const activeCount = useActiveModalCount();\n const [level, offset] = useMemo(() => {\n const stacked = activeCount > 1;\n const level = stacked\n ? (Math.floor(id / MAX_MODAL_COUNT) % MAX_MODAL_LEVEL) * 100\n : 0;\n const offset = stacked ? (id % MAX_MODAL_COUNT) * 35 : 0;\n return [level, offset];\n }, [activeCount, id]);\n\n return (\n <div\n ref={ref}\n className={frame}\n onClick={onChangeOrder}\n style={{\n marginBottom: `calc(25vh + ${level}px)`,\n marginLeft: `${level}px`,\n transform: `translate(${offset}px, ${offset}px)`,\n }}\n >\n {children}\n </div>\n );\n },\n);\n","import { useLayoutEffect, useState } from 'react';\n\nexport const usePathname = () => {\n const [pathname, setPathname] = useState(window.location.pathname);\n\n useLayoutEffect(() => {\n let requestId: number;\n\n const checkPathname = () => {\n if (requestId) cancelAnimationFrame(requestId);\n if (pathname !== window.location.pathname) {\n setPathname(window.location.pathname);\n } else {\n requestId = requestAnimationFrame(checkPathname);\n }\n };\n\n requestId = requestAnimationFrame(checkPathname);\n\n return () => {\n if (requestId) cancelAnimationFrame(requestId);\n };\n }, [pathname]);\n\n return { pathname };\n};\n","import {\n type ComponentType,\n type PropsWithChildren,\n createContext,\n} from 'react';\n\nimport type { Color, Duration } from '@aileron/types';\n\nimport {\n DEFAULT_ANIMATION_DURATION,\n DEFAULT_BACKDROP_COLOR,\n} from '@/promise-modal/app/constant';\nimport {\n FallbackContent,\n FallbackFooter,\n FallbackForegroundFrame,\n FallbackSubtitle,\n FallbackTitle,\n} from '@/promise-modal/components/FallbackComponents';\nimport type {\n FooterComponentProps,\n ModalFrameProps,\n} from '@/promise-modal/types';\n\nexport interface ModalContextProps {\n ForegroundComponent: ComponentType<PropsWithChildren<ModalFrameProps>>;\n BackgroundComponent?: ComponentType<ModalFrameProps>;\n TitleComponent: ComponentType<PropsWithChildren>;\n SubtitleComponent: ComponentType<PropsWithChildren>;\n ContentComponent: ComponentType<PropsWithChildren>;\n FooterComponent: ComponentType<FooterComponentProps>;\n options: {\n duration: Duration;\n backdrop: Color;\n manualDestroy: boolean;\n closeOnBackdropClick: boolean;\n };\n}\n\nexport const ModalContext = createContext<ModalContextProps>({\n ForegroundComponent: FallbackForegroundFrame,\n TitleComponent: FallbackTitle,\n SubtitleComponent: FallbackSubtitle,\n ContentComponent: FallbackContent,\n FooterComponent: FallbackFooter,\n options: {\n duration: DEFAULT_ANIMATION_DURATION,\n backdrop: DEFAULT_BACKDROP_COLOR,\n manualDestroy: false,\n closeOnBackdropClick: true,\n },\n});\n","import {\n type ComponentType,\n type PropsWithChildren,\n memo,\n useMemo,\n useRef,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\n\nimport { useOnMount, useTick } from '@winglet/react-utils';\n\nimport type { Color, Duration } from '@aileron/types';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport {\n DEFAULT_ANIMATION_DURATION,\n DEFAULT_BACKDROP_COLOR,\n} from '@/promise-modal/app/constant';\nimport { Anchor } from '@/promise-modal/components/Anchor';\nimport {\n FallbackContent,\n FallbackFooter,\n FallbackForegroundFrame,\n FallbackSubtitle,\n FallbackTitle,\n} from '@/promise-modal/components/FallbackComponents';\nimport { usePathname as useDefaultPathname } from '@/promise-modal/hooks/useDefaultPathname';\nimport type {\n FooterComponentProps,\n ModalFrameProps,\n} from '@/promise-modal/types';\n\nimport { ModalDataContextProvider } from '../ModalDataContext';\nimport { ModalContext } from './ModalContext';\n\ninterface ModalContextProviderProps {\n BackgroundComponent?: ComponentType<ModalFrameProps>;\n ForegroundComponent?: ComponentType<ModalFrameProps>;\n TitleComponent?: ComponentType<PropsWithChildren>;\n SubtitleComponent?: ComponentType<PropsWithChildren>;\n ContentComponent?: ComponentType<PropsWithChildren>;\n FooterComponent?: ComponentType<FooterComponentProps>;\n options?: {\n /** Modal transition time(ms, s) */\n duration?: Duration;\n /** Modal backdrop color */\n backdrop?: Color;\n /** Whether to destroy the modal manually */\n manualDestroy?: boolean;\n /** Whether to close the modal when the backdrop is clicked */\n closeOnBackdropClick?: boolean;\n };\n usePathname?: () => { pathname: string };\n}\n\nexport const ModalContextProvider = memo(\n ({\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n usePathname,\n children,\n }: PropsWithChildren<ModalContextProviderProps>) => {\n const { pathname } = (usePathname || useDefaultPathname)();\n const [, update] = useTick();\n const portalRef = useRef<HTMLElement | null>(null);\n\n useOnMount(() => {\n portalRef.current = ModalManager.anchor('div');\n update();\n return () => {\n if (portalRef.current) {\n portalRef.current.remove();\n }\n };\n });\n\n const value = useMemo(\n () => ({\n BackgroundComponent,\n ForegroundComponent: ForegroundComponent || FallbackForegroundFrame,\n TitleComponent: TitleComponent || FallbackTitle,\n SubtitleComponent: SubtitleComponent || FallbackSubtitle,\n ContentComponent: memo(ContentComponent || FallbackContent),\n FooterComponent: memo(FooterComponent || FallbackFooter),\n options: {\n duration: DEFAULT_ANIMATION_DURATION,\n backdrop: DEFAULT_BACKDROP_COLOR,\n closeOnBackdropClick: true,\n manualDestroy: false,\n ...options,\n } satisfies ModalContextProviderProps['options'],\n }),\n [\n ForegroundComponent,\n BackgroundComponent,\n ContentComponent,\n FooterComponent,\n SubtitleComponent,\n TitleComponent,\n options,\n ],\n );\n\n return (\n <ModalContext.Provider value={value}>\n {children}\n {portalRef.current &&\n createPortal(\n <ModalDataContextProvider pathname={pathname}>\n <Anchor />\n </ModalDataContextProvider>,\n portalRef.current,\n )}\n </ModalContext.Provider>\n );\n },\n);\n","import { useContext } from 'react';\n\nimport { getMillisecondsFromDuration } from '@/promise-modal/helpers/getMillisecondsFromDuration';\n\nimport { ModalContext } from './ModalContext';\n\nexport const useModalContext = () => useContext(ModalContext);\n\nexport const useModalOptions = () => {\n const { options } = useContext(ModalContext);\n return options;\n};\n\nexport const useModalDuration = () => {\n const { duration } = useModalOptions();\n return { duration, milliseconds: getMillisecondsFromDuration(duration) };\n};\n\nexport const useModalBackdrop = () => {\n const { backdrop } = useModalOptions();\n return backdrop;\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n AlertContentProps,\n AlertFooterRender,\n FooterOptions,\n ModalBackground,\n} from '@/promise-modal/types';\n\ninterface AlertProps<B> {\n subtype?: 'info' | 'success' | 'warning' | 'error';\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<AlertContentProps>;\n background?: ModalBackground<B>;\n footer?:\n | AlertFooterRender\n | Pick<FooterOptions, 'confirm' | 'hideConfirm'>\n | false;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n}\n\nexport const alert = <B = any>({\n subtype,\n title,\n subtitle,\n content,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n}: AlertProps<B>) => {\n return new Promise<void>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'alert',\n subtype,\n resolve: () => resolve(),\n title,\n subtitle,\n content,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n ConfirmContentProps,\n ConfirmFooterRender,\n FooterOptions,\n ModalBackground,\n} from '@/promise-modal/types';\n\ninterface ConfirmProps<B> {\n subtype?: 'info' | 'success' | 'warning' | 'error';\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<ConfirmContentProps>;\n background?: ModalBackground<B>;\n footer?: ConfirmFooterRender | FooterOptions | false;\n closeOnBackdropClick?: boolean;\n manualDestroy?: boolean;\n}\n\nexport const confirm = <B = any>({\n subtype,\n title,\n subtitle,\n content,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n}: ConfirmProps<B>) => {\n return new Promise<boolean>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'confirm',\n subtype,\n resolve: (result) => resolve(result ?? false),\n title,\n subtitle,\n content,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n FooterOptions,\n ModalBackground,\n PromptContentProps,\n PromptFooterRender,\n PromptInputProps,\n} from '@/promise-modal/types';\n\nimport { ModalManager } from '../../app/ModalManager';\n\ninterface PromptProps<T, B = any> {\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<PromptContentProps>;\n Input: (props: PromptInputProps<T>) => ReactNode;\n defaultValue?: T;\n disabled?: (value: T) => boolean;\n returnOnCancel?: boolean;\n background?: ModalBackground<B>;\n footer?: PromptFooterRender<T> | FooterOptions | false;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n}\n\nexport const prompt = <T, B = any>({\n defaultValue,\n title,\n subtitle,\n content,\n Input,\n disabled,\n returnOnCancel,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n}: PromptProps<T, B>) => {\n return new Promise<T>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'prompt',\n resolve: (result) => resolve(result as T),\n title,\n subtitle,\n content,\n Input: ({ defaultValue, onChange, onConfirm }: PromptInputProps<T>) =>\n Input({\n defaultValue,\n onChange,\n onConfirm,\n }),\n defaultValue,\n disabled,\n returnOnCancel,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import { useEffect, useRef } from 'react';\n\nimport { isString } from '@winglet/common-utils';\n\nimport type { Duration } from '@aileron/types';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport { getMillisecondsFromDuration } from '@/promise-modal/helpers/getMillisecondsFromDuration';\n\nimport { useModal } from '../providers';\nimport { useSubscribeModal } from './useSubscribeModal';\n\nexport const useDestroyAfter = (\n modalId: ModalNode['id'],\n duration: Duration | number,\n) => {\n const { modal, onDestroy } = useModal(modalId);\n const tick = useSubscribeModal(modal);\n\n const reference = useRef({\n modal,\n onDestroy,\n milliseconds: isString(duration)\n ? getMillisecondsFromDuration(duration)\n : duration,\n });\n\n useEffect(() => {\n const { modal, onDestroy, milliseconds } = reference.current;\n if (!modal || modal.visible || !modal.alive) return;\n const timer = setTimeout(() => {\n onDestroy();\n }, milliseconds);\n return () => {\n if (timer) clearTimeout(timer);\n };\n }, [tick]);\n};\n"],"names":["prerenderListRef","current","openModalRef","modal","push","anchorRef","ModalManager","prerender","clearPrerender","open","setupOpen","anchor","name","label","document","getElementById","id","node","createElement","setAttribute","getRandomNumber","body","appendChild","DEFAULT_ANIMATION_DURATION","DEFAULT_BACKDROP_COLOR","root","css","process","env","NODE_ENV","styles","toString","_EMOTION_STRINGIFIED_CSS_ERROR__","active","visible","Background","modalId","onChangeOrder","BackgroundComponent","useModalContext","onClose","onChange","onConfirm","onDestroy","useModal","handleClose","useCallback","event","closeOnBackdropClick","stopPropagation","isVisible","manualDestroy","alive","_jsx","jsx","className","cx","active$1","onClick","children","type","initiator","background","AlertInner","memo","handlers","title","subtitle","content","footer","useMemo","handleConfirm","useHandle","TitleComponent","SubtitleComponent","ContentComponent","FooterComponent","_jsxs","Fragment","isString","renderComponent","confirmLabel","confirm","hideConfirm","ConfirmInner","onCancel","cancelLabel","cancel","hideCancel","PromptInner","Input","defaultValue","disabled","checkDisabled","withErrorBoundary","value","setValue","useState","handleChange","inputValue","input","isFunction","setTimeout","Foreground","ForegroundComponent","useSubscribeModal","tick","update","useTick","useOnMount","subscribe","zIndex","Presenter","ref","useRef","handleChangeOrder","style","useActiveModalCount","modalIds","getModalNode","useModalDataContext","count","BaseNode","__classPrivateFieldGet","this","_BaseNode_alive","_BaseNode_visible","constructor","resolve","Object","defineProperty","set","_BaseNode_resolve","_BaseNode_listeners","__classPrivateFieldSet","listener","filter","l","publish","result","call","needPublish","onShow","onHide","AlertNode","subtype","super","ConfirmNode","PromptNode","returnOnCancel","_PromptNode_value","nodeFactory","Error","DURATION_REGEX","getMillisecondsFromDuration","durationString","unit","match","duration","parseInt","ModalDataContext","createContext","undefinedFunction","setUpdater","getModal","undefined","ModalDataContextProvider","pathname","modalDictionary","Map","setModalIds","modalIdsRef","useReference","modalIdSequence","options","useModalOptions","useOnMountLayout","data","ids","destroyed","get","delete","useLayoutEffect","updaterRef","hideModal","updater","Provider","useContext","Anchor","key","useEffect","dimmed","transitionDuration","backgroundColor","backdrop","map","fallback","frame","FallbackTitle","FallbackSubtitle","FallbackContent","FallbackFooter","FallbackForegroundFrame","forwardRef","activeCount","level","offset","stacked","Math","floor","marginBottom","marginLeft","transform","usePathname","setPathname","window","location","requestId","checkPathname","cancelAnimationFrame","requestAnimationFrame","ModalContext","ModalContextProvider","useDefaultPathname","portalRef","remove","jsxs","createPortal","Promise","reject","error","reference","milliseconds","timer","clearTimeout"],"mappings":"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"}
package/dist/index.esm.js CHANGED
@@ -1,4 +1,4 @@
1
- import{jsx as e,jsxs as n}from"react/jsx-runtime";import{useCallback as o,memo as t,useMemo as r,Fragment as i,useState as l,useRef as a,createContext as c,useLayoutEffect as s,useContext as u,useEffect as d,forwardRef as b}from"react";import{createPortal as m}from"react-dom";import{useHandle as p,renderComponent as h,useTick as C,useOnMount as f,useReference as g,useOnMountLayout as y}from"@winglet/react-utils";import{getRandomNumber as v,isString as I,isFunction as k,undefinedFunction as B}from"@winglet/common-utils";import _ from"clsx";import F from"/Users/Vincent/Workspace/altovion/node_modules/style-inject/dist/style-inject.es.js";const Q={current:[]},G={current:e=>{Q.current.push(e)}},O={current:null},x={get prerender(){return Q.current},clearPrerender(){Q.current=[]},open(e){G.current(e)},setupOpen(e){G.current=e},anchor(e,n="modal-anchor"){if(O.current){const e=document.getElementById(O.current.id);if(e)return e}const o=document.createElement(e);return o.setAttribute("id",`${n}-${v()}`),document.body.appendChild(o),O.current=o,o}},w="300ms",D="rgba(0, 0, 0, 0.5)";var V="Background-module__active___Zi50h",Z="Background-module__visible___tAN9F";F(".Background-module__root___zat-I{display:none;inset:0;pointer-events:none;position:fixed;z-index:-999}.Background-module__root___zat-I.Background-module__active___Zi50h{pointer-events:all!important}.Background-module__root___zat-I.Background-module__visible___tAN9F{align-items:center;display:flex;justify-content:center}.Background-module__root___zat-I>*{pointer-events:none}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJhY2tncm91bmQubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQ0FDRSxZQUFhLENBRWIsT0FBUSxDQUVSLG1CQUFvQixDQUhwQixjQUFlLENBRWYsWUFFRixDQUVBLG1FQUNFLDRCQUNGLENBRUEsb0VBRUUsa0JBQW1CLENBRG5CLFlBQWEsQ0FFYixzQkFDRixDQUVBLG1DQUNFLG1CQUNGIiwiZmlsZSI6IkJhY2tncm91bmQubW9kdWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5yb290IHtcbiAgZGlzcGxheTogbm9uZTtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBpbnNldDogMDtcbiAgei1pbmRleDogLTk5OTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5yb290LmFjdGl2ZSB7XG4gIHBvaW50ZXItZXZlbnRzOiBhbGwgIWltcG9ydGFudDtcbn1cblxuLnJvb3QudmlzaWJsZSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4ucm9vdCA+ICoge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbiJdfQ== */");const U=({modalId:n,onChangeOrder:t})=>{const{BackgroundComponent:r}=Ie(),{modal:i,onClose:l,onChange:a,onConfirm:c,onDestroy:s}=ue(n),u=o((e=>{i&&i.closeOnBackdropClick&&i.visible&&l(),e.stopPropagation()}),[i,l]);if(!i)return null;const d=i.manualDestroy?i.alive:i.visible;return e("div",{className:_("Background-module__root___zat-I",{[Z]:d,[V]:i.closeOnBackdropClick&&d}),onClick:u,children:r&&e(r,{id:i.id,type:i.type,alive:i.alive,visible:i.visible,initiator:i.initiator,manualDestroy:i.manualDestroy,closeOnBackdropClick:i.closeOnBackdropClick,background:i.background,onChange:a,onConfirm:c,onClose:l,onDestroy:s,onChangeOrder:t})})};var W="Foreground-module__active___f-kK8";F(".Foreground-module__root___Go3o8{display:none;inset:0;pointer-events:none;position:fixed;z-index:1}.Foreground-module__root___Go3o8.Foreground-module__active___f-kK8{align-items:center;display:flex!important;justify-content:center}.Foreground-module__root___Go3o8.Foreground-module__active___f-kK8>*{pointer-events:all!important}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZvcmVncm91bmQubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQ0FFRSxZQUFhLENBRWIsT0FBUSxDQUhSLG1CQUFvQixDQUVwQixjQUFlLENBRWYsU0FDRixDQUVBLG1FQUdFLGtCQUFtQixDQUZuQixzQkFBd0IsQ0FDeEIsc0JBRUYsQ0FFQSxxRUFDRSw0QkFDRiIsImZpbGUiOiJGb3JlZ3JvdW5kLm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIucm9vdCB7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBkaXNwbGF5OiBub25lO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIGluc2V0OiAwO1xuICB6LWluZGV4OiAxO1xufVxuXG4ucm9vdC5hY3RpdmUge1xuICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4ucm9vdC5hY3RpdmUgPiAqIHtcbiAgcG9pbnRlci1ldmVudHM6IGFsbCAhaW1wb3J0YW50O1xufVxuIl19 */");const j=t((({modal:o,handlers:t})=>{const{title:l,subtitle:a,content:c,footer:s}=r((()=>o),[o]),{onConfirm:u}=r((()=>t),[t]),d=p(u),{TitleComponent:b,SubtitleComponent:m,ContentComponent:C,FooterComponent:f}=Ie();return n(i,{children:[l&&(I(l)?e(b,{children:l}):l),a&&(I(a)?e(m,{children:a}):a),c&&(I(c)?e(C,{children:c}):h(c,{onConfirm:d})),!1!==s&&("function"==typeof s?s({onConfirm:d}):e(f,{onConfirm:d,confirmLabel:s?.confirm,hideConfirm:s?.hideConfirm}))]})})),z=t((({modal:o,handlers:t})=>{const{title:l,subtitle:a,content:c,footer:s}=r((()=>o),[o]),{onConfirm:u,onClose:d}=r((()=>t),[t]),b=p(u),m=p(d),{TitleComponent:C,SubtitleComponent:f,ContentComponent:g,FooterComponent:y}=Ie();return n(i,{children:[l&&(I(l)?e(C,{children:l}):l),a&&(I(a)?e(f,{children:a}):a),c&&(I(c)?e(g,{children:c}):h(c,{onConfirm:b,onCancel:m})),!1!==s&&("function"==typeof s?s({onConfirm:b,onCancel:m}):e(y,{onConfirm:b,onCancel:m,confirmLabel:s?.confirm,cancelLabel:s?.cancel,hideConfirm:s?.hideConfirm,hideCancel:s?.hideCancel}))]})})),L=t((({modal:a,handlers:c})=>{const{Input:s,defaultValue:u,disabled:d,title:b,subtitle:m,content:C,footer:f}=r((()=>({...a,Input:t(a.Input)})),[a]),[g,y]=l(u),{onChange:v,onClose:B,onConfirm:_}=r((()=>c),[c]),F=p(B),Q=p((e=>{const n=k(e)?e(g):e;y(n),v(n)})),G=o((()=>{setTimeout((()=>{_()}))}),[_]),O=r((()=>!!g&&!!d?.(g)),[d,g]),{TitleComponent:x,SubtitleComponent:w,ContentComponent:D,FooterComponent:V}=Ie();return n(i,{children:[b&&(I(b)?e(x,{children:b}):b),m&&(I(m)?e(w,{children:m}):m),C&&(I(C)?e(D,{children:C}):h(C,{onConfirm:G,onCancel:F})),s&&e(s,{defaultValue:u,value:g,onChange:Q,onConfirm:G}),!1!==f&&("function"==typeof f?f({onConfirm:G,onCancel:F,onChange:Q,value:g,disabled:O}):e(V,{onConfirm:G,onCancel:F,disabled:O,confirmLabel:f?.confirm,cancelLabel:f?.cancel,hideConfirm:f?.hideConfirm,hideCancel:f?.hideCancel}))]})})),X=({modalId:o,onChangeOrder:t})=>{const{ForegroundComponent:r}=Ie(),{modal:i,onChange:l,onConfirm:a,onClose:c,onDestroy:s}=ue(o);return i?e("div",{className:_("Foreground-module__root___Go3o8",{[W]:i.manualDestroy?i.alive:i.visible}),children:n(r,{id:i.id,type:i.type,alive:i.alive,visible:i.visible,initiator:i.initiator,manualDestroy:i.manualDestroy,closeOnBackdropClick:i.closeOnBackdropClick,background:i.background,onChange:l,onConfirm:a,onClose:c,onDestroy:s,onChangeOrder:t,children:["alert"===i.type&&e(j,{modal:i,handlers:{onConfirm:a}}),"confirm"===i.type&&e(z,{modal:i,handlers:{onConfirm:a,onClose:c}}),"prompt"===i.type&&e(L,{modal:i,handlers:{onChange:l,onConfirm:a,onClose:c}})]})}):null},R=e=>{const[n,o]=C();return f((()=>{if(e)return e.subscribe(o)})),n};F(".Presenter-module__modal___HyHFW{inset:0;overflow:hidden;pointer-events:none;position:fixed}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlByZXNlbnRlci5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlDQUVFLE9BQVEsQ0FFUixlQUFnQixDQURoQixtQkFBb0IsQ0FGcEIsY0FJRiIsImZpbGUiOiJQcmVzZW50ZXIubW9kdWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5tb2RhbCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgaW5zZXQ6IDA7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuIl19 */");let N=1;const J=t((({modalId:o})=>{const t=a(null),{modal:r}=ue(o);R(r);const i=p((()=>{t.current&&(t.current.style.zIndex=""+N++)}));return n("div",{ref:t,className:"Presenter-module__modal___HyHFW",children:[e(U,{modalId:o,onChangeOrder:i}),e(X,{modalId:o,onChangeOrder:i})]})})),Y=(e=0)=>{const{modalIds:n,getModalNode:o}=se();return r((()=>{let e=0;for(const t of n)o(t)?.visible&&e++;return e}),[o,n,e])},P=({subtype:e,title:n,subtitle:o,content:t,background:r,footer:i,manualDestroy:l,closeOnBackdropClick:a})=>new Promise(((c,s)=>{try{x.open({type:"alert",subtype:e,resolve:()=>c(),title:n,subtitle:o,content:t,background:r,footer:i,manualDestroy:l,closeOnBackdropClick:a})}catch(e){s(e)}})),S=({subtype:e,title:n,subtitle:o,content:t,background:r,footer:i,manualDestroy:l,closeOnBackdropClick:a})=>new Promise(((c,s)=>{try{x.open({type:"confirm",subtype:e,resolve:e=>c(e??!1),title:n,subtitle:o,content:t,background:r,footer:i,manualDestroy:l,closeOnBackdropClick:a})}catch(e){s(e)}})),M=({defaultValue:e,title:n,subtitle:o,content:t,Input:r,disabled:i,returnOnCancel:l,background:a,footer:c,manualDestroy:s,closeOnBackdropClick:u})=>new Promise(((d,b)=>{try{x.open({type:"prompt",resolve:e=>d(e),title:n,subtitle:o,content:t,Input:({defaultValue:e,onChange:n,onConfirm:o})=>r({defaultValue:e,onChange:n,onConfirm:o}),defaultValue:e,disabled:i,returnOnCancel:l,background:a,footer:c,manualDestroy:s,closeOnBackdropClick:u})}catch(e){b(e)}}));
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import{useCallback as n,memo as o,useMemo as r,Fragment as i,useState as a,useRef as l,createContext as s,useLayoutEffect as c,useContext as d,useEffect as u,forwardRef as p}from"react";import{createPortal as m}from"react-dom";import{useHandle as f,renderComponent as h,withErrorBoundary as b,useTick as y,useOnMount as C,useReference as v,useOnMountLayout as g}from"@winglet/react-utils";import{getRandomNumber as k,isString as w,isFunction as O,undefinedFunction as D}from"@winglet/common-utils";import{css as x,cx as j}from"@emotion/css";const B={current:[]},P={current:e=>{B.current.push(e)}},N={current:null},E={get prerender(){return B.current},clearPrerender(){B.current=[]},open(e){P.current(e)},setupOpen(e){P.current=e},anchor(e,t="modal-anchor"){if(N.current){const e=document.getElementById(N.current.id);if(e)return e}const n=document.createElement(e);return n.setAttribute("id",`${t}-${k()}`),document.body.appendChild(n),N.current=n,n}},I="300ms",S="rgba(0, 0, 0, 0.5)";function V(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}const T=x("production"===process.env.NODE_ENV?{name:"u7uu4v",styles:"display:none;position:fixed;inset:0;z-index:-999;pointer-events:none;>*{pointer-events:none;}"}:{name:"1p2ejpq-root",styles:"display:none;position:fixed;inset:0;z-index:-999;pointer-events:none;>*{pointer-events:none;};label:root;",toString:V}),F=x("production"===process.env.NODE_ENV?{name:"10wde3l",styles:"pointer-events:all!important"}:{name:"3a0g0-active",styles:"pointer-events:all!important;label:active;",toString:V}),M=x("production"===process.env.NODE_ENV?{name:"1wnowod",styles:"display:flex;align-items:center;justify-content:center"}:{name:"xppew7-visible",styles:"display:flex;align-items:center;justify-content:center;label:visible;",toString:V}),_=({modalId:t,onChangeOrder:o})=>{const{BackgroundComponent:r}=Ee(),{modal:i,onClose:a,onChange:l,onConfirm:s,onDestroy:c}=be(t),d=n((e=>{i&&i.closeOnBackdropClick&&i.visible&&a(),e.stopPropagation()}),[i,a]);if(!i)return null;const u=i.manualDestroy?i.alive:i.visible;return e("div",{className:j(T,{[M]:u,[F]:i.closeOnBackdropClick&&u}),onClick:d,children:r&&e(r,{id:i.id,type:i.type,alive:i.alive,visible:i.visible,initiator:i.initiator,manualDestroy:i.manualDestroy,closeOnBackdropClick:i.closeOnBackdropClick,background:i.background,onChange:l,onConfirm:s,onClose:a,onDestroy:c,onChangeOrder:o})})};function L(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}const $=x("production"===process.env.NODE_ENV?{name:"12g0hx0",styles:"pointer-events:none;display:none;position:fixed;inset:0;z-index:1"}:{name:"10jnv7e-root",styles:"pointer-events:none;display:none;position:fixed;inset:0;z-index:1;label:root;",toString:L}),z=x("production"===process.env.NODE_ENV?{name:"16yx055",styles:"display:flex!important;justify-content:center;align-items:center;>*{pointer-events:all;}"}:{name:"127acw3-active",styles:"display:flex!important;justify-content:center;align-items:center;>*{pointer-events:all;};label:active;",toString:L}),A=o((({modal:n,handlers:o})=>{const{title:a,subtitle:l,content:s,footer:c}=r((()=>n),[n]),{onConfirm:d}=r((()=>o),[o]),u=f(d),{TitleComponent:p,SubtitleComponent:m,ContentComponent:b,FooterComponent:y}=Ee();return t(i,{children:[a&&(w(a)?e(p,{children:a}):a),l&&(w(l)?e(m,{children:l}):l),s&&(w(s)?e(b,{children:s}):h(s,{onConfirm:u})),!1!==c&&("function"==typeof c?c({onConfirm:u}):e(y,{onConfirm:u,confirmLabel:c?.confirm,hideConfirm:c?.hideConfirm}))]})})),W=o((({modal:n,handlers:o})=>{const{title:a,subtitle:l,content:s,footer:c}=r((()=>n),[n]),{onConfirm:d,onClose:u}=r((()=>o),[o]),p=f(d),m=f(u),{TitleComponent:b,SubtitleComponent:y,ContentComponent:C,FooterComponent:v}=Ee();return t(i,{children:[a&&(w(a)?e(b,{children:a}):a),l&&(w(l)?e(y,{children:l}):l),s&&(w(s)?e(C,{children:s}):h(s,{onConfirm:p,onCancel:m})),!1!==c&&("function"==typeof c?c({onConfirm:p,onCancel:m}):e(v,{onConfirm:p,onCancel:m,confirmLabel:c?.confirm,cancelLabel:c?.cancel,hideConfirm:c?.hideConfirm,hideCancel:c?.hideCancel}))]})})),Y=o((({modal:l,handlers:s})=>{const{Input:c,defaultValue:d,disabled:u,title:p,subtitle:m,content:y,footer:C}=r((()=>({...l,Input:o(b(l.Input))})),[l]),[v,g]=a(d),{onChange:k,onClose:D,onConfirm:x}=r((()=>s),[s]),j=f(D),B=f((e=>{const t=O(e)?e(v):e;g(t),k(t)})),P=n((()=>{setTimeout((()=>{x()}))}),[x]),N=r((()=>!!v&&!!u?.(v)),[u,v]),{TitleComponent:E,SubtitleComponent:I,ContentComponent:S,FooterComponent:V}=Ee();return t(i,{children:[p&&(w(p)?e(E,{children:p}):p),m&&(w(m)?e(I,{children:m}):m),y&&(w(y)?e(S,{children:y}):h(y,{onConfirm:P,onCancel:j})),c&&e(c,{defaultValue:d,value:v,onChange:B,onConfirm:P}),!1!==C&&("function"==typeof C?C({onConfirm:P,onCancel:j,onChange:B,value:v,disabled:N}):e(V,{onConfirm:P,onCancel:j,disabled:N,confirmLabel:C?.confirm,cancelLabel:C?.cancel,hideConfirm:C?.hideConfirm,hideCancel:C?.hideCancel}))]})})),U=({modalId:n,onChangeOrder:o})=>{const{ForegroundComponent:r}=Ee(),{modal:i,onChange:a,onConfirm:l,onClose:s,onDestroy:c}=be(n);return i?e("div",{className:j($,{[z]:i.manualDestroy?i.alive:i.visible}),children:t(r,{id:i.id,type:i.type,alive:i.alive,visible:i.visible,initiator:i.initiator,manualDestroy:i.manualDestroy,closeOnBackdropClick:i.closeOnBackdropClick,background:i.background,onChange:a,onConfirm:l,onClose:s,onDestroy:c,onChangeOrder:o,children:["alert"===i.type&&e(A,{modal:i,handlers:{onConfirm:l}}),"confirm"===i.type&&e(W,{modal:i,handlers:{onConfirm:l,onClose:s}}),"prompt"===i.type&&e(Y,{modal:i,handlers:{onChange:a,onConfirm:l,onClose:s}})]})}):null},q=e=>{const[t,n]=y();return C((()=>{if(e)return e.subscribe(n)})),t},H=x("production"===process.env.NODE_ENV?{name:"13dmkf4",styles:"position:fixed;inset:0;pointer-events:none;overflow:hidden"}:{name:"1kdr2v-root",styles:"position:fixed;inset:0;pointer-events:none;overflow:hidden;label:root;",toString:function(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}});let G=1;const J=o((({modalId:n})=>{const o=l(null),{modal:r}=be(n);q(r);const i=f((()=>{o.current&&(o.current.style.zIndex=""+G++)}));return t("div",{ref:o,className:H,children:[e(_,{modalId:n,onChangeOrder:i}),e(U,{modalId:n,onChangeOrder:i})]})})),K=(e=0)=>{const{modalIds:t,getModalNode:n}=he();return r((()=>{let e=0;for(const o of t)n(o)?.visible&&e++;return e}),[n,t,e])},Q=({subtype:e,title:t,subtitle:n,content:o,background:r,footer:i,manualDestroy:a,closeOnBackdropClick:l})=>new Promise(((s,c)=>{try{E.open({type:"alert",subtype:e,resolve:()=>s(),title:t,subtitle:n,content:o,background:r,footer:i,manualDestroy:a,closeOnBackdropClick:l})}catch(e){c(e)}})),R=({subtype:e,title:t,subtitle:n,content:o,background:r,footer:i,manualDestroy:a,closeOnBackdropClick:l})=>new Promise(((s,c)=>{try{E.open({type:"confirm",subtype:e,resolve:e=>s(e??!1),title:t,subtitle:n,content:o,background:r,footer:i,manualDestroy:a,closeOnBackdropClick:l})}catch(e){c(e)}})),X=({defaultValue:e,title:t,subtitle:n,content:o,Input:r,disabled:i,returnOnCancel:a,background:l,footer:s,manualDestroy:c,closeOnBackdropClick:d})=>new Promise(((u,p)=>{try{E.open({type:"prompt",resolve:e=>u(e),title:t,subtitle:n,content:o,Input:({defaultValue:e,onChange:t,onConfirm:n})=>r({defaultValue:e,onChange:t,onConfirm:n}),defaultValue:e,disabled:i,returnOnCancel:a,background:l,footer:s,manualDestroy:c,closeOnBackdropClick:d})}catch(e){p(e)}}));
2
2
  /******************************************************************************
3
3
  Copyright (c) Microsoft Corporation.
4
4
 
@@ -14,5 +14,5 @@ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
14
  PERFORMANCE OF THIS SOFTWARE.
15
15
  ***************************************************************************** */
16
16
  /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
17
- function A(e,n,o,t){if("a"===o&&!t)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof n?e!==n||!t:!n.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===o?t:"a"===o?t.call(e):t?t.value:n.get(e)}function E(e,n,o,t,r){if("m"===t)throw new TypeError("Private method is not writable");if("a"===t&&!r)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof n?e!==n||!r:!n.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===t?r.call(e,o):r?r.value=o:n.set(e,o),o}var H,T,$,K,q;"function"==typeof SuppressedError&&SuppressedError;class ee{get alive(){return A(this,H,"f")}get visible(){return A(this,T,"f")}constructor({id:e,initiator:n,title:o,subtitle:t,background:r,manualDestroy:i=!1,closeOnBackdropClick:l=!0,resolve:a}){Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"initiator",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"title",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"subtitle",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"background",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"manualDestroy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"closeOnBackdropClick",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),H.set(this,void 0),T.set(this,void 0),$.set(this,void 0),K.set(this,[]),this.id=e,this.initiator=n,this.title=o,this.subtitle=t,this.background=r,this.manualDestroy=i,this.closeOnBackdropClick=l,E(this,H,!0,"f"),E(this,T,!0,"f"),E(this,$,a,"f")}subscribe(e){return A(this,K,"f").push(e),()=>{E(this,K,A(this,K,"f").filter((n=>n!==e)),"f")}}publish(){for(const e of A(this,K,"f"))e()}resolve(e){A(this,$,"f").call(this,e)}onDestroy(){const e=!0===A(this,H,"f");E(this,H,!1,"f"),this.manualDestroy&&e&&this.publish()}onShow(){const e=!1===A(this,T,"f");E(this,T,!0,"f"),e&&this.publish()}onHide(){const e=!0===A(this,T,"f");E(this,T,!1,"f"),e&&this.publish()}}H=new WeakMap,T=new WeakMap,$=new WeakMap,K=new WeakMap;class ne extends ee{constructor({id:e,initiator:n,type:o,subtype:t,title:r,subtitle:i,content:l,footer:a,background:c,manualDestroy:s,closeOnBackdropClick:u,resolve:d}){super({id:e,initiator:n,title:r,subtitle:i,background:c,manualDestroy:s,closeOnBackdropClick:u,resolve:d}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"subtype",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"content",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"footer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.type=o,this.subtype=t,this.content=l,this.footer=a}onClose(){this.resolve(null)}onConfirm(){this.resolve(null)}}class oe extends ee{constructor({id:e,initiator:n,type:o,subtype:t,title:r,subtitle:i,content:l,footer:a,background:c,manualDestroy:s,closeOnBackdropClick:u,resolve:d}){super({id:e,initiator:n,title:r,subtitle:i,background:c,manualDestroy:s,closeOnBackdropClick:u,resolve:d}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"subtype",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"content",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"footer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.type=o,this.subtype=t,this.content=l,this.footer=a}onClose(){this.resolve(!1)}onConfirm(){this.resolve(!0)}}class te extends ee{constructor({id:e,initiator:n,type:o,title:t,subtitle:r,content:i,defaultValue:l,Input:a,disabled:c,returnOnCancel:s,footer:u,background:d,manualDestroy:b,closeOnBackdropClick:m,resolve:p}){super({id:e,initiator:n,title:t,subtitle:r,background:d,manualDestroy:b,closeOnBackdropClick:m,resolve:p}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"content",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"defaultValue",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"Input",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"disabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"returnOnCancel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"footer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),q.set(this,void 0),this.type=o,this.content=i,this.Input=a,this.defaultValue=l,E(this,q,l,"f"),this.disabled=c,this.returnOnCancel=s,this.footer=u}onChange(e){E(this,q,e,"f")}onConfirm(){this.resolve(A(this,q,"f")??null)}onClose(){this.returnOnCancel?this.resolve(A(this,q,"f")??null):this.resolve(null)}}q=new WeakMap;const re=e=>{switch(e.type){case"alert":return new ne(e);case"confirm":return new oe(e);case"prompt":return new te(e)}throw new Error(`Unknown modal: ${e.type}`,{modal:e})},ie=/^\s*(\d+)\s*(ms|s|m|h)\s*$/,le=e=>{const[,n,o]=e.match(ie)||[];if(!n||!o)return 0;const t=parseInt(n);return"ms"===o?t:"s"===o?1e3*t:"m"===o?60*t*1e3:"h"===o?60*t*60*1e3:0},ae=c({modalIds:[],getModalNode:B,onChange:B,onConfirm:B,onClose:B,onDestroy:B,setUpdater:B,getModal:()=>({modal:void 0,onConfirm:B,onClose:B,onChange:B,onDestroy:B})}),ce=t((({pathname:n,children:t})=>{const i=a(new Map),[c,u]=l([]),d=g(c),b=a(n),m=a(0),p=ke(),h=r((()=>le(p.duration)),[p]);y((()=>{const{manualDestroy:e,closeOnBackdropClick:n}=p;for(const o of x.prerender){const t=re({...o,id:m.current++,initiator:b.current,manualDestroy:void 0!==o.manualDestroy?o.manualDestroy:e,closeOnBackdropClick:void 0!==o.closeOnBackdropClick?o.closeOnBackdropClick:n});i.current.set(t.id,t),u((e=>[...e,t.id]))}x.setupOpen((o=>{const t=re({...o,id:m.current++,initiator:b.current,manualDestroy:void 0!==o.manualDestroy?o.manualDestroy:e,closeOnBackdropClick:void 0!==o.closeOnBackdropClick?o.closeOnBackdropClick:n});i.current.set(t.id,t),u((e=>[...e.filter((e=>{const n=!i.current.get(e)?.alive;return n&&i.current.delete(e),!n})),t.id]))})),x.clearPrerender()})),s((()=>{for(const e of d.current){const o=i.current.get(e);o?.alive&&(o.initiator===n?o.onShow():o.onHide())}b.current=n}),[d,n]);const C=o((e=>i.current.get(e)),[]),f=o((e=>{const n=i.current.get(e);n&&(n.onDestroy(),v.current?.())}),[]),v=a(),I=o((e=>{const n=i.current.get(e);n&&(n.onHide(),v.current?.(),n.manualDestroy||setTimeout((()=>{n.onDestroy()}),h))}),[h]),k=o(((e,n)=>{const o=i.current.get(e);o&&"prompt"===o.type&&o.onChange(n)}),[]),B=o((e=>{const n=i.current.get(e);n&&(n.onConfirm(),I(e))}),[I]),_=o((e=>{const n=i.current.get(e);n&&(n.onClose(),I(e))}),[I]),F=o((e=>({modal:C(e),onConfirm:()=>B(e),onClose:()=>_(e),onChange:n=>k(e,n),onDestroy:()=>f(e)})),[C,B,_,k,f]),Q=r((()=>({modalIds:c,getModalNode:C,onChange:k,onConfirm:B,onClose:_,onDestroy:f,getModal:F,setUpdater:e=>{v.current=e}})),[c,F,C,k,B,_,f]);return e(ae.Provider,{value:Q,children:t})})),se=()=>u(ae),ue=e=>{const{getModal:n}=se();return r((()=>n(e)),[e,n])};F(".Anchor-module__root___7N-Qo{align-items:center;display:flex;inset:0;justify-content:center;pointer-events:none;position:fixed;transition:background-color ease-in-out;z-index:1000}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkFuY2hvci5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZCQUVFLGtCQUFtQixDQURuQixZQUFhLENBSWIsT0FBUSxDQUZSLHNCQUF1QixDQUd2QixtQkFBb0IsQ0FGcEIsY0FBZSxDQUlmLHVDQUF3QyxDQUR4QyxZQUVGIiwiZmlsZSI6IkFuY2hvci5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnJvb3Qge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBpbnNldDogMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHotaW5kZXg6IDEwMDA7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgZWFzZS1pbi1vdXQ7XG59XG4iXX0= */");const de=t((()=>{const[n,o]=C(),{modalIds:t,setUpdater:r}=se();d((()=>{r(o)}),[r,o]);const{options:i}=Ie(),l=Y(n);return e("div",{className:"Anchor-module__root___7N-Qo",style:{transitionDuration:i.duration,backgroundColor:l?i.backdrop:"transparent"},children:t.map((n=>e(J,{modalId:n},n)))})}));var be="styles-module__fallback___g8MEI";F(".styles-module__fallback___g8MEI{margin:unset}.styles-module__frame___1mKAZ{align-items:center;background-color:#fff;border:1px solid #000;display:flex;flex-direction:column;gap:10px;justify-content:center;padding:20px 80px}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0eWxlcy5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlDQUNFLFlBQ0YsQ0FFQSw4QkFJRSxrQkFBbUIsQ0FDbkIscUJBQXVCLENBR3ZCLHFCQUF1QixDQVB2QixZQUFhLENBQ2IscUJBQXNCLENBS3RCLFFBQVMsQ0FKVCxzQkFBdUIsQ0FHdkIsaUJBR0YiLCJmaWxlIjoic3R5bGVzLm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuZmFsbGJhY2sge1xuICBtYXJnaW46IHVuc2V0O1xufVxuXG4uZnJhbWUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gIHBhZGRpbmc6IDIwcHggODBweDtcbiAgZ2FwOiAxMHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcbn1cbiJdfQ== */");const me=({children:n})=>e("h2",{className:be,children:n}),pe=({children:n})=>e("h3",{className:be,children:n}),he=({children:n})=>e("div",{className:be,children:n}),Ce=({confirmLabel:o,hideConfirm:t=!1,cancelLabel:r,hideCancel:i=!1,disabled:l,onConfirm:a,onCancel:c})=>n("div",{children:[!t&&e("button",{onClick:a,disabled:l,children:o||"확인"}),!i&&"function"==typeof c&&e("button",{onClick:c,children:r||"취소"})]}),fe=b((({id:n,onChangeOrder:o,children:t},i)=>{const l=Y(),[a,c]=r((()=>{const e=l>1;return[e?Math.floor(n/5)%3*100:0,e?n%5*35:0]}),[l,n]);return e("div",{ref:i,className:"styles-module__frame___1mKAZ",onClick:o,style:{marginBottom:`calc(25vh + ${a}px)`,marginLeft:`${a}px`,transform:`translate(${c}px, ${c}px)`},children:t})})),ge=()=>{const[e,n]=l(window.location.pathname);return s((()=>{let o;const t=()=>{o&&cancelAnimationFrame(o),e!==window.location.pathname?n(window.location.pathname):o=requestAnimationFrame(t)};return o=requestAnimationFrame(t),()=>{o&&cancelAnimationFrame(o)}}),[e]),{pathname:e}},ye=c({ForegroundComponent:fe,TitleComponent:me,SubtitleComponent:pe,ContentComponent:he,FooterComponent:Ce,options:{duration:w,backdrop:D,manualDestroy:!1,closeOnBackdropClick:!0}}),ve=t((({ForegroundComponent:o,BackgroundComponent:i,TitleComponent:l,SubtitleComponent:c,ContentComponent:s,FooterComponent:u,options:d,usePathname:b,children:p})=>{const{pathname:h}=(b||ge)(),[,g]=C(),y=a(null);f((()=>(y.current=x.anchor("div"),g(),()=>{y.current&&y.current.remove()})));const v=r((()=>({BackgroundComponent:i,ForegroundComponent:o||fe,TitleComponent:l||me,SubtitleComponent:c||pe,ContentComponent:t(s||he),FooterComponent:t(u||Ce),options:{duration:w,backdrop:D,closeOnBackdropClick:!0,manualDestroy:!1,...d}})),[o,i,s,u,c,l,d]);return n(ye.Provider,{value:v,children:[p,y.current&&m(e(ce,{pathname:h,children:e(de,{})}),y.current)]})})),Ie=()=>u(ye),ke=()=>{const{options:e}=u(ye);return e},Be=()=>{const{duration:e}=ke();return{duration:e,milliseconds:le(e)}},_e=()=>{const{backdrop:e}=ke();return e},Fe=(e,n)=>{const{modal:o,onDestroy:t}=ue(e),r=R(o),i=a({modal:o,onDestroy:t,milliseconds:I(n)?le(n):n});d((()=>{const{modal:e,onDestroy:n,milliseconds:o}=i.current;if(!e||e.visible||!e.alive)return;const t=setTimeout((()=>{n()}),o);return()=>{t&&clearTimeout(t)}}),[r])};export{ve as ModalProvider,P as alert,S as confirm,M as prompt,Fe as useDestroyAfter,_e as useModalBackdrop,Be as useModalDuration,ke as useModalOptions,R as useSubscribeModal};
17
+ function Z(e,t,n,o){if("a"===n&&!o)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!o:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?o:"a"===n?o.call(e):o?o.value:t.get(e)}function ee(e,t,n,o,r){if("m"===o)throw new TypeError("Private method is not writable");if("a"===o&&!r)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!r:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===o?r.call(e,n):r?r.value=n:t.set(e,n),n}var te,ne,oe,re,ie;"function"==typeof SuppressedError&&SuppressedError;class ae{get alive(){return Z(this,te,"f")}get visible(){return Z(this,ne,"f")}constructor({id:e,initiator:t,title:n,subtitle:o,background:r,manualDestroy:i=!1,closeOnBackdropClick:a=!0,resolve:l}){Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"initiator",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"title",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"subtitle",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"background",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"manualDestroy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"closeOnBackdropClick",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),te.set(this,void 0),ne.set(this,void 0),oe.set(this,void 0),re.set(this,[]),this.id=e,this.initiator=t,this.title=n,this.subtitle=o,this.background=r,this.manualDestroy=i,this.closeOnBackdropClick=a,ee(this,te,!0,"f"),ee(this,ne,!0,"f"),ee(this,oe,l,"f")}subscribe(e){return Z(this,re,"f").push(e),()=>{ee(this,re,Z(this,re,"f").filter((t=>t!==e)),"f")}}publish(){for(const e of Z(this,re,"f"))e()}resolve(e){Z(this,oe,"f").call(this,e)}onDestroy(){const e=!0===Z(this,te,"f");ee(this,te,!1,"f"),this.manualDestroy&&e&&this.publish()}onShow(){const e=!1===Z(this,ne,"f");ee(this,ne,!0,"f"),e&&this.publish()}onHide(){const e=!0===Z(this,ne,"f");ee(this,ne,!1,"f"),e&&this.publish()}}te=new WeakMap,ne=new WeakMap,oe=new WeakMap,re=new WeakMap;class le extends ae{constructor({id:e,initiator:t,type:n,subtype:o,title:r,subtitle:i,content:a,footer:l,background:s,manualDestroy:c,closeOnBackdropClick:d,resolve:u}){super({id:e,initiator:t,title:r,subtitle:i,background:s,manualDestroy:c,closeOnBackdropClick:d,resolve:u}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"subtype",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"content",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"footer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.type=n,this.subtype=o,this.content=a,this.footer=l}onClose(){this.resolve(null)}onConfirm(){this.resolve(null)}}class se extends ae{constructor({id:e,initiator:t,type:n,subtype:o,title:r,subtitle:i,content:a,footer:l,background:s,manualDestroy:c,closeOnBackdropClick:d,resolve:u}){super({id:e,initiator:t,title:r,subtitle:i,background:s,manualDestroy:c,closeOnBackdropClick:d,resolve:u}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"subtype",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"content",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"footer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.type=n,this.subtype=o,this.content=a,this.footer=l}onClose(){this.resolve(!1)}onConfirm(){this.resolve(!0)}}class ce extends ae{constructor({id:e,initiator:t,type:n,title:o,subtitle:r,content:i,defaultValue:a,Input:l,disabled:s,returnOnCancel:c,footer:d,background:u,manualDestroy:p,closeOnBackdropClick:m,resolve:f}){super({id:e,initiator:t,title:o,subtitle:r,background:u,manualDestroy:p,closeOnBackdropClick:m,resolve:f}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"content",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"defaultValue",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"Input",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"disabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"returnOnCancel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"footer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),ie.set(this,void 0),this.type=n,this.content=i,this.Input=l,this.defaultValue=a,ee(this,ie,a,"f"),this.disabled=s,this.returnOnCancel=c,this.footer=d}onChange(e){ee(this,ie,e,"f")}onConfirm(){this.resolve(Z(this,ie,"f")??null)}onClose(){this.returnOnCancel?this.resolve(Z(this,ie,"f")??null):this.resolve(null)}}ie=new WeakMap;const de=e=>{switch(e.type){case"alert":return new le(e);case"confirm":return new se(e);case"prompt":return new ce(e)}throw new Error(`Unknown modal: ${e.type}`,{modal:e})},ue=/^\s*(\d+)\s*(ms|s|m|h)\s*$/,pe=e=>{const[,t,n]=e.match(ue)||[];if(!t||!n)return 0;const o=parseInt(t);return"ms"===n?o:"s"===n?1e3*o:"m"===n?60*o*1e3:"h"===n?60*o*60*1e3:0},me=s({modalIds:[],getModalNode:D,onChange:D,onConfirm:D,onClose:D,onDestroy:D,setUpdater:D,getModal:()=>({modal:void 0,onConfirm:D,onClose:D,onChange:D,onDestroy:D})}),fe=o((({pathname:t,children:o})=>{const i=l(new Map),[s,d]=a([]),u=v(s),p=l(t),m=l(0),f=Ie(),h=r((()=>pe(f.duration)),[f]);g((()=>{const{manualDestroy:e,closeOnBackdropClick:t}=f;for(const n of E.prerender){const o=de({...n,id:m.current++,initiator:p.current,manualDestroy:void 0!==n.manualDestroy?n.manualDestroy:e,closeOnBackdropClick:void 0!==n.closeOnBackdropClick?n.closeOnBackdropClick:t});i.current.set(o.id,o),d((e=>[...e,o.id]))}E.setupOpen((n=>{const o=de({...n,id:m.current++,initiator:p.current,manualDestroy:void 0!==n.manualDestroy?n.manualDestroy:e,closeOnBackdropClick:void 0!==n.closeOnBackdropClick?n.closeOnBackdropClick:t});i.current.set(o.id,o),d((e=>[...e.filter((e=>{const t=!i.current.get(e)?.alive;return t&&i.current.delete(e),!t})),o.id]))})),E.clearPrerender()})),c((()=>{for(const e of u.current){const n=i.current.get(e);n?.alive&&(n.initiator===t?n.onShow():n.onHide())}p.current=t}),[u,t]);const b=n((e=>i.current.get(e)),[]),y=n((e=>{const t=i.current.get(e);t&&(t.onDestroy(),C.current?.())}),[]),C=l(),k=n((e=>{const t=i.current.get(e);t&&(t.onHide(),C.current?.(),t.manualDestroy||setTimeout((()=>{t.onDestroy()}),h))}),[h]),w=n(((e,t)=>{const n=i.current.get(e);n&&"prompt"===n.type&&n.onChange(t)}),[]),O=n((e=>{const t=i.current.get(e);t&&(t.onConfirm(),k(e))}),[k]),D=n((e=>{const t=i.current.get(e);t&&(t.onClose(),k(e))}),[k]),x=n((e=>({modal:b(e),onConfirm:()=>O(e),onClose:()=>D(e),onChange:t=>w(e,t),onDestroy:()=>y(e)})),[b,O,D,w,y]),j=r((()=>({modalIds:s,getModalNode:b,onChange:w,onConfirm:O,onClose:D,onDestroy:y,getModal:x,setUpdater:e=>{C.current=e}})),[s,x,b,w,O,D,y]);return e(me.Provider,{value:j,children:o})})),he=()=>d(me),be=e=>{const{getModal:t}=he();return r((()=>t(e)),[e,t])},ye=x("production"===process.env.NODE_ENV?{name:"2hpasy",styles:"display:flex;align-items:center;justify-content:center;position:fixed;inset:0;pointer-events:none;z-index:1000;transition:background-color ease-in-out"}:{name:"khha1y-root",styles:"display:flex;align-items:center;justify-content:center;position:fixed;inset:0;pointer-events:none;z-index:1000;transition:background-color ease-in-out;label:root;",toString:function(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}}),Ce=o(b((()=>{const[t,n]=y(),{modalIds:o,setUpdater:r}=he();u((()=>{r(n)}),[r,n]);const{options:i}=Ee(),a=K(t);return e("div",{className:ye,style:{transitionDuration:i.duration,backgroundColor:a?i.backdrop:"transparent"},children:o.map((t=>e(J,{modalId:t},t)))})})));function ve(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}const ge=x("production"===process.env.NODE_ENV?{name:"131j9g2",styles:"margin:unset"}:{name:"1w3kbco-fallback",styles:"margin:unset;label:fallback;",toString:ve}),ke=x("production"===process.env.NODE_ENV?{name:"1kuk3a3",styles:"display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:white;padding:20px 80px;gap:10px;border:1px solid black"}:{name:"16dbbea-frame",styles:"display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:white;padding:20px 80px;gap:10px;border:1px solid black;label:frame;",toString:ve}),we=({children:t})=>e("h2",{className:ge,children:t}),Oe=({children:t})=>e("h3",{className:ge,children:t}),De=({children:t})=>e("div",{className:ge,children:t}),xe=({confirmLabel:n,hideConfirm:o=!1,cancelLabel:r,hideCancel:i=!1,disabled:a,onConfirm:l,onCancel:s})=>t("div",{children:[!o&&e("button",{onClick:l,disabled:a,children:n||"확인"}),!i&&"function"==typeof s&&e("button",{onClick:s,children:r||"취소"})]}),je=p((({id:t,onChangeOrder:n,children:o},i)=>{const a=K(),[l,s]=r((()=>{const e=a>1;return[e?Math.floor(t/5)%3*100:0,e?t%5*35:0]}),[a,t]);return e("div",{ref:i,className:ke,onClick:n,style:{marginBottom:`calc(25vh + ${l}px)`,marginLeft:`${l}px`,transform:`translate(${s}px, ${s}px)`},children:o})})),Be=()=>{const[e,t]=a(window.location.pathname);return c((()=>{let n;const o=()=>{n&&cancelAnimationFrame(n),e!==window.location.pathname?t(window.location.pathname):n=requestAnimationFrame(o)};return n=requestAnimationFrame(o),()=>{n&&cancelAnimationFrame(n)}}),[e]),{pathname:e}},Pe=s({ForegroundComponent:je,TitleComponent:we,SubtitleComponent:Oe,ContentComponent:De,FooterComponent:xe,options:{duration:I,backdrop:S,manualDestroy:!1,closeOnBackdropClick:!0}}),Ne=o((({ForegroundComponent:n,BackgroundComponent:i,TitleComponent:a,SubtitleComponent:s,ContentComponent:c,FooterComponent:d,options:u,usePathname:p,children:f})=>{const{pathname:h}=(p||Be)(),[,b]=y(),v=l(null);C((()=>(v.current=E.anchor("div"),b(),()=>{v.current&&v.current.remove()})));const g=r((()=>({BackgroundComponent:i,ForegroundComponent:n||je,TitleComponent:a||we,SubtitleComponent:s||Oe,ContentComponent:o(c||De),FooterComponent:o(d||xe),options:{duration:I,backdrop:S,closeOnBackdropClick:!0,manualDestroy:!1,...u}})),[n,i,c,d,s,a,u]);return t(Pe.Provider,{value:g,children:[f,v.current&&m(e(fe,{pathname:h,children:e(Ce,{})}),v.current)]})})),Ee=()=>d(Pe),Ie=()=>{const{options:e}=d(Pe);return e},Se=()=>{const{duration:e}=Ie();return{duration:e,milliseconds:pe(e)}},Ve=()=>{const{backdrop:e}=Ie();return e},Te=(e,t)=>{const{modal:n,onDestroy:o}=be(e),r=q(n),i=l({modal:n,onDestroy:o,milliseconds:w(t)?pe(t):t});u((()=>{const{modal:e,onDestroy:t,milliseconds:n}=i.current;if(!e||e.visible||!e.alive)return;const o=setTimeout((()=>{t()}),n);return()=>{o&&clearTimeout(o)}}),[r])};export{Ne as ModalProvider,Q as alert,R as confirm,X as prompt,Te as useDestroyAfter,Ve as useModalBackdrop,Se as useModalDuration,Ie as useModalOptions,q as useSubscribeModal};
18
18
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/app/ModalManager.ts","../src/app/constant.ts","../src/components/Background/Background.tsx","../src/components/Foreground/components/AlertInner.tsx","../src/components/Foreground/components/ConfirmInner.tsx","../src/components/Foreground/components/PromptInner.tsx","../src/components/Foreground/Foreground.tsx","../src/hooks/useSubscribeModal.ts","../src/components/Presenter/Presenter.tsx","../src/hooks/useActiveModalCount.ts","../src/core/handle/alert.ts","../src/core/handle/confirm.ts","../src/core/handle/prompt.ts","../src/core/node/ModalNode/AbstractBaseNode.ts","../src/core/node/ModalNode/AlertNode.ts","../src/core/node/ModalNode/ConfirmNode.ts","../src/core/node/ModalNode/PromptNode.ts","../src/core/node/nodeFactory.ts","../src/helpers/getMillisecondsFromDuration.ts","../src/providers/ModalDataContext/ModalDataContext.ts","../src/providers/ModalDataContext/ModalDataContextProvider.tsx","../src/providers/ModalDataContext/useModalDataContext.ts","../src/components/Anchor/Anchor.tsx","../src/components/FallbackComponents/FallbackTitle.tsx","../src/components/FallbackComponents/FallbackSubtitle.tsx","../src/components/FallbackComponents/FallbackContent.tsx","../src/components/FallbackComponents/FallbackFooter.tsx","../src/components/FallbackComponents/FallbackForegroundFrame.tsx","../src/hooks/useDefaultPathname.ts","../src/providers/ModalContext/ModalContext.ts","../src/providers/ModalContext/ModalContextProvider.tsx","../src/providers/ModalContext/useModalContext.ts","../src/hooks/useDestroyAfter.ts"],"sourcesContent":["import { MutableRefObject } from 'react';\n\nimport { getRandomNumber } from '@winglet/common-utils';\n\nimport type { Fn } from '@aileron/types';\n\nimport type { Modal } from '@/promise-modal/types';\n\nconst prerenderListRef: MutableRefObject<Modal[]> = {\n current: [],\n};\n\nconst openModalRef: MutableRefObject<Fn<[Modal], void>> = {\n current: (modal: Modal) => {\n prerenderListRef.current.push(modal);\n },\n};\n\nconst anchorRef: MutableRefObject<HTMLElement | null> = {\n current: null,\n};\n\nexport const ModalManager = {\n get prerender() {\n return prerenderListRef.current;\n },\n clearPrerender() {\n prerenderListRef.current = [];\n },\n open(modal: Modal) {\n openModalRef.current(modal);\n },\n setupOpen(open: (modal: Modal) => void) {\n openModalRef.current = open;\n },\n anchor(name: string, label = 'modal-anchor'): HTMLElement {\n if (anchorRef.current) {\n const anchor = document.getElementById(anchorRef.current.id);\n if (anchor) return anchor;\n }\n const node = document.createElement(name);\n node.setAttribute('id', `${label}-${getRandomNumber()}`);\n document.body.appendChild(node);\n anchorRef.current = node;\n return node;\n },\n};\n","import type { Color, Duration } from '@aileron/types';\n\nexport const DEFAULT_ANIMATION_DURATION: Duration = '300ms';\n\nexport const DEFAULT_BACKDROP_COLOR: Color = 'rgba(0, 0, 0, 0.5)';\n","import { type MouseEvent, useCallback } from 'react';\n\nimport cx from 'clsx';\n\nimport { useModal, useModalContext } from '@/promise-modal/providers';\nimport type { ModalLayerProps } from '@/promise-modal/types';\n\nimport styles from './Background.module.css';\n\nexport const Background = ({ modalId, onChangeOrder }: ModalLayerProps) => {\n const { BackgroundComponent } = useModalContext();\n const { modal, onClose, onChange, onConfirm, onDestroy } = useModal(modalId);\n\n const handleClose = useCallback(\n (event: MouseEvent) => {\n if (modal && modal.closeOnBackdropClick && modal.visible) onClose();\n event.stopPropagation();\n },\n [modal, onClose],\n );\n\n if (!modal) return null;\n\n const visible = modal.manualDestroy ? modal.alive : modal.visible;\n\n return (\n <div\n className={cx(styles.root, {\n [styles.visible]: visible,\n [styles.active]: modal.closeOnBackdropClick && visible,\n })}\n onClick={handleClose}\n >\n {BackgroundComponent && (\n <BackgroundComponent\n id={modal.id}\n type={modal.type}\n alive={modal.alive}\n visible={modal.visible}\n initiator={modal.initiator}\n manualDestroy={modal.manualDestroy}\n closeOnBackdropClick={modal.closeOnBackdropClick}\n background={modal.background}\n onChange={onChange}\n onConfirm={onConfirm}\n onClose={onClose}\n onDestroy={onDestroy}\n onChangeOrder={onChangeOrder}\n />\n )}\n </div>\n );\n};\n","import { Fragment, memo, useMemo } from 'react';\n\nimport { isString } from '@winglet/common-utils';\nimport { renderComponent, useHandle } from '@winglet/react-utils';\n\nimport type { AlertNode } from '@/promise-modal/core';\nimport { useModalContext } from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface AlertInnerProps<B> {\n modal: AlertNode<B>;\n handlers: Pick<ModalActions, 'onConfirm'>;\n}\n\nexport const AlertInner = memo(\n <B,>({ modal, handlers }: AlertInnerProps<B>) => {\n const { title, subtitle, content, footer } = useMemo(() => modal, [modal]);\n const { onConfirm } = useMemo(() => handlers, [handlers]);\n\n const handleConfirm = useHandle(onConfirm);\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useModalContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? <TitleComponent>{title}</TitleComponent> : title)}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent>{subtitle}</SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent>{content}</ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n })\n ))}\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({ onConfirm: handleConfirm })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n confirmLabel={footer?.confirm}\n hideConfirm={footer?.hideConfirm}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { Fragment, memo, useMemo } from 'react';\n\nimport { isString } from '@winglet/common-utils';\nimport { renderComponent, useHandle } from '@winglet/react-utils';\n\nimport type { ConfirmNode } from '@/promise-modal/core';\nimport { useModalContext } from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface ConfirmInnerProps<B> {\n modal: ConfirmNode<B>;\n handlers: Pick<ModalActions, 'onConfirm' | 'onClose'>;\n}\n\nexport const ConfirmInner = memo(\n <B,>({ modal, handlers }: ConfirmInnerProps<B>) => {\n const { title, subtitle, content, footer } = useMemo(() => modal, [modal]);\n const { onConfirm, onClose } = useMemo(() => handlers, [handlers]);\n\n const handleConfirm = useHandle(onConfirm);\n const handleClose = useHandle(onClose);\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useModalContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? <TitleComponent>{title}</TitleComponent> : title)}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent>{subtitle}</SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent>{content}</ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n onCancel: handleClose,\n })\n ))}\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n onConfirm: handleConfirm,\n onCancel: handleClose,\n })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n onCancel={handleClose}\n confirmLabel={footer?.confirm}\n cancelLabel={footer?.cancel}\n hideConfirm={footer?.hideConfirm}\n hideCancel={footer?.hideCancel}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { Fragment, memo, useCallback, useMemo, useState } from 'react';\n\nimport { isFunction, isString } from '@winglet/common-utils';\nimport { renderComponent, useHandle } from '@winglet/react-utils';\n\nimport type { PromptNode } from '@/promise-modal/core';\nimport { useModalContext } from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface PromptInnerProps<T, B> {\n modal: PromptNode<T, B>;\n handlers: Pick<ModalActions, 'onChange' | 'onClose' | 'onConfirm'>;\n}\n\nexport const PromptInner = memo(\n <T, B>({ modal, handlers }: PromptInnerProps<T, B>) => {\n const {\n Input,\n defaultValue,\n disabled: checkDisabled,\n title,\n subtitle,\n content,\n footer,\n } = useMemo(\n () => ({\n ...modal,\n Input: memo(modal.Input),\n }),\n [modal],\n );\n\n const [value, setValue] = useState<T | undefined>(defaultValue);\n\n const { onChange, onClose, onConfirm } = useMemo(\n () => handlers,\n [handlers],\n );\n\n const handleClose = useHandle(onClose);\n const handleChange = useHandle(\n (inputValue?: T | ((prevState: T | undefined) => T | undefined)) => {\n const input = isFunction(inputValue) ? inputValue(value) : inputValue;\n setValue(input);\n onChange(input);\n },\n );\n\n const handleConfirm = useCallback(() => {\n // NOTE: wait for the next tick to ensure the value is updated\n setTimeout(() => {\n onConfirm();\n });\n }, [onConfirm]);\n\n const disabled = useMemo(\n () => (value ? !!checkDisabled?.(value) : false),\n [checkDisabled, value],\n );\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useModalContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? <TitleComponent>{title}</TitleComponent> : title)}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent>{subtitle}</SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent>{content}</ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n onCancel: handleClose,\n })\n ))}\n\n {Input && (\n <Input\n defaultValue={defaultValue}\n value={value}\n onChange={handleChange}\n onConfirm={handleConfirm}\n />\n )}\n\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n onConfirm: handleConfirm,\n onCancel: handleClose,\n onChange: handleChange,\n value,\n disabled,\n })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n onCancel={handleClose}\n disabled={disabled}\n confirmLabel={footer?.confirm}\n cancelLabel={footer?.cancel}\n hideConfirm={footer?.hideConfirm}\n hideCancel={footer?.hideCancel}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import cx from 'clsx';\n\nimport { useModal, useModalContext } from '@/promise-modal/providers';\nimport type { ModalLayerProps } from '@/promise-modal/types';\n\nimport styles from './Foreground.module.css';\nimport { AlertInner, ConfirmInner, PromptInner } from './components';\n\nexport const Foreground = ({ modalId, onChangeOrder }: ModalLayerProps) => {\n const { ForegroundComponent } = useModalContext();\n\n const { modal, onChange, onConfirm, onClose, onDestroy } = useModal(modalId);\n\n if (!modal) return null;\n\n return (\n <div\n className={cx(styles.root, {\n [styles.active]: modal.manualDestroy ? modal.alive : modal.visible,\n })}\n >\n <ForegroundComponent\n id={modal.id}\n type={modal.type}\n alive={modal.alive}\n visible={modal.visible}\n initiator={modal.initiator}\n manualDestroy={modal.manualDestroy}\n closeOnBackdropClick={modal.closeOnBackdropClick}\n background={modal.background}\n onChange={onChange}\n onConfirm={onConfirm}\n onClose={onClose}\n onDestroy={onDestroy}\n onChangeOrder={onChangeOrder}\n >\n {modal.type === 'alert' && (\n <AlertInner modal={modal} handlers={{ onConfirm }} />\n )}\n {modal.type === 'confirm' && (\n <ConfirmInner modal={modal} handlers={{ onConfirm, onClose }} />\n )}\n {modal.type === 'prompt' && (\n <PromptInner\n modal={modal}\n handlers={{ onChange, onConfirm, onClose }}\n />\n )}\n </ForegroundComponent>\n </div>\n );\n};\n","import { useOnMount, useTick } from '@winglet/react-utils';\n\nimport type { ModalNode } from '@/promise-modal/core';\n\nexport const useSubscribeModal = (modal?: ModalNode) => {\n const [tick, update] = useTick();\n useOnMount(() => {\n if (!modal) return;\n const unsubscribe = modal.subscribe(update);\n return unsubscribe;\n });\n return tick;\n};\n","import { memo, useRef } from 'react';\n\nimport { useHandle } from '@winglet/react-utils';\n\nimport { Background } from '@/promise-modal/components/Background';\nimport { Foreground } from '@/promise-modal/components/Foreground';\nimport { useSubscribeModal } from '@/promise-modal/hooks/useSubscribeModal';\nimport { useModal } from '@/promise-modal/providers';\nimport type { ModalIdProps } from '@/promise-modal/types';\n\nimport styles from './Presenter.module.css';\n\nlet zIndex = 1;\n\nexport const Presenter = memo(({ modalId }: ModalIdProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { modal } = useModal(modalId);\n useSubscribeModal(modal);\n const handleChangeOrder = useHandle(() => {\n if (ref.current) {\n ref.current.style.zIndex = `${zIndex++}`;\n }\n });\n return (\n <div ref={ref} className={styles.modal}>\n <Background modalId={modalId} onChangeOrder={handleChangeOrder} />\n <Foreground modalId={modalId} onChangeOrder={handleChangeOrder} />\n </div>\n );\n});\n","import { useMemo } from 'react';\n\nimport { useModalDataContext } from '../providers';\n\nexport const useActiveModalCount = (tick: string | number = 0) => {\n const { modalIds, getModalNode } = useModalDataContext();\n return useMemo(() => {\n let count = 0;\n for (const id of modalIds) {\n if (getModalNode(id)?.visible) count++;\n }\n return count;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getModalNode, modalIds, tick]);\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n AlertContentProps,\n AlertFooterRender,\n FooterOptions,\n ModalBackground,\n} from '@/promise-modal/types';\n\ninterface AlertProps<B> {\n subtype?: 'info' | 'success' | 'warning' | 'error';\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<AlertContentProps>;\n background?: ModalBackground<B>;\n footer?:\n | AlertFooterRender\n | Pick<FooterOptions, 'confirm' | 'hideConfirm'>\n | false;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n}\n\nexport const alert = <B = any>({\n subtype,\n title,\n subtitle,\n content,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n}: AlertProps<B>) => {\n return new Promise<void>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'alert',\n subtype,\n resolve: () => resolve(),\n title,\n subtitle,\n content,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n ConfirmContentProps,\n ConfirmFooterRender,\n FooterOptions,\n ModalBackground,\n} from '@/promise-modal/types';\n\ninterface ConfirmProps<B> {\n subtype?: 'info' | 'success' | 'warning' | 'error';\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<ConfirmContentProps>;\n background?: ModalBackground<B>;\n footer?: ConfirmFooterRender | FooterOptions | false;\n closeOnBackdropClick?: boolean;\n manualDestroy?: boolean;\n}\n\nexport const confirm = <B = any>({\n subtype,\n title,\n subtitle,\n content,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n}: ConfirmProps<B>) => {\n return new Promise<boolean>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'confirm',\n subtype,\n resolve: (result) => resolve(result ?? false),\n title,\n subtitle,\n content,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n FooterOptions,\n ModalBackground,\n PromptContentProps,\n PromptFooterRender,\n PromptInputProps,\n} from '@/promise-modal/types';\n\nimport { ModalManager } from '../../app/ModalManager';\n\ninterface PromptProps<T, B = any> {\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<PromptContentProps>;\n Input: (props: PromptInputProps<T>) => ReactNode;\n defaultValue?: T;\n disabled?: (value: T) => boolean;\n returnOnCancel?: boolean;\n background?: ModalBackground<B>;\n footer?: PromptFooterRender<T> | FooterOptions | false;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n}\n\nexport const prompt = <T, B = any>({\n defaultValue,\n title,\n subtitle,\n content,\n Input,\n disabled,\n returnOnCancel,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n}: PromptProps<T, B>) => {\n return new Promise<T>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'prompt',\n resolve: (result) => resolve(result as T),\n title,\n subtitle,\n content,\n Input: ({ defaultValue, onChange, onConfirm }: PromptInputProps<T>) =>\n Input({\n defaultValue,\n onChange,\n onConfirm,\n }),\n defaultValue,\n disabled,\n returnOnCancel,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ReactNode } from 'react';\n\nimport type { Fn } from '@aileron/types';\n\nimport type {\n BaseModal,\n ManagedEntity,\n ModalBackground,\n} from '@/promise-modal/types';\n\ntype BaseNodeProps<T, B> = BaseModal<T, B> & ManagedEntity;\n\nexport abstract class BaseNode<T, B> {\n readonly id: number;\n readonly initiator: string;\n\n readonly title?: ReactNode;\n readonly subtitle?: ReactNode;\n readonly background?: ModalBackground<B>;\n\n readonly manualDestroy: boolean;\n readonly closeOnBackdropClick: boolean;\n\n #alive: boolean;\n get alive() {\n return this.#alive;\n }\n #visible: boolean;\n get visible() {\n return this.#visible;\n }\n\n #resolve: (result: T | null) => void;\n #listeners: Fn[] = [];\n\n constructor({\n id,\n initiator,\n title,\n subtitle,\n background,\n manualDestroy = false,\n closeOnBackdropClick = true,\n resolve,\n }: BaseNodeProps<T, B>) {\n this.id = id;\n this.initiator = initiator;\n this.title = title;\n this.subtitle = subtitle;\n this.background = background;\n this.manualDestroy = manualDestroy;\n this.closeOnBackdropClick = closeOnBackdropClick;\n\n this.#alive = true;\n this.#visible = true;\n this.#resolve = resolve;\n }\n\n subscribe(listener: Fn) {\n this.#listeners.push(listener);\n return () => {\n this.#listeners = this.#listeners.filter((l) => l !== listener);\n };\n }\n publish() {\n for (const listener of this.#listeners) listener();\n }\n protected resolve(result: T | null) {\n this.#resolve(result);\n }\n onDestroy() {\n const needPublish = this.#alive === true;\n this.#alive = false;\n if (this.manualDestroy && needPublish) this.publish();\n }\n onShow() {\n const needPublish = this.#visible === false;\n this.#visible = true;\n if (needPublish) this.publish();\n }\n onHide() {\n const needPublish = this.#visible === true;\n this.#visible = false;\n if (needPublish) this.publish();\n }\n abstract onClose(): void;\n abstract onConfirm(): void;\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n AlertContentProps,\n AlertFooterRender,\n AlertModal,\n FooterOptions,\n ManagedEntity,\n} from '@/promise-modal/types';\n\nimport { BaseNode } from './AbstractBaseNode';\n\ntype AlertNodeProps<B> = AlertModal<B> & ManagedEntity;\n\nexport class AlertNode<B> extends BaseNode<null, B> {\n readonly type: 'alert';\n readonly subtype?: 'info' | 'success' | 'warning' | 'error';\n readonly content?: ReactNode | ComponentType<AlertContentProps>;\n readonly footer?:\n | AlertFooterRender\n | Pick<FooterOptions, 'confirm' | 'hideConfirm'>\n | false;\n\n constructor({\n id,\n initiator,\n type,\n subtype,\n title,\n subtitle,\n content,\n footer,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n }: AlertNodeProps<B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n });\n this.type = type;\n this.subtype = subtype;\n this.content = content;\n this.footer = footer;\n }\n onClose() {\n this.resolve(null);\n }\n onConfirm() {\n this.resolve(null);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n ConfirmContentProps,\n ConfirmFooterRender,\n ConfirmModal,\n FooterOptions,\n ManagedEntity,\n} from '@/promise-modal/types';\n\nimport { BaseNode } from './AbstractBaseNode';\n\ntype ConfirmNodeProps<B> = ConfirmModal<B> & ManagedEntity;\n\nexport class ConfirmNode<B> extends BaseNode<boolean, B> {\n readonly type: 'confirm';\n readonly subtype?: 'info' | 'success' | 'warning' | 'error';\n readonly content?: ReactNode | ComponentType<ConfirmContentProps>;\n readonly footer?: ConfirmFooterRender | FooterOptions | false;\n\n constructor({\n id,\n initiator,\n type,\n subtype,\n title,\n subtitle,\n content,\n footer,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n }: ConfirmNodeProps<B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n });\n this.type = type;\n this.subtype = subtype;\n this.content = content;\n this.footer = footer;\n }\n onClose() {\n this.resolve(false);\n }\n onConfirm() {\n this.resolve(true);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n FooterOptions,\n ManagedEntity,\n PromptContentProps,\n PromptFooterRender,\n PromptInputProps,\n PromptModal,\n} from '@/promise-modal/types';\n\nimport { BaseNode } from './AbstractBaseNode';\n\ntype PromptNodeProps<T, B> = PromptModal<T, B> & ManagedEntity;\n\nexport class PromptNode<T, B> extends BaseNode<T, B> {\n readonly type: 'prompt';\n readonly content?: ReactNode | ComponentType<PromptContentProps>;\n readonly defaultValue: T | undefined;\n readonly Input: (props: PromptInputProps<T>) => ReactNode;\n readonly disabled?: (value: T) => boolean;\n readonly returnOnCancel?: boolean;\n readonly footer?: PromptFooterRender<T> | FooterOptions | false;\n #value: T | undefined;\n\n constructor({\n id,\n initiator,\n type,\n title,\n subtitle,\n content,\n defaultValue,\n Input,\n disabled,\n returnOnCancel,\n footer,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n }: PromptNodeProps<T, B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n });\n this.type = type;\n this.content = content;\n this.Input = Input;\n this.defaultValue = defaultValue;\n this.#value = defaultValue;\n this.disabled = disabled;\n this.returnOnCancel = returnOnCancel;\n this.footer = footer;\n }\n\n onChange(value: T) {\n this.#value = value;\n }\n onConfirm() {\n this.resolve(this.#value ?? null);\n }\n onClose() {\n if (this.returnOnCancel) this.resolve(this.#value ?? null);\n else this.resolve(null);\n }\n}\n","import type { ManagedModal } from '@/promise-modal/types';\n\nimport { AlertNode, ConfirmNode, PromptNode } from './ModalNode';\n\nexport const nodeFactory = <T, B>(modal: ManagedModal<T, B>) => {\n switch (modal.type) {\n case 'alert':\n return new AlertNode<B>(modal);\n case 'confirm':\n return new ConfirmNode<B>(modal);\n case 'prompt':\n return new PromptNode<T, B>(modal);\n }\n // @ts-expect-error: This state is unreachable by design and should NEVER occur.\n throw new Error(`Unknown modal: ${modal.type}`, { modal });\n};\n","const DURATION_REGEX = /^\\s*(\\d+)\\s*(ms|s|m|h)\\s*$/;\n\nexport const getMillisecondsFromDuration = (input: string) => {\n const [, durationString, unit] = input.match(DURATION_REGEX) || [];\n if (!durationString || !unit) return 0;\n const duration = parseInt(durationString);\n if (unit === 'ms') return duration;\n if (unit === 's') return duration * 1000;\n if (unit === 'm') return duration * 60 * 1000;\n if (unit === 'h') return duration * 60 * 60 * 1000;\n else return 0;\n};\n","import { createContext } from 'react';\n\nimport { undefinedFunction } from '@winglet/common-utils';\n\nimport type { Fn } from '@aileron/types';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport type { ModalActions, ModalHandlersWithId } from '@/promise-modal/types';\n\nexport interface ModalDataContextProps extends ModalHandlersWithId {\n modalIds: ModalNode['id'][];\n getModal: Fn<[id: ModalNode['id']], ModalActions>;\n getModalNode: Fn<[id: ModalNode['id']], ModalNode | undefined>;\n setUpdater: Fn<[updater: Fn]>;\n}\n\nexport const ModalDataContext = createContext<ModalDataContextProps>({\n modalIds: [],\n getModalNode: undefinedFunction,\n onChange: undefinedFunction,\n onConfirm: undefinedFunction,\n onClose: undefinedFunction,\n onDestroy: undefinedFunction,\n setUpdater: undefinedFunction,\n getModal: () => ({\n modal: undefined,\n onConfirm: undefinedFunction,\n onClose: undefinedFunction,\n onChange: undefinedFunction,\n onDestroy: undefinedFunction,\n }),\n});\n","import {\n type PropsWithChildren,\n memo,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { useOnMountLayout, useReference } from '@winglet/react-utils';\n\nimport type { Fn } from '@aileron/types';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport { type ModalNode, nodeFactory } from '@/promise-modal/core';\nimport { getMillisecondsFromDuration } from '@/promise-modal/helpers/getMillisecondsFromDuration';\nimport { useModalOptions } from '@/promise-modal/providers';\nimport type { Modal } from '@/promise-modal/types';\n\nimport { ModalDataContext } from './ModalDataContext';\n\ninterface ModalDataContextProviderProps {\n pathname: string;\n}\n\nexport const ModalDataContextProvider = memo(\n ({\n pathname,\n children,\n }: PropsWithChildren<ModalDataContextProviderProps>) => {\n const modalDictionary = useRef<Map<ModalNode['id'], ModalNode>>(new Map());\n\n const [modalIds, setModalIds] = useState<ModalNode['id'][]>([]);\n const modalIdsRef = useReference(modalIds);\n\n const initiator = useRef(pathname);\n const modalIdSequence = useRef(0);\n\n const options = useModalOptions();\n\n const duration = useMemo(\n () => getMillisecondsFromDuration(options.duration),\n [options],\n );\n\n useOnMountLayout(() => {\n const { manualDestroy, closeOnBackdropClick } = options;\n\n for (const data of ModalManager.prerender) {\n const modal = nodeFactory({\n ...data,\n id: modalIdSequence.current++,\n initiator: initiator.current,\n manualDestroy:\n data.manualDestroy !== undefined\n ? data.manualDestroy\n : manualDestroy,\n closeOnBackdropClick:\n data.closeOnBackdropClick !== undefined\n ? data.closeOnBackdropClick\n : closeOnBackdropClick,\n });\n modalDictionary.current.set(modal.id, modal);\n setModalIds((ids) => [...ids, modal.id]);\n }\n\n ModalManager.setupOpen((data: Modal) => {\n const modal = nodeFactory({\n ...data,\n id: modalIdSequence.current++,\n initiator: initiator.current,\n manualDestroy:\n data.manualDestroy !== undefined\n ? data.manualDestroy\n : manualDestroy,\n closeOnBackdropClick:\n data.closeOnBackdropClick !== undefined\n ? data.closeOnBackdropClick\n : closeOnBackdropClick,\n });\n modalDictionary.current.set(modal.id, modal);\n setModalIds((ids) => {\n const aliveIds = ids.filter((id) => {\n const destroyed = !modalDictionary.current.get(id)?.alive;\n if (destroyed) modalDictionary.current.delete(id);\n return !destroyed;\n });\n return [...aliveIds, modal.id];\n });\n });\n ModalManager.clearPrerender();\n });\n\n useLayoutEffect(() => {\n for (const id of modalIdsRef.current) {\n const modal = modalDictionary.current.get(id);\n if (!modal?.alive) continue;\n if (modal.initiator === pathname) modal.onShow();\n else modal.onHide();\n }\n initiator.current = pathname;\n }, [modalIdsRef, pathname]);\n\n const getModalNode = useCallback((modalId: ModalNode['id']) => {\n return modalDictionary.current.get(modalId);\n }, []);\n\n const onDestroy = useCallback((modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onDestroy();\n updaterRef.current?.();\n }, []);\n\n const updaterRef = useRef<Fn>();\n const hideModal = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onHide();\n updaterRef.current?.();\n if (!modal.manualDestroy)\n setTimeout(() => {\n modal.onDestroy();\n }, duration);\n },\n [duration],\n );\n\n const onChange = useCallback((modalId: ModalNode['id'], value: any) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n if (modal.type === 'prompt') modal.onChange(value);\n }, []);\n\n const onConfirm = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onConfirm();\n hideModal(modalId);\n },\n [hideModal],\n );\n\n const onClose = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onClose();\n hideModal(modalId);\n },\n [hideModal],\n );\n\n const getModal = useCallback(\n (modalId: ModalNode['id']) => ({\n modal: getModalNode(modalId),\n onConfirm: () => onConfirm(modalId),\n onClose: () => onClose(modalId),\n onChange: (value: any) => onChange(modalId, value),\n onDestroy: () => onDestroy(modalId),\n }),\n [getModalNode, onConfirm, onClose, onChange, onDestroy],\n );\n\n const value = useMemo(() => {\n return {\n modalIds,\n getModalNode,\n onChange,\n onConfirm,\n onClose,\n onDestroy,\n getModal,\n setUpdater: (updater: Fn) => {\n updaterRef.current = updater;\n },\n };\n }, [\n modalIds,\n getModal,\n getModalNode,\n onChange,\n onConfirm,\n onClose,\n onDestroy,\n ]);\n\n return (\n <ModalDataContext.Provider value={value}>\n {children}\n </ModalDataContext.Provider>\n );\n },\n);\n","import { useContext, useMemo } from 'react';\n\nimport type { ManagedModal } from '@/promise-modal/types';\n\nimport { ModalDataContext } from './ModalDataContext';\n\nexport const useModalDataContext = () => useContext(ModalDataContext);\n\nexport const useModal = (id: ManagedModal['id']) => {\n const { getModal } = useModalDataContext();\n return useMemo(() => getModal(id), [id, getModal]);\n};\n","import { memo, useEffect } from 'react';\n\nimport { useTick } from '@winglet/react-utils';\n\nimport { Presenter } from '@/promise-modal/components/Presenter';\nimport { useActiveModalCount } from '@/promise-modal/hooks/useActiveModalCount';\nimport { useModalContext } from '@/promise-modal/providers';\nimport { useModalDataContext } from '@/promise-modal/providers/ModalDataContext';\n\nimport styles from './Anchor.module.css';\n\nexport const Anchor = memo(() => {\n const [key, update] = useTick();\n\n const { modalIds, setUpdater } = useModalDataContext();\n\n useEffect(() => {\n setUpdater(update);\n }, [setUpdater, update]);\n\n const { options } = useModalContext();\n\n const dimmed = useActiveModalCount(key);\n\n return (\n <div\n className={styles.root}\n style={{\n transitionDuration: options.duration,\n backgroundColor: dimmed ? options.backdrop : 'transparent',\n }}\n >\n {modalIds.map((id) => {\n return <Presenter key={id} modalId={id} />;\n })}\n </div>\n );\n});\n","import type { PropsWithChildren } from 'react';\n\nimport styles from './styles.module.css';\n\nexport const FallbackTitle = ({ children }: PropsWithChildren) => {\n return <h2 className={styles.fallback}>{children}</h2>;\n};\n","import type { PropsWithChildren } from 'react';\n\nimport styles from './styles.module.css';\n\nexport const FallbackSubtitle = ({ children }: PropsWithChildren) => {\n return <h3 className={styles.fallback}>{children}</h3>;\n};\n","import type { PropsWithChildren } from 'react';\n\nimport styles from './styles.module.css';\n\nexport const FallbackContent = ({ children }: PropsWithChildren) => {\n return <div className={styles.fallback}>{children}</div>;\n};\n","import type { FooterComponentProps } from '@/promise-modal/types';\n\nexport const FallbackFooter = ({\n confirmLabel,\n hideConfirm = false,\n cancelLabel,\n hideCancel = false,\n disabled,\n onConfirm,\n onCancel,\n}: FooterComponentProps) => {\n return (\n <div>\n {!hideConfirm && (\n <button onClick={onConfirm} disabled={disabled}>\n {confirmLabel || '확인'}\n </button>\n )}\n\n {!hideCancel && typeof onCancel === 'function' && (\n <button onClick={onCancel}>{cancelLabel || '취소'}</button>\n )}\n </div>\n );\n};\n","import {\n type ForwardedRef,\n type PropsWithChildren,\n forwardRef,\n useMemo,\n} from 'react';\n\nimport { useActiveModalCount } from '@/promise-modal/hooks/useActiveModalCount';\nimport type { ModalFrameProps } from '@/promise-modal/types';\n\nimport styles from './styles.module.css';\n\nconst MAX_MODAL_COUNT = 5;\nconst MAX_MODAL_LEVEL = 3;\n\nexport const FallbackForegroundFrame = forwardRef(\n (\n { id, onChangeOrder, children }: PropsWithChildren<ModalFrameProps>,\n ref: ForwardedRef<HTMLDivElement>,\n ) => {\n const activeCount = useActiveModalCount();\n const [level, offset] = useMemo(() => {\n const stacked = activeCount > 1;\n const level = stacked\n ? (Math.floor(id / MAX_MODAL_COUNT) % MAX_MODAL_LEVEL) * 100\n : 0;\n const offset = stacked ? (id % MAX_MODAL_COUNT) * 35 : 0;\n return [level, offset];\n }, [activeCount, id]);\n\n return (\n <div\n ref={ref}\n className={styles.frame}\n onClick={onChangeOrder}\n style={{\n marginBottom: `calc(25vh + ${level}px)`,\n marginLeft: `${level}px`,\n transform: `translate(${offset}px, ${offset}px)`,\n }}\n >\n {children}\n </div>\n );\n },\n);\n","import { useLayoutEffect, useState } from 'react';\n\nexport const usePathname = () => {\n const [pathname, setPathname] = useState(window.location.pathname);\n\n useLayoutEffect(() => {\n let requestId: number;\n\n const checkPathname = () => {\n if (requestId) cancelAnimationFrame(requestId);\n if (pathname !== window.location.pathname) {\n setPathname(window.location.pathname);\n } else {\n requestId = requestAnimationFrame(checkPathname);\n }\n };\n\n requestId = requestAnimationFrame(checkPathname);\n\n return () => {\n if (requestId) cancelAnimationFrame(requestId);\n };\n }, [pathname]);\n\n return { pathname };\n};\n","import {\n type ComponentType,\n type PropsWithChildren,\n createContext,\n} from 'react';\n\nimport type { Color, Duration } from '@aileron/types';\n\nimport {\n DEFAULT_ANIMATION_DURATION,\n DEFAULT_BACKDROP_COLOR,\n} from '@/promise-modal/app/constant';\nimport {\n FallbackContent,\n FallbackFooter,\n FallbackForegroundFrame,\n FallbackSubtitle,\n FallbackTitle,\n} from '@/promise-modal/components/FallbackComponents';\nimport type {\n FooterComponentProps,\n ModalFrameProps,\n} from '@/promise-modal/types';\n\nexport interface ModalContextProps {\n ForegroundComponent: ComponentType<PropsWithChildren<ModalFrameProps>>;\n BackgroundComponent?: ComponentType<ModalFrameProps>;\n TitleComponent: ComponentType<PropsWithChildren>;\n SubtitleComponent: ComponentType<PropsWithChildren>;\n ContentComponent: ComponentType<PropsWithChildren>;\n FooterComponent: ComponentType<FooterComponentProps>;\n options: {\n duration: Duration;\n backdrop: Color;\n manualDestroy: boolean;\n closeOnBackdropClick: boolean;\n };\n}\n\nexport const ModalContext = createContext<ModalContextProps>({\n ForegroundComponent: FallbackForegroundFrame,\n TitleComponent: FallbackTitle,\n SubtitleComponent: FallbackSubtitle,\n ContentComponent: FallbackContent,\n FooterComponent: FallbackFooter,\n options: {\n duration: DEFAULT_ANIMATION_DURATION,\n backdrop: DEFAULT_BACKDROP_COLOR,\n manualDestroy: false,\n closeOnBackdropClick: true,\n },\n});\n","import {\n type ComponentType,\n type PropsWithChildren,\n memo,\n useMemo,\n useRef,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\n\nimport { useOnMount, useTick } from '@winglet/react-utils';\n\nimport type { Color, Duration } from '@aileron/types';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport {\n DEFAULT_ANIMATION_DURATION,\n DEFAULT_BACKDROP_COLOR,\n} from '@/promise-modal/app/constant';\nimport { Anchor } from '@/promise-modal/components/Anchor';\nimport {\n FallbackContent,\n FallbackFooter,\n FallbackForegroundFrame,\n FallbackSubtitle,\n FallbackTitle,\n} from '@/promise-modal/components/FallbackComponents';\nimport { usePathname as useDefaultPathname } from '@/promise-modal/hooks/useDefaultPathname';\nimport type {\n FooterComponentProps,\n ModalFrameProps,\n} from '@/promise-modal/types';\n\nimport { ModalDataContextProvider } from '../ModalDataContext';\nimport { ModalContext } from './ModalContext';\n\ninterface ModalContextProviderProps {\n BackgroundComponent?: ComponentType<ModalFrameProps>;\n ForegroundComponent?: ComponentType<ModalFrameProps>;\n TitleComponent?: ComponentType<PropsWithChildren>;\n SubtitleComponent?: ComponentType<PropsWithChildren>;\n ContentComponent?: ComponentType<PropsWithChildren>;\n FooterComponent?: ComponentType<FooterComponentProps>;\n options?: {\n /** Modal transition time(ms, s) */\n duration?: Duration;\n /** Modal backdrop color */\n backdrop?: Color;\n /** Whether to destroy the modal manually */\n manualDestroy?: boolean;\n /** Whether to close the modal when the backdrop is clicked */\n closeOnBackdropClick?: boolean;\n };\n usePathname?: () => { pathname: string };\n}\n\nexport const ModalContextProvider = memo(\n ({\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n usePathname,\n children,\n }: PropsWithChildren<ModalContextProviderProps>) => {\n const { pathname } = (usePathname || useDefaultPathname)();\n const [, update] = useTick();\n const portalRef = useRef<HTMLElement | null>(null);\n\n useOnMount(() => {\n portalRef.current = ModalManager.anchor('div');\n update();\n return () => {\n if (portalRef.current) {\n portalRef.current.remove();\n }\n };\n });\n\n const value = useMemo(\n () => ({\n BackgroundComponent,\n ForegroundComponent: ForegroundComponent || FallbackForegroundFrame,\n TitleComponent: TitleComponent || FallbackTitle,\n SubtitleComponent: SubtitleComponent || FallbackSubtitle,\n ContentComponent: memo(ContentComponent || FallbackContent),\n FooterComponent: memo(FooterComponent || FallbackFooter),\n options: {\n duration: DEFAULT_ANIMATION_DURATION,\n backdrop: DEFAULT_BACKDROP_COLOR,\n closeOnBackdropClick: true,\n manualDestroy: false,\n ...options,\n } satisfies ModalContextProviderProps['options'],\n }),\n [\n ForegroundComponent,\n BackgroundComponent,\n ContentComponent,\n FooterComponent,\n SubtitleComponent,\n TitleComponent,\n options,\n ],\n );\n\n return (\n <ModalContext.Provider value={value}>\n {children}\n {portalRef.current &&\n createPortal(\n <ModalDataContextProvider pathname={pathname}>\n <Anchor />\n </ModalDataContextProvider>,\n portalRef.current,\n )}\n </ModalContext.Provider>\n );\n },\n);\n","import { useContext } from 'react';\n\nimport { getMillisecondsFromDuration } from '@/promise-modal/helpers/getMillisecondsFromDuration';\n\nimport { ModalContext } from './ModalContext';\n\nexport const useModalContext = () => useContext(ModalContext);\n\nexport const useModalOptions = () => {\n const { options } = useContext(ModalContext);\n return options;\n};\n\nexport const useModalDuration = () => {\n const { duration } = useModalOptions();\n return { duration, milliseconds: getMillisecondsFromDuration(duration) };\n};\n\nexport const useModalBackdrop = () => {\n const { backdrop } = useModalOptions();\n return backdrop;\n};\n","import { useEffect, useRef } from 'react';\n\nimport { isString } from '@winglet/common-utils';\n\nimport type { Duration } from '@aileron/types';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport { getMillisecondsFromDuration } from '@/promise-modal/helpers/getMillisecondsFromDuration';\n\nimport { useModal } from '../providers';\nimport { useSubscribeModal } from './useSubscribeModal';\n\nexport const useDestroyAfter = (\n modalId: ModalNode['id'],\n duration: Duration | number,\n) => {\n const { modal, onDestroy } = useModal(modalId);\n const tick = useSubscribeModal(modal);\n\n const reference = useRef({\n modal,\n onDestroy,\n milliseconds: isString(duration)\n ? getMillisecondsFromDuration(duration)\n : duration,\n });\n\n useEffect(() => {\n const { modal, onDestroy, milliseconds } = reference.current;\n if (!modal || modal.visible || !modal.alive) return;\n const timer = setTimeout(() => {\n onDestroy();\n }, milliseconds);\n return () => {\n if (timer) clearTimeout(timer);\n };\n }, [tick]);\n};\n"],"names":["prerenderListRef","current","openModalRef","modal","push","anchorRef","ModalManager","prerender","clearPrerender","open","setupOpen","anchor","name","label","document","getElementById","id","node","createElement","setAttribute","getRandomNumber","body","appendChild","DEFAULT_ANIMATION_DURATION","DEFAULT_BACKDROP_COLOR","Background","modalId","onChangeOrder","BackgroundComponent","useModalContext","onClose","onChange","onConfirm","onDestroy","useModal","handleClose","useCallback","event","closeOnBackdropClick","visible","stopPropagation","manualDestroy","alive","_jsx","className","cx","styles$4_visible","styles","styles$4_active","onClick","children","type","initiator","background","AlertInner","memo","handlers","title","subtitle","content","footer","useMemo","handleConfirm","useHandle","TitleComponent","SubtitleComponent","ContentComponent","FooterComponent","_jsxs","Fragment","isString","renderComponent","confirmLabel","confirm","hideConfirm","ConfirmInner","onCancel","cancelLabel","cancel","hideCancel","PromptInner","Input","defaultValue","disabled","checkDisabled","value","setValue","useState","handleChange","inputValue","input","isFunction","setTimeout","Foreground","ForegroundComponent","styles$3_active","useSubscribeModal","tick","update","useTick","useOnMount","subscribe","zIndex","Presenter","ref","useRef","handleChangeOrder","style","useActiveModalCount","modalIds","getModalNode","useModalDataContext","count","alert","subtype","Promise","resolve","reject","error","result","prompt","returnOnCancel","BaseNode","__classPrivateFieldGet","this","_BaseNode_alive","_BaseNode_visible","constructor","Object","defineProperty","set","_BaseNode_resolve","_BaseNode_listeners","__classPrivateFieldSet","listener","filter","l","publish","call","needPublish","onShow","onHide","AlertNode","super","ConfirmNode","PromptNode","_PromptNode_value","nodeFactory","Error","DURATION_REGEX","getMillisecondsFromDuration","durationString","unit","match","duration","parseInt","ModalDataContext","createContext","undefinedFunction","setUpdater","getModal","undefined","ModalDataContextProvider","pathname","modalDictionary","Map","setModalIds","modalIdsRef","useReference","modalIdSequence","options","useModalOptions","useOnMountLayout","data","ids","destroyed","get","delete","useLayoutEffect","updaterRef","hideModal","updater","Provider","useContext","Anchor","key","useEffect","dimmed","transitionDuration","backgroundColor","backdrop","map","FallbackTitle","FallbackSubtitle","FallbackContent","FallbackFooter","FallbackForegroundFrame","forwardRef","activeCount","level","offset","stacked","Math","floor","marginBottom","marginLeft","transform","usePathname","setPathname","window","location","requestId","checkPathname","cancelAnimationFrame","requestAnimationFrame","ModalContext","ModalContextProvider","useDefaultPathname","portalRef","remove","createPortal","useModalDuration","milliseconds","useModalBackdrop","useDestroyAfter","reference","timer","clearTimeout"],"mappings":"ooBAQA,MAAMA,EAA8C,CAClDC,QAAS,IAGLC,EAAoD,CACxDD,QAAUE,IACRH,EAAiBC,QAAQG,KAAKD,EAAM,GAIlCE,EAAkD,CACtDJ,QAAS,MAGEK,EAAe,CAC1B,aAAIC,GACF,OAAOP,EAAiBC,OACzB,EACD,cAAAO,GACER,EAAiBC,QAAU,EAC5B,EACD,IAAAQ,CAAKN,GACHD,EAAaD,QAAQE,EACtB,EACD,SAAAO,CAAUD,GACRP,EAAaD,QAAUQ,CACxB,EACD,MAAAE,CAAOC,EAAcC,EAAQ,gBAC3B,GAAIR,EAAUJ,QAAS,CACrB,MAAMU,EAASG,SAASC,eAAeV,EAAUJ,QAAQe,IACzD,GAAIL,EAAQ,OAAOA,EAErB,MAAMM,EAAOH,SAASI,cAAcN,GAIpC,OAHAK,EAAKE,aAAa,KAAM,GAAGN,KAASO,OACpCN,SAASO,KAAKC,YAAYL,GAC1BZ,EAAUJ,QAAUgB,EACbA,CACR,GC3CUM,EAAuC,QAEvCC,EAAgC,mwCCKtC,MAAMC,EAAa,EAAGC,UAASC,oBACpC,MAAMC,oBAAEA,GAAwBC,MAC1B1B,MAAEA,EAAK2B,QAAEA,EAAOC,SAAEA,EAAQC,UAAEA,EAASC,UAAEA,GAAcC,GAASR,GAE9DS,EAAcC,GACjBC,IACKlC,GAASA,EAAMmC,sBAAwBnC,EAAMoC,SAAST,IAC1DO,EAAMG,iBAAiB,GAEzB,CAACrC,EAAO2B,IAGV,IAAK3B,EAAO,OAAO,KAEnB,MAAMoC,EAAUpC,EAAMsC,cAAgBtC,EAAMuC,MAAQvC,EAAMoC,QAE1D,OACEI,SACEC,UAAWC,oCAAgB,CACzBC,CAACC,GAAiBR,EAClBS,CAACD,GAAgB5C,EAAMmC,sBAAwBC,IAEjDU,QAASd,EAAWe,SAEnBtB,GACCe,EAACf,GACCZ,GAAIb,EAAMa,GACVmC,KAAMhD,EAAMgD,KACZT,MAAOvC,EAAMuC,MACbH,QAASpC,EAAMoC,QACfa,UAAWjD,EAAMiD,UACjBX,cAAetC,EAAMsC,cACrBH,qBAAsBnC,EAAMmC,qBAC5Be,WAAYlD,EAAMkD,WAClBtB,SAAUA,EACVC,UAAWA,EACXF,QAASA,EACTG,UAAWA,EACXN,cAAeA,KAGf,0lCCpCH,MAAM2B,EAAaC,GACxB,EAAOpD,QAAOqD,eACZ,MAAMC,MAAEA,EAAKC,SAAEA,EAAQC,QAAEA,EAAOC,OAAEA,GAAWC,GAAQ,IAAM1D,GAAO,CAACA,KAC7D6B,UAAEA,GAAc6B,GAAQ,IAAML,GAAU,CAACA,IAEzCM,EAAgBC,EAAU/B,IAE1BgC,eACJA,EAAcC,kBACdA,EAAiBC,iBACjBA,EAAgBC,gBAChBA,GACEtC,KAEJ,OACEuC,EAACC,EAAQ,CAAAnB,SAAA,CACNO,IACEa,EAASb,GAASd,EAACqB,EAAgB,CAAAd,SAAAO,IAA0BA,GAC/DC,IACEY,EAASZ,GACRf,EAACsB,EAAiB,CAAAf,SAAEQ,IAA6B,GAIpDC,IACEW,EAASX,GACRhB,EAACuB,YAAkBP,IAEnBY,EAAgBZ,EAAS,CACvB3B,UAAW8B,MAGL,IAAXF,IACoB,mBAAXA,EACNA,EAAO,CAAE5B,UAAW8B,IAEpBnB,EAACwB,EACC,CAAAnC,UAAW8B,EACXU,aAAcZ,GAAQa,QACtBC,YAAad,GAAQc,iBAGlB,IC1CJC,EAAepB,GAC1B,EAAOpD,QAAOqD,eACZ,MAAMC,MAAEA,EAAKC,SAAEA,EAAQC,QAAEA,EAAOC,OAAEA,GAAWC,GAAQ,IAAM1D,GAAO,CAACA,KAC7D6B,UAAEA,EAASF,QAAEA,GAAY+B,GAAQ,IAAML,GAAU,CAACA,IAElDM,EAAgBC,EAAU/B,GAC1BG,EAAc4B,EAAUjC,IAExBkC,eACJA,EAAcC,kBACdA,EAAiBC,iBACjBA,EAAgBC,gBAChBA,GACEtC,KAEJ,OACEuC,EAACC,EAAQ,CAAAnB,SAAA,CACNO,IACEa,EAASb,GAASd,EAACqB,EAAgB,CAAAd,SAAAO,IAA0BA,GAC/DC,IACEY,EAASZ,GACRf,EAACsB,EAAiB,CAAAf,SAAEQ,IAA6B,GAIpDC,IACEW,EAASX,GACRhB,EAACuB,YAAkBP,IAEnBY,EAAgBZ,EAAS,CACvB3B,UAAW8B,EACXc,SAAUzC,MAGJ,IAAXyB,IACoB,mBAAXA,EACNA,EAAO,CACL5B,UAAW8B,EACXc,SAAUzC,IAGZQ,EAACwB,GACCnC,UAAW8B,EACXc,SAAUzC,EACVqC,aAAcZ,GAAQa,QACtBI,YAAajB,GAAQkB,OACrBJ,YAAad,GAAQc,YACrBK,WAAYnB,GAAQmB,gBAGjB,IClDJC,EAAczB,GACzB,EAASpD,QAAOqD,eACd,MAAMyB,MACJA,EAAKC,aACLA,EACAC,SAAUC,EAAa3B,MACvBA,EAAKC,SACLA,EAAQC,QACRA,EAAOC,OACPA,GACEC,GACF,KAAO,IACF1D,EACH8E,MAAO1B,EAAKpD,EAAM8E,UAEpB,CAAC9E,KAGIkF,EAAOC,GAAYC,EAAwBL,IAE5CnD,SAAEA,EAAQD,QAAEA,EAAOE,UAAEA,GAAc6B,GACvC,IAAML,GACN,CAACA,IAGGrB,EAAc4B,EAAUjC,GACxB0D,EAAezB,GAClB0B,IACC,MAAMC,EAAQC,EAAWF,GAAcA,EAAWJ,GAASI,EAC3DH,EAASI,GACT3D,EAAS2D,EAAM,IAIb5B,EAAgB1B,GAAY,KAEhCwD,YAAW,KACT5D,GAAW,GACX,GACD,CAACA,IAEEmD,EAAWtB,GACf,MAAOwB,KAAUD,IAAgBC,IACjC,CAACD,EAAeC,KAGZrB,eACJA,EAAcC,kBACdA,EAAiBC,iBACjBA,EAAgBC,gBAChBA,GACEtC,KAEJ,OACEuC,EAACC,EAAQ,CAAAnB,SAAA,CACNO,IACEa,EAASb,GAASd,EAACqB,EAAgB,CAAAd,SAAAO,IAA0BA,GAC/DC,IACEY,EAASZ,GACRf,EAACsB,EAAiB,CAAAf,SAAEQ,IAA6B,GAIpDC,IACEW,EAASX,GACRhB,EAACuB,YAAkBP,IAEnBY,EAAgBZ,EAAS,CACvB3B,UAAW8B,EACXc,SAAUzC,KAIf8C,GACCtC,EAACsC,EACC,CAAAC,aAAcA,EACdG,MAAOA,EACPtD,SAAUyD,EACVxD,UAAW8B,KAIH,IAAXF,IACoB,mBAAXA,EACNA,EAAO,CACL5B,UAAW8B,EACXc,SAAUzC,EACVJ,SAAUyD,EACVH,QACAF,aAGFxC,EAACwB,EACC,CAAAnC,UAAW8B,EACXc,SAAUzC,EACVgD,SAAUA,EACVX,aAAcZ,GAAQa,QACtBI,YAAajB,GAAQkB,OACrBJ,YAAad,GAAQc,YACrBK,WAAYnB,GAAQmB,gBAGjB,IC5GJc,EAAa,EAAGnE,UAASC,oBACpC,MAAMmE,oBAAEA,GAAwBjE,MAE1B1B,MAAEA,EAAK4B,SAAEA,EAAQC,UAAEA,EAASF,QAAEA,EAAOG,UAAEA,GAAcC,GAASR,GAEpE,OAAKvB,EAGHwC,SACEC,UAAWC,oCAAgB,CACzBkD,CAAChD,GAAgB5C,EAAMsC,cAAgBtC,EAAMuC,MAAQvC,EAAMoC,UAG7DW,SAAAkB,EAAC0B,EAAmB,CAClB9E,GAAIb,EAAMa,GACVmC,KAAMhD,EAAMgD,KACZT,MAAOvC,EAAMuC,MACbH,QAASpC,EAAMoC,QACfa,UAAWjD,EAAMiD,UACjBX,cAAetC,EAAMsC,cACrBH,qBAAsBnC,EAAMmC,qBAC5Be,WAAYlD,EAAMkD,WAClBtB,SAAUA,EACVC,UAAWA,EACXF,QAASA,EACTG,UAAWA,EACXN,cAAeA,EAEduB,SAAA,CAAe,UAAf/C,EAAMgD,MACLR,EAACW,EAAU,CAACnD,MAAOA,EAAOqD,SAAU,CAAExB,eAExB,YAAf7B,EAAMgD,MACLR,EAACgC,EAAa,CAAAxE,MAAOA,EAAOqD,SAAU,CAAExB,YAAWF,aAErC,WAAf3B,EAAMgD,MACLR,EAACqC,EACC,CAAA7E,MAAOA,EACPqD,SAAU,CAAEzB,WAAUC,YAAWF,kBAhCxB,IAoCX,EC7CGkE,EAAqB7F,IAChC,MAAO8F,EAAMC,GAAUC,IAMvB,OALAC,GAAW,KACT,GAAKjG,EAEL,OADoBA,EAAMkG,UAAUH,EAClB,IAEbD,CAAI,+fCCb,IAAIK,EAAS,EAEN,MAAMC,EAAYhD,GAAK,EAAG7B,cAC/B,MAAM8E,EAAMC,EAAuB,OAC7BtG,MAAEA,GAAU+B,GAASR,GAC3BsE,EAAkB7F,GAClB,MAAMuG,EAAoB3C,GAAU,KAC9ByC,EAAIvG,UACNuG,EAAIvG,QAAQ0G,MAAML,OAAS,GAAGA,QAGlC,OACElC,EAAK,MAAA,CAAAoC,IAAKA,EAAK5D,4CACbM,SAAA,CAAAP,EAAClB,EAAU,CAACC,QAASA,EAASC,cAAe+E,IAC7C/D,EAACkD,EAAW,CAAAnE,QAASA,EAASC,cAAe+E,MACzC,ICvBGE,EAAsB,CAACX,EAAwB,KAC1D,MAAMY,SAAEA,EAAQC,aAAEA,GAAiBC,KACnC,OAAOlD,GAAQ,KACb,IAAImD,EAAQ,EACZ,IAAK,MAAMhG,KAAM6F,EACXC,EAAa9F,IAAKuB,SAASyE,IAEjC,OAAOA,CAAK,GAEX,CAACF,EAAcD,EAAUZ,GAAM,ECWvBgB,EAAQ,EACnBC,UACAzD,QACAC,WACAC,UACAN,aACAO,SACAnB,gBACAH,0BAEO,IAAI6E,SAAc,CAACC,EAASC,KACjC,IACE/G,EAAaG,KAAK,CAChB0C,KAAM,QACN+D,UACAE,QAAS,IAAMA,IACf3D,QACAC,WACAC,UACAN,aACAO,SACAnB,gBACAH,yBAEF,MAAOgF,GACPD,EAAOC,OC5BA7C,EAAU,EACrByC,UACAzD,QACAC,WACAC,UACAN,aACAO,SACAnB,gBACAH,0BAEO,IAAI6E,SAAiB,CAACC,EAASC,KACpC,IACE/G,EAAaG,KAAK,CAChB0C,KAAM,UACN+D,UACAE,QAAUG,GAAWH,EAAQG,IAAU,GACvC9D,QACAC,WACAC,UACAN,aACAO,SACAnB,gBACAH,yBAEF,MAAOgF,GACPD,EAAOC,OCpBAE,EAAS,EACpBtC,eACAzB,QACAC,WACAC,UACAsB,QACAE,WACAsC,iBACApE,aACAO,SACAnB,gBACAH,0BAEO,IAAI6E,SAAW,CAACC,EAASC,KAC9B,IACE/G,EAAaG,KAAK,CAChB0C,KAAM,SACNiE,QAAUG,GAAWH,EAAQG,GAC7B9D,QACAC,WACAC,UACAsB,MAAO,EAAGC,eAAcnD,WAAUC,eAChCiD,EAAM,CACJC,eACAnD,WACAC,cAEJkD,eACAC,WACAsC,iBACApE,aACAO,SACAnB,gBACAH,yBAEF,MAAOgF,GACPD,EAAOC;;;;;;;;;;;;;;;;0tBClDSI,GAYpB,SAAIhF,GACF,OAAOiF,EAAAC,KAAIC,EAAA,KAGb,WAAItF,GACF,OAAOoF,EAAAC,KAAIE,EAAA,KAMb,WAAAC,EAAY/G,GACVA,EAAEoC,UACFA,EAASK,MACTA,EAAKC,SACLA,EAAQL,WACRA,EAAUZ,cACVA,GAAgB,EAAKH,qBACrBA,GAAuB,EAAI8E,QAC3BA,IA9BOY,OAAAC,eAAAL,KAAA,KAAA,0DACAI,OAAAC,eAAAL,KAAA,YAAA,0DAEAI,OAAAC,eAAAL,KAAA,QAAA,0DACAI,OAAAC,eAAAL,KAAA,WAAA,0DACAI,OAAAC,eAAAL,KAAA,aAAA,0DAEAI,OAAAC,eAAAL,KAAA,gBAAA,0DACAI,OAAAC,eAAAL,KAAA,uBAAA,0DAETC,EAAgBK,IAAAN,UAAA,GAIhBE,EAAkBI,IAAAN,UAAA,GAKlBO,EAAqCD,IAAAN,UAAA,GACrCQ,EAAAF,IAAAN,KAAmB,IAYjBA,KAAK5G,GAAKA,EACV4G,KAAKxE,UAAYA,EACjBwE,KAAKnE,MAAQA,EACbmE,KAAKlE,SAAWA,EAChBkE,KAAKvE,WAAaA,EAClBuE,KAAKnF,cAAgBA,EACrBmF,KAAKtF,qBAAuBA,EAE5B+F,EAAAT,KAAIC,GAAU,EAAI,KAClBQ,EAAAT,KAAIE,GAAY,EAAI,KACpBO,EAAAT,KAAIO,EAAYf,EAAO,KAGzB,SAAAf,CAAUiC,GAER,OADAX,EAAAC,KAAeQ,EAAA,KAAChI,KAAKkI,GACd,KACLD,EAAAT,KAAkBQ,EAAAT,EAAAC,KAAeQ,EAAA,KAACG,QAAQC,GAAMA,IAAMF,QAAS,EAGnE,OAAAG,GACE,IAAK,MAAMH,KAAYX,EAAAC,KAAeQ,EAAA,KAAEE,IAEhC,OAAAlB,CAAQG,GAChBI,EAAAC,KAAaO,EAAA,KAAAO,KAAbd,KAAcL,GAEhB,SAAAtF,GACE,MAAM0G,GAA8B,IAAhBhB,EAAAC,KAAWC,EAAA,KAC/BQ,EAAAT,KAAIC,GAAU,EAAK,KACfD,KAAKnF,eAAiBkG,GAAaf,KAAKa,UAE9C,MAAAG,GACE,MAAMD,GAAgC,IAAlBhB,EAAAC,KAAaE,EAAA,KACjCO,EAAAT,KAAIE,GAAY,EAAI,KAChBa,GAAaf,KAAKa,UAExB,MAAAI,GACE,MAAMF,GAAgC,IAAlBhB,EAAAC,KAAaE,EAAA,KACjCO,EAAAT,KAAIE,GAAY,EAAK,KACjBa,GAAaf,KAAKa,mECrEpB,MAAOK,WAAqBpB,GAShC,WAAAK,EAAY/G,GACVA,EAAEoC,UACFA,EAASD,KACTA,EAAI+D,QACJA,EAAOzD,MACPA,EAAKC,SACLA,EAAQC,QACRA,EAAOC,OACPA,EAAMP,WACNA,EAAUZ,cACVA,EAAaH,qBACbA,EAAoB8E,QACpBA,IAEA2B,MAAM,CACJ/H,KACAoC,YACAK,QACAC,WACAL,aACAZ,gBACAH,uBACA8E,YA9BKY,OAAAC,eAAAL,KAAA,OAAA,0DACAI,OAAAC,eAAAL,KAAA,UAAA,0DACAI,OAAAC,eAAAL,KAAA,UAAA,0DACAI,OAAAC,eAAAL,KAAA,SAAA,0DA6BPA,KAAKzE,KAAOA,EACZyE,KAAKV,QAAUA,EACfU,KAAKjE,QAAUA,EACfiE,KAAKhE,OAASA,EAEhB,OAAA9B,GACE8F,KAAKR,QAAQ,MAEf,SAAApF,GACE4F,KAAKR,QAAQ,OC1CX,MAAO4B,WAAuBtB,GAMlC,WAAAK,EAAY/G,GACVA,EAAEoC,UACFA,EAASD,KACTA,EAAI+D,QACJA,EAAOzD,MACPA,EAAKC,SACLA,EAAQC,QACRA,EAAOC,OACPA,EAAMP,WACNA,EAAUZ,cACVA,EAAaH,qBACbA,EAAoB8E,QACpBA,IAEA2B,MAAM,CACJ/H,KACAoC,YACAK,QACAC,WACAL,aACAZ,gBACAH,uBACA8E,YA3BKY,OAAAC,eAAAL,KAAA,OAAA,0DACAI,OAAAC,eAAAL,KAAA,UAAA,0DACAI,OAAAC,eAAAL,KAAA,UAAA,0DACAI,OAAAC,eAAAL,KAAA,SAAA,0DA0BPA,KAAKzE,KAAOA,EACZyE,KAAKV,QAAUA,EACfU,KAAKjE,QAAUA,EACfiE,KAAKhE,OAASA,EAEhB,OAAA9B,GACE8F,KAAKR,SAAQ,GAEf,SAAApF,GACE4F,KAAKR,SAAQ,ICtCX,MAAO6B,WAAyBvB,GAUpC,WAAAK,EAAY/G,GACVA,EAAEoC,UACFA,EAASD,KACTA,EAAIM,MACJA,EAAKC,SACLA,EAAQC,QACRA,EAAOuB,aACPA,EAAYD,MACZA,EAAKE,SACLA,EAAQsC,eACRA,EAAc7D,OACdA,EAAMP,WACNA,EAAUZ,cACVA,EAAaH,qBACbA,EAAoB8E,QACpBA,IAEA2B,MAAM,CACJ/H,KACAoC,YACAK,QACAC,WACAL,aACAZ,gBACAH,uBACA8E,YAlCKY,OAAAC,eAAAL,KAAA,OAAA,0DACAI,OAAAC,eAAAL,KAAA,UAAA,0DACAI,OAAAC,eAAAL,KAAA,eAAA,0DACAI,OAAAC,eAAAL,KAAA,QAAA,0DACAI,OAAAC,eAAAL,KAAA,WAAA,0DACAI,OAAAC,eAAAL,KAAA,iBAAA,0DACAI,OAAAC,eAAAL,KAAA,SAAA,0DACTsB,EAAsBhB,IAAAN,UAAA,GA6BpBA,KAAKzE,KAAOA,EACZyE,KAAKjE,QAAUA,EACfiE,KAAK3C,MAAQA,EACb2C,KAAK1C,aAAeA,EACpBmD,EAAAT,KAAIsB,EAAUhE,EAAY,KAC1B0C,KAAKzC,SAAWA,EAChByC,KAAKH,eAAiBA,EACtBG,KAAKhE,OAASA,EAGhB,QAAA7B,CAASsD,GACPgD,EAAAT,KAAIsB,EAAU7D,EAAK,KAErB,SAAArD,GACE4F,KAAKR,QAAQO,EAAAC,KAAWsB,EAAA,MAAI,MAE9B,OAAApH,GACM8F,KAAKH,eAAgBG,KAAKR,QAAQO,EAAAC,KAAWsB,EAAA,MAAI,MAChDtB,KAAKR,QAAQ,qBClEf,MAAM+B,GAAqBhJ,IAChC,OAAQA,EAAMgD,MACZ,IAAK,QACH,OAAO,IAAI2F,GAAa3I,GAC1B,IAAK,UACH,OAAO,IAAI6I,GAAe7I,GAC5B,IAAK,SACH,OAAO,IAAI8I,GAAiB9I,GAGhC,MAAM,IAAIiJ,MAAM,kBAAkBjJ,EAAMgD,OAAQ,CAAEhD,SAAQ,ECdtDkJ,GAAiB,6BAEVC,GAA+B5D,IAC1C,MAAM,CAAG6D,EAAgBC,GAAQ9D,EAAM+D,MAAMJ,KAAmB,GAChE,IAAKE,IAAmBC,EAAM,OAAO,EACrC,MAAME,EAAWC,SAASJ,GAC1B,MAAa,OAATC,EAAsBE,EACb,MAATF,EAAgC,IAAXE,EACZ,MAATF,EAAgC,GAAXE,EAAgB,IAC5B,MAATF,EAAgC,GAAXE,EAAgB,GAAK,IAClC,CAAC,ECMFE,GAAmBC,EAAqC,CACnEhD,SAAU,GACVC,aAAcgD,EACd/H,SAAU+H,EACV9H,UAAW8H,EACXhI,QAASgI,EACT7H,UAAW6H,EACXC,WAAYD,EACZE,SAAU,KAAO,CACf7J,WAAO8J,EACPjI,UAAW8H,EACXhI,QAASgI,EACT/H,SAAU+H,EACV7H,UAAW6H,MCHFI,GAA2B3G,GACtC,EACE4G,WACAjH,eAEA,MAAMkH,EAAkB3D,EAAwC,IAAI4D,MAE7DxD,EAAUyD,GAAe/E,EAA4B,IACtDgF,EAAcC,EAAa3D,GAE3BzD,EAAYqD,EAAO0D,GACnBM,EAAkBhE,EAAO,GAEzBiE,EAAUC,KAEVjB,EAAW7F,GACf,IAAMyF,GAA4BoB,EAAQhB,WAC1C,CAACgB,IAGHE,GAAiB,KACf,MAAMnI,cAAEA,EAAaH,qBAAEA,GAAyBoI,EAEhD,IAAK,MAAMG,KAAQvK,EAAaC,UAAW,CACzC,MAAMJ,EAAQgJ,GAAY,IACrB0B,EACH7J,GAAIyJ,EAAgBxK,UACpBmD,UAAWA,EAAUnD,QACrBwC,mBACyBwH,IAAvBY,EAAKpI,cACDoI,EAAKpI,cACLA,EACNH,0BACgC2H,IAA9BY,EAAKvI,qBACDuI,EAAKvI,qBACLA,IAER8H,EAAgBnK,QAAQiI,IAAI/H,EAAMa,GAAIb,GACtCmK,GAAaQ,GAAQ,IAAIA,EAAK3K,EAAMa,MAGtCV,EAAaI,WAAWmK,IACtB,MAAM1K,EAAQgJ,GAAY,IACrB0B,EACH7J,GAAIyJ,EAAgBxK,UACpBmD,UAAWA,EAAUnD,QACrBwC,mBACyBwH,IAAvBY,EAAKpI,cACDoI,EAAKpI,cACLA,EACNH,0BACgC2H,IAA9BY,EAAKvI,qBACDuI,EAAKvI,qBACLA,IAER8H,EAAgBnK,QAAQiI,IAAI/H,EAAMa,GAAIb,GACtCmK,GAAaQ,GAMJ,IALUA,EAAIvC,QAAQvH,IAC3B,MAAM+J,GAAaX,EAAgBnK,QAAQ+K,IAAIhK,IAAK0B,MAEpD,OADIqI,GAAWX,EAAgBnK,QAAQgL,OAAOjK,IACtC+J,CAAS,IAEE5K,EAAMa,KAC3B,IAEJV,EAAaE,gBAAgB,IAG/B0K,GAAgB,KACd,IAAK,MAAMlK,KAAMuJ,EAAYtK,QAAS,CACpC,MAAME,EAAQiK,EAAgBnK,QAAQ+K,IAAIhK,GACrCb,GAAOuC,QACRvC,EAAMiD,YAAc+G,EAAUhK,EAAMyI,SACnCzI,EAAM0I,UAEbzF,EAAUnD,QAAUkK,CAAQ,GAC3B,CAACI,EAAaJ,IAEjB,MAAMrD,EAAe1E,GAAaV,GACzB0I,EAAgBnK,QAAQ+K,IAAItJ,IAClC,IAEGO,EAAYG,GAAaV,IAC7B,MAAMvB,EAAQiK,EAAgBnK,QAAQ+K,IAAItJ,GACrCvB,IACLA,EAAM8B,YACNkJ,EAAWlL,YAAW,GACrB,IAEGkL,EAAa1E,IACb2E,EAAYhJ,GACfV,IACC,MAAMvB,EAAQiK,EAAgBnK,QAAQ+K,IAAItJ,GACrCvB,IACLA,EAAM0I,SACNsC,EAAWlL,YACNE,EAAMsC,eACTmD,YAAW,KACTzF,EAAM8B,WAAW,GAChByH,GAAS,GAEhB,CAACA,IAGG3H,EAAWK,GAAY,CAACV,EAA0B2D,KACtD,MAAMlF,EAAQiK,EAAgBnK,QAAQ+K,IAAItJ,GACrCvB,GACc,WAAfA,EAAMgD,MAAmBhD,EAAM4B,SAASsD,EAAM,GACjD,IAEGrD,EAAYI,GACfV,IACC,MAAMvB,EAAQiK,EAAgBnK,QAAQ+K,IAAItJ,GACrCvB,IACLA,EAAM6B,YACNoJ,EAAU1J,GAAQ,GAEpB,CAAC0J,IAGGtJ,EAAUM,GACbV,IACC,MAAMvB,EAAQiK,EAAgBnK,QAAQ+K,IAAItJ,GACrCvB,IACLA,EAAM2B,UACNsJ,EAAU1J,GAAQ,GAEpB,CAAC0J,IAGGpB,EAAW5H,GACdV,IAA8B,CAC7BvB,MAAO2G,EAAapF,GACpBM,UAAW,IAAMA,EAAUN,GAC3BI,QAAS,IAAMA,EAAQJ,GACvBK,SAAWsD,GAAetD,EAASL,EAAS2D,GAC5CpD,UAAW,IAAMA,EAAUP,MAE7B,CAACoF,EAAc9E,EAAWF,EAASC,EAAUE,IAGzCoD,EAAQxB,GAAQ,KACb,CACLgD,WACAC,eACA/E,WACAC,YACAF,UACAG,YACA+H,WACAD,WAAasB,IACXF,EAAWlL,QAAUoL,CAAO,KAG/B,CACDxE,EACAmD,EACAlD,EACA/E,EACAC,EACAF,EACAG,IAGF,OACEU,EAACiH,GAAiB0B,SAAQ,CAACjG,MAAOA,EAAKnC,SACpCA,GACyB,IC3LrB6D,GAAsB,IAAMwE,EAAW3B,IAEvC1H,GAAYlB,IACvB,MAAMgJ,SAAEA,GAAajD,KACrB,OAAOlD,GAAQ,IAAMmG,EAAShJ,IAAK,CAACA,EAAIgJ,GAAU,myBCC7C,MAAMwB,GAASjI,GAAK,KACzB,MAAOkI,EAAKvF,GAAUC,KAEhBU,SAAEA,EAAQkD,WAAEA,GAAehD,KAEjC2E,GAAU,KACR3B,EAAW7D,EAAO,GACjB,CAAC6D,EAAY7D,IAEhB,MAAMwE,QAAEA,GAAY7I,KAEd8J,EAAS/E,EAAoB6E,GAEnC,OACE9I,SACEC,wCACA+D,MAAO,CACLiF,mBAAoBlB,EAAQhB,SAC5BmC,gBAAiBF,EAASjB,EAAQoB,SAAW,eAC9C5I,SAEA2D,EAASkF,KAAK/K,GACN2B,EAAC4D,EAAmB,CAAA7E,QAASV,GAAbA,MAErB,s8BC/BH,MAAMgL,GAAgB,EAAG9I,cACvBP,EAAA,KAAA,CAAIC,UAAWG,GAAeG,SAAGA,ICD7B+I,GAAmB,EAAG/I,cAC1BP,EAAA,KAAA,CAAIC,UAAWG,GAAeG,SAAGA,ICD7BgJ,GAAkB,EAAGhJ,cACzBP,EAAA,MAAA,CAAKC,UAAWG,GAAeG,SAAGA,ICH9BiJ,GAAiB,EAC5B3H,eACAE,eAAc,EACdG,cACAE,cAAa,EACbI,WACAnD,YACA4C,cAGER,EACG,MAAA,CAAAlB,SAAA,EAACwB,GACA/B,YAAQM,QAASjB,EAAWmD,SAAUA,EAAQjC,SAC3CsB,GAAgB,QAInBO,GAAkC,mBAAbH,GACrBjC,EAAQ,SAAA,CAAAM,QAAS2B,EAAQ1B,SAAG2B,GAAe,UCLtCuH,GAA0BC,GACrC,EACIrL,KAAIW,gBAAeuB,YACrBsD,KAEA,MAAM8F,EAAc1F,KACb2F,EAAOC,GAAU3I,GAAQ,KAC9B,MAAM4I,EAAUH,EAAc,EAK9B,MAAO,CAJOG,EACTC,KAAKC,MAAM3L,EAZE,GACA,EAWyC,IACvD,EACWyL,EAAWzL,EAdR,EAcgC,GAAK,EACjC,GACrB,CAACsL,EAAatL,IAEjB,OACE2B,EACE,MAAA,CAAA6D,IAAKA,EACL5D,yCACAK,QAAStB,EACTgF,MAAO,CACLiG,aAAc,eAAeL,OAC7BM,WAAY,GAAGN,MACfO,UAAW,aAAaN,QAAaA,QAGtCtJ,SAAAA,GACG,ICxCC6J,GAAc,KACzB,MAAO5C,EAAU6C,GAAezH,EAAS0H,OAAOC,SAAS/C,UAqBzD,OAnBAe,GAAgB,KACd,IAAIiC,EAEJ,MAAMC,EAAgB,KAChBD,GAAWE,qBAAqBF,GAChChD,IAAa8C,OAAOC,SAAS/C,SAC/B6C,EAAYC,OAAOC,SAAS/C,UAE5BgD,EAAYG,sBAAsBF,IAMtC,OAFAD,EAAYG,sBAAsBF,GAE3B,KACDD,GAAWE,qBAAqBF,EAAU,CAC/C,GACA,CAAChD,IAEG,CAAEA,WAAU,ECeRoD,GAAe1D,EAAiC,CAC3D/D,oBAAqBsG,GACrBpI,eAAgBgI,GAChB/H,kBAAmBgI,GACnB/H,iBAAkBgI,GAClB/H,gBAAiBgI,GACjBzB,QAAS,CACPhB,SAAUnI,EACVuK,SAAUtK,EACViB,eAAe,EACfH,sBAAsB,KCObkL,GAAuBjK,GAClC,EACEuC,sBACAlE,sBACAoC,iBACAC,oBACAC,mBACAC,kBACAuG,sBACAqC,EACA7J,eAEA,MAAMiH,SAAEA,IAAc4C,GAAeU,OAC5B,CAAAvH,GAAUC,IACbuH,EAAYjH,EAA2B,MAE7CL,GAAW,KACTsH,EAAUzN,QAAUK,EAAaK,OAAO,OACxCuF,IACO,KACDwH,EAAUzN,SACZyN,EAAUzN,QAAQ0N,aAKxB,MAAMtI,EAAQxB,GACZ,KAAO,CACLjC,sBACAkE,oBAAqBA,GAAuBsG,GAC5CpI,eAAgBA,GAAkBgI,GAClC/H,kBAAmBA,GAAqBgI,GACxC/H,iBAAkBX,EAAKW,GAAoBgI,IAC3C/H,gBAAiBZ,EAAKY,GAAmBgI,IACzCzB,QAAS,CACPhB,SAAUnI,EACVuK,SAAUtK,EACVc,sBAAsB,EACtBG,eAAe,KACZiI,MAGP,CACE5E,EACAlE,EACAsC,EACAC,EACAF,EACAD,EACA0G,IAIJ,OACEtG,EAACmJ,GAAajC,SAAS,CAAAjG,MAAOA,EAC3BnC,SAAA,CAAAA,EACAwK,EAAUzN,SACT2N,EACEjL,EAACuH,IAAyBC,SAAUA,EAClCjH,SAAAP,EAAC6I,GAAS,CAAA,KAEZkC,EAAUzN,WAEQ,ICjHjB4B,GAAkB,IAAM0J,EAAWgC,IAEnC5C,GAAkB,KAC7B,MAAMD,QAAEA,GAAYa,EAAWgC,IAC/B,OAAO7C,CAAO,EAGHmD,GAAmB,KAC9B,MAAMnE,SAAEA,GAAaiB,KACrB,MAAO,CAAEjB,WAAUoE,aAAcxE,GAA4BI,GAAW,EAG7DqE,GAAmB,KAC9B,MAAMjC,SAAEA,GAAanB,KACrB,OAAOmB,CAAQ,ECRJkC,GAAkB,CAC7BtM,EACAgI,KAEA,MAAMvJ,MAAEA,EAAK8B,UAAEA,GAAcC,GAASR,GAChCuE,EAAOD,EAAkB7F,GAEzB8N,EAAYxH,EAAO,CACvBtG,QACA8B,YACA6L,aAAcxJ,EAASoF,GACnBJ,GAA4BI,GAC5BA,IAGNgC,GAAU,KACR,MAAMvL,MAAEA,EAAK8B,UAAEA,EAAS6L,aAAEA,GAAiBG,EAAUhO,QACrD,IAAKE,GAASA,EAAMoC,UAAYpC,EAAMuC,MAAO,OAC7C,MAAMwL,EAAQtI,YAAW,KACvB3D,GAAW,GACV6L,GACH,MAAO,KACDI,GAAOC,aAAaD,EAAM,CAC/B,GACA,CAACjI,GAAM"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/app/ModalManager.ts","../src/app/constant.ts","../src/components/Background/classNames.emotion.ts","../src/components/Background/Background.tsx","../src/components/Foreground/classNames.emotion.ts","../src/components/Foreground/components/AlertInner.tsx","../src/components/Foreground/components/ConfirmInner.tsx","../src/components/Foreground/components/PromptInner.tsx","../src/components/Foreground/Foreground.tsx","../src/hooks/useSubscribeModal.ts","../src/components/Presenter/classNames.emotion.ts","../src/components/Presenter/Presenter.tsx","../src/hooks/useActiveModalCount.ts","../src/core/handle/alert.ts","../src/core/handle/confirm.ts","../src/core/handle/prompt.ts","../src/core/node/ModalNode/AbstractBaseNode.ts","../src/core/node/ModalNode/AlertNode.ts","../src/core/node/ModalNode/ConfirmNode.ts","../src/core/node/ModalNode/PromptNode.ts","../src/core/node/nodeFactory.ts","../src/helpers/getMillisecondsFromDuration.ts","../src/providers/ModalDataContext/ModalDataContext.ts","../src/providers/ModalDataContext/ModalDataContextProvider.tsx","../src/providers/ModalDataContext/useModalDataContext.ts","../src/components/Anchor/classNames.emotion.ts","../src/components/Anchor/Anchor.tsx","../src/components/FallbackComponents/classNames.emotion.ts","../src/components/FallbackComponents/FallbackTitle.tsx","../src/components/FallbackComponents/FallbackSubtitle.tsx","../src/components/FallbackComponents/FallbackContent.tsx","../src/components/FallbackComponents/FallbackFooter.tsx","../src/components/FallbackComponents/FallbackForegroundFrame.tsx","../src/hooks/useDefaultPathname.ts","../src/providers/ModalContext/ModalContext.ts","../src/providers/ModalContext/ModalContextProvider.tsx","../src/providers/ModalContext/useModalContext.ts","../src/hooks/useDestroyAfter.ts"],"sourcesContent":["import { MutableRefObject } from 'react';\n\nimport { getRandomNumber } from '@winglet/common-utils';\n\nimport type { Fn } from '@aileron/types';\n\nimport type { Modal } from '@/promise-modal/types';\n\nconst prerenderListRef: MutableRefObject<Modal[]> = {\n current: [],\n};\n\nconst openModalRef: MutableRefObject<Fn<[Modal], void>> = {\n current: (modal: Modal) => {\n prerenderListRef.current.push(modal);\n },\n};\n\nconst anchorRef: MutableRefObject<HTMLElement | null> = {\n current: null,\n};\n\nexport const ModalManager = {\n get prerender() {\n return prerenderListRef.current;\n },\n clearPrerender() {\n prerenderListRef.current = [];\n },\n open(modal: Modal) {\n openModalRef.current(modal);\n },\n setupOpen(open: (modal: Modal) => void) {\n openModalRef.current = open;\n },\n anchor(name: string, label = 'modal-anchor'): HTMLElement {\n if (anchorRef.current) {\n const anchor = document.getElementById(anchorRef.current.id);\n if (anchor) return anchor;\n }\n const node = document.createElement(name);\n node.setAttribute('id', `${label}-${getRandomNumber()}`);\n document.body.appendChild(node);\n anchorRef.current = node;\n return node;\n },\n};\n","import type { Color, Duration } from '@aileron/types';\n\nexport const DEFAULT_ANIMATION_DURATION: Duration = '300ms';\n\nexport const DEFAULT_BACKDROP_COLOR: Color = 'rgba(0, 0, 0, 0.5)';\n","import { css } from '@emotion/css';\n\nexport const root = css`\n display: none;\n position: fixed;\n inset: 0;\n z-index: -999;\n pointer-events: none;\n > * {\n pointer-events: none;\n }\n`;\n\nexport const active = css`\n pointer-events: all !important;\n`;\n\nexport const visible = css`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n","import { type MouseEvent, useCallback } from 'react';\n\nimport { cx } from '@emotion/css';\n\nimport { useModal, useModalContext } from '@/promise-modal/providers';\nimport type { ModalLayerProps } from '@/promise-modal/types';\n\nimport { active, root, visible } from './classNames.emotion';\n\nexport const Background = ({ modalId, onChangeOrder }: ModalLayerProps) => {\n const { BackgroundComponent } = useModalContext();\n const { modal, onClose, onChange, onConfirm, onDestroy } = useModal(modalId);\n\n const handleClose = useCallback(\n (event: MouseEvent) => {\n if (modal && modal.closeOnBackdropClick && modal.visible) onClose();\n event.stopPropagation();\n },\n [modal, onClose],\n );\n\n if (!modal) return null;\n\n const isVisible = modal.manualDestroy ? modal.alive : modal.visible;\n\n return (\n <div\n className={cx(root, {\n [visible]: isVisible,\n [active]: modal.closeOnBackdropClick && isVisible,\n })}\n onClick={handleClose}\n >\n {BackgroundComponent && (\n <BackgroundComponent\n id={modal.id}\n type={modal.type}\n alive={modal.alive}\n visible={modal.visible}\n initiator={modal.initiator}\n manualDestroy={modal.manualDestroy}\n closeOnBackdropClick={modal.closeOnBackdropClick}\n background={modal.background}\n onChange={onChange}\n onConfirm={onConfirm}\n onClose={onClose}\n onDestroy={onDestroy}\n onChangeOrder={onChangeOrder}\n />\n )}\n </div>\n );\n};\n","import { css } from '@emotion/css';\n\nexport const root = css`\n pointer-events: none;\n display: none;\n position: fixed;\n inset: 0;\n z-index: 1;\n`;\n\nexport const active = css`\n display: flex !important;\n justify-content: center;\n align-items: center;\n > * {\n pointer-events: all;\n }\n`;\n","import { Fragment, memo, useMemo } from 'react';\n\nimport { isString } from '@winglet/common-utils';\nimport { renderComponent, useHandle } from '@winglet/react-utils';\n\nimport type { AlertNode } from '@/promise-modal/core';\nimport { useModalContext } from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface AlertInnerProps<B> {\n modal: AlertNode<B>;\n handlers: Pick<ModalActions, 'onConfirm'>;\n}\n\nexport const AlertInner = memo(\n <B,>({ modal, handlers }: AlertInnerProps<B>) => {\n const { title, subtitle, content, footer } = useMemo(() => modal, [modal]);\n const { onConfirm } = useMemo(() => handlers, [handlers]);\n\n const handleConfirm = useHandle(onConfirm);\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useModalContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? <TitleComponent>{title}</TitleComponent> : title)}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent>{subtitle}</SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent>{content}</ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n })\n ))}\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({ onConfirm: handleConfirm })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n confirmLabel={footer?.confirm}\n hideConfirm={footer?.hideConfirm}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { Fragment, memo, useMemo } from 'react';\n\nimport { isString } from '@winglet/common-utils';\nimport { renderComponent, useHandle } from '@winglet/react-utils';\n\nimport type { ConfirmNode } from '@/promise-modal/core';\nimport { useModalContext } from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface ConfirmInnerProps<B> {\n modal: ConfirmNode<B>;\n handlers: Pick<ModalActions, 'onConfirm' | 'onClose'>;\n}\n\nexport const ConfirmInner = memo(\n <B,>({ modal, handlers }: ConfirmInnerProps<B>) => {\n const { title, subtitle, content, footer } = useMemo(() => modal, [modal]);\n const { onConfirm, onClose } = useMemo(() => handlers, [handlers]);\n\n const handleConfirm = useHandle(onConfirm);\n const handleClose = useHandle(onClose);\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useModalContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? <TitleComponent>{title}</TitleComponent> : title)}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent>{subtitle}</SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent>{content}</ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n onCancel: handleClose,\n })\n ))}\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n onConfirm: handleConfirm,\n onCancel: handleClose,\n })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n onCancel={handleClose}\n confirmLabel={footer?.confirm}\n cancelLabel={footer?.cancel}\n hideConfirm={footer?.hideConfirm}\n hideCancel={footer?.hideCancel}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { Fragment, memo, useCallback, useMemo, useState } from 'react';\n\nimport { isFunction, isString } from '@winglet/common-utils';\nimport {\n renderComponent,\n useHandle,\n withErrorBoundary,\n} from '@winglet/react-utils';\n\nimport type { PromptNode } from '@/promise-modal/core';\nimport { useModalContext } from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface PromptInnerProps<T, B> {\n modal: PromptNode<T, B>;\n handlers: Pick<ModalActions, 'onChange' | 'onClose' | 'onConfirm'>;\n}\n\nexport const PromptInner = memo(\n <T, B>({ modal, handlers }: PromptInnerProps<T, B>) => {\n const {\n Input,\n defaultValue,\n disabled: checkDisabled,\n title,\n subtitle,\n content,\n footer,\n } = useMemo(\n () => ({\n ...modal,\n Input: memo(withErrorBoundary(modal.Input)),\n }),\n [modal],\n );\n\n const [value, setValue] = useState<T | undefined>(defaultValue);\n\n const { onChange, onClose, onConfirm } = useMemo(\n () => handlers,\n [handlers],\n );\n\n const handleClose = useHandle(onClose);\n const handleChange = useHandle(\n (inputValue?: T | ((prevState: T | undefined) => T | undefined)) => {\n const input = isFunction(inputValue) ? inputValue(value) : inputValue;\n setValue(input);\n onChange(input);\n },\n );\n\n const handleConfirm = useCallback(() => {\n // NOTE: wait for the next tick to ensure the value is updated\n setTimeout(() => {\n onConfirm();\n });\n }, [onConfirm]);\n\n const disabled = useMemo(\n () => (value ? !!checkDisabled?.(value) : false),\n [checkDisabled, value],\n );\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useModalContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? <TitleComponent>{title}</TitleComponent> : title)}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent>{subtitle}</SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent>{content}</ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n onCancel: handleClose,\n })\n ))}\n\n {Input && (\n <Input\n defaultValue={defaultValue}\n value={value}\n onChange={handleChange}\n onConfirm={handleConfirm}\n />\n )}\n\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n onConfirm: handleConfirm,\n onCancel: handleClose,\n onChange: handleChange,\n value,\n disabled,\n })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n onCancel={handleClose}\n disabled={disabled}\n confirmLabel={footer?.confirm}\n cancelLabel={footer?.cancel}\n hideConfirm={footer?.hideConfirm}\n hideCancel={footer?.hideCancel}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { cx } from '@emotion/css';\n\nimport { useModal, useModalContext } from '@/promise-modal/providers';\nimport type { ModalLayerProps } from '@/promise-modal/types';\n\nimport { active, root } from './classNames.emotion';\nimport { AlertInner, ConfirmInner, PromptInner } from './components';\n\nexport const Foreground = ({ modalId, onChangeOrder }: ModalLayerProps) => {\n const { ForegroundComponent } = useModalContext();\n\n const { modal, onChange, onConfirm, onClose, onDestroy } = useModal(modalId);\n\n if (!modal) return null;\n\n return (\n <div\n className={cx(root, {\n [active]: modal.manualDestroy ? modal.alive : modal.visible,\n })}\n >\n <ForegroundComponent\n id={modal.id}\n type={modal.type}\n alive={modal.alive}\n visible={modal.visible}\n initiator={modal.initiator}\n manualDestroy={modal.manualDestroy}\n closeOnBackdropClick={modal.closeOnBackdropClick}\n background={modal.background}\n onChange={onChange}\n onConfirm={onConfirm}\n onClose={onClose}\n onDestroy={onDestroy}\n onChangeOrder={onChangeOrder}\n >\n {modal.type === 'alert' && (\n <AlertInner modal={modal} handlers={{ onConfirm }} />\n )}\n {modal.type === 'confirm' && (\n <ConfirmInner modal={modal} handlers={{ onConfirm, onClose }} />\n )}\n {modal.type === 'prompt' && (\n <PromptInner\n modal={modal}\n handlers={{ onChange, onConfirm, onClose }}\n />\n )}\n </ForegroundComponent>\n </div>\n );\n};\n","import { useOnMount, useTick } from '@winglet/react-utils';\n\nimport type { ModalNode } from '@/promise-modal/core';\n\nexport const useSubscribeModal = (modal?: ModalNode) => {\n const [tick, update] = useTick();\n useOnMount(() => {\n if (!modal) return;\n const unsubscribe = modal.subscribe(update);\n return unsubscribe;\n });\n return tick;\n};\n","import { css } from '@emotion/css';\n\nexport const root = css`\n position: fixed;\n inset: 0;\n pointer-events: none;\n overflow: hidden;\n`;\n","import { memo, useRef } from 'react';\n\nimport { useHandle } from '@winglet/react-utils';\n\nimport { Background } from '@/promise-modal/components/Background';\nimport { Foreground } from '@/promise-modal/components/Foreground';\nimport { useSubscribeModal } from '@/promise-modal/hooks/useSubscribeModal';\nimport { useModal } from '@/promise-modal/providers';\nimport type { ModalIdProps } from '@/promise-modal/types';\n\nimport { root } from './classNames.emotion';\n\nlet zIndex = 1;\n\nexport const Presenter = memo(({ modalId }: ModalIdProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { modal } = useModal(modalId);\n useSubscribeModal(modal);\n const handleChangeOrder = useHandle(() => {\n if (ref.current) {\n ref.current.style.zIndex = `${zIndex++}`;\n }\n });\n return (\n <div ref={ref} className={root}>\n <Background modalId={modalId} onChangeOrder={handleChangeOrder} />\n <Foreground modalId={modalId} onChangeOrder={handleChangeOrder} />\n </div>\n );\n});\n","import { useMemo } from 'react';\n\nimport { useModalDataContext } from '../providers';\n\nexport const useActiveModalCount = (tick: string | number = 0) => {\n const { modalIds, getModalNode } = useModalDataContext();\n return useMemo(() => {\n let count = 0;\n for (const id of modalIds) {\n if (getModalNode(id)?.visible) count++;\n }\n return count;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getModalNode, modalIds, tick]);\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n AlertContentProps,\n AlertFooterRender,\n FooterOptions,\n ModalBackground,\n} from '@/promise-modal/types';\n\ninterface AlertProps<B> {\n subtype?: 'info' | 'success' | 'warning' | 'error';\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<AlertContentProps>;\n background?: ModalBackground<B>;\n footer?:\n | AlertFooterRender\n | Pick<FooterOptions, 'confirm' | 'hideConfirm'>\n | false;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n}\n\nexport const alert = <B = any>({\n subtype,\n title,\n subtitle,\n content,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n}: AlertProps<B>) => {\n return new Promise<void>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'alert',\n subtype,\n resolve: () => resolve(),\n title,\n subtitle,\n content,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n ConfirmContentProps,\n ConfirmFooterRender,\n FooterOptions,\n ModalBackground,\n} from '@/promise-modal/types';\n\ninterface ConfirmProps<B> {\n subtype?: 'info' | 'success' | 'warning' | 'error';\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<ConfirmContentProps>;\n background?: ModalBackground<B>;\n footer?: ConfirmFooterRender | FooterOptions | false;\n closeOnBackdropClick?: boolean;\n manualDestroy?: boolean;\n}\n\nexport const confirm = <B = any>({\n subtype,\n title,\n subtitle,\n content,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n}: ConfirmProps<B>) => {\n return new Promise<boolean>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'confirm',\n subtype,\n resolve: (result) => resolve(result ?? false),\n title,\n subtitle,\n content,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n FooterOptions,\n ModalBackground,\n PromptContentProps,\n PromptFooterRender,\n PromptInputProps,\n} from '@/promise-modal/types';\n\nimport { ModalManager } from '../../app/ModalManager';\n\ninterface PromptProps<T, B = any> {\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<PromptContentProps>;\n Input: (props: PromptInputProps<T>) => ReactNode;\n defaultValue?: T;\n disabled?: (value: T) => boolean;\n returnOnCancel?: boolean;\n background?: ModalBackground<B>;\n footer?: PromptFooterRender<T> | FooterOptions | false;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n}\n\nexport const prompt = <T, B = any>({\n defaultValue,\n title,\n subtitle,\n content,\n Input,\n disabled,\n returnOnCancel,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n}: PromptProps<T, B>) => {\n return new Promise<T>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'prompt',\n resolve: (result) => resolve(result as T),\n title,\n subtitle,\n content,\n Input: ({ defaultValue, onChange, onConfirm }: PromptInputProps<T>) =>\n Input({\n defaultValue,\n onChange,\n onConfirm,\n }),\n defaultValue,\n disabled,\n returnOnCancel,\n background,\n footer,\n manualDestroy,\n closeOnBackdropClick,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ReactNode } from 'react';\n\nimport type { Fn } from '@aileron/types';\n\nimport type {\n BaseModal,\n ManagedEntity,\n ModalBackground,\n} from '@/promise-modal/types';\n\ntype BaseNodeProps<T, B> = BaseModal<T, B> & ManagedEntity;\n\nexport abstract class BaseNode<T, B> {\n readonly id: number;\n readonly initiator: string;\n\n readonly title?: ReactNode;\n readonly subtitle?: ReactNode;\n readonly background?: ModalBackground<B>;\n\n readonly manualDestroy: boolean;\n readonly closeOnBackdropClick: boolean;\n\n #alive: boolean;\n get alive() {\n return this.#alive;\n }\n #visible: boolean;\n get visible() {\n return this.#visible;\n }\n\n #resolve: (result: T | null) => void;\n #listeners: Fn[] = [];\n\n constructor({\n id,\n initiator,\n title,\n subtitle,\n background,\n manualDestroy = false,\n closeOnBackdropClick = true,\n resolve,\n }: BaseNodeProps<T, B>) {\n this.id = id;\n this.initiator = initiator;\n this.title = title;\n this.subtitle = subtitle;\n this.background = background;\n this.manualDestroy = manualDestroy;\n this.closeOnBackdropClick = closeOnBackdropClick;\n\n this.#alive = true;\n this.#visible = true;\n this.#resolve = resolve;\n }\n\n subscribe(listener: Fn) {\n this.#listeners.push(listener);\n return () => {\n this.#listeners = this.#listeners.filter((l) => l !== listener);\n };\n }\n publish() {\n for (const listener of this.#listeners) listener();\n }\n protected resolve(result: T | null) {\n this.#resolve(result);\n }\n onDestroy() {\n const needPublish = this.#alive === true;\n this.#alive = false;\n if (this.manualDestroy && needPublish) this.publish();\n }\n onShow() {\n const needPublish = this.#visible === false;\n this.#visible = true;\n if (needPublish) this.publish();\n }\n onHide() {\n const needPublish = this.#visible === true;\n this.#visible = false;\n if (needPublish) this.publish();\n }\n abstract onClose(): void;\n abstract onConfirm(): void;\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n AlertContentProps,\n AlertFooterRender,\n AlertModal,\n FooterOptions,\n ManagedEntity,\n} from '@/promise-modal/types';\n\nimport { BaseNode } from './AbstractBaseNode';\n\ntype AlertNodeProps<B> = AlertModal<B> & ManagedEntity;\n\nexport class AlertNode<B> extends BaseNode<null, B> {\n readonly type: 'alert';\n readonly subtype?: 'info' | 'success' | 'warning' | 'error';\n readonly content?: ReactNode | ComponentType<AlertContentProps>;\n readonly footer?:\n | AlertFooterRender\n | Pick<FooterOptions, 'confirm' | 'hideConfirm'>\n | false;\n\n constructor({\n id,\n initiator,\n type,\n subtype,\n title,\n subtitle,\n content,\n footer,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n }: AlertNodeProps<B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n });\n this.type = type;\n this.subtype = subtype;\n this.content = content;\n this.footer = footer;\n }\n onClose() {\n this.resolve(null);\n }\n onConfirm() {\n this.resolve(null);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n ConfirmContentProps,\n ConfirmFooterRender,\n ConfirmModal,\n FooterOptions,\n ManagedEntity,\n} from '@/promise-modal/types';\n\nimport { BaseNode } from './AbstractBaseNode';\n\ntype ConfirmNodeProps<B> = ConfirmModal<B> & ManagedEntity;\n\nexport class ConfirmNode<B> extends BaseNode<boolean, B> {\n readonly type: 'confirm';\n readonly subtype?: 'info' | 'success' | 'warning' | 'error';\n readonly content?: ReactNode | ComponentType<ConfirmContentProps>;\n readonly footer?: ConfirmFooterRender | FooterOptions | false;\n\n constructor({\n id,\n initiator,\n type,\n subtype,\n title,\n subtitle,\n content,\n footer,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n }: ConfirmNodeProps<B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n });\n this.type = type;\n this.subtype = subtype;\n this.content = content;\n this.footer = footer;\n }\n onClose() {\n this.resolve(false);\n }\n onConfirm() {\n this.resolve(true);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n FooterOptions,\n ManagedEntity,\n PromptContentProps,\n PromptFooterRender,\n PromptInputProps,\n PromptModal,\n} from '@/promise-modal/types';\n\nimport { BaseNode } from './AbstractBaseNode';\n\ntype PromptNodeProps<T, B> = PromptModal<T, B> & ManagedEntity;\n\nexport class PromptNode<T, B> extends BaseNode<T, B> {\n readonly type: 'prompt';\n readonly content?: ReactNode | ComponentType<PromptContentProps>;\n readonly defaultValue: T | undefined;\n readonly Input: (props: PromptInputProps<T>) => ReactNode;\n readonly disabled?: (value: T) => boolean;\n readonly returnOnCancel?: boolean;\n readonly footer?: PromptFooterRender<T> | FooterOptions | false;\n #value: T | undefined;\n\n constructor({\n id,\n initiator,\n type,\n title,\n subtitle,\n content,\n defaultValue,\n Input,\n disabled,\n returnOnCancel,\n footer,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n }: PromptNodeProps<T, B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n });\n this.type = type;\n this.content = content;\n this.Input = Input;\n this.defaultValue = defaultValue;\n this.#value = defaultValue;\n this.disabled = disabled;\n this.returnOnCancel = returnOnCancel;\n this.footer = footer;\n }\n\n onChange(value: T) {\n this.#value = value;\n }\n onConfirm() {\n this.resolve(this.#value ?? null);\n }\n onClose() {\n if (this.returnOnCancel) this.resolve(this.#value ?? null);\n else this.resolve(null);\n }\n}\n","import type { ManagedModal } from '@/promise-modal/types';\n\nimport { AlertNode, ConfirmNode, PromptNode } from './ModalNode';\n\nexport const nodeFactory = <T, B>(modal: ManagedModal<T, B>) => {\n switch (modal.type) {\n case 'alert':\n return new AlertNode<B>(modal);\n case 'confirm':\n return new ConfirmNode<B>(modal);\n case 'prompt':\n return new PromptNode<T, B>(modal);\n }\n // @ts-expect-error: This state is unreachable by design and should NEVER occur.\n throw new Error(`Unknown modal: ${modal.type}`, { modal });\n};\n","const DURATION_REGEX = /^\\s*(\\d+)\\s*(ms|s|m|h)\\s*$/;\n\nexport const getMillisecondsFromDuration = (input: string) => {\n const [, durationString, unit] = input.match(DURATION_REGEX) || [];\n if (!durationString || !unit) return 0;\n const duration = parseInt(durationString);\n if (unit === 'ms') return duration;\n if (unit === 's') return duration * 1000;\n if (unit === 'm') return duration * 60 * 1000;\n if (unit === 'h') return duration * 60 * 60 * 1000;\n else return 0;\n};\n","import { createContext } from 'react';\n\nimport { undefinedFunction } from '@winglet/common-utils';\n\nimport type { Fn } from '@aileron/types';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport type { ModalActions, ModalHandlersWithId } from '@/promise-modal/types';\n\nexport interface ModalDataContextProps extends ModalHandlersWithId {\n modalIds: ModalNode['id'][];\n getModal: Fn<[id: ModalNode['id']], ModalActions>;\n getModalNode: Fn<[id: ModalNode['id']], ModalNode | undefined>;\n setUpdater: Fn<[updater: Fn]>;\n}\n\nexport const ModalDataContext = createContext<ModalDataContextProps>({\n modalIds: [],\n getModalNode: undefinedFunction,\n onChange: undefinedFunction,\n onConfirm: undefinedFunction,\n onClose: undefinedFunction,\n onDestroy: undefinedFunction,\n setUpdater: undefinedFunction,\n getModal: () => ({\n modal: undefined,\n onConfirm: undefinedFunction,\n onClose: undefinedFunction,\n onChange: undefinedFunction,\n onDestroy: undefinedFunction,\n }),\n});\n","import {\n type PropsWithChildren,\n memo,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { useOnMountLayout, useReference } from '@winglet/react-utils';\n\nimport type { Fn } from '@aileron/types';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport { type ModalNode, nodeFactory } from '@/promise-modal/core';\nimport { getMillisecondsFromDuration } from '@/promise-modal/helpers/getMillisecondsFromDuration';\nimport { useModalOptions } from '@/promise-modal/providers';\nimport type { Modal } from '@/promise-modal/types';\n\nimport { ModalDataContext } from './ModalDataContext';\n\ninterface ModalDataContextProviderProps {\n pathname: string;\n}\n\nexport const ModalDataContextProvider = memo(\n ({\n pathname,\n children,\n }: PropsWithChildren<ModalDataContextProviderProps>) => {\n const modalDictionary = useRef<Map<ModalNode['id'], ModalNode>>(new Map());\n\n const [modalIds, setModalIds] = useState<ModalNode['id'][]>([]);\n const modalIdsRef = useReference(modalIds);\n\n const initiator = useRef(pathname);\n const modalIdSequence = useRef(0);\n\n const options = useModalOptions();\n\n const duration = useMemo(\n () => getMillisecondsFromDuration(options.duration),\n [options],\n );\n\n useOnMountLayout(() => {\n const { manualDestroy, closeOnBackdropClick } = options;\n\n for (const data of ModalManager.prerender) {\n const modal = nodeFactory({\n ...data,\n id: modalIdSequence.current++,\n initiator: initiator.current,\n manualDestroy:\n data.manualDestroy !== undefined\n ? data.manualDestroy\n : manualDestroy,\n closeOnBackdropClick:\n data.closeOnBackdropClick !== undefined\n ? data.closeOnBackdropClick\n : closeOnBackdropClick,\n });\n modalDictionary.current.set(modal.id, modal);\n setModalIds((ids) => [...ids, modal.id]);\n }\n\n ModalManager.setupOpen((data: Modal) => {\n const modal = nodeFactory({\n ...data,\n id: modalIdSequence.current++,\n initiator: initiator.current,\n manualDestroy:\n data.manualDestroy !== undefined\n ? data.manualDestroy\n : manualDestroy,\n closeOnBackdropClick:\n data.closeOnBackdropClick !== undefined\n ? data.closeOnBackdropClick\n : closeOnBackdropClick,\n });\n modalDictionary.current.set(modal.id, modal);\n setModalIds((ids) => {\n const aliveIds = ids.filter((id) => {\n const destroyed = !modalDictionary.current.get(id)?.alive;\n if (destroyed) modalDictionary.current.delete(id);\n return !destroyed;\n });\n return [...aliveIds, modal.id];\n });\n });\n ModalManager.clearPrerender();\n });\n\n useLayoutEffect(() => {\n for (const id of modalIdsRef.current) {\n const modal = modalDictionary.current.get(id);\n if (!modal?.alive) continue;\n if (modal.initiator === pathname) modal.onShow();\n else modal.onHide();\n }\n initiator.current = pathname;\n }, [modalIdsRef, pathname]);\n\n const getModalNode = useCallback((modalId: ModalNode['id']) => {\n return modalDictionary.current.get(modalId);\n }, []);\n\n const onDestroy = useCallback((modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onDestroy();\n updaterRef.current?.();\n }, []);\n\n const updaterRef = useRef<Fn>();\n const hideModal = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onHide();\n updaterRef.current?.();\n if (!modal.manualDestroy)\n setTimeout(() => {\n modal.onDestroy();\n }, duration);\n },\n [duration],\n );\n\n const onChange = useCallback((modalId: ModalNode['id'], value: any) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n if (modal.type === 'prompt') modal.onChange(value);\n }, []);\n\n const onConfirm = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onConfirm();\n hideModal(modalId);\n },\n [hideModal],\n );\n\n const onClose = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onClose();\n hideModal(modalId);\n },\n [hideModal],\n );\n\n const getModal = useCallback(\n (modalId: ModalNode['id']) => ({\n modal: getModalNode(modalId),\n onConfirm: () => onConfirm(modalId),\n onClose: () => onClose(modalId),\n onChange: (value: any) => onChange(modalId, value),\n onDestroy: () => onDestroy(modalId),\n }),\n [getModalNode, onConfirm, onClose, onChange, onDestroy],\n );\n\n const value = useMemo(() => {\n return {\n modalIds,\n getModalNode,\n onChange,\n onConfirm,\n onClose,\n onDestroy,\n getModal,\n setUpdater: (updater: Fn) => {\n updaterRef.current = updater;\n },\n };\n }, [\n modalIds,\n getModal,\n getModalNode,\n onChange,\n onConfirm,\n onClose,\n onDestroy,\n ]);\n\n return (\n <ModalDataContext.Provider value={value}>\n {children}\n </ModalDataContext.Provider>\n );\n },\n);\n","import { useContext, useMemo } from 'react';\n\nimport type { ManagedModal } from '@/promise-modal/types';\n\nimport { ModalDataContext } from './ModalDataContext';\n\nexport const useModalDataContext = () => useContext(ModalDataContext);\n\nexport const useModal = (id: ManagedModal['id']) => {\n const { getModal } = useModalDataContext();\n return useMemo(() => getModal(id), [id, getModal]);\n};\n","import { css } from '@emotion/css';\n\nexport const root = css`\n display: flex;\n align-items: center;\n justify-content: center;\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 1000;\n transition: background-color ease-in-out;\n`;\n","import { memo, useEffect } from 'react';\n\nimport { useTick, withErrorBoundary } from '@winglet/react-utils';\n\nimport { Presenter } from '@/promise-modal/components/Presenter';\nimport { useActiveModalCount } from '@/promise-modal/hooks/useActiveModalCount';\nimport { useModalContext } from '@/promise-modal/providers';\nimport { useModalDataContext } from '@/promise-modal/providers/ModalDataContext';\n\nimport { root } from './classNames.emotion';\n\nconst AnchorInner = () => {\n const [key, update] = useTick();\n\n const { modalIds, setUpdater } = useModalDataContext();\n\n useEffect(() => {\n setUpdater(update);\n }, [setUpdater, update]);\n\n const { options } = useModalContext();\n\n const dimmed = useActiveModalCount(key);\n\n return (\n <div\n className={root}\n style={{\n transitionDuration: options.duration,\n backgroundColor: dimmed ? options.backdrop : 'transparent',\n }}\n >\n {modalIds.map((id) => {\n return <Presenter key={id} modalId={id} />;\n })}\n </div>\n );\n};\n\nexport const Anchor = memo(withErrorBoundary(AnchorInner));\n","import { css } from '@emotion/css';\n\nexport const fallback = css`\n margin: unset;\n`;\n\nexport const frame = css`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n background-color: white;\n padding: 20px 80px;\n gap: 10px;\n border: 1px solid black;\n`;\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackTitle = ({ children }: PropsWithChildren) => {\n return <h2 className={fallback}>{children}</h2>;\n};\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackSubtitle = ({ children }: PropsWithChildren) => {\n return <h3 className={fallback}>{children}</h3>;\n};\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackContent = ({ children }: PropsWithChildren) => {\n return <div className={fallback}>{children}</div>;\n};\n","import type { FooterComponentProps } from '@/promise-modal/types';\n\nexport const FallbackFooter = ({\n confirmLabel,\n hideConfirm = false,\n cancelLabel,\n hideCancel = false,\n disabled,\n onConfirm,\n onCancel,\n}: FooterComponentProps) => {\n return (\n <div>\n {!hideConfirm && (\n <button onClick={onConfirm} disabled={disabled}>\n {confirmLabel || '확인'}\n </button>\n )}\n\n {!hideCancel && typeof onCancel === 'function' && (\n <button onClick={onCancel}>{cancelLabel || '취소'}</button>\n )}\n </div>\n );\n};\n","import {\n type ForwardedRef,\n type PropsWithChildren,\n forwardRef,\n useMemo,\n} from 'react';\n\nimport { useActiveModalCount } from '@/promise-modal/hooks/useActiveModalCount';\nimport type { ModalFrameProps } from '@/promise-modal/types';\n\nimport { frame } from './classNames.emotion';\n\nconst MAX_MODAL_COUNT = 5;\nconst MAX_MODAL_LEVEL = 3;\n\nexport const FallbackForegroundFrame = forwardRef(\n (\n { id, onChangeOrder, children }: PropsWithChildren<ModalFrameProps>,\n ref: ForwardedRef<HTMLDivElement>,\n ) => {\n const activeCount = useActiveModalCount();\n const [level, offset] = useMemo(() => {\n const stacked = activeCount > 1;\n const level = stacked\n ? (Math.floor(id / MAX_MODAL_COUNT) % MAX_MODAL_LEVEL) * 100\n : 0;\n const offset = stacked ? (id % MAX_MODAL_COUNT) * 35 : 0;\n return [level, offset];\n }, [activeCount, id]);\n\n return (\n <div\n ref={ref}\n className={frame}\n onClick={onChangeOrder}\n style={{\n marginBottom: `calc(25vh + ${level}px)`,\n marginLeft: `${level}px`,\n transform: `translate(${offset}px, ${offset}px)`,\n }}\n >\n {children}\n </div>\n );\n },\n);\n","import { useLayoutEffect, useState } from 'react';\n\nexport const usePathname = () => {\n const [pathname, setPathname] = useState(window.location.pathname);\n\n useLayoutEffect(() => {\n let requestId: number;\n\n const checkPathname = () => {\n if (requestId) cancelAnimationFrame(requestId);\n if (pathname !== window.location.pathname) {\n setPathname(window.location.pathname);\n } else {\n requestId = requestAnimationFrame(checkPathname);\n }\n };\n\n requestId = requestAnimationFrame(checkPathname);\n\n return () => {\n if (requestId) cancelAnimationFrame(requestId);\n };\n }, [pathname]);\n\n return { pathname };\n};\n","import {\n type ComponentType,\n type PropsWithChildren,\n createContext,\n} from 'react';\n\nimport type { Color, Duration } from '@aileron/types';\n\nimport {\n DEFAULT_ANIMATION_DURATION,\n DEFAULT_BACKDROP_COLOR,\n} from '@/promise-modal/app/constant';\nimport {\n FallbackContent,\n FallbackFooter,\n FallbackForegroundFrame,\n FallbackSubtitle,\n FallbackTitle,\n} from '@/promise-modal/components/FallbackComponents';\nimport type {\n FooterComponentProps,\n ModalFrameProps,\n} from '@/promise-modal/types';\n\nexport interface ModalContextProps {\n ForegroundComponent: ComponentType<PropsWithChildren<ModalFrameProps>>;\n BackgroundComponent?: ComponentType<ModalFrameProps>;\n TitleComponent: ComponentType<PropsWithChildren>;\n SubtitleComponent: ComponentType<PropsWithChildren>;\n ContentComponent: ComponentType<PropsWithChildren>;\n FooterComponent: ComponentType<FooterComponentProps>;\n options: {\n duration: Duration;\n backdrop: Color;\n manualDestroy: boolean;\n closeOnBackdropClick: boolean;\n };\n}\n\nexport const ModalContext = createContext<ModalContextProps>({\n ForegroundComponent: FallbackForegroundFrame,\n TitleComponent: FallbackTitle,\n SubtitleComponent: FallbackSubtitle,\n ContentComponent: FallbackContent,\n FooterComponent: FallbackFooter,\n options: {\n duration: DEFAULT_ANIMATION_DURATION,\n backdrop: DEFAULT_BACKDROP_COLOR,\n manualDestroy: false,\n closeOnBackdropClick: true,\n },\n});\n","import {\n type ComponentType,\n type PropsWithChildren,\n memo,\n useMemo,\n useRef,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\n\nimport { useOnMount, useTick } from '@winglet/react-utils';\n\nimport type { Color, Duration } from '@aileron/types';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport {\n DEFAULT_ANIMATION_DURATION,\n DEFAULT_BACKDROP_COLOR,\n} from '@/promise-modal/app/constant';\nimport { Anchor } from '@/promise-modal/components/Anchor';\nimport {\n FallbackContent,\n FallbackFooter,\n FallbackForegroundFrame,\n FallbackSubtitle,\n FallbackTitle,\n} from '@/promise-modal/components/FallbackComponents';\nimport { usePathname as useDefaultPathname } from '@/promise-modal/hooks/useDefaultPathname';\nimport type {\n FooterComponentProps,\n ModalFrameProps,\n} from '@/promise-modal/types';\n\nimport { ModalDataContextProvider } from '../ModalDataContext';\nimport { ModalContext } from './ModalContext';\n\ninterface ModalContextProviderProps {\n BackgroundComponent?: ComponentType<ModalFrameProps>;\n ForegroundComponent?: ComponentType<ModalFrameProps>;\n TitleComponent?: ComponentType<PropsWithChildren>;\n SubtitleComponent?: ComponentType<PropsWithChildren>;\n ContentComponent?: ComponentType<PropsWithChildren>;\n FooterComponent?: ComponentType<FooterComponentProps>;\n options?: {\n /** Modal transition time(ms, s) */\n duration?: Duration;\n /** Modal backdrop color */\n backdrop?: Color;\n /** Whether to destroy the modal manually */\n manualDestroy?: boolean;\n /** Whether to close the modal when the backdrop is clicked */\n closeOnBackdropClick?: boolean;\n };\n usePathname?: () => { pathname: string };\n}\n\nexport const ModalContextProvider = memo(\n ({\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n usePathname,\n children,\n }: PropsWithChildren<ModalContextProviderProps>) => {\n const { pathname } = (usePathname || useDefaultPathname)();\n const [, update] = useTick();\n const portalRef = useRef<HTMLElement | null>(null);\n\n useOnMount(() => {\n portalRef.current = ModalManager.anchor('div');\n update();\n return () => {\n if (portalRef.current) {\n portalRef.current.remove();\n }\n };\n });\n\n const value = useMemo(\n () => ({\n BackgroundComponent,\n ForegroundComponent: ForegroundComponent || FallbackForegroundFrame,\n TitleComponent: TitleComponent || FallbackTitle,\n SubtitleComponent: SubtitleComponent || FallbackSubtitle,\n ContentComponent: memo(ContentComponent || FallbackContent),\n FooterComponent: memo(FooterComponent || FallbackFooter),\n options: {\n duration: DEFAULT_ANIMATION_DURATION,\n backdrop: DEFAULT_BACKDROP_COLOR,\n closeOnBackdropClick: true,\n manualDestroy: false,\n ...options,\n } satisfies ModalContextProviderProps['options'],\n }),\n [\n ForegroundComponent,\n BackgroundComponent,\n ContentComponent,\n FooterComponent,\n SubtitleComponent,\n TitleComponent,\n options,\n ],\n );\n\n return (\n <ModalContext.Provider value={value}>\n {children}\n {portalRef.current &&\n createPortal(\n <ModalDataContextProvider pathname={pathname}>\n <Anchor />\n </ModalDataContextProvider>,\n portalRef.current,\n )}\n </ModalContext.Provider>\n );\n },\n);\n","import { useContext } from 'react';\n\nimport { getMillisecondsFromDuration } from '@/promise-modal/helpers/getMillisecondsFromDuration';\n\nimport { ModalContext } from './ModalContext';\n\nexport const useModalContext = () => useContext(ModalContext);\n\nexport const useModalOptions = () => {\n const { options } = useContext(ModalContext);\n return options;\n};\n\nexport const useModalDuration = () => {\n const { duration } = useModalOptions();\n return { duration, milliseconds: getMillisecondsFromDuration(duration) };\n};\n\nexport const useModalBackdrop = () => {\n const { backdrop } = useModalOptions();\n return backdrop;\n};\n","import { useEffect, useRef } from 'react';\n\nimport { isString } from '@winglet/common-utils';\n\nimport type { Duration } from '@aileron/types';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport { getMillisecondsFromDuration } from '@/promise-modal/helpers/getMillisecondsFromDuration';\n\nimport { useModal } from '../providers';\nimport { useSubscribeModal } from './useSubscribeModal';\n\nexport const useDestroyAfter = (\n modalId: ModalNode['id'],\n duration: Duration | number,\n) => {\n const { modal, onDestroy } = useModal(modalId);\n const tick = useSubscribeModal(modal);\n\n const reference = useRef({\n modal,\n onDestroy,\n milliseconds: isString(duration)\n ? getMillisecondsFromDuration(duration)\n : duration,\n });\n\n useEffect(() => {\n const { modal, onDestroy, milliseconds } = reference.current;\n if (!modal || modal.visible || !modal.alive) return;\n const timer = setTimeout(() => {\n onDestroy();\n }, milliseconds);\n return () => {\n if (timer) clearTimeout(timer);\n };\n }, [tick]);\n};\n"],"names":["prerenderListRef","current","openModalRef","modal","push","anchorRef","ModalManager","prerender","clearPrerender","open","setupOpen","anchor","name","label","document","getElementById","id","node","createElement","setAttribute","getRandomNumber","body","appendChild","DEFAULT_ANIMATION_DURATION","DEFAULT_BACKDROP_COLOR","root","css","process","env","NODE_ENV","styles","toString","_EMOTION_STRINGIFIED_CSS_ERROR__","active","visible","Background","modalId","onChangeOrder","BackgroundComponent","useModalContext","onClose","onChange","onConfirm","onDestroy","useModal","handleClose","useCallback","event","closeOnBackdropClick","stopPropagation","isVisible","manualDestroy","alive","_jsx","className","cx","active$1","onClick","children","type","initiator","background","AlertInner","memo","handlers","title","subtitle","content","footer","useMemo","handleConfirm","useHandle","TitleComponent","SubtitleComponent","ContentComponent","FooterComponent","_jsxs","Fragment","isString","renderComponent","confirmLabel","confirm","hideConfirm","ConfirmInner","onCancel","cancelLabel","cancel","hideCancel","PromptInner","Input","defaultValue","disabled","checkDisabled","withErrorBoundary","value","setValue","useState","handleChange","inputValue","input","isFunction","setTimeout","Foreground","ForegroundComponent","useSubscribeModal","tick","update","useTick","useOnMount","subscribe","zIndex","Presenter","ref","useRef","handleChangeOrder","style","useActiveModalCount","modalIds","getModalNode","useModalDataContext","count","alert","subtype","Promise","resolve","reject","error","result","prompt","returnOnCancel","BaseNode","__classPrivateFieldGet","this","_BaseNode_alive","_BaseNode_visible","constructor","Object","defineProperty","set","_BaseNode_resolve","_BaseNode_listeners","__classPrivateFieldSet","listener","filter","l","publish","call","needPublish","onShow","onHide","AlertNode","super","ConfirmNode","PromptNode","_PromptNode_value","nodeFactory","Error","DURATION_REGEX","getMillisecondsFromDuration","durationString","unit","match","duration","parseInt","ModalDataContext","createContext","undefinedFunction","setUpdater","getModal","undefined","ModalDataContextProvider","pathname","modalDictionary","Map","setModalIds","modalIdsRef","useReference","modalIdSequence","options","useModalOptions","useOnMountLayout","data","ids","destroyed","get","delete","useLayoutEffect","updaterRef","hideModal","updater","Provider","useContext","Anchor","key","useEffect","dimmed","transitionDuration","backgroundColor","backdrop","map","fallback","frame","FallbackTitle","FallbackSubtitle","FallbackContent","FallbackFooter","FallbackForegroundFrame","forwardRef","activeCount","level","offset","stacked","Math","floor","marginBottom","marginLeft","transform","usePathname","setPathname","window","location","requestId","checkPathname","cancelAnimationFrame","requestAnimationFrame","ModalContext","ModalContextProvider","useDefaultPathname","portalRef","remove","createPortal","useModalDuration","milliseconds","useModalBackdrop","useDestroyAfter","reference","timer","clearTimeout"],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@lerx/promise-modal",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "repository": {
5
5
  "type": "git",
6
- "url": "https://github.com/vincent-kk/altovion.git",
6
+ "url": "https://github.com/vincent-kk/albatrion.git",
7
7
  "directory": "packages/promise-modal"
8
8
  },
9
9
  "license": "MIT",
@@ -20,6 +20,7 @@
20
20
  ],
21
21
  "sideEffects": false,
22
22
  "scripts": {
23
+ "aileron:types": "ln -sf ../../../aileron/common/@types ./@aileron/types",
23
24
  "format": "prettier --write \"src/**/*.ts\" \"src/**/*.tsx\"",
24
25
  "clean": "rm -rf dist",
25
26
  "test": "yarn build:chain && vitest",
@@ -31,18 +32,25 @@
31
32
  "make-dependency-graph": "npx depcruise src --config .dependency-cruiser.js --output-type dot > dependency-graph.dot && dot -Tpng dependency-graph.dot -o dependency-graph.png",
32
33
  "storybook": "storybook dev -p 6006",
33
34
  "build-storybook": "storybook build",
35
+ "version:patch": "yarn version patch",
36
+ "version:minor": "yarn version minor",
37
+ "version:major": "yarn version major",
34
38
  "publish:npm": "yarn build:chain && yarn npm publish --access public"
35
39
  },
36
40
  "dependencies": {
37
- "@winglet/common-utils": "0.0.2",
38
- "@winglet/react-utils": "0.0.2",
39
- "clsx": "^2.0.0"
41
+ "@emotion/css": "^11.0.0",
42
+ "@winglet/common-utils": "^0.0.4",
43
+ "@winglet/react-utils": "^0.0.4"
40
44
  },
41
45
  "devDependencies": {
46
+ "@babel/core": "^7.26.0",
42
47
  "@chromatic-com/storybook": "^3.2.2",
48
+ "@emotion/babel-plugin": "^11.13.5",
49
+ "@rollup/plugin-babel": "^6.0.4",
43
50
  "@rollup/plugin-commonjs": "^28.0.1",
44
51
  "@rollup/plugin-node-resolve": "^15.3.0",
45
52
  "@rollup/plugin-replace": "^6.0.1",
53
+ "@rollup/plugin-terser": "^0.4.4",
46
54
  "@size-limit/preset-app": "^11.1.6",
47
55
  "@size-limit/preset-big-lib": "^11.1.6",
48
56
  "@size-limit/preset-small-lib": "^11.1.6",
@@ -52,8 +60,9 @@
52
60
  "@storybook/react": "^8.4.7",
53
61
  "@storybook/react-vite": "^8.4.7",
54
62
  "@storybook/test": "^8.4.7",
63
+ "@testing-library/dom": "^10.4.0",
55
64
  "@testing-library/jest-dom": "^6.6.3",
56
- "@testing-library/react": "^16.0.1",
65
+ "@testing-library/react": "^16.1.0",
57
66
  "@trivago/prettier-plugin-sort-imports": "^4.3.0",
58
67
  "@types/react": "^18.3.12",
59
68
  "@types/react-dom": "^18.3.1",
@@ -61,8 +70,6 @@
61
70
  "@typescript-eslint/eslint-plugin": "^8.14.0",
62
71
  "@typescript-eslint/parser": "^8.14.0",
63
72
  "antd": "^5.22.5",
64
- "autoprefixer": "^10.4.20",
65
- "cssnano": "^7.0.6",
66
73
  "dependency-cruiser": "^16.7.0",
67
74
  "eslint": "^8.56.0",
68
75
  "eslint-plugin-react": "^7.37.2",
@@ -76,8 +83,6 @@
76
83
  "rollup": "^4.27.4",
77
84
  "rollup-plugin-copy": "^3.5.0",
78
85
  "rollup-plugin-peer-deps-external": "^2.2.4",
79
- "rollup-plugin-postcss": "^4.0.2",
80
- "rollup-plugin-terser": "^7.0.2",
81
86
  "rollup-plugin-typescript2": "^0.36.0",
82
87
  "rollup-plugin-visualizer": "^5.12.0",
83
88
  "sass-embedded": "^1.83.0",