@bwg-ui/core 1.1.7 → 1.1.8

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.
Files changed (103) hide show
  1. package/README.md +1 -1
  2. package/dist/chunks/BwgLargeUploader-1yDku10l.cjs +3 -0
  3. package/dist/chunks/BwgLargeUploader-1yDku10l.cjs.map +1 -0
  4. package/dist/chunks/{BwgLargeUploader-CZllyq7K.js → BwgLargeUploader-DsaIHpYz.js} +311 -297
  5. package/dist/chunks/BwgLargeUploader-DsaIHpYz.js.map +1 -0
  6. package/dist/chunks/LoadingOverlay-CAO6_FuF.js +29 -0
  7. package/dist/chunks/LoadingOverlay-CAO6_FuF.js.map +1 -0
  8. package/dist/chunks/LoadingOverlay-NX9Mo_6n.cjs +2 -0
  9. package/dist/chunks/LoadingOverlay-NX9Mo_6n.cjs.map +1 -0
  10. package/dist/chunks/{PublicLayout-BiTPwkVq.cjs → PublicLayout-3v46YZdi.cjs} +2 -2
  11. package/dist/chunks/{PublicLayout-BiTPwkVq.cjs.map → PublicLayout-3v46YZdi.cjs.map} +1 -1
  12. package/dist/chunks/{PublicLayout-g9WMtoZ0.js → PublicLayout-B4wGo0ut.js} +2 -2
  13. package/dist/chunks/{PublicLayout-g9WMtoZ0.js.map → PublicLayout-B4wGo0ut.js.map} +1 -1
  14. package/dist/chunks/{SSOHandler-Bu3v95k0.js → SSOHandler-B5rmYk8s.js} +2565 -2568
  15. package/dist/chunks/SSOHandler-B5rmYk8s.js.map +1 -0
  16. package/dist/chunks/SSOHandler-DjL0sH7k.cjs +184 -0
  17. package/dist/chunks/SSOHandler-DjL0sH7k.cjs.map +1 -0
  18. package/dist/chunks/ScreenProtectContext-3my4PHFa.js +154 -0
  19. package/dist/chunks/ScreenProtectContext-3my4PHFa.js.map +1 -0
  20. package/dist/chunks/ScreenProtectContext-CVuXrJm6.cjs +2 -0
  21. package/dist/chunks/ScreenProtectContext-CVuXrJm6.cjs.map +1 -0
  22. package/dist/chunks/{UtilsContext-CSgz9o2Z.js → UtilsContext-BKUZmmKx.js} +2 -2
  23. package/dist/chunks/{UtilsContext-CSgz9o2Z.js.map → UtilsContext-BKUZmmKx.js.map} +1 -1
  24. package/dist/chunks/{UtilsContext-5l7yFRQI.cjs → UtilsContext-DczQBfFi.cjs} +2 -2
  25. package/dist/chunks/{UtilsContext-5l7yFRQI.cjs.map → UtilsContext-DczQBfFi.cjs.map} +1 -1
  26. package/dist/chunks/{commonUtils-BV6WFv-z.js → commonUtils-Cvx6_eK2.js} +24 -23
  27. package/dist/chunks/commonUtils-Cvx6_eK2.js.map +1 -0
  28. package/dist/chunks/commonUtils-DaFg0y7C.cjs +2 -0
  29. package/dist/chunks/commonUtils-DaFg0y7C.cjs.map +1 -0
  30. package/dist/chunks/menuViewStore-BJak0NMm.cjs +3 -0
  31. package/dist/chunks/menuViewStore-BJak0NMm.cjs.map +1 -0
  32. package/dist/chunks/menuViewStore-BwR3vgPM.js +339 -0
  33. package/dist/chunks/menuViewStore-BwR3vgPM.js.map +1 -0
  34. package/dist/components/common/BwgButtonGroup.d.ts +2 -2
  35. package/dist/components/common/BwgButtonGroup.d.ts.map +1 -1
  36. package/dist/components/common/BwgTitleBox.d.ts +2 -2
  37. package/dist/components/common/BwgTitleBox.d.ts.map +1 -1
  38. package/dist/components/common/BwgView.d.ts.map +1 -1
  39. package/dist/components/common/QuickServiceToggle.d.ts.map +1 -1
  40. package/dist/components/common/index.cjs +1 -1
  41. package/dist/components/common/index.js +1 -1
  42. package/dist/components/core/BwgForm.d.ts.map +1 -1
  43. package/dist/components/core/BwgUploader.d.ts +5 -0
  44. package/dist/components/core/BwgUploader.d.ts.map +1 -1
  45. package/dist/components/core/index.cjs +1 -1
  46. package/dist/components/core/index.js +1 -1
  47. package/dist/components/layout/LoadingOverlay.d.ts +5 -0
  48. package/dist/components/layout/LoadingOverlay.d.ts.map +1 -0
  49. package/dist/components/layout/index.cjs +1 -1
  50. package/dist/components/layout/index.d.ts +1 -0
  51. package/dist/components/layout/index.d.ts.map +1 -1
  52. package/dist/components/layout/index.js +3 -1
  53. package/dist/components/layout/index.js.map +1 -1
  54. package/dist/index.cjs +1 -1
  55. package/dist/index.js +295 -291
  56. package/dist/index.js.map +1 -1
  57. package/dist/provider/contexts/ScreenProtectContext.d.ts +9 -4
  58. package/dist/provider/contexts/ScreenProtectContext.d.ts.map +1 -1
  59. package/dist/provider/hooks/index.d.ts +0 -1
  60. package/dist/provider/hooks/index.d.ts.map +1 -1
  61. package/dist/provider/index.cjs +1 -1
  62. package/dist/provider/index.js +2 -2
  63. package/dist/stores/favoriteStore.d.ts +1 -1
  64. package/dist/stores/favoriteStore.d.ts.map +1 -1
  65. package/dist/stores/index.cjs +1 -1
  66. package/dist/stores/index.cjs.map +1 -1
  67. package/dist/stores/index.d.ts +34 -3
  68. package/dist/stores/index.d.ts.map +1 -1
  69. package/dist/stores/index.js +17 -15
  70. package/dist/stores/index.js.map +1 -1
  71. package/dist/stores/menuModelStore.d.ts +36 -0
  72. package/dist/stores/menuModelStore.d.ts.map +1 -0
  73. package/dist/stores/menuViewStore.d.ts +31 -0
  74. package/dist/stores/menuViewStore.d.ts.map +1 -0
  75. package/dist/styles/assets/images/contents/icon/ico-quick-tab-move.svg +4 -4
  76. package/dist/styles/assets/images/logos/krx-logo-full.svg +35 -35
  77. package/dist/styles/components.css +2 -2
  78. package/dist/styles/layout.css +7 -1
  79. package/dist/utils/index.cjs +1 -1
  80. package/dist/utils/index.js +1 -1
  81. package/package.json +10 -4
  82. package/scripts/gen-component-registry.js +138 -0
  83. package/dist/chunks/BwgLargeUploader-CZllyq7K.js.map +0 -1
  84. package/dist/chunks/BwgLargeUploader-xAjj4TQ1.cjs +0 -3
  85. package/dist/chunks/BwgLargeUploader-xAjj4TQ1.cjs.map +0 -1
  86. package/dist/chunks/SSOHandler-Bu3v95k0.js.map +0 -1
  87. package/dist/chunks/SSOHandler-kghWABfM.cjs +0 -184
  88. package/dist/chunks/SSOHandler-kghWABfM.cjs.map +0 -1
  89. package/dist/chunks/ScreenProtectContext-ofv2QgMp.cjs +0 -2
  90. package/dist/chunks/ScreenProtectContext-ofv2QgMp.cjs.map +0 -1
  91. package/dist/chunks/ScreenProtectContext-zByHldrr.js +0 -115
  92. package/dist/chunks/ScreenProtectContext-zByHldrr.js.map +0 -1
  93. package/dist/chunks/commonUtils-BV6WFv-z.js.map +0 -1
  94. package/dist/chunks/commonUtils-L9Jgc5y-.cjs +0 -2
  95. package/dist/chunks/commonUtils-L9Jgc5y-.cjs.map +0 -1
  96. package/dist/chunks/menuStore-2zsN-PRt.js +0 -266
  97. package/dist/chunks/menuStore-2zsN-PRt.js.map +0 -1
  98. package/dist/chunks/menuStore-D7zl2c89.cjs +0 -2
  99. package/dist/chunks/menuStore-D7zl2c89.cjs.map +0 -1
  100. package/dist/provider/hooks/useViewState.d.ts +0 -15
  101. package/dist/provider/hooks/useViewState.d.ts.map +0 -1
  102. package/dist/stores/menuStore.d.ts +0 -53
  103. package/dist/stores/menuStore.d.ts.map +0 -1
@@ -0,0 +1,29 @@
1
+ import { j as e } from "./jsx-runtime-Dpn_P65e.js";
2
+ import { Spin as t, Typography as i } from "antd";
3
+ function o({
4
+ text: r = "로딩 중...",
5
+ backdrop: s = !1
6
+ // 필요하면 살짝 어둡게
7
+ }) {
8
+ return /* @__PURE__ */ e.jsx(
9
+ "div",
10
+ {
11
+ style: {
12
+ position: "absolute",
13
+ inset: 0,
14
+ display: "grid",
15
+ placeItems: "center",
16
+ zIndex: 5,
17
+ background: s ? "rgba(255,255,255,0.5)" : "transparent"
18
+ },
19
+ children: /* @__PURE__ */ e.jsxs("div", { style: { display: "grid", justifyItems: "center", gap: 12 }, children: [
20
+ /* @__PURE__ */ e.jsx(t, { size: "large" }),
21
+ /* @__PURE__ */ e.jsx(i.Text, { type: "secondary", children: r })
22
+ ] })
23
+ }
24
+ );
25
+ }
26
+ export {
27
+ o as L
28
+ };
29
+ //# sourceMappingURL=LoadingOverlay-CAO6_FuF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoadingOverlay-CAO6_FuF.js","sources":["../../src/components/layout/LoadingOverlay.tsx"],"sourcesContent":["// src/components/common/LoadingOverlay.tsx\r\nimport React from \"react\";\r\nimport { Spin, Typography } from \"antd\";\r\n\r\nexport default function LoadingOverlay({\r\n text = \"로딩 중...\",\r\n backdrop = false, // 필요하면 살짝 어둡게\r\n}: {\r\n text?: string;\r\n backdrop?: boolean;\r\n}) {\r\n return (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n display: \"grid\",\r\n placeItems: \"center\",\r\n zIndex: 5,\r\n background: backdrop ? \"rgba(255,255,255,0.5)\" : \"transparent\",\r\n }}\r\n >\r\n <div style={{ display: \"grid\", justifyItems: \"center\", gap: 12 }}>\r\n <Spin size=\"large\" />\r\n <Typography.Text type=\"secondary\">{text}</Typography.Text>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["LoadingOverlay","text","backdrop","jsx","jsxs","Spin","Typography"],"mappings":";;AAIA,SAAwBA,EAAe;AAAA,EACrC,MAAAC,IAAO;AAAA,EACP,UAAAC,IAAW;AAAA;AACb,GAGG;AACD,SACEC,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,YAAYD,IAAW,0BAA0B;AAAA,MAAA;AAAA,MAGnD,UAAAE,gBAAAA,EAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,cAAc,UAAU,KAAK,GAAA,GAC1D,UAAA;AAAA,QAAAD,gBAAAA,EAAAA,IAACE,GAAA,EAAK,MAAK,QAAA,CAAQ;AAAA,8BAClBC,EAAW,MAAX,EAAgB,MAAK,aAAa,UAAAL,EAAA,CAAK;AAAA,MAAA,EAAA,CAC1C;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e=require("./jsx-runtime-CeSfJrVB.cjs"),s=require("antd");function i({text:t="로딩 중...",backdrop:r=!1}){return e.jsxRuntimeExports.jsx("div",{style:{position:"absolute",inset:0,display:"grid",placeItems:"center",zIndex:5,background:r?"rgba(255,255,255,0.5)":"transparent"},children:e.jsxRuntimeExports.jsxs("div",{style:{display:"grid",justifyItems:"center",gap:12},children:[e.jsxRuntimeExports.jsx(s.Spin,{size:"large"}),e.jsxRuntimeExports.jsx(s.Typography.Text,{type:"secondary",children:t})]})})}exports.LoadingOverlay=i;
2
+ //# sourceMappingURL=LoadingOverlay-NX9Mo_6n.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoadingOverlay-NX9Mo_6n.cjs","sources":["../../src/components/layout/LoadingOverlay.tsx"],"sourcesContent":["// src/components/common/LoadingOverlay.tsx\r\nimport React from \"react\";\r\nimport { Spin, Typography } from \"antd\";\r\n\r\nexport default function LoadingOverlay({\r\n text = \"로딩 중...\",\r\n backdrop = false, // 필요하면 살짝 어둡게\r\n}: {\r\n text?: string;\r\n backdrop?: boolean;\r\n}) {\r\n return (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n display: \"grid\",\r\n placeItems: \"center\",\r\n zIndex: 5,\r\n background: backdrop ? \"rgba(255,255,255,0.5)\" : \"transparent\",\r\n }}\r\n >\r\n <div style={{ display: \"grid\", justifyItems: \"center\", gap: 12 }}>\r\n <Spin size=\"large\" />\r\n <Typography.Text type=\"secondary\">{text}</Typography.Text>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["LoadingOverlay","text","backdrop","jsx","jsxs","Spin","Typography"],"mappings":"6EAIA,SAAwBA,EAAe,CACrC,KAAAC,EAAO,UACP,SAAAC,EAAW,EACb,EAGG,CACD,OACEC,EAAAA,kBAAAA,IAAC,MAAA,CACC,MAAO,CACL,SAAU,WACV,MAAO,EACP,QAAS,OACT,WAAY,SACZ,OAAQ,EACR,WAAYD,EAAW,wBAA0B,aAAA,EAGnD,SAAAE,EAAAA,kBAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,aAAc,SAAU,IAAK,EAAA,EAC1D,SAAA,CAAAD,EAAAA,kBAAAA,IAACE,EAAAA,KAAA,CAAK,KAAK,OAAA,CAAQ,0BAClBC,EAAAA,WAAW,KAAX,CAAgB,KAAK,YAAa,SAAAL,CAAA,CAAK,CAAA,CAAA,CAC1C,CAAA,CAAA,CAGN"}
@@ -1,4 +1,4 @@
1
- "use strict";const t=require("./jsx-runtime-CeSfJrVB.cjs"),d=require("./AuthContext-CXng9fj0.cjs"),f=require("./ScreenProtectContext-ofv2QgMp.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=`
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
2
  .bwg-dotline {
3
3
  display: inline-flex;
4
4
  align-items: center;
@@ -33,4 +33,4 @@
33
33
  .bwg-dotline .dot { animation: none; }
34
34
  }
35
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-BiTPwkVq.cjs.map
36
+ //# sourceMappingURL=PublicLayout-3v46YZdi.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"PublicLayout-BiTPwkVq.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
+ {"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,6 +1,6 @@
1
1
  import { j as e } from "./jsx-runtime-Dpn_P65e.js";
2
2
  import { u as p } from "./AuthContext-Ei2P-z4d.js";
3
- import { S as y } from "./ScreenProtectContext-zByHldrr.js";
3
+ import { S as y } from "./ScreenProtectContext-3my4PHFa.js";
4
4
  import { Spin as h, ConfigProvider as w } from "antd";
5
5
  import { Outlet as d } from "react-router-dom";
6
6
  import { i as v } from "./envUtils-C9Gf5aek.js";
@@ -136,4 +136,4 @@ export {
136
136
  B as a,
137
137
  $ as b
138
138
  };
139
- //# sourceMappingURL=PublicLayout-g9WMtoZ0.js.map
139
+ //# sourceMappingURL=PublicLayout-B4wGo0ut.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PublicLayout-g9WMtoZ0.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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"}
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":";;;;;;;AAIA,MAAMA,IAAmB;AACzB,SAASC,IAA4B;AAEnC,MADI,OAAO,WAAa,OACpB,SAAS,eAAeD,CAAgB,EAAG;AAE/C,QAAME,IAAQ,SAAS,cAAc,OAAO;AAC5C,EAAAA,EAAM,KAAKF,GACXE,EAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAmCpB,SAAS,KAAK,YAAYA,CAAK;AACjC;AAGA,MAAMC,IASD,CAAC;AAAA,EACJ,QAAAC,IAAS,CAAC,WAAW,WAAW,WAAW,SAAS;AAAA,EACpD,OAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,KAAAC,IAAM;AAAA,EACN,KAAAC,IAAM;AAAA,EACN,SAAAC,IAAU;AAAA,EACV,WAAAC,IAAY;AAAA,EACZ,OAAAC,IAAQ;AACV,MAAM;AACJ,EAAAC,EAAU,MAAM;AAAE,IAAAX,EAAA;AAAA,EAA6B,GAAG,CAAA,CAAE;AAEpD,QAAMY,IAAIR,KAASD,EAAO,QACpBU,IAAO,MAAM,KAAK,EAAE,QAAQD,GAAG,GAC/BE,IAAY;AAAA,IACf,cAAsB,GAAGT,CAAI;AAAA,IAC7B,aAAqB,GAAGC,CAAG;AAAA,IAC3B,aAAqB,GAAGC,CAAG;AAAA,IAC3B,eAAuB,GAAGC,CAAO;AAAA,EAAA,GAG9BO,IAAeP,IAAUI,IAAKF;AAEpC,SACEM,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,eAAc,MAAK,OAAM,cAAW,WAAU,OAAOF,GAClE,UAAAD,EAAK,IAAI,CAACI,GAAGC,MACZF,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MAEC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,iBAAiBb,EAAOe,IAAIf,EAAO,MAAM;AAAA,QACzC,gBACEM,MAAc,QACV,GAAIS,IAAIH,CAAY,OACpB,IAAKH,IAAI,IAAIM,KAAKH,CAAY;AAAA,MAAA;AAAA,IACtC;AAAA,IARKG;AAAA,EAAA,CAUR,GACH;AAEJ,GAOMC,IAAqE,CAAC,EAAC,MAAAC,IAAO,MAAM,MAAAC,IAAO,eAAe;AAC5G,QAAM,EAAE,MAAAC,EAAA,IAASC,EAAA;AAEnB,SADgBH,KAAQE,IAGpBE,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,QACL,SAAS;AAAA,QACT,eAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,QAAQ;AAAA,MAAA;AAAA,MAET,aAAU;AAAA,MACX,aAAU;AAAA,MACV,MAAK;AAAA,MAEP,UAAA;AAAA,QAAAR,gBAAAA,EAAAA;AAAAA,UAACS;AAAA,UAAA;AAAA,YACC,WACET,gBAAAA,EAAAA;AAAAA,cAACd;AAAA,cAAA;AAAA,gBACC,QAAQ,CAAC,WAAW,WAAW,WAAW,SAAS;AAAA,gBACnD,MAAM;AAAA,gBACN,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,SAAS;AAAA,gBACT,OAAO;AAAA,gBACP,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ;AAAA,QAAA;AAAA,QAGFc,gBAAAA,EAAAA,IAAC,UAAK,WAAU,gBAAe,OAAO,EAAC,WAAU,OAAA,GAAU,UAAAK,EAAA,CAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,IApCpD;AAuClB,GCzIIK,IAAkB,MAAM;AAC1B,QAAM,EAAE,eAAAC,EAAA,IAAkBJ,EAAA;AAG1B,+BACGK,GAAA,EAAsB,QAAQ,KAAK,KAAQ,UAAU,OAAOC,MACxDC,IAEM,KAEF,CAAC,CAACD,KAAQ,MAAMF,EAAcE,CAAG,GAGxC,UAAAb,gBAAAA,MAACe,GAAA,EAAe,mBAAmB,MAAM,SAAS,eAAe,WAAW,KAAK,SAAS,MACxF,UAAAP,gBAAAA,EAAAA,KAAC,OAAA,EAAI,IAAG,aACN,UAAA;AAAA,IAAAR,gBAAAA,EAAAA,IAACG,GAAA,EAAgB;AAAA,0BAChBa,GAAA,CAAA,CAAO;AAAA,EAAA,EAAA,CACV,GACF,GACF;AAEJ,GCzBIC,IAAe,6BAEd,OAAA,EACC,UAAA;AAAA,EAAAjB,gBAAAA,EAAAA,IAACG,GAAA,EAAgB;AAAA,wBAChBa,GAAA,CAAA,CAAO;AAAA,GACV;"}