@bwg-ui/core 1.1.11 → 1.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/BwgLargeUploader-CgrJUwFW.cjs +3 -0
- package/dist/chunks/BwgLargeUploader-CgrJUwFW.cjs.map +1 -0
- package/dist/chunks/{BwgLargeUploader-B5EtYKUz.js → BwgLargeUploader-Nx2-wiD8.js} +802 -776
- package/dist/chunks/BwgLargeUploader-Nx2-wiD8.js.map +1 -0
- package/dist/chunks/{FileUtils-CaU9Bzu2.js → FileUtils-Bbz3AvQn.js} +2 -2
- package/dist/chunks/{FileUtils-CaU9Bzu2.js.map → FileUtils-Bbz3AvQn.js.map} +1 -1
- package/dist/chunks/FileUtils-D73GVmB8.cjs +2 -0
- package/dist/chunks/{FileUtils-BweAWoJt.cjs.map → FileUtils-D73GVmB8.cjs.map} +1 -1
- package/dist/chunks/SSOHandler-CZHPiuEh.js +25397 -0
- package/dist/chunks/SSOHandler-CZHPiuEh.js.map +1 -0
- package/dist/chunks/SSOHandler-rq0OGrpX.cjs +236 -0
- package/dist/chunks/SSOHandler-rq0OGrpX.cjs.map +1 -0
- package/dist/chunks/{SearchBoxContext-CY4tAQcg.js → SearchBoxContext-BxtHF9BO.js} +2 -2
- package/dist/chunks/{SearchBoxContext-CY4tAQcg.js.map → SearchBoxContext-BxtHF9BO.js.map} +1 -1
- package/dist/chunks/SearchBoxContext-Cpr9xa1S.cjs +2 -0
- package/dist/chunks/{SearchBoxContext-DDBY44Wr.cjs.map → SearchBoxContext-Cpr9xa1S.cjs.map} +1 -1
- package/dist/chunks/TabContainer-B7-6AQXV.js +254 -0
- package/dist/chunks/TabContainer-B7-6AQXV.js.map +1 -0
- package/dist/chunks/TabContainer-Dx2PVShz.cjs +36 -0
- package/dist/chunks/TabContainer-Dx2PVShz.cjs.map +1 -0
- package/dist/chunks/_commonjsHelpers-DKOUU3wS.cjs +2 -0
- package/dist/chunks/_commonjsHelpers-DKOUU3wS.cjs.map +1 -0
- package/dist/chunks/_commonjsHelpers-DaMA6jEr.js +9 -0
- package/dist/chunks/_commonjsHelpers-DaMA6jEr.js.map +1 -0
- package/dist/chunks/apiUtils-C45AWfu-.js +957 -0
- package/dist/chunks/apiUtils-C45AWfu-.js.map +1 -0
- package/dist/chunks/apiUtils-Cbg6NQLv.cjs +4 -0
- package/dist/chunks/apiUtils-Cbg6NQLv.cjs.map +1 -0
- package/dist/chunks/codeStore-BGLhSpAM.cjs +2 -0
- package/dist/chunks/{codeStore-KPL92rcv.cjs.map → codeStore-BGLhSpAM.cjs.map} +1 -1
- package/dist/chunks/{codeStore-IIp25egq.js → codeStore-BzT5wSd9.js} +2 -2
- package/dist/chunks/{codeStore-IIp25egq.js.map → codeStore-BzT5wSd9.js.map} +1 -1
- package/dist/chunks/commonUtils-BH6QwGUb.cjs +2 -0
- package/dist/chunks/commonUtils-BH6QwGUb.cjs.map +1 -0
- package/dist/chunks/{commonUtils-Cvx6_eK2.js → commonUtils-Bb16Yqjk.js} +24 -25
- package/dist/chunks/commonUtils-Bb16Yqjk.js.map +1 -0
- package/dist/chunks/envUtils-C9Gf5aek.js.map +1 -1
- package/dist/chunks/envUtils-CduTHoHu.cjs.map +1 -1
- package/dist/chunks/favoriteStore-3YceyayF.cjs +2 -0
- package/dist/chunks/favoriteStore-3YceyayF.cjs.map +1 -0
- package/dist/chunks/favoriteStore-C9utQ6sm.js +112 -0
- package/dist/chunks/favoriteStore-C9utQ6sm.js.map +1 -0
- package/dist/chunks/{popupStore-D8RI04bU.js → popupStore-DmFbkkjd.js} +19 -18
- package/dist/chunks/popupStore-DmFbkkjd.js.map +1 -0
- package/dist/chunks/popupStore-DnWLaQ70.cjs +2 -0
- package/dist/chunks/popupStore-DnWLaQ70.cjs.map +1 -0
- package/dist/chunks/usePopup-C8FrbrDD.cjs +2 -0
- package/dist/chunks/{UtilsContext-JSHHfnWl.js.map → usePopup-C8FrbrDD.cjs.map} +1 -1
- package/dist/chunks/{UtilsContext-JSHHfnWl.js → usePopup-pfh-ajfP.js} +82 -82
- package/dist/chunks/usePopup-pfh-ajfP.js.map +1 -0
- package/dist/components/common/BwgDetail.d.ts +5 -0
- package/dist/components/common/BwgDetail.d.ts.map +1 -0
- package/dist/components/common/BwgDrawer.d.ts.map +1 -1
- package/dist/components/common/BwgEditor.d.ts +7 -0
- package/dist/components/common/BwgEditor.d.ts.map +1 -0
- package/dist/components/common/BwgView.d.ts.map +1 -1
- package/dist/components/common/index.cjs +1 -1
- package/dist/components/common/index.d.ts +3 -1
- package/dist/components/common/index.d.ts.map +1 -1
- package/dist/components/common/index.js +27 -25
- package/dist/components/core/BwgDatePicker.d.ts +1 -1
- package/dist/components/core/BwgDatePicker.d.ts.map +1 -1
- package/dist/components/core/BwgRangePicker.d.ts +1 -1
- package/dist/components/core/BwgRangePicker.d.ts.map +1 -1
- package/dist/components/core/BwgUploader.d.ts.map +1 -1
- package/dist/components/core/index.cjs +1 -1
- package/dist/components/core/index.js +1 -1
- package/dist/components/layout/ErrorBound.d.ts +29 -0
- package/dist/components/layout/ErrorBound.d.ts.map +1 -0
- package/dist/components/layout/TabContainer.d.ts +9 -0
- package/dist/components/layout/TabContainer.d.ts.map +1 -0
- package/dist/components/layout/index.cjs +1 -1
- package/dist/components/layout/index.d.ts +3 -1
- package/dist/components/layout/index.d.ts.map +1 -1
- package/dist/components/layout/index.js +6 -4
- package/dist/index.cjs +1 -1
- package/dist/index.js +304 -299
- package/dist/provider/index.cjs +1 -1
- package/dist/provider/index.js +2 -2
- package/dist/stores/favoriteStore.d.ts.map +1 -1
- package/dist/stores/index.cjs +1 -1
- package/dist/stores/index.cjs.map +1 -1
- package/dist/stores/index.d.ts +3 -1
- package/dist/stores/index.d.ts.map +1 -1
- package/dist/stores/index.js +18 -16
- package/dist/stores/index.js.map +1 -1
- package/dist/stores/loadingStore.d.ts +9 -0
- package/dist/stores/loadingStore.d.ts.map +1 -0
- package/dist/stores/menuViewStore.d.ts +28 -3
- package/dist/stores/menuViewStore.d.ts.map +1 -1
- package/dist/stores/popupStore.d.ts.map +1 -1
- package/dist/styles/assets/images/header/icon/ico-bell.svg +3 -3
- package/dist/styles/assets/images/header/icon/ico-logout.svg +10 -10
- package/dist/styles/assets/images/header/icon/ico-setting.svg +4 -4
- package/dist/styles/assets/images/header/icon/ico-sidebar-arrow.svg +3 -3
- package/dist/utils/apiUtils.d.ts +3 -2
- package/dist/utils/apiUtils.d.ts.map +1 -1
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.js +3 -3
- package/dist/utils/notificationUtils.d.ts +0 -1
- package/dist/utils/notificationUtils.d.ts.map +1 -1
- package/package.json +6 -7
- package/dist/chunks/BwgLargeUploader-B5EtYKUz.js.map +0 -1
- package/dist/chunks/BwgLargeUploader-BPJcShgF.cjs +0 -3
- package/dist/chunks/BwgLargeUploader-BPJcShgF.cjs.map +0 -1
- package/dist/chunks/FileUtils-BweAWoJt.cjs +0 -2
- package/dist/chunks/PublicLayout-3v46YZdi.cjs +0 -36
- package/dist/chunks/PublicLayout-3v46YZdi.cjs.map +0 -1
- package/dist/chunks/PublicLayout-B4wGo0ut.js +0 -139
- package/dist/chunks/PublicLayout-B4wGo0ut.js.map +0 -1
- package/dist/chunks/SSOHandler-C72Do3RD.js +0 -15717
- package/dist/chunks/SSOHandler-C72Do3RD.js.map +0 -1
- package/dist/chunks/SSOHandler-ColywAGZ.cjs +0 -184
- package/dist/chunks/SSOHandler-ColywAGZ.cjs.map +0 -1
- package/dist/chunks/SearchBoxContext-DDBY44Wr.cjs +0 -2
- package/dist/chunks/UtilsContext-C4tlOndT.cjs +0 -2
- package/dist/chunks/UtilsContext-C4tlOndT.cjs.map +0 -1
- package/dist/chunks/_commonjsHelpers-C6fGbg64.js +0 -7
- package/dist/chunks/_commonjsHelpers-C6fGbg64.js.map +0 -1
- package/dist/chunks/_commonjsHelpers-DwGv2jUC.cjs +0 -2
- package/dist/chunks/_commonjsHelpers-DwGv2jUC.cjs.map +0 -1
- package/dist/chunks/codeStore-KPL92rcv.cjs +0 -2
- package/dist/chunks/commonUtils-Cvx6_eK2.js.map +0 -1
- package/dist/chunks/commonUtils-DaFg0y7C.cjs +0 -2
- package/dist/chunks/commonUtils-DaFg0y7C.cjs.map +0 -1
- package/dist/chunks/menuViewStore-DuS0VmkB.cjs +0 -3
- package/dist/chunks/menuViewStore-DuS0VmkB.cjs.map +0 -1
- package/dist/chunks/menuViewStore-OKcSQq-s.js +0 -343
- package/dist/chunks/menuViewStore-OKcSQq-s.js.map +0 -1
- package/dist/chunks/popupStore-BEoWGajT.cjs +0 -2
- package/dist/chunks/popupStore-BEoWGajT.cjs.map +0 -1
- package/dist/chunks/popupStore-D8RI04bU.js.map +0 -1
- package/dist/chunks/serviceConfig-9dHegQIK.cjs +0 -3
- package/dist/chunks/serviceConfig-9dHegQIK.cjs.map +0 -1
- package/dist/chunks/serviceConfig-Dhe7neaj.js +0 -709
- package/dist/chunks/serviceConfig-Dhe7neaj.js.map +0 -1
- package/scripts/gen-component-registry.js +0 -138
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const i=require("react"),n=require("antd"),g=require("./serviceConfig-9dHegQIK.cjs");var a=typeof document<"u"?document.currentScript:null;const h=e=>{try{return new URL(Object.assign({})[`../assets/images/backgrounds/${e}`],typeof document>"u"?require("url").pathToFileURL(__filename).href:a&&a.tagName.toUpperCase()==="SCRIPT"&&a.src||new URL("chunks/FileUtils-BweAWoJt.cjs",document.baseURI).href).href}catch{return l()}},l=()=>"https://images.unsplash.com/photo-1578662996442-48f60103fc96?w=1920&h=1080&fit=crop&crop=center",d=e=>{try{return new URL(Object.assign({})[`../assets/images/logos/${e}`],typeof document>"u"?require("url").pathToFileURL(__filename).href:a&&a.tagName.toUpperCase()==="SCRIPT"&&a.src||new URL("chunks/FileUtils-BweAWoJt.cjs",document.baseURI).href).href}catch{return"/images/default-logo.png"}},f=(e,t="common")=>{try{return new URL(Object.assign({})[`../assets/images/icons/${t}/${e}`],typeof document>"u"?require("url").pathToFileURL(__filename).href:a&&a.tagName.toUpperCase()==="SCRIPT"&&a.src||new URL("chunks/FileUtils-BweAWoJt.cjs",document.baseURI).href).href}catch{return`/images/icons/${t}/default.svg`}},w=e=>{try{return new URL(Object.assign({})[`../assets/images/avatars/${e}`],typeof document>"u"?require("url").pathToFileURL(__filename).href:a&&a.tagName.toUpperCase()==="SCRIPT"&&a.src||new URL("chunks/FileUtils-BweAWoJt.cjs",document.baseURI).href).href}catch{return"/images/avatars/default.png"}},u=e=>new Promise((t,r)=>{const s=new Image;s.onload=()=>t(),s.onerror=()=>r(new Error(`Failed to load image: ${e}`)),s.src=e}),m=(e,t,r)=>{const s=new URL(e);return s.searchParams.set("w",t.toString()),s.searchParams.set("h",r.toString()),s.toString()},p=(e,t)=>{const r=new URL(e);return r.searchParams.set("fm",t),r.toString()},I=(e,t)=>t.map(r=>`${m(e,r,r)} ${r}w`).join(", "),U=(e,t={})=>{const r=new URL(e);return t.width&&r.searchParams.set("w",t.width.toString()),t.height&&r.searchParams.set("h",t.height.toString()),t.format&&r.searchParams.set("fm",t.format),t.quality&&r.searchParams.set("q",t.quality.toString()),r.toString()},S=e=>{const t=e.target;t.src="/images/placeholder.png",t.alt="이미지를 불러올 수 없습니다"},R=e=>{const[t,r]=i.useState(!0),[s,o]=i.useState(!1);return i.useEffect(()=>{r(!0),o(!1),u(e).then(()=>r(!1)).catch(()=>{o(!0),r(!1)})},[e]),{isLoading:t,hasError:s}},C=(e,t,r=30)=>{const s=new Date;s.setTime(s.getTime()+r*24*60*60*1e3),document.cookie=`${e}=${t};expires=${s.toUTCString()};path=/`},E=e=>{const t=e+"=",r=document.cookie.split(";");for(let s=0;s<r.length;s++){let o=r[s];for(;o.charAt(0)===" ";)o=o.substring(1,o.length);if(o.indexOf(t)===0)return o.substring(t.length,o.length)}return null},L=e=>{document.cookie=`${e}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/`},y="krx_ui_theme",_=(e,t=3)=>{n.message.success({content:e,duration:t})},c=(e,t=5)=>{n.message.error({content:e,duration:t})},k=(e="처리중...")=>n.message.loading({content:e,duration:0}),$=e=>{n.message.destroy(e)},F=()=>{n.message.destroy()},P=(e,t="처리 중 오류가 발생했습니다.")=>{const r=e?.response?.data?.message||e?.message||t;c(r)},T=(e="저장")=>{_(`${e}이 완료되었습니다.`)},b=(e="저장")=>{c(`${e} 중 오류가 발생했습니다.`)},v=e=>{c(`이미 사용중인 ${e}입니다.`)},q=e=>{c(`${e}을(를) 입력해주세요.`)};async function O(e){try{return await g.callService("SCMFILE00101",{crprCd:g.getUserInfo().crprCd,sysCd:__SYS_CD__,fileKey:e}).then(r=>{let s;if(r.sub&&(s=r.sub[0]),console.log(r),console.log(s),!s.lgclFileNm)throw console.error("논리파일명이 없습니다."),new Error("논리 파일명 누락");if(!s.filePath)throw console.error("파일 경로가 없습니다."),new Error("파일 경로 누락");const o=`api/download?filePath=${encodeURIComponent(s.filePath)}&logicalName=${encodeURIComponent(s.lgclFileNm)}`;return window.open(o,"_blank"),{success:!0,message:"파일 다운로드 요청 성공"}})}catch(t){throw console.error("downloadByFileKey 함수 실행 중 오류 발생:",t),t}}exports.THEME_COOKIE_NAME=y;exports.closeAllMessages=F;exports.closeMessage=$;exports.convertImageFormat=p;exports.deleteCookie=L;exports.downloadByFileKey=O;exports.generateSrcSet=I;exports.getAvatarImage=w;exports.getBackgroundImage=h;exports.getCookie=E;exports.getDefaultBackgroundImage=l;exports.getIconImage=f;exports.getLogoImage=d;exports.getOptimizedImageUrl=U;exports.handleImageError=S;exports.preloadImage=u;exports.resizeImage=m;exports.setCookie=C;exports.showApiError=P;exports.showDuplicateError=v;exports.showLoading=k;exports.showRequiredError=q;exports.showSaveError=b;exports.showSaveSuccess=T;exports.useImageLoader=R;
|
|
2
|
-
//# sourceMappingURL=FileUtils-BweAWoJt.cjs.map
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use strict";const t=require("./jsx-runtime-CeSfJrVB.cjs"),d=require("./AuthContext-CXng9fj0.cjs"),f=require("./ScreenProtectContext-CVuXrJm6.cjs"),u=require("antd"),x=require("react-router-dom"),w=require("./envUtils-CduTHoHu.cjs"),j=require("react"),p="bwg-dot-line-wave-v4";function v(){if(typeof document>"u"||document.getElementById(p))return;const e=document.createElement("style");e.id=p,e.textContent=`
|
|
2
|
-
.bwg-dotline {
|
|
3
|
-
display: inline-flex;
|
|
4
|
-
align-items: center;
|
|
5
|
-
gap: var(--bwg-gap, 12px);
|
|
6
|
-
height: calc(var(--bwg-size, 12px) + 2 * var(--bwg-amp, 12px));
|
|
7
|
-
line-height: 0;
|
|
8
|
-
}
|
|
9
|
-
.bwg-dotline .dot {
|
|
10
|
-
width: var(--bwg-size, 12px);
|
|
11
|
-
height: var(--bwg-size, 12px);
|
|
12
|
-
border-radius: 50%;
|
|
13
|
-
background: currentColor;
|
|
14
|
-
will-change: transform, opacity;
|
|
15
|
-
filter: drop-shadow(0 1px 2px rgba(0,0,0,.12));
|
|
16
|
-
animation: bwg-dotline-sine var(--bwg-speed, 780ms) linear infinite;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/* sin(θ) 근사: 0, 45, 90, 135, 180, 225, 270, 315, 360deg */
|
|
20
|
-
@keyframes bwg-dotline-sine {
|
|
21
|
-
0% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }
|
|
22
|
-
12.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }
|
|
23
|
-
25% { transform: translate3d(0, calc(-1 * var(--bwg-amp, 12px)), 0) scale(1.06); opacity: 1; }
|
|
24
|
-
37.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }
|
|
25
|
-
50% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }
|
|
26
|
-
62.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }
|
|
27
|
-
75% { transform: translate3d(0, calc( 1 * var(--bwg-amp, 12px)), 0) scale(.96); opacity: .76; }
|
|
28
|
-
87.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }
|
|
29
|
-
100% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
@media (prefers-reduced-motion: reduce) {
|
|
33
|
-
.bwg-dotline .dot { animation: none; }
|
|
34
|
-
}
|
|
35
|
-
`,document.head.appendChild(e)}const E=({colors:e=["#DAD3FF","#B3A6FF","#9380FF","#816BFA"],count:r,size:s=12,gap:i=10,amp:m=16,speedMs:l=900,direction:g="ltr",phase:y=.7})=>{j.useEffect(()=>{v()},[]);const a=r??e.length,b=Array.from({length:a}),h={"--bwg-size":`${s}px`,"--bwg-gap":`${i}px`,"--bwg-amp":`${m}px`,"--bwg-speed":`${l}ms`},c=l/a*y;return t.jsxRuntimeExports.jsx("span",{className:"bwg-dotline",role:"img","aria-label":"loading",style:h,children:b.map((D,n)=>t.jsxRuntimeExports.jsx("span",{className:"dot",style:{backgroundColor:e[n%e.length],animationDelay:g==="ltr"?`${n*c}ms`:`${(a-1-n)*c}ms`}},n))})},o=({spin:e=null,text:r="인증중..."})=>{const{busy:s}=d.useAuth();return e??s?t.jsxRuntimeExports.jsxs("div",{style:{position:"fixed",height:"100vh",left:0,right:0,top:0,display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",gap:8,padding:"8px 12px",background:"rgba(0,0,0,0.6)",color:"#fff",zIndex:1e4},"aria-live":"polite","aria-busy":"true",role:"status",children:[t.jsxRuntimeExports.jsx(u.Spin,{indicator:t.jsxRuntimeExports.jsx(E,{colors:["#DAD3FF","#B3A6FF","#9380FF","#816BFA"],size:12,gap:10,amp:16,speedMs:900,phase:.75,direction:"ltr"})}),t.jsxRuntimeExports.jsx("span",{className:"bwg-spin-txt",style:{marginTop:"15px"},children:r})]}):null},R=()=>{const{reauthWithPin:e}=d.useAuth();return t.jsxRuntimeExports.jsx(f.ScreenProtectProvider,{idleMs:30*6e4,onUnlock:async r=>w.isLocal?!0:!!r&&await e(r),children:t.jsxRuntimeExports.jsx(u.ConfigProvider,{getPopupContainer:()=>document.getElementById("app-shell")||document.body,children:t.jsxRuntimeExports.jsxs("div",{id:"app-shell",children:[t.jsxRuntimeExports.jsx(o,{}),t.jsxRuntimeExports.jsx(x.Outlet,{})]})})})},F=()=>t.jsxRuntimeExports.jsxs("div",{children:[t.jsxRuntimeExports.jsx(o,{}),t.jsxRuntimeExports.jsx(x.Outlet,{})]});exports.ProgressOverlay=o;exports.ProtectedLayout=R;exports.PublicLayout=F;
|
|
36
|
-
//# sourceMappingURL=PublicLayout-3v46YZdi.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PublicLayout-3v46YZdi.cjs","sources":["../../src/components/layout/ProgressOverlay.tsx","../../src/components/layout/ProtectLayout.tsx","../../src/components/layout/PublicLayout.tsx"],"sourcesContent":["import { useAuth } from \"@/provider/contexts/AuthContext\";\r\nimport { Spin } from \"antd\";\r\nimport React, { useEffect } from 'react';\r\n\r\nconst DOTLINE_STYLE_ID = 'bwg-dot-line-wave-v4';\r\nfunction ensureDotLineWaveStylesV4() {\r\n if (typeof document === 'undefined') return;\r\n if (document.getElementById(DOTLINE_STYLE_ID)) return;\r\n\r\n const style = document.createElement('style');\r\n style.id = DOTLINE_STYLE_ID;\r\n style.textContent = `\r\n .bwg-dotline {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--bwg-gap, 12px);\r\n height: calc(var(--bwg-size, 12px) + 2 * var(--bwg-amp, 12px));\r\n line-height: 0;\r\n }\r\n .bwg-dotline .dot {\r\n width: var(--bwg-size, 12px);\r\n height: var(--bwg-size, 12px);\r\n border-radius: 50%;\r\n background: currentColor;\r\n will-change: transform, opacity;\r\n filter: drop-shadow(0 1px 2px rgba(0,0,0,.12));\r\n animation: bwg-dotline-sine var(--bwg-speed, 780ms) linear infinite;\r\n }\r\n\r\n /* sin(θ) 근사: 0, 45, 90, 135, 180, 225, 270, 315, 360deg */\r\n @keyframes bwg-dotline-sine {\r\n 0% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }\r\n 12.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }\r\n 25% { transform: translate3d(0, calc(-1 * var(--bwg-amp, 12px)), 0) scale(1.06); opacity: 1; }\r\n 37.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }\r\n 50% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }\r\n 62.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }\r\n 75% { transform: translate3d(0, calc( 1 * var(--bwg-amp, 12px)), 0) scale(.96); opacity: .76; }\r\n 87.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }\r\n 100% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .bwg-dotline .dot { animation: none; }\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n}\r\n\r\n/* 직선 도트 파동 인디케이터 */\r\nconst DotLineSmoothIndicator: React.FC<{\r\n colors?: string[]; // 각 점 색\r\n count?: number; // 점 개수 (기본: colors 길이)\r\n size?: number; // 점 지름\r\n gap?: number; // 점 간격\r\n amp?: number; // 진폭(px)\r\n speedMs?: number; // 한 주기(ms)\r\n direction?: 'ltr' | 'rtl'; // 파동 진행 방향\r\n phase?: number; // 점 간 지연 비율(0~1) — 낮출수록 부드러움\r\n}> = ({\r\n colors = ['#DAD3FF', '#B3A6FF', '#9380FF', '#816BFA'],\r\n count,\r\n size = 12,\r\n gap = 10,\r\n amp = 16,\r\n speedMs = 900,\r\n direction = 'ltr',\r\n phase = 0.7,\r\n}) => {\r\n useEffect(() => { ensureDotLineWaveStylesV4(); }, []);\r\n\r\n const n = count ?? colors.length;\r\n const dots = Array.from({ length: n });\r\n const baseStyle = {\r\n ['--bwg-size' as any]: `${size}px`,\r\n ['--bwg-gap' as any]: `${gap}px`,\r\n ['--bwg-amp' as any]: `${amp}px`,\r\n ['--bwg-speed' as any]: `${speedMs}ms`,\r\n } as React.CSSProperties;\r\n\r\n const perDotDelay = (speedMs / n) * phase;\r\n\r\n return (\r\n <span className=\"bwg-dotline\" role=\"img\" aria-label=\"loading\" style={baseStyle}>\r\n {dots.map((_, i) => (\r\n <span\r\n key={i}\r\n className=\"dot\"\r\n style={{\r\n backgroundColor: colors[i % colors.length],\r\n animationDelay:\r\n direction === 'ltr'\r\n ? `${(i * perDotDelay)}ms`\r\n : `${((n - 1 - i) * perDotDelay)}ms`,\r\n }}\r\n />\r\n ))}\r\n </span>\r\n );\r\n};\r\n\r\n\r\n/**\r\n * 진행 중 표시\r\n * @returns ProgressOverlay\r\n */\r\nconst ProgressOverlay: React.FC<{spin?: boolean | null; text?: string }> = ({spin = null, text = '인증중...',}) => {\r\n const { busy } = useAuth();\r\n const show = (spin ?? busy);\r\n if (!show) return null;\r\n return (\r\n <div\r\n style={{\r\n position: \"fixed\",\r\n height: \"100vh\",\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n display: \"flex\",\r\n flexDirection:'column',\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n gap: 8,\r\n padding: \"8px 12px\",\r\n background: \"rgba(0,0,0,0.6)\",\r\n color: \"#fff\",\r\n zIndex: 10000,\r\n }}\r\n aria-live=\"polite\"\r\n aria-busy=\"true\"\r\n role=\"status\"\r\n >\r\n <Spin\r\n indicator={\r\n <DotLineSmoothIndicator\r\n colors={['#DAD3FF', '#B3A6FF', '#9380FF', '#816BFA']}\r\n size={12}\r\n gap={10}\r\n amp={16}\r\n speedMs={900}\r\n phase={0.75} \r\n direction=\"ltr\"\r\n />\r\n }\r\n />\r\n <span className=\"bwg-spin-txt\" style={{marginTop:\"15px\"}}>{text}</span>\r\n </div>\r\n );\r\n };\r\n\r\nexport default ProgressOverlay;","import { useAuth } from \"@/provider/contexts/AuthContext\";\r\nimport { ScreenProtectProvider } from \"@/provider/contexts/ScreenProtectContext\";\r\nimport { isLocal } from \"@/utils\";\r\nimport { ConfigProvider } from \"antd\";\r\nimport { Outlet } from \"react-router-dom\";\r\nimport ProgressOverlay from \"./ProgressOverlay\";\r\n\r\n/**\r\n * 보호 레이아웃\r\n * @returns ProtectedLayout\r\n */\r\nconst ProtectedLayout = () => {\r\n const { reauthWithPin } = useAuth();\r\n // NOTE: 인증 여부 체크는 각 페이지(/main)의 스토어 가드에 위임합니다.\r\n // 필요하다면 여기서도 RequireAuth로 감싸세요.\r\n return (\r\n <ScreenProtectProvider idleMs={30 * 60_000} onUnlock={async (pin) => {\r\n if(isLocal) {\r\n // 로컬에서는 항상 true\r\n return true;\r\n }\r\n return !!pin && (await reauthWithPin(pin));\r\n }}>\r\n {/* Ensure AntD portals mount inside protected shell if you need it */}\r\n <ConfigProvider getPopupContainer={() => document.getElementById(\"app-shell\") || document.body}>\r\n <div id=\"app-shell\">\r\n <ProgressOverlay />\r\n <Outlet />\r\n </div>\r\n </ConfigProvider>\r\n </ScreenProtectProvider>\r\n );\r\n }\r\n\r\n export default ProtectedLayout;","import { Outlet } from \"react-router-dom\";\r\nimport ProgressOverlay from \"./ProgressOverlay\";\r\n\r\n/**\r\n * 공개 레이아웃\r\n * @returns PublicLayout\r\n */\r\nconst PublicLayout = () => {\r\n return (\r\n <div>\r\n <ProgressOverlay />\r\n <Outlet />\r\n </div>\r\n );\r\n}\r\n\r\nexport default PublicLayout;"],"names":["DOTLINE_STYLE_ID","ensureDotLineWaveStylesV4","style","DotLineSmoothIndicator","colors","count","size","gap","amp","speedMs","direction","phase","useEffect","n","dots","baseStyle","perDotDelay","jsx","_","i","ProgressOverlay","spin","text","busy","useAuth","jsxs","Spin","ProtectedLayout","reauthWithPin","ScreenProtectProvider","pin","isLocal","ConfigProvider","Outlet","PublicLayout"],"mappings":"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"}
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { j as e } from "./jsx-runtime-Dpn_P65e.js";
|
|
2
|
-
import { u as p } from "./AuthContext-Ei2P-z4d.js";
|
|
3
|
-
import { S as y } from "./ScreenProtectContext-3my4PHFa.js";
|
|
4
|
-
import { Spin as h, ConfigProvider as w } from "antd";
|
|
5
|
-
import { Outlet as d } from "react-router-dom";
|
|
6
|
-
import { i as v } from "./envUtils-C9Gf5aek.js";
|
|
7
|
-
import { useEffect as j } from "react";
|
|
8
|
-
const c = "bwg-dot-line-wave-v4";
|
|
9
|
-
function F() {
|
|
10
|
-
if (typeof document > "u" || document.getElementById(c)) return;
|
|
11
|
-
const t = document.createElement("style");
|
|
12
|
-
t.id = c, t.textContent = `
|
|
13
|
-
.bwg-dotline {
|
|
14
|
-
display: inline-flex;
|
|
15
|
-
align-items: center;
|
|
16
|
-
gap: var(--bwg-gap, 12px);
|
|
17
|
-
height: calc(var(--bwg-size, 12px) + 2 * var(--bwg-amp, 12px));
|
|
18
|
-
line-height: 0;
|
|
19
|
-
}
|
|
20
|
-
.bwg-dotline .dot {
|
|
21
|
-
width: var(--bwg-size, 12px);
|
|
22
|
-
height: var(--bwg-size, 12px);
|
|
23
|
-
border-radius: 50%;
|
|
24
|
-
background: currentColor;
|
|
25
|
-
will-change: transform, opacity;
|
|
26
|
-
filter: drop-shadow(0 1px 2px rgba(0,0,0,.12));
|
|
27
|
-
animation: bwg-dotline-sine var(--bwg-speed, 780ms) linear infinite;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/* sin(θ) 근사: 0, 45, 90, 135, 180, 225, 270, 315, 360deg */
|
|
31
|
-
@keyframes bwg-dotline-sine {
|
|
32
|
-
0% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }
|
|
33
|
-
12.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }
|
|
34
|
-
25% { transform: translate3d(0, calc(-1 * var(--bwg-amp, 12px)), 0) scale(1.06); opacity: 1; }
|
|
35
|
-
37.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }
|
|
36
|
-
50% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }
|
|
37
|
-
62.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }
|
|
38
|
-
75% { transform: translate3d(0, calc( 1 * var(--bwg-amp, 12px)), 0) scale(.96); opacity: .76; }
|
|
39
|
-
87.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }
|
|
40
|
-
100% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
@media (prefers-reduced-motion: reduce) {
|
|
44
|
-
.bwg-dotline .dot { animation: none; }
|
|
45
|
-
}
|
|
46
|
-
`, document.head.appendChild(t);
|
|
47
|
-
}
|
|
48
|
-
const D = ({
|
|
49
|
-
colors: t = ["#DAD3FF", "#B3A6FF", "#9380FF", "#816BFA"],
|
|
50
|
-
count: a,
|
|
51
|
-
size: n = 12,
|
|
52
|
-
gap: o = 10,
|
|
53
|
-
amp: g = 16,
|
|
54
|
-
speedMs: i = 900,
|
|
55
|
-
direction: u = "ltr",
|
|
56
|
-
phase: x = 0.7
|
|
57
|
-
}) => {
|
|
58
|
-
j(() => {
|
|
59
|
-
F();
|
|
60
|
-
}, []);
|
|
61
|
-
const s = a ?? t.length, f = Array.from({ length: s }), b = {
|
|
62
|
-
"--bwg-size": `${n}px`,
|
|
63
|
-
"--bwg-gap": `${o}px`,
|
|
64
|
-
"--bwg-amp": `${g}px`,
|
|
65
|
-
"--bwg-speed": `${i}ms`
|
|
66
|
-
}, l = i / s * x;
|
|
67
|
-
return /* @__PURE__ */ e.jsx("span", { className: "bwg-dotline", role: "img", "aria-label": "loading", style: b, children: f.map((P, r) => /* @__PURE__ */ e.jsx(
|
|
68
|
-
"span",
|
|
69
|
-
{
|
|
70
|
-
className: "dot",
|
|
71
|
-
style: {
|
|
72
|
-
backgroundColor: t[r % t.length],
|
|
73
|
-
animationDelay: u === "ltr" ? `${r * l}ms` : `${(s - 1 - r) * l}ms`
|
|
74
|
-
}
|
|
75
|
-
},
|
|
76
|
-
r
|
|
77
|
-
)) });
|
|
78
|
-
}, m = ({ spin: t = null, text: a = "인증중..." }) => {
|
|
79
|
-
const { busy: n } = p();
|
|
80
|
-
return t ?? n ? /* @__PURE__ */ e.jsxs(
|
|
81
|
-
"div",
|
|
82
|
-
{
|
|
83
|
-
style: {
|
|
84
|
-
position: "fixed",
|
|
85
|
-
height: "100vh",
|
|
86
|
-
left: 0,
|
|
87
|
-
right: 0,
|
|
88
|
-
top: 0,
|
|
89
|
-
display: "flex",
|
|
90
|
-
flexDirection: "column",
|
|
91
|
-
justifyContent: "center",
|
|
92
|
-
alignItems: "center",
|
|
93
|
-
gap: 8,
|
|
94
|
-
padding: "8px 12px",
|
|
95
|
-
background: "rgba(0,0,0,0.6)",
|
|
96
|
-
color: "#fff",
|
|
97
|
-
zIndex: 1e4
|
|
98
|
-
},
|
|
99
|
-
"aria-live": "polite",
|
|
100
|
-
"aria-busy": "true",
|
|
101
|
-
role: "status",
|
|
102
|
-
children: [
|
|
103
|
-
/* @__PURE__ */ e.jsx(
|
|
104
|
-
h,
|
|
105
|
-
{
|
|
106
|
-
indicator: /* @__PURE__ */ e.jsx(
|
|
107
|
-
D,
|
|
108
|
-
{
|
|
109
|
-
colors: ["#DAD3FF", "#B3A6FF", "#9380FF", "#816BFA"],
|
|
110
|
-
size: 12,
|
|
111
|
-
gap: 10,
|
|
112
|
-
amp: 16,
|
|
113
|
-
speedMs: 900,
|
|
114
|
-
phase: 0.75,
|
|
115
|
-
direction: "ltr"
|
|
116
|
-
}
|
|
117
|
-
)
|
|
118
|
-
}
|
|
119
|
-
),
|
|
120
|
-
/* @__PURE__ */ e.jsx("span", { className: "bwg-spin-txt", style: { marginTop: "15px" }, children: a })
|
|
121
|
-
]
|
|
122
|
-
}
|
|
123
|
-
) : null;
|
|
124
|
-
}, B = () => {
|
|
125
|
-
const { reauthWithPin: t } = p();
|
|
126
|
-
return /* @__PURE__ */ e.jsx(y, { idleMs: 30 * 6e4, onUnlock: async (a) => v ? !0 : !!a && await t(a), children: /* @__PURE__ */ e.jsx(w, { getPopupContainer: () => document.getElementById("app-shell") || document.body, children: /* @__PURE__ */ e.jsxs("div", { id: "app-shell", children: [
|
|
127
|
-
/* @__PURE__ */ e.jsx(m, {}),
|
|
128
|
-
/* @__PURE__ */ e.jsx(d, {})
|
|
129
|
-
] }) }) });
|
|
130
|
-
}, $ = () => /* @__PURE__ */ e.jsxs("div", { children: [
|
|
131
|
-
/* @__PURE__ */ e.jsx(m, {}),
|
|
132
|
-
/* @__PURE__ */ e.jsx(d, {})
|
|
133
|
-
] });
|
|
134
|
-
export {
|
|
135
|
-
m as P,
|
|
136
|
-
B as a,
|
|
137
|
-
$ as b
|
|
138
|
-
};
|
|
139
|
-
//# sourceMappingURL=PublicLayout-B4wGo0ut.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PublicLayout-B4wGo0ut.js","sources":["../../src/components/layout/ProgressOverlay.tsx","../../src/components/layout/ProtectLayout.tsx","../../src/components/layout/PublicLayout.tsx"],"sourcesContent":["import { useAuth } from \"@/provider/contexts/AuthContext\";\r\nimport { Spin } from \"antd\";\r\nimport React, { useEffect } from 'react';\r\n\r\nconst DOTLINE_STYLE_ID = 'bwg-dot-line-wave-v4';\r\nfunction ensureDotLineWaveStylesV4() {\r\n if (typeof document === 'undefined') return;\r\n if (document.getElementById(DOTLINE_STYLE_ID)) return;\r\n\r\n const style = document.createElement('style');\r\n style.id = DOTLINE_STYLE_ID;\r\n style.textContent = `\r\n .bwg-dotline {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--bwg-gap, 12px);\r\n height: calc(var(--bwg-size, 12px) + 2 * var(--bwg-amp, 12px));\r\n line-height: 0;\r\n }\r\n .bwg-dotline .dot {\r\n width: var(--bwg-size, 12px);\r\n height: var(--bwg-size, 12px);\r\n border-radius: 50%;\r\n background: currentColor;\r\n will-change: transform, opacity;\r\n filter: drop-shadow(0 1px 2px rgba(0,0,0,.12));\r\n animation: bwg-dotline-sine var(--bwg-speed, 780ms) linear infinite;\r\n }\r\n\r\n /* sin(θ) 근사: 0, 45, 90, 135, 180, 225, 270, 315, 360deg */\r\n @keyframes bwg-dotline-sine {\r\n 0% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }\r\n 12.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }\r\n 25% { transform: translate3d(0, calc(-1 * var(--bwg-amp, 12px)), 0) scale(1.06); opacity: 1; }\r\n 37.5%{ transform: translate3d(0, calc(-0.7071 * var(--bwg-amp, 12px)), 0) scale(1.03); opacity: .92; }\r\n 50% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }\r\n 62.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }\r\n 75% { transform: translate3d(0, calc( 1 * var(--bwg-amp, 12px)), 0) scale(.96); opacity: .76; }\r\n 87.5%{ transform: translate3d(0, calc( 0.7071 * var(--bwg-amp, 12px)), 0) scale(.97); opacity: .78; }\r\n 100% { transform: translate3d(0, 0, 0) scale(.98); opacity: .80; }\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .bwg-dotline .dot { animation: none; }\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n}\r\n\r\n/* 직선 도트 파동 인디케이터 */\r\nconst DotLineSmoothIndicator: React.FC<{\r\n colors?: string[]; // 각 점 색\r\n count?: number; // 점 개수 (기본: colors 길이)\r\n size?: number; // 점 지름\r\n gap?: number; // 점 간격\r\n amp?: number; // 진폭(px)\r\n speedMs?: number; // 한 주기(ms)\r\n direction?: 'ltr' | 'rtl'; // 파동 진행 방향\r\n phase?: number; // 점 간 지연 비율(0~1) — 낮출수록 부드러움\r\n}> = ({\r\n colors = ['#DAD3FF', '#B3A6FF', '#9380FF', '#816BFA'],\r\n count,\r\n size = 12,\r\n gap = 10,\r\n amp = 16,\r\n speedMs = 900,\r\n direction = 'ltr',\r\n phase = 0.7,\r\n}) => {\r\n useEffect(() => { ensureDotLineWaveStylesV4(); }, []);\r\n\r\n const n = count ?? colors.length;\r\n const dots = Array.from({ length: n });\r\n const baseStyle = {\r\n ['--bwg-size' as any]: `${size}px`,\r\n ['--bwg-gap' as any]: `${gap}px`,\r\n ['--bwg-amp' as any]: `${amp}px`,\r\n ['--bwg-speed' as any]: `${speedMs}ms`,\r\n } as React.CSSProperties;\r\n\r\n const perDotDelay = (speedMs / n) * phase;\r\n\r\n return (\r\n <span className=\"bwg-dotline\" role=\"img\" aria-label=\"loading\" style={baseStyle}>\r\n {dots.map((_, i) => (\r\n <span\r\n key={i}\r\n className=\"dot\"\r\n style={{\r\n backgroundColor: colors[i % colors.length],\r\n animationDelay:\r\n direction === 'ltr'\r\n ? `${(i * perDotDelay)}ms`\r\n : `${((n - 1 - i) * perDotDelay)}ms`,\r\n }}\r\n />\r\n ))}\r\n </span>\r\n );\r\n};\r\n\r\n\r\n/**\r\n * 진행 중 표시\r\n * @returns ProgressOverlay\r\n */\r\nconst ProgressOverlay: React.FC<{spin?: boolean | null; text?: string }> = ({spin = null, text = '인증중...',}) => {\r\n const { busy } = useAuth();\r\n const show = (spin ?? busy);\r\n if (!show) return null;\r\n return (\r\n <div\r\n style={{\r\n position: \"fixed\",\r\n height: \"100vh\",\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n display: \"flex\",\r\n flexDirection:'column',\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n gap: 8,\r\n padding: \"8px 12px\",\r\n background: \"rgba(0,0,0,0.6)\",\r\n color: \"#fff\",\r\n zIndex: 10000,\r\n }}\r\n aria-live=\"polite\"\r\n aria-busy=\"true\"\r\n role=\"status\"\r\n >\r\n <Spin\r\n indicator={\r\n <DotLineSmoothIndicator\r\n colors={['#DAD3FF', '#B3A6FF', '#9380FF', '#816BFA']}\r\n size={12}\r\n gap={10}\r\n amp={16}\r\n speedMs={900}\r\n phase={0.75} \r\n direction=\"ltr\"\r\n />\r\n }\r\n />\r\n <span className=\"bwg-spin-txt\" style={{marginTop:\"15px\"}}>{text}</span>\r\n </div>\r\n );\r\n };\r\n\r\nexport default ProgressOverlay;","import { useAuth } from \"@/provider/contexts/AuthContext\";\r\nimport { ScreenProtectProvider } from \"@/provider/contexts/ScreenProtectContext\";\r\nimport { isLocal } from \"@/utils\";\r\nimport { ConfigProvider } from \"antd\";\r\nimport { Outlet } from \"react-router-dom\";\r\nimport ProgressOverlay from \"./ProgressOverlay\";\r\n\r\n/**\r\n * 보호 레이아웃\r\n * @returns ProtectedLayout\r\n */\r\nconst ProtectedLayout = () => {\r\n const { reauthWithPin } = useAuth();\r\n // NOTE: 인증 여부 체크는 각 페이지(/main)의 스토어 가드에 위임합니다.\r\n // 필요하다면 여기서도 RequireAuth로 감싸세요.\r\n return (\r\n <ScreenProtectProvider idleMs={30 * 60_000} onUnlock={async (pin) => {\r\n if(isLocal) {\r\n // 로컬에서는 항상 true\r\n return true;\r\n }\r\n return !!pin && (await reauthWithPin(pin));\r\n }}>\r\n {/* Ensure AntD portals mount inside protected shell if you need it */}\r\n <ConfigProvider getPopupContainer={() => document.getElementById(\"app-shell\") || document.body}>\r\n <div id=\"app-shell\">\r\n <ProgressOverlay />\r\n <Outlet />\r\n </div>\r\n </ConfigProvider>\r\n </ScreenProtectProvider>\r\n );\r\n }\r\n\r\n export default ProtectedLayout;","import { Outlet } from \"react-router-dom\";\r\nimport ProgressOverlay from \"./ProgressOverlay\";\r\n\r\n/**\r\n * 공개 레이아웃\r\n * @returns PublicLayout\r\n */\r\nconst PublicLayout = () => {\r\n return (\r\n <div>\r\n <ProgressOverlay />\r\n <Outlet />\r\n </div>\r\n );\r\n}\r\n\r\nexport default PublicLayout;"],"names":["DOTLINE_STYLE_ID","ensureDotLineWaveStylesV4","style","DotLineSmoothIndicator","colors","count","size","gap","amp","speedMs","direction","phase","useEffect","n","dots","baseStyle","perDotDelay","jsx","_","i","ProgressOverlay","spin","text","busy","useAuth","jsxs","Spin","ProtectedLayout","reauthWithPin","ScreenProtectProvider","pin","isLocal","ConfigProvider","Outlet","PublicLayout"],"mappings":"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"}
|