@bwg-ui/core 1.1.32 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/chunks/{common-components-C-dWpBJk.js → common-components-CI7wc_j0.js} +1782 -1771
  2. package/dist/chunks/common-components-cQcq2ylW.cjs +183 -0
  3. package/dist/chunks/{core-Cdocvd6i.cjs → core-Cg6a-3GL.cjs} +1 -1
  4. package/dist/chunks/{core-uWiM5s5E.js → core-xi9w8O3O.js} +1 -1
  5. package/dist/chunks/{enc-base64-D3cQUe7q.cjs → enc-base64-BR77UbCA.cjs} +1 -1
  6. package/dist/chunks/{enc-base64-1cOwmBuR.js → enc-base64-CyKdjNg8.js} +2 -2
  7. package/dist/chunks/{sha256-C1laOj1I.cjs → sha256-DA5XnjXl.cjs} +1 -1
  8. package/dist/chunks/{sha256-naKE9EFq.js → sha256-DmQY-nMP.js} +2 -2
  9. package/dist/components/common/BwgDraggable.d.ts +1 -1
  10. package/dist/components/common/BwgDraggable.d.ts.map +1 -1
  11. package/dist/components/common/BwgGrid.d.ts +4 -4
  12. package/dist/components/common/BwgGrid.d.ts.map +1 -1
  13. package/dist/components/common/BwgView.d.ts.map +1 -1
  14. package/dist/components/common/index.cjs +1 -1
  15. package/dist/components/common/index.js +5 -5
  16. package/dist/components/core/BwgUploader.d.ts.map +1 -1
  17. package/dist/components/core/index.cjs +1 -1
  18. package/dist/components/core/index.js +2 -1
  19. package/dist/components/guide/index.cjs +1 -1
  20. package/dist/components/guide/index.js +1 -1
  21. package/dist/components/layout/AppWrapper.d.ts +13 -0
  22. package/dist/components/layout/AppWrapper.d.ts.map +1 -0
  23. package/dist/components/layout/BwgPortal01.d.ts +5 -0
  24. package/dist/components/layout/BwgPortal01.d.ts.map +1 -0
  25. package/dist/components/layout/BwgPortal02.d.ts +5 -0
  26. package/dist/components/layout/BwgPortal02.d.ts.map +1 -0
  27. package/dist/components/layout/custom/ConfigurableContent.d.ts +4 -0
  28. package/dist/components/layout/custom/ConfigurableContent.d.ts.map +1 -0
  29. package/dist/components/layout/{ErrorBound.d.ts → custom/ConfigurableErrorBound.d.ts} +1 -1
  30. package/dist/components/layout/custom/ConfigurableErrorBound.d.ts.map +1 -0
  31. package/dist/components/layout/custom/ConfigurableHeader.d.ts +5 -0
  32. package/dist/components/layout/custom/ConfigurableHeader.d.ts.map +1 -0
  33. package/dist/components/layout/custom/ConfigurableMenuTab.d.ts +5 -0
  34. package/dist/components/layout/custom/ConfigurableMenuTab.d.ts.map +1 -0
  35. package/dist/components/layout/custom/ConfigurableSidebar.d.ts +5 -0
  36. package/dist/components/layout/custom/ConfigurableSidebar.d.ts.map +1 -0
  37. package/dist/components/layout/custom/index.d.ts +5 -0
  38. package/dist/components/layout/custom/index.d.ts.map +1 -0
  39. package/dist/components/layout/{ViewContainer.d.ts → default/ContentContainer.d.ts} +1 -1
  40. package/dist/components/layout/default/ContentContainer.d.ts.map +1 -0
  41. package/dist/components/layout/default/LandingContainer.d.ts +3 -0
  42. package/dist/components/layout/default/LandingContainer.d.ts.map +1 -0
  43. package/dist/components/layout/default/LoadingContainer.d.ts +11 -0
  44. package/dist/components/layout/default/LoadingContainer.d.ts.map +1 -0
  45. package/dist/components/layout/default/PopupContainer.d.ts +12 -0
  46. package/dist/components/layout/default/PopupContainer.d.ts.map +1 -0
  47. package/dist/components/layout/default/index.d.ts +5 -0
  48. package/dist/components/layout/default/index.d.ts.map +1 -0
  49. package/dist/components/layout/{PrivateProtectedOverlay.d.ts → extension/ProtectWrapper.d.ts} +3 -3
  50. package/dist/components/layout/extension/ProtectWrapper.d.ts.map +1 -0
  51. package/dist/components/layout/extension/index.d.ts +2 -0
  52. package/dist/components/layout/extension/index.d.ts.map +1 -0
  53. package/dist/components/layout/index.cjs +2 -2
  54. package/dist/components/layout/index.d.ts +7 -7
  55. package/dist/components/layout/index.d.ts.map +1 -1
  56. package/dist/components/layout/index.js +1437 -229
  57. package/dist/components/layout/types.d.ts +181 -0
  58. package/dist/components/layout/types.d.ts.map +1 -0
  59. package/dist/components/popup/SearchAddress.d.ts +3 -0
  60. package/dist/components/popup/SearchAddress.d.ts.map +1 -0
  61. package/dist/components/popup/SearchDepartmentP01.d.ts +3 -0
  62. package/dist/components/popup/SearchDepartmentP01.d.ts.map +1 -0
  63. package/dist/components/popup/SearchDepartmentP02.d.ts +3 -0
  64. package/dist/components/popup/SearchDepartmentP02.d.ts.map +1 -0
  65. package/dist/components/popup/SearchEmployeeP01.d.ts +3 -0
  66. package/dist/components/popup/SearchEmployeeP01.d.ts.map +1 -0
  67. package/dist/components/popup/SearchEmployeeP02.d.ts +3 -0
  68. package/dist/components/popup/SearchEmployeeP02.d.ts.map +1 -0
  69. package/dist/index.cjs +1 -1
  70. package/dist/index.js +133 -128
  71. package/dist/provider/index.cjs +1 -1
  72. package/dist/provider/index.js +84 -84
  73. package/dist/styles/layout-test.css +354 -0
  74. package/dist/styles/layout.css +65 -78
  75. package/dist/utils/index.cjs +1 -1
  76. package/dist/utils/index.js +3 -3
  77. package/package.json +4 -1
  78. package/dist/chunks/common-components-eKBzroXe.cjs +0 -183
  79. package/dist/components/layout/ErrorBound.d.ts.map +0 -1
  80. package/dist/components/layout/LoadingOverlay.d.ts +0 -6
  81. package/dist/components/layout/LoadingOverlay.d.ts.map +0 -1
  82. package/dist/components/layout/PrivateProtectedOverlay.d.ts.map +0 -1
  83. package/dist/components/layout/ProgressOverlay.d.ts +0 -11
  84. package/dist/components/layout/ProgressOverlay.d.ts.map +0 -1
  85. package/dist/components/layout/ProtectLayout.d.ts +0 -7
  86. package/dist/components/layout/ProtectLayout.d.ts.map +0 -1
  87. package/dist/components/layout/PublicLayout.d.ts +0 -7
  88. package/dist/components/layout/PublicLayout.d.ts.map +0 -1
  89. package/dist/components/layout/ViewContainer.d.ts.map +0 -1
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react"),O=require("../stores/index.cjs"),l=require("react/jsx-runtime"),M=require("antd"),U=require("../utils/index.cjs"),E={AUTH_BTNS:"SCMSIGN00202",AUTH_MENU:"SCMSIGN00201",SRCH_CODE:"SCMSIGN00301",SRCH_POPU:"SCMPOPU00101",AUTH_BMRK:"SCMBMRK00101"},B=n.createContext(null),_=({children:e,serviceCodes:t={}})=>{n.useEffect(()=>{U.setServiceCodeOverrides(t)},[t]);const s={serviceCodes:t,getServiceCode:r=>{if(t[r]&&t[r].trim()!=="")return console.log(`🔧 Provider 설정 사용: ${r} = ${t[r]}`),t[r];const c=E[r];return console.log(`🔧 기본값 사용: ${r} = ${c}`),c}};return l.jsx(B.Provider,{value:s,children:e})},y=()=>{const e=n.useContext(B);if(!e)throw new Error("useServiceCode must be used within a ServiceCodeProvider");return e},G=e=>{const{getServiceCode:t}=y();return t(e)},V=()=>{const{getServiceCode:e}=y(),t={};for(const o of Object.keys(E))t[o]=e(o);return t},$=()=>{const{getServiceCode:e}=y();console.log("🔧 bwg-core 서비스코드 설정:"),console.log("📋 Provider 설정 > 기본값 순서로 확인");for(const t of Object.keys(E)){const o=e(t);console.log(` ${t}: ${o}`)}},A=n.createContext(null),q=({children:e})=>{const t=n.useRef(null),C={searchBoxRef:t,getFormData:()=>t.current?.getFormData()||{},setFormData:a=>{t.current?.setFormData(a)},resetForm:()=>{t.current?.resetForm()},validateForm:async()=>await t.current?.validateForm()||{success:!1,error:null}};return l.jsx(A.Provider,{value:C,children:e})},H=()=>{const e=n.useContext(A);if(!e)throw new Error("useSearchBox must be used within a SearchBoxProvider");return e},I=n.createContext(null),W=()=>{const e=n.useContext(I);if(!e)throw new Error("useAuth must be used within AuthProvider");return e},z=({children:e})=>{const[t,o]=n.useState(!1),[s,r]=n.useState(!1),c=async i=>{const u=(await i.text()).trim().toLowerCase();try{const d=JSON.parse(u);if(typeof d=="object"&&d&&(d.ok===!0||d.success===!0))return!0}catch{}return!!["true","ok","1","y"].includes(u)},C=async i=>{r(!0);try{const u=await fetch("/serviceEndpoint/sso_check.jsp",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"token="+encodeURIComponent(i)}),d=u.ok&&await c(u);return o(d),d}catch{return!1}finally{r(!1)}},a=async i=>{r(!0);try{const u=await fetch("/serviceEndpoint/sso_reauth.jsp",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"pin="+encodeURIComponent(i)});return u.ok&&await c(u)?(o(!0),!0):!1}catch{return!1}finally{r(!1)}},m=()=>{o(!1)},h=n.useMemo(()=>({authed:t,busy:s,verifyWithToken:C,reauthWithPin:a,logout:m}),[t,s]);return l.jsx(I.Provider,{value:h,children:e})},F=n.createContext(null),J=()=>{const e=n.useContext(F);if(!e)throw new Error("useLock must be used within ScreenProtectProvider");return e},Q=({children:e,idleMs:t=1e4,onUnlock:o,persistLocked:s=!0,storageKey:r="inactivityLocked",eventTarget:c,overlayScope:C="global",overlayId:a="lock-overlay-root",overlayPosition:m="fixed"})=>{const h=s&&typeof window<"u"&&window.localStorage.getItem(r)==="1",[i,u]=n.useState(h),[d,k]=n.useState(t),P=Number.isFinite(d)&&d>0,w=n.useRef(null),T=()=>{try{s&&window.localStorage.setItem(r,"1")}catch{}u(!0)},b=async v=>{if(!(o&&!await o(v))){try{s&&window.localStorage.removeItem(r)}catch{}u(!1),P&&L()}},R=()=>{try{s&&window.localStorage.setItem(r,"1")}catch{}u(!0)},L=()=>{P&&(w.current&&window.clearTimeout(w.current),w.current=window.setTimeout(()=>{R()},d))};n.useEffect(()=>{if(!P)return;const v=()=>{i||L()},x={passive:!0},S=["pointermove","pointerdown","keydown","wheel","touchstart"],g=c??window;return S.forEach(p=>g.addEventListener(p,v,x)),L(),()=>{w.current&&window.clearTimeout(w.current),S.forEach(p=>g.removeEventListener(p,v))}},[d,i,c,P]),n.useEffect(()=>{if(!i)return;const v=p=>{const j=document.getElementById(a);j&&j.contains(p.target)||(p.stopPropagation(),p.preventDefault())},x={capture:!0},S=["pointerdown","pointerup","pointermove","click","wheel","keydown","keyup","touchstart","touchmove"],g=C==="scoped"?c??window:window;return S.forEach(p=>g.addEventListener(p,v,x)),()=>S.forEach(p=>g.removeEventListener(p,v,x))},[i,C,a,c]);const D=n.useMemo(()=>({locked:i,lock:T,unlock:b,setIdleMs:k}),[i]);return l.jsxs(F.Provider,{value:D,children:[l.jsx("div",{style:{width:"100%",height:"100%"},...i?{inert:""}:{},...i?{"aria-hidden":!0}:{},children:e}),i&&l.jsx(X,{onUnlock:b,overlayId:a,overlayPosition:m})]})},X=({onUnlock:e,overlayId:t="lock-overlay-root",overlayPosition:o="fixed"})=>{const[s]=n.useState(4),[r,c]=n.useState("");return l.jsx("div",{id:t,"aria-modal":"true",role:"dialog","aria-label":"Locked screen",style:{position:o,inset:0,background:"rgba(12, 14, 18, 0.85)",backdropFilter:"blur(4px)",display:"grid",placeItems:"center",zIndex:9999},children:l.jsxs("div",{className:"lockscreen-form",style:{width:420,maxWidth:"92vw"},children:[l.jsx("div",{className:"lock-icon-wrap",children:l.jsx("span",{className:"lock-icon-box"})}),l.jsx("h2",{children:"잠금됨"}),l.jsx("p",{children:"PIN 번호를 입력하세요"}),l.jsx("div",{className:"lock-ipt-wrap",style:{display:"flex",justifyContent:"center"},children:l.jsx(M.Input.OTP,{mask:"*",autoFocus:!0,length:s,value:r,onChange:C=>{const a=(C??"").replace(/\D/g,"").slice(0,s);c(a),a.length===s&&e(a)}})})]})})},N=n.createContext(void 0),Y=({children:e})=>{const{codeData:t,isLoading:o,error:s,lastUpdated:r,getCodeList:c,getCodeListByOption:C,getCodeName:a,getCodeColor:m,getCodeByOption:h,getAvailableGroupCodes:i,getGridLookup:u,fetchCommonCodes:d}=O.useCodeStore(),k={codeData:t,isLoading:o,error:s,lastUpdated:r,getCodeList:c,getCodeListByOption:C,getCodeName:a,getCodeColor:m,getCodeByOption:h,getAvailableGroupCodes:i,getGridLookup:u,refreshCodes:d};return l.jsx(N.Provider,{value:k,children:e})},f=()=>{const e=n.useContext(N);if(e===void 0)throw new Error("useCommonCode must be used within a CommonCodeProvider");return e},Z=()=>{const{getCodeList:e,isLoading:t,error:o}=f();return{getCodeList:e,isLoading:t,error:o}},K=()=>{const{getCodeName:e,isLoading:t,error:o}=f();return{getCodeName:e,isLoading:t,error:o}},ee=()=>{const{getCodeColor:e,isLoading:t,error:o}=f();return{getCodeColor:e,isLoading:t,error:o}},te=()=>{const{getCodeListByOption:e,isLoading:t,error:o}=f();return{getCodeListByOption:e,isLoading:t,error:o}},oe=()=>{const{getGridLookup:e,isLoading:t,error:o}=f();return{getGridLookup:e,isLoading:t,error:o}},re=()=>!1,ne=()=>{const{popups:e,activePopupId:t,setActivePopup:o,closePopup:s,openPopup:r}=O.usePopupStore(),c=n.useCallback(async(C,a,m)=>{try{await r(C,a,m)}catch(h){throw console.error("팝업 열기 실패:",h),h}},[r]);return{popups:e,activePopupId:t,setActivePopup:o,closePopup:s,showPopup:c,isPopup:e.length>0}};exports.AuthProvider=z;exports.CommonCodeProvider=Y;exports.ScreenProtectProvider=Q;exports.SearchBoxProvider=q;exports.ServiceCodeProvider=_;exports.useAllServiceCodes=V;exports.useAuth=W;exports.useCodeColor=ee;exports.useCodeList=Z;exports.useCodeListByOption=te;exports.useCodeName=K;exports.useCommonCode=f;exports.useGridLookup=oe;exports.useLock=J;exports.useLogServiceCodeConfig=$;exports.usePopup=ne;exports.usePopupContext=re;exports.useSearchBox=H;exports.useServiceCode=y;exports.useServiceCodeValue=G;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react"),O=require("../stores/index.cjs"),l=require("react/jsx-runtime"),M=require("antd"),U=require("../utils/index.cjs"),E={AUTH_BTNS:"SCMSIGN00202",AUTH_MENU:"SCMSIGN00201",SRCH_CODE:"SCMSIGN00301",SRCH_POPU:"SCMPOPU00101",AUTH_BMRK:"SCMBMRK00101"},B=n.createContext(null),_=({children:e,serviceCodes:t={}})=>{n.useEffect(()=>{U.setServiceCodeOverrides(t)},[t]);const s={serviceCodes:t,getServiceCode:r=>{if(t[r]&&t[r].trim()!=="")return console.log(`🔧 Provider 설정 사용: ${r} = ${t[r]}`),t[r];const c=E[r];return console.log(`🔧 기본값 사용: ${r} = ${c}`),c}};return l.jsx(B.Provider,{value:s,children:e})},y=()=>{const e=n.useContext(B);if(!e)throw new Error("useServiceCode must be used within a ServiceCodeProvider");return e},G=e=>{const{getServiceCode:t}=y();return t(e)},V=()=>{const{getServiceCode:e}=y(),t={};for(const o of Object.keys(E))t[o]=e(o);return t},$=()=>{const{getServiceCode:e}=y();console.log("🔧 bwg-core 서비스코드 설정:"),console.log("📋 Provider 설정 > 기본값 순서로 확인");for(const t of Object.keys(E)){const o=e(t);console.log(` ${t}: ${o}`)}},A=n.createContext(null),q=({children:e})=>{const t=n.useRef(null),C={searchBoxRef:t,getFormData:()=>t.current?.getFormData()||{},setFormData:a=>{t.current?.setFormData(a)},resetForm:()=>{t.current?.resetForm()},validateForm:async()=>await t.current?.validateForm()||{success:!1,error:null}};return l.jsx(A.Provider,{value:C,children:e})},H=()=>{const e=n.useContext(A);if(!e)throw new Error("useSearchBox must be used within a SearchBoxProvider");return e},I=n.createContext(null),W=()=>{const e=n.useContext(I);if(!e)throw new Error("useAuth must be used within AuthProvider");return e},z=({children:e})=>{const[t,o]=n.useState(!1),[s,r]=n.useState(!1),c=async i=>{const u=(await i.text()).trim().toLowerCase();try{const d=JSON.parse(u);if(typeof d=="object"&&d&&(d.ok===!0||d.success===!0))return!0}catch{}return!!["true","ok","1","y"].includes(u)},C=async i=>{r(!0);try{const u=await fetch("/serviceEndpoint/sso_check.jsp",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"token="+encodeURIComponent(i)}),d=u.ok&&await c(u);return o(d),d}catch{return!1}finally{r(!1)}},a=async i=>{r(!0);try{const u=await fetch("/serviceEndpoint/sso_reauth.jsp",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"pin="+encodeURIComponent(i)});return u.ok&&await c(u)?(o(!0),!0):!1}catch{return!1}finally{r(!1)}},m=()=>{o(!1)},h=n.useMemo(()=>({authed:t,busy:s,verifyWithToken:C,reauthWithPin:a,logout:m}),[t,s]);return l.jsx(I.Provider,{value:h,children:e})},F=n.createContext(void 0),J=({children:e})=>{const{codeData:t,isLoading:o,error:s,lastUpdated:r,getCodeList:c,getCodeListByOption:C,getCodeName:a,getCodeColor:m,getCodeByOption:h,getAvailableGroupCodes:i,getGridLookup:u,fetchCommonCodes:d}=O.useCodeStore(),k={codeData:t,isLoading:o,error:s,lastUpdated:r,getCodeList:c,getCodeListByOption:C,getCodeName:a,getCodeColor:m,getCodeByOption:h,getAvailableGroupCodes:i,getGridLookup:u,refreshCodes:d};return l.jsx(F.Provider,{value:k,children:e})},f=()=>{const e=n.useContext(F);if(e===void 0)throw new Error("useCommonCode must be used within a CommonCodeProvider");return e},Q=()=>{const{getCodeList:e,isLoading:t,error:o}=f();return{getCodeList:e,isLoading:t,error:o}},X=()=>{const{getCodeName:e,isLoading:t,error:o}=f();return{getCodeName:e,isLoading:t,error:o}},Y=()=>{const{getCodeColor:e,isLoading:t,error:o}=f();return{getCodeColor:e,isLoading:t,error:o}},Z=()=>{const{getCodeListByOption:e,isLoading:t,error:o}=f();return{getCodeListByOption:e,isLoading:t,error:o}},K=()=>{const{getGridLookup:e,isLoading:t,error:o}=f();return{getGridLookup:e,isLoading:t,error:o}},N=n.createContext(null),ee=()=>{const e=n.useContext(N);if(!e)throw new Error("useLock must be used within ScreenProtectProvider");return e},te=({children:e,idleMs:t=1e4,onUnlock:o,persistLocked:s=!0,storageKey:r="inactivityLocked",eventTarget:c,overlayScope:C="global",overlayId:a="lock-overlay-root",overlayPosition:m="fixed"})=>{const h=s&&typeof window<"u"&&window.localStorage.getItem(r)==="1",[i,u]=n.useState(h),[d,k]=n.useState(t),P=Number.isFinite(d)&&d>0,w=n.useRef(null),T=()=>{try{s&&window.localStorage.setItem(r,"1")}catch{}u(!0)},b=async v=>{if(!(o&&!await o(v))){try{s&&window.localStorage.removeItem(r)}catch{}u(!1),P&&L()}},R=()=>{try{s&&window.localStorage.setItem(r,"1")}catch{}u(!0)},L=()=>{P&&(w.current&&window.clearTimeout(w.current),w.current=window.setTimeout(()=>{R()},d))};n.useEffect(()=>{if(!P)return;const v=()=>{i||L()},x={passive:!0},S=["pointermove","pointerdown","keydown","wheel","touchstart"],g=c??window;return S.forEach(p=>g.addEventListener(p,v,x)),L(),()=>{w.current&&window.clearTimeout(w.current),S.forEach(p=>g.removeEventListener(p,v))}},[d,i,c,P]),n.useEffect(()=>{if(!i)return;const v=p=>{const j=document.getElementById(a);j&&j.contains(p.target)||(p.stopPropagation(),p.preventDefault())},x={capture:!0},S=["pointerdown","pointerup","pointermove","click","wheel","keydown","keyup","touchstart","touchmove"],g=C==="scoped"?c??window:window;return S.forEach(p=>g.addEventListener(p,v,x)),()=>S.forEach(p=>g.removeEventListener(p,v,x))},[i,C,a,c]);const D=n.useMemo(()=>({locked:i,lock:T,unlock:b,setIdleMs:k}),[i]);return l.jsxs(N.Provider,{value:D,children:[l.jsx("div",{style:{width:"100%",height:"100%"},...i?{inert:""}:{},...i?{"aria-hidden":!0}:{},children:e}),i&&l.jsx(oe,{onUnlock:b,overlayId:a,overlayPosition:m})]})},oe=({onUnlock:e,overlayId:t="lock-overlay-root",overlayPosition:o="fixed"})=>{const[s]=n.useState(4),[r,c]=n.useState("");return l.jsx("div",{id:t,"aria-modal":"true",role:"dialog","aria-label":"Locked screen",style:{position:o,inset:0,background:"rgba(12, 14, 18, 0.85)",backdropFilter:"blur(4px)",display:"grid",placeItems:"center",zIndex:9999},children:l.jsxs("div",{className:"lockscreen-form",style:{width:420,maxWidth:"92vw"},children:[l.jsx("div",{className:"lock-icon-wrap",children:l.jsx("span",{className:"lock-icon-box"})}),l.jsx("h2",{children:"잠금됨"}),l.jsx("p",{children:"PIN 번호를 입력하세요"}),l.jsx("div",{className:"lock-ipt-wrap",style:{display:"flex",justifyContent:"center"},children:l.jsx(M.Input.OTP,{mask:"*",autoFocus:!0,length:s,value:r,onChange:C=>{const a=(C??"").replace(/\D/g,"").slice(0,s);c(a),a.length===s&&e(a)}})})]})})},re=()=>!1,ne=()=>{const{popups:e,activePopupId:t,setActivePopup:o,closePopup:s,openPopup:r}=O.usePopupStore(),c=n.useCallback(async(C,a,m)=>{try{await r(C,a,m)}catch(h){throw console.error("팝업 열기 실패:",h),h}},[r]);return{popups:e,activePopupId:t,setActivePopup:o,closePopup:s,showPopup:c,isPopup:e.length>0}};exports.AuthProvider=z;exports.CommonCodeProvider=J;exports.ScreenProtectProvider=te;exports.SearchBoxProvider=q;exports.ServiceCodeProvider=_;exports.useAllServiceCodes=V;exports.useAuth=W;exports.useCodeColor=Y;exports.useCodeList=Q;exports.useCodeListByOption=Z;exports.useCodeName=X;exports.useCommonCode=f;exports.useGridLookup=K;exports.useLock=ee;exports.useLogServiceCodeConfig=$;exports.usePopup=ne;exports.usePopupContext=re;exports.useSearchBox=H;exports.useServiceCode=y;exports.useServiceCodeValue=G;
@@ -124,12 +124,85 @@ const I = {
124
124
  [t, n]
125
125
  );
126
126
  return /* @__PURE__ */ d(R.Provider, { value: m, children: e });
127
- }, U = y(null), ue = () => {
127
+ }, U = y(
128
+ void 0
129
+ ), ue = ({
130
+ children: e
131
+ }) => {
132
+ const {
133
+ codeData: t,
134
+ isLoading: o,
135
+ error: n,
136
+ lastUpdated: r,
137
+ getCodeList: s,
138
+ getCodeListByOption: l,
139
+ getCodeName: u,
140
+ getCodeColor: f,
141
+ getCodeByOption: m,
142
+ getAvailableGroupCodes: c,
143
+ getGridLookup: i,
144
+ fetchCommonCodes: a
145
+ } = H(), L = {
146
+ codeData: t,
147
+ isLoading: o,
148
+ error: n,
149
+ lastUpdated: r,
150
+ getCodeList: s,
151
+ getCodeListByOption: l,
152
+ getCodeName: u,
153
+ getCodeColor: f,
154
+ getCodeByOption: m,
155
+ getAvailableGroupCodes: c,
156
+ getGridLookup: i,
157
+ refreshCodes: a
158
+ };
159
+ return /* @__PURE__ */ d(U.Provider, { value: L, children: e });
160
+ }, k = () => {
128
161
  const e = P(U);
162
+ if (e === void 0)
163
+ throw new Error("useCommonCode must be used within a CommonCodeProvider");
164
+ return e;
165
+ }, ae = () => {
166
+ const { getCodeList: e, isLoading: t, error: o } = k();
167
+ return {
168
+ getCodeList: e,
169
+ isLoading: t,
170
+ error: o
171
+ };
172
+ }, de = () => {
173
+ const { getCodeName: e, isLoading: t, error: o } = k();
174
+ return {
175
+ getCodeName: e,
176
+ isLoading: t,
177
+ error: o
178
+ };
179
+ }, le = () => {
180
+ const { getCodeColor: e, isLoading: t, error: o } = k();
181
+ return {
182
+ getCodeColor: e,
183
+ isLoading: t,
184
+ error: o
185
+ };
186
+ }, pe = () => {
187
+ const { getCodeListByOption: e, isLoading: t, error: o } = k();
188
+ return {
189
+ getCodeListByOption: e,
190
+ isLoading: t,
191
+ error: o
192
+ };
193
+ }, me = () => {
194
+ const { getGridLookup: e, isLoading: t, error: o } = k();
195
+ return {
196
+ getGridLookup: e,
197
+ isLoading: t,
198
+ error: o
199
+ };
200
+ }, j = y(null), fe = () => {
201
+ const e = P(j);
129
202
  if (!e)
130
203
  throw new Error("useLock must be used within ScreenProtectProvider");
131
204
  return e;
132
- }, ae = ({
205
+ }, he = ({
133
206
  children: e,
134
207
  idleMs: t = 1e4,
135
208
  onUnlock: o,
@@ -201,7 +274,7 @@ const I = {
201
274
  () => ({ locked: c, lock: _, unlock: F, setIdleMs: L }),
202
275
  [c]
203
276
  );
204
- return /* @__PURE__ */ T(U.Provider, { value: V, children: [
277
+ return /* @__PURE__ */ T(j.Provider, { value: V, children: [
205
278
  /* @__PURE__ */ d(
206
279
  "div",
207
280
  {
@@ -269,79 +342,6 @@ const I = {
269
342
  ] })
270
343
  }
271
344
  );
272
- }, j = y(
273
- void 0
274
- ), de = ({
275
- children: e
276
- }) => {
277
- const {
278
- codeData: t,
279
- isLoading: o,
280
- error: n,
281
- lastUpdated: r,
282
- getCodeList: s,
283
- getCodeListByOption: l,
284
- getCodeName: u,
285
- getCodeColor: f,
286
- getCodeByOption: m,
287
- getAvailableGroupCodes: c,
288
- getGridLookup: i,
289
- fetchCommonCodes: a
290
- } = H(), L = {
291
- codeData: t,
292
- isLoading: o,
293
- error: n,
294
- lastUpdated: r,
295
- getCodeList: s,
296
- getCodeListByOption: l,
297
- getCodeName: u,
298
- getCodeColor: f,
299
- getCodeByOption: m,
300
- getAvailableGroupCodes: c,
301
- getGridLookup: i,
302
- refreshCodes: a
303
- };
304
- return /* @__PURE__ */ d(j.Provider, { value: L, children: e });
305
- }, k = () => {
306
- const e = P(j);
307
- if (e === void 0)
308
- throw new Error("useCommonCode must be used within a CommonCodeProvider");
309
- return e;
310
- }, le = () => {
311
- const { getCodeList: e, isLoading: t, error: o } = k();
312
- return {
313
- getCodeList: e,
314
- isLoading: t,
315
- error: o
316
- };
317
- }, pe = () => {
318
- const { getCodeName: e, isLoading: t, error: o } = k();
319
- return {
320
- getCodeName: e,
321
- isLoading: t,
322
- error: o
323
- };
324
- }, me = () => {
325
- const { getCodeColor: e, isLoading: t, error: o } = k();
326
- return {
327
- getCodeColor: e,
328
- isLoading: t,
329
- error: o
330
- };
331
- }, fe = () => {
332
- const { getCodeListByOption: e, isLoading: t, error: o } = k();
333
- return {
334
- getCodeListByOption: e,
335
- isLoading: t,
336
- error: o
337
- };
338
- }, he = () => {
339
- const { getGridLookup: e, isLoading: t, error: o } = k();
340
- return {
341
- getGridLookup: e,
342
- isLoading: t,
343
- error: o
344
- };
345
345
  }, we = () => !1, Ce = () => {
346
346
  const { popups: e, activePopupId: t, setActivePopup: o, closePopup: n, openPopup: r } = W(), s = $(
347
347
  async (l, u, f) => {
@@ -364,19 +364,19 @@ const I = {
364
364
  };
365
365
  export {
366
366
  ie as AuthProvider,
367
- de as CommonCodeProvider,
368
- ae as ScreenProtectProvider,
367
+ ue as CommonCodeProvider,
368
+ he as ScreenProtectProvider,
369
369
  ne as SearchBoxProvider,
370
370
  ee as ServiceCodeProvider,
371
371
  oe as useAllServiceCodes,
372
372
  ce as useAuth,
373
- me as useCodeColor,
374
- le as useCodeList,
375
- fe as useCodeListByOption,
376
- pe as useCodeName,
373
+ le as useCodeColor,
374
+ ae as useCodeList,
375
+ pe as useCodeListByOption,
376
+ de as useCodeName,
377
377
  k as useCommonCode,
378
- he as useGridLookup,
379
- ue as useLock,
378
+ me as useGridLookup,
379
+ fe as useLock,
380
380
  re as useLogServiceCodeConfig,
381
381
  Ce as usePopup,
382
382
  we as usePopupContext,
@@ -0,0 +1,354 @@
1
+ /* 메인 레이아웃 스타일 */
2
+ .main-layout {
3
+ min-height: 100vh;
4
+ overflow: hidden;
5
+ min-width: 1280px;
6
+ }
7
+
8
+ /* 헤더 스타일 */
9
+ .header-wrapper {
10
+ background: var(--header-bg);
11
+ padding: 0 30px 0 20px;
12
+ border-bottom: 1px solid var(--border-color);
13
+ display: flex;
14
+ justify-content: space-between;
15
+ align-items: center;
16
+ z-index: 1000;
17
+ gap: 24px;
18
+ color: var(--header-text);
19
+ }
20
+
21
+ /**
22
+ * 헤더 좌측
23
+ */
24
+ .header-left {
25
+ display: flex;
26
+ align-items: center;
27
+ min-width: 200px;
28
+
29
+ .logo-container {
30
+ display: flex;
31
+ align-items: center;
32
+ height: 100%;
33
+ }
34
+ }
35
+
36
+ /**
37
+ * 헤더 우측
38
+ */
39
+ .header-right {
40
+ display: flex;
41
+ align-items: center;
42
+ justify-content: flex-end;
43
+
44
+ .logout-btn {
45
+ cursor: pointer;
46
+ }
47
+ .theme-btn {
48
+ cursor: pointer;
49
+ }
50
+ .alarm-btn {
51
+ cursor: pointer;
52
+ }
53
+ .avatar {
54
+ cursor: pointer;
55
+ }
56
+ }
57
+
58
+ .side-wrapper {
59
+ height: calc(100vh - 50px); /* 헤더 높이(50px)를 제외 */
60
+ overflow: visible; /* 토글 버튼이 짤리지 않도록 visible로 변경 */
61
+ display: flex;
62
+ flex-direction: column;
63
+ background-color: var(--sidebar-bg) !important;
64
+ position: relative; /* 토글 버튼의 absolute 포지셔닝을 위해 */
65
+ border-right: 1px solid var(--border-color);
66
+
67
+ .sider-toggle-btn {
68
+ position: absolute;
69
+ top: 9px;
70
+ right: -25px;
71
+ z-index: 1000;
72
+ width: 25px;
73
+ height: 41px;
74
+ background-color: #ffffff;
75
+ border: 1px solid #dddddd;
76
+ border-radius: 0 10px 10px 0;
77
+ display: flex;
78
+ align-items: center;
79
+ justify-content: center;
80
+ cursor: pointer;
81
+ box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.05);
82
+ transition: all 0.3s ease;
83
+ }
84
+
85
+ .sider-toggle-btn .ant-btn {
86
+ border-radius: 0 10px 10px 0;
87
+ font-size: 12px;
88
+ color: #787878;
89
+ padding: 0;
90
+ width: 100%;
91
+ height: 100%;
92
+ display: flex;
93
+ align-items: center;
94
+ justify-content: center;
95
+ }
96
+
97
+ .sider-search-ipt {
98
+ background: var(--sidebar-search-bg);
99
+ border-radius: var(--border-radius-xl);
100
+ border: 0;
101
+ color: var(--sidebar-search-text);
102
+ font-size: 13px;
103
+ font-weight: var(--font-weight-medium);
104
+ .anticon-search svg {
105
+ width: 20px;
106
+ height: 20px;
107
+ }
108
+ }
109
+
110
+ .sider-segmented {
111
+ padding: 5px;
112
+ background-color: var(--sidebar-segmented-bg);
113
+ border-radius: var(--border-radius-sm);
114
+ font-size: 13px;
115
+ color: var(--sidebar-segmented-text);
116
+ width: 100%;
117
+
118
+ .sider-segmented-item {
119
+ width: 20px;
120
+ height: 20px;
121
+ display: flex;
122
+ align-items: center;
123
+ justify-content: center;
124
+ flex-shrink: 0;
125
+ }
126
+ .ant-segmented-group {
127
+ gap: 5px;
128
+ }
129
+ .ant-segmented-item-selected {
130
+ color: var(--text-high);
131
+ font-weight: var(--font-weight-semibold);
132
+ }
133
+ }
134
+
135
+ .sider-content {
136
+ flex: 1;
137
+ display: flex;
138
+ flex-direction: column;
139
+ overflow: hidden;
140
+
141
+ /* 사이드바 로딩 스타일 */
142
+ .sider-loading {
143
+ position: absolute;
144
+ top: 50%;
145
+ left: 50%;
146
+ transform: translate(-50%, -50%);
147
+ display: flex;
148
+ flex-direction: column;
149
+ align-items: center;
150
+ justify-content: center;
151
+ gap: 12px;
152
+ z-index: 10;
153
+ }
154
+
155
+ .sider-loading-text {
156
+ font-size: 13px;
157
+ color: var(--text-secondary);
158
+ font-weight: var(--font-weight-medium);
159
+ letter-spacing: -0.2px;
160
+ }
161
+
162
+ /* 사이드바 에러 스타일 */
163
+ .sider-error {
164
+ position: absolute;
165
+ top: 50%;
166
+ left: 50%;
167
+ transform: translate(-50%, -50%);
168
+ display: flex;
169
+ flex-direction: column;
170
+ align-items: center;
171
+ justify-content: center;
172
+ gap: 8px;
173
+ padding: 16px;
174
+ background: rgba(255, 77, 79, 0.1);
175
+ border: 1px solid rgba(255, 77, 79, 0.2);
176
+ border-radius: var(--border-radius-md);
177
+ z-index: 10;
178
+ max-width: 200px;
179
+ text-align: center;
180
+ }
181
+
182
+ .sider-error-icon {
183
+ font-size: 20px;
184
+ color: #ff4d4f;
185
+ }
186
+
187
+ .sider-error-text {
188
+ font-size: 12px;
189
+ color: #ff4d4f;
190
+ font-weight: var(--font-weight-medium);
191
+ line-height: 1.4;
192
+ }
193
+
194
+ .sider-menu-container {
195
+ padding-right: 17px;
196
+ margin-right: -17px;
197
+ height: 100%;
198
+ overflow-y: auto;
199
+ }
200
+
201
+ /* 사이드바 스크롤바 스타일링 */
202
+ .sider-menu::-webkit-scrollbar,
203
+ .sider-menu-container::-webkit-scrollbar {
204
+ width: 6px;
205
+ }
206
+
207
+ .sider-menu::-webkit-scrollbar-track,
208
+ .sider-menu-container::-webkit-scrollbar-track {
209
+ background: transparent;
210
+ border-radius: 3px;
211
+ }
212
+
213
+ .sider-menu::-webkit-scrollbar-thumb,
214
+ .sider-menu-container::-webkit-scrollbar-thumb {
215
+ background: #d9d9d9;
216
+ border-radius: 3px;
217
+ border: 1px solid #f0f0f0;
218
+ }
219
+
220
+ .sider-menu::-webkit-scrollbar-thumb:hover,
221
+ .sider-menu-container::-webkit-scrollbar-thumb:hover {
222
+ background: #bfbfbf;
223
+ }
224
+
225
+ /* Firefox 스크롤바 스타일링 */
226
+ .sider-menu {
227
+ scrollbar-width: thin;
228
+ scrollbar-color: #d9d9d9 #f0f0f0;
229
+ }
230
+
231
+ /* Ant Design 메뉴 스타일 오버라이드 */
232
+ .sider-menu .ant-menu-item {
233
+ height: 30px;
234
+ transition: all 0.3s ease;
235
+ }
236
+
237
+ .sider-menu .ant-menu-submenu-title {
238
+ height: 30px !important;
239
+ line-height: 30px !important;
240
+ }
241
+
242
+ .sider-menu .ant-menu-submenu-title:hover {
243
+ background-color: unset !important;
244
+ }
245
+ }
246
+ }
247
+
248
+ /**
249
+ * 메뉴 탭 스타일
250
+ */
251
+ .menu-tab-wrapper {
252
+ background: var(--bg-primary);
253
+
254
+ .menu-tabs.ant-tabs .ant-tabs-nav {
255
+ margin: 0;
256
+ padding: 10px 34px 0 29px;
257
+ height: 45px;
258
+ display: flex;
259
+ align-items: center;
260
+ justify-content: space-between;
261
+ }
262
+ .ant-tabs-nav::before {
263
+ left: 29px;
264
+ bottom: 0;
265
+ border-bottom: 1px solid var(--border-color);
266
+ }
267
+ .menu-tabs.ant-tabs .ant-tabs-nav-wrap {
268
+ height: 35px;
269
+ flex: 1 !important;
270
+ align-items: flex-end;
271
+ }
272
+ .menu-tabs.ant-tabs .ant-tabs-nav-list {
273
+ display: flex;
274
+ align-items: center;
275
+ height: 100%;
276
+ flex-wrap: nowrap;
277
+ }
278
+ .menu-tabs.ant-tabs .ant-tabs-tab {
279
+ height: 100%;
280
+ border-radius: 10px 10px 0 0;
281
+ transition: all 0.3s ease;
282
+ padding: 0 10px 0 24px;
283
+ position: relative ;
284
+ background: #E7E9F4;
285
+ margin: 0 4px 0 0;
286
+ font-size: var(--font-size-sm);
287
+ color: #777;
288
+ border: 0;
289
+ .ant-tabs-tab-remove {
290
+ width: 20px;
291
+ height: 20px;
292
+ margin-right: 0;
293
+ margin-left: 10px;
294
+ color: #A1A1A1;
295
+ }
296
+ }
297
+ .menu-tabs.ant-tabs .ant-tabs-tab:not(.ant-tabs-tab-active):hover {
298
+ background: #dbdeec;
299
+ color: var(--text-secondary);
300
+ }
301
+ .menu-tabs.ant-tabs .ant-tabs-tab-active {
302
+ background: var(--bg-primary);
303
+ border: 2px solid var(--primary-color);
304
+ border-bottom: none;
305
+ .ant-tabs-tab-btn {
306
+ color:var(--primary-color);
307
+ }
308
+ }
309
+ .menu-tabs.ant-tabs .ant-tabs-content-holder {
310
+ display: none !important;
311
+ }
312
+ .menu-tabs.ant-tabs .ant-tabs-extra-content {
313
+ display: flex;
314
+ align-items: center;
315
+ gap: 4px;
316
+ flex-shrink: 0;
317
+ white-space: nowrap;
318
+ overflow: hidden;
319
+ padding-bottom: 13px;
320
+ }
321
+ .menu-tabs.ant-tabs .ant-tabs-extra-content > div {
322
+ display: flex !important;
323
+ align-items: center !important;
324
+ gap: 4px !important;
325
+ flex-wrap: nowrap !important;
326
+ }
327
+ .menu-tabs.ant-tabs .ant-tabs-extra-content .ant-btn {
328
+ height: 20px !important;
329
+ width: 20px !important;
330
+ font-size: 12px !important;
331
+ }
332
+ .menu-tabs.ant-tabs .ant-tabs-extra-content .ant-btn:hover {
333
+ color: #5E5E5E;
334
+ }
335
+ .menu-tabs.ant-tabs .ant-tabs-extra-content .ant-btn:disabled {
336
+ opacity: 0.5;
337
+ cursor: not-allowed;
338
+ background: none;
339
+ }
340
+ .menu-tabs.ant-tabs .ant-tabs-extra-content .menu-tabs-close-btn {
341
+ margin-left: 11px;
342
+ }
343
+
344
+ .menu-nav-wrapper {
345
+ display: flex;
346
+ align-items: center;
347
+ gap: 4px;
348
+
349
+ .menu-nav-buttons {
350
+ }
351
+ .menu-nav-tooltip {
352
+ }
353
+ }
354
+ }