@atomazing-org/design-system 1.1.1 → 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.
package/dist/index.mjs CHANGED
@@ -1,14 +1,14 @@
1
- import F from"@emotion/styled";import{Button as L}from"@mui/material";var z=F(L)`
1
+ import{a as ie,c as se,e as ae,g as le,i as me}from"./chunk-JBLCVRJT.mjs";import de from"@emotion/styled";import{Button as pe}from"@mui/material";var fe=de(pe)`
2
2
  padding: 10px 16px;
3
3
  border-radius: 16px;
4
4
  font-size: 16px;
5
5
  margin: 8px;
6
- `;import N from"react";import P from"@emotion/styled";import M from"@mui/icons-material/ErrorOutlineRounded";import{Box as u}from"@mui/material";import{jsx as f,jsxs as c}from"react/jsx-runtime";var y=class extends N.Component{constructor(r){super(r),this.state={hasError:!1}}static getDerivedStateFromError(r){return{hasError:!0,error:r}}componentDidCatch(r,n){console.error("Error:",r),console.error("Error Info:",n)}render(){var o,t,i;let{state:r,props:n}=this;return r.hasError?c(W,{children:[f(G,{children:f(u,{children:"Something went wrong.\xA0"})}),c("h3",{children:[c(u,{style:{color:"#ff3131",display:"inline-block"},children:[f(M,{sx:{verticalAlign:"middle",mb:"4px"}})," ","ERROR:"]})," ",c(u,{translate:"no",children:["[",(o=r.error)==null?void 0:o.name,"] ",(t=r.error)==null?void 0:t.message]}),c(u,{style:{color:"#ff3131",display:"inline-block"},children:[f(M,{sx:{verticalAlign:"middle",mb:"4px"}})," ","Stack:"]})," ",c(u,{translate:"no",children:["[",(i=r.error)==null?void 0:i.stack,"]"]})]})]}):n.children}},W=P.div`
6
+ `;import he from"react";import G from"@emotion/styled";import U from"@mui/icons-material/ErrorOutlineRounded";import{Box as x}from"@mui/material";import{jsx as b,jsxs as c}from"react/jsx-runtime";var O=class extends he.Component{constructor(t){super(t),this.state={hasError:!1}}static getDerivedStateFromError(t){return{hasError:!0,error:t}}componentDidCatch(t,r){console.error("Error:",t),console.error("Error Info:",r)}render(){var n,s,i;let{state:t,props:r}=this;return t.hasError?c(ce,{children:[b(ue,{children:b(x,{children:"Something went wrong.\xA0"})}),c("h3",{children:[c(x,{style:{color:"#ff3131",display:"inline-block"},children:[b(U,{sx:{verticalAlign:"middle",mb:"4px"}})," ","ERROR:"]})," ",c(x,{translate:"no",children:["[",(n=t.error)==null?void 0:n.name,"] ",(s=t.error)==null?void 0:s.message]}),c(x,{style:{color:"#ff3131",display:"inline-block"},children:[b(U,{sx:{verticalAlign:"middle",mb:"4px"}})," ","Stack:"]})," ",c(x,{translate:"no",children:["[",(i=t.error)==null?void 0:i.stack,"]"]})]})]}):r.children}},ce=G.div`
7
7
  margin: 0 8vw;
8
8
  @media (max-width: 768px) {
9
9
  margin: 0;
10
10
  }
11
- `,G=P.h1`
11
+ `,ue=G.h1`
12
12
  margin-top: 32px;
13
13
  margin-bottom: 32px;
14
14
  font-size: 36px;
@@ -24,7 +24,7 @@ import F from"@emotion/styled";import{Button as L}from"@mui/material";var z=F(L)
24
24
  margin-top: 0;
25
25
  margin-bottom: 0;
26
26
  }
27
- `;import{useEffect as H,useState as U}from"react";import Y from"@emotion/styled";import{Box as _,CircularProgress as X}from"@mui/material";import{Fragment as K,jsx as b,jsxs as V}from"react/jsx-runtime";var J=()=>{let[e,r]=U(!1);return H(()=>{let n=setTimeout(()=>{r(!0)},100);return()=>clearTimeout(n)},[]),b(Q,{"aria-live":"polite",role:"status",children:e&&V(K,{children:[b(X,{"aria-label":"loading",size:80,thickness:4}),b("h3",{style:{opacity:.8},children:"Loading Page..."})]})})},Q=Y(_)`
27
+ `;import{useEffect as ge,useState as xe}from"react";import ye from"@emotion/styled";import{Box as be,CircularProgress as _e}from"@mui/material";import{Fragment as ke,jsx as z,jsxs as ve}from"react/jsx-runtime";var Se=()=>{let[e,t]=xe(!1);return ge(()=>{let r=setTimeout(()=>{t(!0)},100);return()=>clearTimeout(r)},[]),z(Te,{"aria-live":"polite",role:"status",children:e&&ve(ke,{children:[z(_e,{"aria-label":"loading",size:80,thickness:4}),z("h3",{style:{opacity:.8},children:"Loading Page..."})]})})},Te=ye(be)`
28
28
  position: absolute;
29
29
  top: 50%;
30
30
  left: 50%;
@@ -35,12 +35,12 @@ import F from"@emotion/styled";import{Button as L}from"@mui/material";var z=F(L)
35
35
  flex-direction: column;
36
36
  text-align: center;
37
37
  gap: 8px;
38
- `;import Z from"@emotion/styled";var j=Z.code`
38
+ `;import Me from"@emotion/styled";var we=Me.code`
39
39
  background: #000000c8;
40
40
  color: white;
41
41
  padding: 4px 6px;
42
42
  border-radius: 8px;
43
- `;import q from"@mui/icons-material/BrightnessAutoRounded";import ee from"@mui/icons-material/DarkModeRounded";import re from"@mui/icons-material/LightModeRounded";import oe from"@mui/icons-material/PersonalVideoRounded";import{jsx as g}from"react/jsx-runtime";var h=32,te=[{label:"Auto",value:"auto",icon:g(q,{color:"inherit",sx:{fontSize:h}})},{label:"System",value:"system",icon:g(oe,{color:"inherit",sx:{fontSize:h}})},{label:"Light",value:"light",icon:g(re,{color:"inherit",sx:{fontSize:h}})},{label:"Dark",value:"dark",icon:g(ee,{color:"inherit",sx:{fontSize:h}})}];import{createContext as ne,useContext as ie}from"react";var v=ne(void 0),ae=()=>{let e=ie(v);if(!e)throw new Error("useThemeSettings must be used within ThemeProviderWrapper");return e};import{useMemo as A}from"react";import{createTheme as $e}from"@mui/material";import{ThemeProvider as Be}from"@mui/material/styles";var se={MuiTooltip:{defaultProps:{disableInteractive:!0},styleOverrides:{tooltip:({theme:e})=>({backdropFilter:"blur(6px)",WebkitBackdropFilter:"blur(6px)",padding:"8px 16px",borderRadius:e.shape.borderRadius,fontSize:"12px"})}},MuiButton:{styleOverrides:{root:({theme:e})=>({padding:"12px 24px",borderRadius:e.shape.borderRadius}),contained:{boxShadow:"none"}}},MuiSkeleton:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius})}},MuiSelect:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius}),select:{display:"flex",justifyContent:"flex-start",alignItems:"center",gap:"4px"}}},MuiDialog:{defaultProps:{slotProps:{paper:{style:{padding:"12px",borderRadius:24,minWidth:"400px"}}}},styleOverrides:{root:{"& .MuiDialog-container":{backdropFilter:"blur(4px)"}}}},MuiAvatar:{styleOverrides:{root:{fontWeight:500}}},MuiAlert:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius})}},MuiTextField:{defaultProps:{variant:"outlined"},styleOverrides:{root:({theme:e})=>({"& .MuiInputBase-root":{borderRadius:e.shape.borderRadius}})}},MuiOutlinedInput:{styleOverrides:{root:({theme:e})=>({color:e.palette.primary.main,"& fieldset":{borderColor:e.palette.primary.main},"&:hover fieldset":{borderColor:e.palette.primary.dark},"&.Mui-focused fieldset":{borderColor:e.palette.primary.main}})}},MuiInputLabel:{styleOverrides:{root:({theme:e})=>({color:e.palette.primary.main,"&.Mui-focused":{color:e.palette.primary.main}})}},MuiFormHelperText:{styleOverrides:{root:({theme:e})=>({color:e.palette.error.main})}},MuiPaper:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius}),elevation8:({theme:e})=>({borderRadius:e.shape.borderRadius})}},MuiMenuItem:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius})}},MuiBottomNavigationAction:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius,padding:"12px",margin:0,maxHeight:"none"})}},MuiDialogContent:{styleOverrides:{root:{padding:0}}},MuiSlider:{styleOverrides:{valueLabel:({theme:e})=>({borderRadius:e.shape.borderRadius,padding:"6px 14px","&::before, &::after":{display:"none"}})}},MuiCircularProgress:{styleOverrides:{circle:{strokeLinecap:"round"}}},MuiTab:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius})}},MuiAccordion:{styleOverrides:{root:{"&::before":{display:"none"}}}}};import{Global as me,css as le}from"@emotion/react";import{useTheme as de}from"@mui/material/styles";import{jsx as pe}from"react/jsx-runtime";var k=({fontFamily:e})=>{let r=de(),n=r.palette.mode==="dark",o=r.palette.primary.main,t=r.palette.background.default,i=r.palette.background.paper;return pe(me,{styles:le`
43
+ `;import Pe from"@mui/icons-material/BrightnessAutoRounded";import Oe from"@mui/icons-material/DarkModeRounded";import ze from"@mui/icons-material/LightModeRounded";import Ie from"@mui/icons-material/PersonalVideoRounded";import{jsx as S}from"react/jsx-runtime";var _=32,De=[{label:"Auto",value:"auto",icon:S(Pe,{color:"inherit",sx:{fontSize:_}})},{label:"System",value:"system",icon:S(Ie,{color:"inherit",sx:{fontSize:_}})},{label:"Light",value:"light",icon:S(ze,{color:"inherit",sx:{fontSize:_}})},{label:"Dark",value:"dark",icon:S(Oe,{color:"inherit",sx:{fontSize:_}})}];import{useMemo as P}from"react";import{ThemeProvider as nt}from"@mui/material/styles";import{createContext as Ee,useContext as We}from"react";var T=Ee(void 0),V=()=>{let e=We(T);if(!e)throw new Error("useThemeSettings must be used within ThemeProviderWrapper");return e};var Y="Default",k=e=>typeof e=="object"&&e!==null,Re=e=>{let t=e==null?void 0:e.trim();if(!t)throw new Error("normalizeThemesInput: preset `id` must be a non-empty.");return t},He=(e,t)=>{let r=e==null?void 0:e.trim();return r||t},Ne=e=>{if(!k(e)||typeof e.id!="string"||typeof e.label!="string"||!("colorSchemes"in e))return!1;let{colorSchemes:t}=e;return k(t)},Ae=(e,t)=>{if(!Ne(e))throw new Error(`normalizeThemesInput: invalid ThemePreset shape at index ${t}.`);let r=Re(e.id),n=He(e.label,r),{colorSchemes:s}=e,{light:i,dark:a}=s;if(!k(i))throw new Error("normalizeThemesInput: preset must include colorSchemes.light.");if(!k(a))throw new Error("normalizeThemesInput: preset must include colorSchemes.dark.");return{...e,id:r,label:n,colorSchemes:{light:i,dark:a},meta:{origin:"preset"}}},Ce=e=>{let t=new Map,r=new Map;for(let[i,a]of e.entries())t.has(a.id)||t.set(a.id,i),r.set(a.id,a);let n=[...t.entries()].sort(([,i],[,a])=>i-a).map(([i])=>i),s=[];for(let i of n){let a=r.get(i);a&&s.push(a)}return s},X=()=>({id:Y,label:Y,colorSchemes:{light:{},dark:{}},meta:{origin:"custom"}}),v=e=>{if(!e||e.length===0)return[X()];let t=e.map((r,n)=>Ae(r,n));return t.length===0?[X()]:Ce(t)};var K="Default",Be=e=>({name:e.id,...e.colorSchemes.light}),I=e=>{let t=v(e);return t.length===0?[{name:K}]:t.map(r=>Be(r))},Z=(e,t)=>{let r=[...e!=null?e:[],...t!=null?t:[]];return I(r.length>0?r:void 0)},y=e=>{var t,r;return(r=(t=e[0])==null?void 0:t.name)!=null?r:K},M=(e,t)=>e&&t.some(r=>r.name===e)?e:y(t),J=(e,t)=>e.find(r=>r.name===t),j=(e,t="system")=>e||t;import{useEffect as W,useMemo as w,useState as R}from"react";var f=()=>globalThis.window!==void 0&&globalThis.document!==void 0;var Q="appSettings",u=1,$e=new Set(["system","auto","light","dark"]),Fe=e=>typeof e=="string"&&$e.has(e),D=()=>{if(!f()||globalThis.localStorage===void 0)return null;try{let e=globalThis.localStorage.getItem(Q);if(!e)return null;let t=JSON.parse(e),r=Fe(t.darkMode)?t.darkMode:void 0;if(t.version===u){let s=typeof t.themeId=="string"?t.themeId:void 0;return!s&&!r?null:{version:u,themeId:s,darkMode:r}}let n=typeof t.theme=="string"?t.theme:void 0;return!n&&!r?null:{version:u,themeId:n,darkMode:r}}catch(e){return null}},E=e=>{if(!(!f()||globalThis.localStorage===void 0))try{globalThis.localStorage.setItem(Q,JSON.stringify(e))}catch(t){}};var q="system",H=({themes:e})=>{let t=w(()=>v(e),[e]),r=w(()=>t.map(l=>({name:l.id,...l.colorSchemes.light})),[t]),[n,s]=R(()=>M(void 0,r)),[i,a]=R(q),[m,d]=R(!1),g=w(()=>t.find(l=>l.id===n)||t[0],[n,t]),h=w(()=>r.find(l=>l.name===n)||r[0],[n,r]);return W(()=>{if(m)return;let l=D();s(M(l==null?void 0:l.themeId,r)),a(j(l==null?void 0:l.darkMode,q)),d(!0)},[m,r]),W(()=>{let l=M(n,r);l!==n&&s(l)},[n,r]),W(()=>{m&&E({version:u,themeId:n,darkMode:i})},[m,n,i]),{theme:n,setTheme:s,darkMode:i,setDarkMode:a,presetsSource:t,selectedPreset:g,themesSource:r,selectedTheme:h}};import{Global as Le,css as Ue}from"@emotion/react";import{useTheme as Ge}from"@mui/material/styles";import{jsx as Ve}from"react/jsx-runtime";var N=({fontFamily:e})=>{let t=Ge(),r=t.palette.mode==="dark",n=t.palette.primary.main,s=t.palette.text.primary,i=t.palette.background.default,a=t.palette.background.paper;return Ve(Le,{styles:Ue`
44
44
  /* Allow application to control font via CSS var or prop */
45
45
  :root {
46
46
  ${e?`--app-font-family: ${e};`:""}
@@ -59,7 +59,7 @@ import F from"@emotion/styled";import{Button as L}from"@mui/material";var z=F(L)
59
59
  sans-serif !important;
60
60
  -webkit-tap-highlight-color: transparent;
61
61
  &::selection {
62
- background-color: ${`${o}e1`};
62
+ background-color: ${`${n}e1`};
63
63
  }
64
64
  }
65
65
 
@@ -86,7 +86,7 @@ import F from"@emotion/styled";import{Button as L}from"@mui/material";var z=F(L)
86
86
  sans-serif;
87
87
  line-height: 1.5;
88
88
  font-weight: 400;
89
- color-scheme: ${n?"dark":"light"};
89
+ color-scheme: ${r?"dark":"light"};
90
90
  font-synthesis: none;
91
91
  text-rendering: optimizeLegibility;
92
92
  -webkit-font-smoothing: antialiased;
@@ -99,28 +99,29 @@ import F from"@emotion/styled";import{Button as L}from"@mui/material";var z=F(L)
99
99
  height: 100%;
100
100
  overflow: auto;
101
101
  touch-action: manipulation;
102
- background: ${t};
102
+ background: ${i};
103
+ color: ${s};
103
104
  background-attachment: fixed;
104
105
  background-size: cover;
105
106
  transition: 0.3s background;
106
107
  /* Firefox */
107
- scrollbar-color: ${o} ${t};
108
+ scrollbar-color: ${n} ${i};
108
109
  scrollbar-width: thin;
109
110
 
110
111
  ::-webkit-scrollbar {
111
112
  width: 8px;
112
- background-color: ${t};
113
+ background-color: ${i};
113
114
  }
114
115
  ::-webkit-scrollbar-thumb {
115
- background-color: ${o};
116
+ background-color: ${n};
116
117
  border-radius: 64px;
117
118
  }
118
119
  ::-webkit-scrollbar-thumb:hover {
119
- background-color: ${`${o}d8`};
120
+ background-color: ${`${n}d8`};
120
121
  }
121
122
  ::-webkit-scrollbar-track {
122
123
  border-radius: 64px;
123
- background-color: ${t};
124
+ background-color: ${i};
124
125
  }
125
126
  }
126
127
 
@@ -152,22 +153,22 @@ import F from"@emotion/styled";import{Button as L}from"@mui/material";var z=F(L)
152
153
  .customScrollbar,
153
154
  textarea {
154
155
  /* Firefox */
155
- scrollbar-color: ${o} ${i};
156
+ scrollbar-color: ${n} ${a};
156
157
  scrollbar-width: thin;
157
158
  ::-webkit-scrollbar {
158
159
  width: 8px;
159
- background-color: ${i};
160
+ background-color: ${a};
160
161
  }
161
162
  ::-webkit-scrollbar-thumb {
162
- background-color: ${o};
163
+ background-color: ${n};
163
164
  border-radius: 64px;
164
165
  }
165
166
  ::-webkit-scrollbar-thumb:hover {
166
- background-color: ${`${o}d8`};
167
+ background-color: ${`${n}d8`};
167
168
  }
168
169
  ::-webkit-scrollbar-track {
169
170
  border-radius: 64px;
170
- background-color: ${i};
171
+ background-color: ${a};
171
172
  }
172
173
  }
173
174
 
@@ -176,7 +177,7 @@ import F from"@emotion/styled";import{Button as L}from"@mui/material";var z=F(L)
176
177
  border-radius: 42px 42px 0 0;
177
178
  z-index: 9999999;
178
179
  }
179
- `})};import{keyframes as l}from"@emotion/react";var ce=l`
180
+ `})};import{alpha as A}from"@mui/material/styles";import{alpha as Ye}from"@mui/material/styles";var ee=e=>({pageBg:e.palette.background.default,surfaceBg:e.palette.background.paper,textPrimary:e.palette.text.primary,textSecondary:e.palette.text.secondary,divider:e.palette.divider}),yo=(e,t)=>Ye(e.palette.text.primary,t);var Xe={MuiTooltip:{defaultProps:{disableInteractive:!0},styleOverrides:{tooltip:({theme:e})=>({backdropFilter:"blur(6px)",WebkitBackdropFilter:"blur(6px)",padding:"8px 16px",borderRadius:e.shape.borderRadius,fontSize:e.typography.pxToRem(12)})}},MuiButton:{styleOverrides:{root:({theme:e})=>({padding:"12px 24px",borderRadius:e.shape.borderRadius}),contained:{boxShadow:"none"}}},MuiSkeleton:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius})}},MuiSelect:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius}),select:{display:"flex",justifyContent:"flex-start",alignItems:"center",gap:"4px"}}},MuiDialog:{defaultProps:{slotProps:{paper:{style:{padding:"12px",borderRadius:24,minWidth:"400px"}}}},styleOverrides:{root:{"& .MuiDialog-container":{backdropFilter:"blur(4px)"}}}},MuiAvatar:{styleOverrides:{root:{fontWeight:500}}},MuiAlert:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius})}},MuiTextField:{defaultProps:{variant:"outlined"},styleOverrides:{root:({theme:e})=>({"& .MuiInputBase-root":{borderRadius:e.shape.borderRadius}})}},MuiOutlinedInput:{styleOverrides:{root:({theme:e})=>{let t=ee(e);return{color:t.textPrimary,"& fieldset":{borderColor:A(t.textPrimary,.16)},"&:hover fieldset":{borderColor:A(t.textPrimary,.28)},"&.Mui-focused fieldset":{borderColor:e.palette.primary.main}}}}},MuiInputLabel:{styleOverrides:{root:({theme:e})=>({color:A(e.palette.text.primary,.72),"&.Mui-focused":{color:e.palette.primary.main}})}},MuiFormHelperText:{styleOverrides:{root:({theme:e})=>({color:e.palette.text.secondary,"&.Mui-error":{color:e.palette.error.main}})}},MuiPaper:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius}),elevation8:({theme:e})=>({borderRadius:e.shape.borderRadius})}},MuiMenuItem:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius})}},MuiBottomNavigationAction:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius,padding:"12px",margin:0,maxHeight:"none"})}},MuiDialogContent:{styleOverrides:{root:{padding:0}}},MuiSlider:{styleOverrides:{valueLabel:({theme:e})=>({borderRadius:e.shape.borderRadius,padding:"6px 14px","&::before, &::after":{display:"none"}})}},MuiCircularProgress:{styleOverrides:{circle:{strokeLinecap:"round"}}},MuiTab:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius})}},MuiAccordion:{styleOverrides:{root:{"&::before":{display:"none"}}}}};import{createTheme as Ke}from"@mui/material/styles";var C=(e,t)=>{let{background:r,palette:n,...s}=e,i=r==null?void 0:r[t],a={...n,mode:t};return(i||n!=null&&n.background)&&(a.background={...n==null?void 0:n.background,...i}),Ke({...s,palette:a})};import{useEffect as Ze,useState as Je}from"react";var je=(e=768)=>{let[t,r]=Je(!1);return Ze(()=>{if(!f())return()=>{};let n=()=>{r(window.innerWidth<e)};n();let s=()=>n();return window.addEventListener("resize",s),()=>{window.removeEventListener("resize",s)}},[e]),t};import{useEffect as Qe,useState as qe}from"react";var B=()=>{let[e,t]=qe("unknown");return Qe(()=>{if(!f()||typeof globalThis.matchMedia!="function")return t("unknown"),()=>{};let r=globalThis.matchMedia("(prefers-color-scheme: dark)"),n=s=>{let i=s?s.matches:r.matches;t(i?"dark":"light")};return n(),typeof r.addEventListener!="function"?()=>{}:(r.addEventListener("change",n),()=>{r.removeEventListener("change",n)})},[]),e};var No=e=>/^#([\dA-Fa-f]{3}|[\dA-Fa-f]{6})$/.test(e);var Co=()=>{let e=new Date().getHours();return e>=5&&e<12?"Good morning":e>12&&e<18?"Good afternoon":"Good evening"};var $o=e=>{let t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0");return`${t}-${r}-${n}`};var et=()=>{let e=(typeof navigator=="undefined"?"":navigator.userAgent).toLowerCase();return e.includes("windows nt")?"Windows":e.includes("iphone")||e.includes("ipad")||e.includes("ipod")?"iOS":e.includes("mac")?"macOS":e.includes("android")?"Android":e.includes("linux")?"Linux":"Unknown"},tt=()=>{let e=(typeof navigator=="undefined"?"":navigator.userAgent).toLowerCase();return e.includes("edg")?"Edge":e.includes("chrome")?"Chrome":e.includes("firefox")?"Firefox":e.includes("safari")?"Safari":"Unknown"},Lo={os:typeof navigator=="undefined"?"Unknown":et(),browser:typeof navigator=="undefined"?"Unknown":tt()};var te=(e,t)=>{switch(e){case"light":return!1;case"dark":return!0;case"system":case"auto":return t==="dark";default:return!1}};var Vo=(e,t)=>{let r=t!=null?t:typeof navigator=="undefined"?"en-US":navigator.language,n=new Date;e=new Date(e);let s=Math.floor((n.getTime()-e.getTime())/1e3),i=new Intl.RelativeTimeFormat(r,{numeric:"auto"});if(s<60)return i.format(-s,"second");if(s<3600){let m=Math.floor(s/60);return i.format(-m,"minute")}if(s<86400){let m=Math.floor(s/3600);return i.format(-m,"hour")}let a=Math.floor(s/86400);return i.format(-a,"day")},Yo=(e,t)=>{let r=t!=null?t:typeof navigator=="undefined"?"en-US":navigator.language,n=new Date;e=new Date(e);let s=(e.getTime()-n.getTime())/1e3,i=Math.floor(s/(60*60)),a=Math.floor((s-60*60*i)/60),m=Math.floor(s-60*60*i-60*a),d=new Intl.RelativeTimeFormat(r,{numeric:"auto"});if(a===0&&m<60)return d.format(m,"second");if(i===0&&a<60)return d.format(a,"minute");if(i<24){let h=`${new Intl.RelativeTimeFormat(r,{numeric:"auto"}).format(i,"hour")}`,l=` ${new Intl.RelativeTimeFormat(r,{localeMatcher:"lookup",numeric:"always",style:"long"}).format(a,"minute")}`.replace(/^\D+/,"");return`${h} ${l}`}let g=Math.floor(m/86400);return d.format(g,"day")};var $=(e,t)=>te(e,t)?"dark":"light";var F=(e,t)=>{var r;return(r=e.colorSchemes[t])!=null?r:e.colorSchemes.light};var o=e=>`${e/16}rem`,ot={defaultProps:{variantMapping:{text_xl_regular:"p",text_lg_regular:"p",text_md_regular:"p",text_sm_regular:"p",text_xs_regular:"p",text_2xs_regular:"p",text_xl_bold:"p",text_lg_bold:"p",text_md_bold:"p",text_sm_bold:"p",text_xs_bold:"p",text_2xs_bold:"p",text_xl_semibold:"p",text_lg_semibold:"p",text_md_semibold:"p",text_sm_semibold:"p",text_xs_semibold:"p",text_2xs_semibold:"p",text_xl_thin:"p",text_lg_thin:"p",text_md_thin:"p",text_sm_thin:"p",text_xs_thin:"p",text_2xs_thin:"p",header_2xl_regular:"h1",header_xl_regular:"h2",header_lg_regular:"h3",header_md_regular:"h4",header_sm_regular:"h5",header_xs_regular:"h6",header_2xl_bold:"h1",header_xl_bold:"h2",header_lg_bold:"h3",header_md_bold:"h4",header_sm_bold:"h5",header_xs_bold:"h6",header_2xl_semibold:"h1",header_xl_semibold:"h2",header_lg_semibold:"h3",header_md_semibold:"h4",header_sm_semibold:"h5",header_xs_semibold:"h6"}}},rt={text_xl_regular:{fontWeight:400,fontSize:o(20),lineHeight:o(30)},text_lg_regular:{fontWeight:400,fontSize:o(18),lineHeight:o(28)},text_md_regular:{fontWeight:400,fontSize:o(16),lineHeight:o(24)},text_sm_regular:{fontWeight:400,fontSize:o(14),lineHeight:o(20)},text_xs_regular:{fontWeight:400,fontSize:o(12),lineHeight:o(18)},text_2xs_regular:{fontWeight:400,fontSize:o(10),lineHeight:o(14)},text_xl_bold:{fontWeight:700,fontSize:o(20),lineHeight:o(30)},text_lg_bold:{fontWeight:700,fontSize:o(18),lineHeight:o(28)},text_md_bold:{fontWeight:700,fontSize:o(16),lineHeight:o(24)},text_sm_bold:{fontWeight:700,fontSize:o(14),lineHeight:o(20)},text_xs_bold:{fontWeight:700,fontSize:o(12),lineHeight:o(18)},text_2xs_bold:{fontWeight:700,fontSize:o(10),lineHeight:o(14)},text_xl_semibold:{fontWeight:600,fontSize:o(20),lineHeight:o(30)},text_lg_semibold:{fontWeight:600,fontSize:o(18),lineHeight:o(28)},text_md_semibold:{fontWeight:600,fontSize:o(16),lineHeight:o(24)},text_sm_semibold:{fontWeight:600,fontSize:o(14),lineHeight:o(20)},text_xs_semibold:{fontWeight:600,fontSize:o(12),lineHeight:o(18)},text_2xs_semibold:{fontWeight:600,fontSize:o(10),lineHeight:o(14)},text_xl_thin:{fontWeight:100,fontSize:o(20),lineHeight:o(30)},text_lg_thin:{fontWeight:100,fontSize:o(18),lineHeight:o(28)},text_md_thin:{fontWeight:100,fontSize:o(16),lineHeight:o(24)},text_sm_thin:{fontWeight:100,fontSize:o(14),lineHeight:o(20)},text_xs_thin:{fontWeight:100,fontSize:o(12),lineHeight:o(18)},text_2xs_thin:{fontWeight:100,fontSize:o(10),lineHeight:o(14)},header_2xl_regular:{fontWeight:400,fontSize:o(34),lineHeight:o(42)},header_xl_regular:{fontWeight:400,fontSize:o(32),lineHeight:o(40)},header_lg_regular:{fontWeight:400,fontSize:o(28),lineHeight:o(36)},header_md_regular:{fontWeight:400,fontSize:o(24),lineHeight:o(32)},header_sm_regular:{fontWeight:400,fontSize:o(20),lineHeight:o(28)},header_xs_regular:{fontWeight:400,fontSize:o(18),lineHeight:o(26)},header_2xl_bold:{fontWeight:700,fontSize:o(34),lineHeight:o(42)},header_xl_bold:{fontWeight:700,fontSize:o(32),lineHeight:o(40)},header_lg_bold:{fontWeight:700,fontSize:o(28),lineHeight:o(36)},header_md_bold:{fontWeight:700,fontSize:o(24),lineHeight:o(32)},header_sm_bold:{fontWeight:700,fontSize:o(20),lineHeight:o(28)},header_xs_bold:{fontWeight:700,fontSize:o(18),lineHeight:o(26)},header_2xl_semibold:{fontWeight:600,fontSize:o(34),lineHeight:o(42)},header_xl_semibold:{fontWeight:600,fontSize:o(32),lineHeight:o(40)},header_lg_semibold:{fontWeight:600,fontSize:o(28),lineHeight:o(36)},header_md_semibold:{fontWeight:600,fontSize:o(24),lineHeight:o(32)},header_sm_semibold:{fontWeight:600,fontSize:o(20),lineHeight:o(28)},header_xs_semibold:{fontWeight:600,fontSize:o(18),lineHeight:o(26)}};var nr=e=>{var n,s,i,a;let t=[],{palette:r}=e;return r?((n=r.background)!=null&&n.default||t.push("palette.background.default is missing."),(s=r.background)!=null&&s.paper||t.push("palette.background.paper is missing."),(i=r.text)!=null&&i.primary||t.push("palette.text.primary is missing."),(a=r.text)!=null&&a.secondary||t.push("palette.text.secondary is missing."),r.divider||t.push("palette.divider is missing."),t):(t.push("palette is missing."),t)};import{keyframes as p}from"@emotion/react";var ar=p`
180
181
  from {
181
182
  opacity: 0;
182
183
  transform: translateX(-40px);
@@ -185,48 +186,48 @@ import F from"@emotion/styled";import{Button as L}from"@mui/material";var z=F(L)
185
186
  opacity: 1;
186
187
  transform: translateX(0);
187
188
  }
188
- `,ue=l`
189
+ `,lr=p`
189
190
  from {
190
191
  opacity: 0;
191
192
  }
192
193
  to {
193
194
  opacity: 1;
194
195
  }
195
- `,fe=l`
196
+ `,mr=p`
196
197
  from {
197
198
  transform: translateX(-100%);
198
199
  }
199
200
  to {
200
201
  transform: translateX(0);
201
202
  }
202
- `,he=l`
203
+ `,dr=p`
203
204
  from {
204
205
  transform: translateY(100%);
205
206
  }
206
207
  to {
207
208
  transform: translateY(0);
208
209
  }
209
- `,ge=l`
210
+ `,pr=p`
210
211
  from {
211
212
  transform: scale(0);
212
213
  }
213
214
  to {
214
215
  transform: scale(1);
215
216
  }
216
- `,xe=(e,r=12)=>l`
217
+ `,fr=(e,t=12)=>p`
217
218
  0% {
218
219
  transform: scale(0.95);
219
220
  box-shadow: 0 0 0 0 ${e}b2;
220
221
  }
221
222
  70% {
222
223
  transform: scale(1);
223
- box-shadow: 0 0 0 ${r}px ${e}00;
224
+ box-shadow: 0 0 0 ${t}px ${e}00;
224
225
  }
225
226
  100% {
226
227
  transform: scale(0.95);
227
228
  box-shadow: 0 0 0 0 ${e}00;
228
229
  }
229
- `,ye=e=>l`
230
+ `,hr=e=>p`
230
231
  0% {
231
232
  filter: none;
232
233
  }
@@ -236,7 +237,7 @@ import F from"@emotion/styled";import{Button as L}from"@mui/material";var z=F(L)
236
237
  100% {
237
238
  filter: none;
238
239
  }
239
- `,be=l`
240
+ `,cr=p`
240
241
  0% {
241
242
  transform: scale(1);
242
243
  opacity: 1;
@@ -249,7 +250,7 @@ import F from"@emotion/styled";import{Button as L}from"@mui/material";var z=F(L)
249
250
  transform: scale(1);
250
251
  opacity: 1;
251
252
  }
252
- `,ve=l`
253
+ `,ur=p`
253
254
  0% {
254
255
  transform: translateY(0);
255
256
  }
@@ -265,5 +266,5 @@ import F from"@emotion/styled";import{Button as L}from"@mui/material";var z=F(L)
265
266
  100% {
266
267
  transform: translateY(0);
267
268
  }
268
- `;var ke=e=>/^#([\dA-Fa-f]{3}|[\dA-Fa-f]{6})$/.test(e);var Te=()=>{let e=new Date().getHours();return e>=5&&e<12?"Good morning":e>12&&e<18?"Good afternoon":"Good evening"};var we=e=>{let r=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),o=String(e.getDate()).padStart(2,"0");return`${r}-${n}-${o}`};var Se=()=>{let e=(typeof navigator=="undefined"?"":navigator.userAgent).toLowerCase();return e.includes("windows nt")?"Windows":e.includes("iphone")||e.includes("ipad")||e.includes("ipod")?"iOS":e.includes("mac")?"macOS":e.includes("android")?"Android":e.includes("linux")?"Linux":"Unknown"},Me=()=>{let e=(typeof navigator=="undefined"?"":navigator.userAgent).toLowerCase();return e.includes("edg")?"Edge":e.includes("chrome")?"Chrome":e.includes("firefox")?"Firefox":e.includes("safari")?"Safari":"Unknown"},Pe={os:typeof navigator=="undefined"?"Unknown":Se(),browser:typeof navigator=="undefined"?"Unknown":Me()};var T=(e,r)=>{switch(e){case"light":return!1;case"dark":return!0;case"system":return r==="dark";default:return!1}};var Oe=(e,r)=>{let n=r!=null?r:typeof navigator=="undefined"?"en-US":navigator.language,o=new Date;e=new Date(e);let t=Math.floor((o.getTime()-e.getTime())/1e3),i=new Intl.RelativeTimeFormat(n,{numeric:"auto"});if(t<60)return i.format(-t,"second");if(t<3600){let a=Math.floor(t/60);return i.format(-a,"minute")}if(t<86400){let a=Math.floor(t/3600);return i.format(-a,"hour")}let s=Math.floor(t/86400);return i.format(-s,"day")},Re=(e,r)=>{let n=r!=null?r:typeof navigator=="undefined"?"en-US":navigator.language,o=new Date;e=new Date(e);let t=(e.getTime()-o.getTime())/1e3,i=Math.floor(t/(60*60)),s=Math.floor((t-60*60*i)/60),a=Math.floor(t-60*60*i-60*s),d=new Intl.RelativeTimeFormat(n,{numeric:"auto"});if(s===0&&a<60)return d.format(a,"second");if(i===0&&s<60)return d.format(s,"minute");if(i<24){let p=`${new Intl.RelativeTimeFormat(n,{numeric:"auto"}).format(i,"hour")}`,x=` ${new Intl.RelativeTimeFormat(n,{localeMatcher:"lookup",numeric:"always",style:"long"}).format(s,"minute")}`.replace(/^\D+/,"");return`${p} ${x}`}let m=Math.floor(a/86400);return d.format(m,"day")};import{useEffect as De,useState as Ee}from"react";var Ie=(e=768)=>{let[r,n]=Ee(!1);return De(()=>{let o=()=>{n(window.innerWidth<e)};o();let t=()=>o();return window.addEventListener("resize",t),()=>{window.removeEventListener("resize",t)}},[e]),r};import{useState as Ce,useEffect as Ae}from"react";var w=()=>{let[e,r]=Ce("unknown");return Ae(()=>{let n=t=>{r(t.matches?"dark":"light")},o=globalThis.matchMedia("(prefers-color-scheme: dark)");return r(o.matches?"dark":"light"),o.addEventListener("change",n),()=>{o.removeEventListener("change",n)}},[]),e};import{useEffect as D,useMemo as E,useState as S}from"react";var O="Default",R=e=>{if(!e||e.length===0)return[{name:O}];if(e.length===1){let r=e[0],n=r.name&&r.name.trim().length>0?r.name:O;return[{...r,name:n}]}for(let r of e)if(!("name"in r)||!r.name||r.name.trim().length===0)throw new Error("ThemeProviderWrapper: when providing multiple themes, each theme must include a non-empty `name`.");return e};var I="appSettings",C=({themes:e})=>{let[r,n]=S("system"),[o,t]=S("auto"),[i,s]=S(!1),a=E(()=>R(e),[e]),d=E(()=>a.find(m=>m.name===r)||a[0],[r,a]);return D(()=>{if(globalThis.window!==void 0)try{let m=globalThis.localStorage.getItem(I);if(m){let p=JSON.parse(m);p.theme&&n(p.theme),p.darkMode&&t(p.darkMode)}}catch(m){}finally{s(!0)}},[]),D(()=>{if(globalThis.window!==void 0&&i)try{globalThis.localStorage.setItem(I,JSON.stringify({theme:r,darkMode:o}))}catch(m){}},[i,r,o]),{theme:r,setTheme:n,darkMode:o,setDarkMode:t,themesSource:a,selectedTheme:d}};import{jsx as $,jsxs as Le}from"react/jsx-runtime";var Fe=({children:e,fontFamily:r,themes:n})=>{let o=w(),{theme:t,setTheme:i,darkMode:s,setDarkMode:a,selectedTheme:d}=C({themes:n}),m=A(()=>T(s,o)?"dark":"light",[s,o]),p=A(()=>{let{name:x,...B}=d;if(!x)throw new Error("ThemeProviderWrapper: selected theme must include a non-empty `name`.");return $e({palette:{mode:m},...B})},[d,m]);return $(v.Provider,{value:{theme:t,darkMode:s,setTheme:i,setDarkMode:a},children:Le(Be,{theme:p,children:[$(k,{fontFamily:r}),e]})})};export{z as DialogBtn,y as ErrorBoundary,k as GlobalStyles,J as Loading,j as PathName,Fe as ThemeProviderWrapper,se as commonComponentProps,te as darkModeOptions,Te as displayGreeting,ue as fadeIn,ce as fadeInLeft,we as getDayIdentifier,ve as installAppAnimation,T as isDarkMode,ke as isHexColor,be as logoutAnimation,ye as progressPulse,xe as pulseAnimation,ge as scale,fe as slideIn,he as slideInBottom,Pe as systemInfo,Oe as timeAgo,Re as timeAgoFromStart,Ie as useResponsiveDisplay,w as useSystemTheme,ae as useThemeSettings};
269
+ `;import{jsx as oe,jsxs as st}from"react/jsx-runtime";var it=({children:e,fontFamily:t,themes:r})=>{let n=B(),{theme:s,setTheme:i,darkMode:a,setDarkMode:m,themesSource:d,selectedTheme:g,selectedPreset:h}=H({themes:r}),l=P(()=>$(a,n),[a,n]),L=P(()=>F(h,l),[h,l]),re=P(()=>C(L,l),[L,l]),ne=P(()=>y(d),[d]);return oe(T.Provider,{value:{theme:s,darkMode:a,setTheme:i,setDarkMode:m,themes:d,selectedTheme:g,defaultThemeName:ne},children:st(nt,{theme:re,children:[oe(N,{fontFamily:t}),e]})})};export{u as APP_SETTINGS_VERSION,fe as DialogBtn,O as ErrorBoundary,N as GlobalStyles,Se as Loading,we as PathName,it as ThemeProviderWrapper,yo as alphaText,C as buildMuiTheme,f as canUseDom,Xe as commonComponentProps,De as darkModeOptions,Co as displayGreeting,ie as editorialClassic,lr as fadeIn,ar as fadeInLeft,tt as getBrowser,$o as getDayIdentifier,et as getOperatingSystem,ee as getSurfaceTokens,ur as installAppAnimation,te as isDarkMode,No as isHexColor,cr as logoutAnimation,Z as mergeThemes,se as modernMinimal,ot as muiTypography,ae as neoGlass,I as normalizeThemes,hr as progressPulse,fr as pulseAnimation,D as readAppSettings,y as resolveDefaultThemeName,$ as resolveEffectiveMode,J as resolveThemeById,le as retroTerminal,pr as scale,F as selectThemeOptions,mr as slideIn,dr as slideInBottom,Lo as systemInfo,Vo as timeAgo,Yo as timeAgoFromStart,rt as typographyVariants,je as useResponsiveDisplay,B as useSystemTheme,V as useThemeSettings,nr as validateSchemeTokens,me as warmEarth,E as writeAppSettings};
269
270
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/DialogBtn.ts","../src/components/ErrorBoundary.tsx","../src/components/Loading.tsx","../src/components/PathName.ts","../src/constants/darkModeOptions.tsx","../src/context/ThemeContext.tsx","../src/context/ThemeProviderWrapper.tsx","../src/styles/commonComponents.ts","../src/styles/GlobalStyles.tsx","../src/styles/keyframes.ts","../src/utils/colorUtils.ts","../src/utils/displayGreeting.ts","../src/utils/getDayIdentifier.ts","../src/utils/getSystemInfo.ts","../src/utils/isDarkMode.ts","../src/utils/timeAgo.ts","../src/utils/useResponsiveDisplay.ts","../src/utils/useSystemTheme.ts","../src/context/usePersistedAppSettings.ts","../src/context/helper.ts"],"sourcesContent":["import styled from \"@emotion/styled\";\nimport { Button } from \"@mui/material\";\n\nexport const DialogBtn = styled(Button)`\n padding: 10px 16px;\n border-radius: 16px;\n font-size: 16px;\n margin: 8px;\n`;\n","/* eslint-disable @typescript-eslint/class-methods-use-this -- only for ErrorBoundary */\nimport React from \"react\";\nimport styled from \"@emotion/styled\";\nimport ErrorOutlineRounded from \"@mui/icons-material/ErrorOutlineRounded\";\nimport { Box } from \"@mui/material\";\n\nimport type { ErrorInfo } from \"react\";\n\ninterface ErrorBoundaryProps {\n children: React.ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error?: Error;\n}\n\n/**\n * ErrorBoundary component that catches and displays errors.\n */\nexport class ErrorBoundary extends React.Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {\n hasError: false,\n };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return {\n hasError: true,\n error,\n };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n // eslint-disable-next-line no-console -- Allow console output for error reporting\n console.error(\"Error:\", error);\n // eslint-disable-next-line no-console -- Allow console output for error reporting\n console.error(\"Error Info:\", errorInfo);\n }\n\n render() {\n const { state, props } = this;\n if (state.hasError) {\n return (\n <Container>\n <ErrorHeader>\n <Box>Something went wrong.&nbsp;</Box>\n </ErrorHeader>\n <h3>\n <Box style={{ color: \"#ff3131\", display: \"inline-block\" }}>\n <ErrorOutlineRounded\n sx={{ verticalAlign: \"middle\", mb: \"4px\" }}\n />{\" \"}\n ERROR:\n </Box>{\" \"}\n <Box translate=\"no\">\n [{state.error?.name}] {state.error?.message}\n </Box>\n <Box style={{ color: \"#ff3131\", display: \"inline-block\" }}>\n <ErrorOutlineRounded\n sx={{ verticalAlign: \"middle\", mb: \"4px\" }}\n />{\" \"}\n Stack:\n </Box>{\" \"}\n <Box translate=\"no\">[{state.error?.stack}]</Box>\n </h3>\n </Container>\n );\n }\n\n return props.children;\n }\n}\n\nconst Container = styled.div`\n margin: 0 8vw;\n @media (max-width: 768px) {\n margin: 0;\n }\n`;\n\nconst ErrorHeader = styled.h1`\n margin-top: 32px;\n margin-bottom: 32px;\n font-size: 36px;\n color: #ff3131;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n @media (max-width: 768px) {\n text-align: left;\n justify-content: left;\n font-size: 30px;\n margin-top: 0;\n margin-bottom: 0;\n }\n`;\n","import { useEffect, useState } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { Box, CircularProgress } from \"@mui/material\";\n\nexport const Loading = () => {\n const [showLoading, setShowLoading] = useState<boolean>(false);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setShowLoading(true);\n }, 100); // Show the loading spinner after 100 milliseconds\n\n return () => clearTimeout(timer);\n }, []);\n\n return (\n <Container aria-live=\"polite\" role=\"status\">\n {showLoading && (\n <>\n <CircularProgress aria-label=\"loading\" size={80} thickness={4} />\n <h3 style={{ opacity: 0.8 }}>Loading Page...</h3>\n </>\n )}\n </Container>\n );\n};\n\nconst Container = styled(Box)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n text-align: center;\n gap: 8px;\n`;\n","import styled from \"@emotion/styled\";\n\nexport const PathName = styled.code`\n background: #000000c8;\n color: white;\n padding: 4px 6px;\n border-radius: 8px;\n`;\n","import BrightnessAutoRoundedIcon from \"@mui/icons-material/BrightnessAutoRounded\";\nimport DarkModeRoundedIcon from \"@mui/icons-material/DarkModeRounded\";\nimport LightModeRoundedIcon from \"@mui/icons-material/LightModeRounded\";\nimport PersonalVideoRoundedIcon from \"@mui/icons-material/PersonalVideoRounded\";\n\nimport type { OptionItem } from \"../models\";\n\nconst OPTION_ICON_SIZE = 32;\n\nexport const darkModeOptions: OptionItem[] = [\n {\n label: \"Auto\",\n value: \"auto\",\n icon: (\n <BrightnessAutoRoundedIcon\n color=\"inherit\"\n sx={{ fontSize: OPTION_ICON_SIZE }}\n />\n ),\n },\n {\n label: \"System\",\n value: \"system\",\n icon: (\n <PersonalVideoRoundedIcon\n color=\"inherit\"\n sx={{ fontSize: OPTION_ICON_SIZE }}\n />\n ),\n },\n {\n label: \"Light\",\n value: \"light\",\n icon: (\n <LightModeRoundedIcon\n color=\"inherit\"\n sx={{ fontSize: OPTION_ICON_SIZE }}\n />\n ),\n },\n {\n label: \"Dark\",\n value: \"dark\",\n icon: (\n <DarkModeRoundedIcon\n color=\"inherit\"\n sx={{ fontSize: OPTION_ICON_SIZE }}\n />\n ),\n },\n];\n","import { createContext, useContext } from \"react\";\n\nimport type { ThemeContextProps } from \"../models\";\n\nexport const ThemeContext = createContext<ThemeContextProps | undefined>(\n undefined,\n);\n\nexport const useThemeSettings = (): ThemeContextProps => {\n const context = useContext(ThemeContext);\n if (!context)\n throw new Error(\n \"useThemeSettings must be used within ThemeProviderWrapper\",\n );\n return context;\n};\n","import { useMemo } from \"react\";\nimport { createTheme } from \"@mui/material\";\nimport { ThemeProvider as MuiThemeProvider } from \"@mui/material/styles\";\n\nimport { GlobalStyles } from \"../styles\";\nimport { isDarkMode, useSystemTheme } from \"../utils\";\n\nimport { ThemeContext } from \"./ThemeContext\";\nimport { usePersistedAppSettings } from \"./usePersistedAppSettings\";\n\nimport type { ThemesProp } from \"./themeTypes\";\nimport type { FC, PropsWithChildren } from \"react\";\n\ntype ThemeProviderWrapperProps = PropsWithChildren<{\n /** Optional font stack to apply across the app. */\n fontFamily?: string;\n /**\n * Optional dynamic list of themes.\n * Each theme is a full ThemeOptions object.\n */\n themes?: ThemesProp;\n}>;\n\nexport const ThemeProviderWrapper: FC<ThemeProviderWrapperProps> = ({\n children,\n fontFamily,\n themes,\n}) => {\n const systemTheme = useSystemTheme();\n const { theme, setTheme, darkMode, setDarkMode, selectedTheme } =\n usePersistedAppSettings({ themes });\n\n const mode = useMemo(\n () => (isDarkMode(darkMode, systemTheme) ? \"dark\" : \"light\"),\n [darkMode, systemTheme],\n );\n\n const muiTheme = useMemo(() => {\n const { name, ...customTheme } = selectedTheme;\n if (!name) {\n throw new Error(\n \"ThemeProviderWrapper: selected theme must include a non-empty `name`.\",\n );\n }\n return createTheme({\n palette: { mode },\n ...customTheme,\n });\n }, [selectedTheme, mode]);\n\n return (\n <ThemeContext.Provider value={{ theme, darkMode, setTheme, setDarkMode }}>\n <MuiThemeProvider theme={muiTheme}>\n <GlobalStyles fontFamily={fontFamily} />\n {children}\n </MuiThemeProvider>\n </ThemeContext.Provider>\n );\n};\n","import type { Theme } from \"@mui/material\";\n\n/**\n * Common component style overrides and default props shared across the design system.\n * This object should be spread into the `components` field of the MUI theme.\n */\nexport const commonComponentProps: Theme[\"components\"] = {\n MuiTooltip: {\n defaultProps: {\n disableInteractive: true,\n },\n styleOverrides: {\n tooltip: ({ theme }) => ({\n backdropFilter: \"blur(6px)\",\n WebkitBackdropFilter: \"blur(6px)\",\n padding: \"8px 16px\",\n borderRadius: theme.shape.borderRadius,\n fontSize: \"12px\",\n }),\n },\n },\n\n MuiButton: {\n styleOverrides: {\n root: ({ theme }) => ({\n padding: \"12px 24px\",\n borderRadius: theme.shape.borderRadius,\n }),\n contained: {\n boxShadow: \"none\",\n },\n },\n },\n\n MuiSkeleton: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n },\n },\n\n MuiSelect: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n select: {\n display: \"flex\",\n justifyContent: \"flex-start\",\n alignItems: \"center\",\n gap: \"4px\",\n },\n },\n },\n\n MuiDialog: {\n defaultProps: {\n slotProps: {\n paper: {\n style: {\n padding: \"12px\",\n borderRadius: 24, // оставить явно, если это критично\n minWidth: \"400px\",\n },\n },\n },\n },\n styleOverrides: {\n root: {\n \"& .MuiDialog-container\": {\n backdropFilter: \"blur(4px)\",\n },\n },\n },\n },\n\n MuiAvatar: {\n styleOverrides: {\n root: {\n fontWeight: 500,\n },\n },\n },\n\n MuiAlert: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n },\n },\n\n MuiTextField: {\n defaultProps: {\n variant: \"outlined\", // по умолчанию, если нужно\n },\n styleOverrides: {\n root: ({ theme }) => ({\n \"& .MuiInputBase-root\": {\n borderRadius: theme.shape.borderRadius,\n },\n }),\n },\n },\n\n MuiOutlinedInput: {\n styleOverrides: {\n root: ({ theme }) => ({\n color: theme.palette.primary.main,\n \"& fieldset\": {\n borderColor: theme.palette.primary.main,\n },\n \"&:hover fieldset\": {\n borderColor: theme.palette.primary.dark,\n },\n \"&.Mui-focused fieldset\": {\n borderColor: theme.palette.primary.main,\n },\n }),\n },\n },\n\n MuiInputLabel: {\n styleOverrides: {\n root: ({ theme }) => ({\n color: theme.palette.primary.main,\n \"&.Mui-focused\": {\n color: theme.palette.primary.main,\n },\n }),\n },\n },\n MuiFormHelperText: {\n styleOverrides: {\n root: ({ theme }) => ({\n color: theme.palette.error.main,\n }),\n },\n },\n\n MuiPaper: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n elevation8: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n },\n },\n\n MuiMenuItem: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n },\n },\n\n MuiBottomNavigationAction: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n padding: \"12px\",\n margin: 0,\n maxHeight: \"none\",\n }),\n },\n },\n\n MuiDialogContent: {\n styleOverrides: {\n root: {\n padding: 0,\n },\n },\n },\n\n MuiSlider: {\n styleOverrides: {\n valueLabel: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n padding: \"6px 14px\",\n \"&::before, &::after\": {\n display: \"none\",\n },\n }),\n },\n },\n\n MuiCircularProgress: {\n styleOverrides: {\n circle: {\n strokeLinecap: \"round\",\n },\n },\n },\n\n MuiTab: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n },\n },\n\n MuiAccordion: {\n styleOverrides: {\n root: {\n \"&::before\": {\n display: \"none\",\n },\n },\n },\n },\n};\n","import { Global, css } from \"@emotion/react\";\nimport { useTheme } from \"@mui/material/styles\";\n\nimport type { FC } from \"react\";\n\n/**\n * Injects global styles into the document using Emotion.\n * These styles include font setup, base HTML styles, custom scrollbars,\n * selection styling, and some accessibility tweaks.\n *\n * Uses the MUI theme to dynamically adjust colors for light/dark mode.\n */\ninterface GlobalStylesProps {\n /** Optional font stack to apply across the app. */\n fontFamily?: string;\n}\n\nexport const GlobalStyles: FC<GlobalStylesProps> = ({ fontFamily }) => {\n const theme = useTheme();\n const isDarkMode = theme.palette.mode === \"dark\";\n\n const primaryColor = theme.palette.primary.main;\n const backgroundDefault = theme.palette.background.default;\n const backgroundPaper = theme.palette.background.paper;\n\n return (\n <Global\n styles={css`\n /* Allow application to control font via CSS var or prop */\n :root {\n ${fontFamily ? `--app-font-family: ${fontFamily};` : \"\"}\n }\n * {\n font-family:\n var(\n --app-font-family,\n \"Mulish\",\n system-ui,\n -apple-system,\n \"Segoe UI\",\n Roboto,\n Arial\n ),\n sans-serif !important;\n -webkit-tap-highlight-color: transparent;\n &::selection {\n background-color: ${`${primaryColor}e1`};\n }\n }\n\n html,\n body,\n #root {\n height: 100%;\n margin: 0;\n }\n\n :root {\n height: 100%;\n /* default fallback font; apps can override via --app-font-family */\n font-family: var(\n --app-font-family,\n \"Mulish\",\n system-ui,\n -apple-system,\n \"Segoe UI\",\n Roboto,\n Arial,\n sans-serif\n )\n sans-serif;\n line-height: 1.5;\n font-weight: 400;\n color-scheme: ${isDarkMode ? \"dark\" : \"light\"};\n font-synthesis: none;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n -webkit-text-size-adjust: 100%;\n }\n\n body {\n margin: 0;\n height: 100%;\n overflow: auto;\n touch-action: manipulation;\n background: ${backgroundDefault};\n background-attachment: fixed;\n background-size: cover;\n transition: 0.3s background;\n /* Firefox */\n scrollbar-color: ${primaryColor} ${backgroundDefault};\n scrollbar-width: thin;\n\n ::-webkit-scrollbar {\n width: 8px;\n background-color: ${backgroundDefault};\n }\n ::-webkit-scrollbar-thumb {\n background-color: ${primaryColor};\n border-radius: 64px;\n }\n ::-webkit-scrollbar-thumb:hover {\n background-color: ${`${primaryColor}d8`};\n }\n ::-webkit-scrollbar-track {\n border-radius: 64px;\n background-color: ${backgroundDefault};\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n }\n\n img {\n user-select: none;\n }\n\n input[type=\"file\"]::-webkit-file-upload-button {\n display: none;\n }\n\n input[type=\"datetime-local\"]:placeholder-shown {\n color: transparent !important;\n }\n\n pre {\n padding: 16px;\n border-radius: 18px;\n overflow-x: auto;\n }\n\n .MuiDialogContent-root,\n .MuiDrawer-paper,\n .customScrollbar,\n textarea {\n /* Firefox */\n scrollbar-color: ${primaryColor} ${backgroundPaper};\n scrollbar-width: thin;\n ::-webkit-scrollbar {\n width: 8px;\n background-color: ${backgroundPaper};\n }\n ::-webkit-scrollbar-thumb {\n background-color: ${primaryColor};\n border-radius: 64px;\n }\n ::-webkit-scrollbar-thumb:hover {\n background-color: ${`${primaryColor}d8`};\n }\n ::-webkit-scrollbar-track {\n border-radius: 64px;\n background-color: ${backgroundPaper};\n }\n }\n\n /* react-spring-bottom-sheet styles */\n div[role=\"dialog\"] {\n border-radius: 42px 42px 0 0;\n z-index: 9999999;\n }\n `}\n />\n );\n};\n","import { keyframes } from \"@emotion/react\";\n\n/**\n * Fade in from the left with slight movement on the X-axis.\n */\nexport const fadeInLeft = keyframes`\n from {\n opacity: 0;\n transform: translateX(-40px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n`;\n\n/**\n * Simple fade in animation (opacity only).\n */\nexport const fadeIn = keyframes`\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n`;\n\n/**\n * Slide in from the left side of the screen.\n */\nexport const slideIn = keyframes`\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(0);\n }\n`;\n\n/**\n * Slide in from the bottom of the screen.\n */\nexport const slideInBottom = keyframes`\n from {\n transform: translateY(100%);\n }\n to {\n transform: translateY(0);\n }\n`;\n\n/**\n * Scale from 0 to full size.\n */\nexport const scale = keyframes`\n from {\n transform: scale(0);\n }\n to {\n transform: scale(1);\n }\n`;\n\n/**\n * Creates a pulsating animation using scale and box-shadow.\n * Simulates a glowing effect.\n *\n * @param clr - The base color for the shadow in hex format.\n * @param shadowBlur - The maximum spread of the shadow during the pulse (default: 12).\n * @returns Emotion keyframes animation.\n */\nexport const pulseAnimation = (clr: string, shadowBlur = 12) => keyframes`\n 0% {\n transform: scale(0.95);\n box-shadow: 0 0 0 0 ${clr}b2;\n }\n 70% {\n transform: scale(1);\n box-shadow: 0 0 0 ${shadowBlur}px ${clr}00;\n }\n 100% {\n transform: scale(0.95);\n box-shadow: 0 0 0 0 ${clr}00;\n }\n`;\n\n/**\n * Creates a glowing pulse animation using drop-shadow.\n * Used in progress or highlight elements.\n *\n * @param clr - The glow color in hex.\n * @returns Emotion keyframes animation.\n */\nexport const progressPulse = (clr: string) => keyframes`\n 0% {\n filter: none;\n }\n 50% {\n filter: drop-shadow(0 0 10px ${clr}78);\n }\n 100% {\n filter: none;\n }\n`;\n\n/**\n * A bounce-scale animation used during logout transition.\n */\nexport const logoutAnimation = keyframes`\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 50% {\n transform: scale(0.9) translateX(-2px);\n opacity: 0.7;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n`;\n\n/**\n * Subtle bounce animation used for install app prompts.\n */\nexport const installAppAnimation = keyframes`\n 0% {\n transform: translateY(0);\n }\n 30% {\n transform: translateY(-5px);\n }\n 50% {\n transform: translateY(2px);\n }\n 70% {\n transform: translateY(-2px);\n }\n 100% {\n transform: translateY(0);\n }\n`;\n","/**\n * Validates whether a given string is a valid 3- or 6-digit hex color code (e.g., \"#fff\" or \"#ffffff\").\n *\n * @param value - The string to check.\n * @returns `true` if the string is a valid hex color; otherwise, `false`.\n */\nexport const isHexColor = (value: string): boolean =>\n /^#([\\dA-Fa-f]{3}|[\\dA-Fa-f]{6})$/.test(value);\n","/**\n * Returns a greeting based on the current time.\n * @returns {string} The appropriate greeting.\n */\nexport const displayGreeting = (): string => {\n const currentHour = new Date().getHours();\n if (currentHour >= 5 && currentHour < 12) return \"Good morning\";\n if (currentHour > 12 && currentHour < 18) return \"Good afternoon\";\n return \"Good evening\";\n};\n","/**\n * Function to extract year, month, and day from a Date object\n */\nexport const getDayIdentifier = (date: Date) => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\"); // Months are zero-based in JavaScript\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n};\n","/**\n * A list of supported operating systems.\n */\nexport type OperatingSystem =\n | \"Windows\"\n | \"macOS\"\n | \"Linux\"\n | \"iOS\"\n | \"Android\"\n | \"Unknown\";\n\n/**\n * A list of supported browsers.\n */\nexport type Browser = \"Chrome\" | \"Firefox\" | \"Safari\" | \"Edge\" | \"Unknown\";\n\n/**\n * Detects the user's operating system based on the user agent string.\n * Safe for SSR: falls back to \"Unknown\" on server.\n */\nexport const getOperatingSystem = (): OperatingSystem => {\n const ua = (\n typeof navigator === \"undefined\" ? \"\" : navigator.userAgent\n ).toLowerCase();\n\n if (ua.includes(\"windows nt\")) return \"Windows\";\n if (ua.includes(\"iphone\") || ua.includes(\"ipad\") || ua.includes(\"ipod\"))\n return \"iOS\";\n if (ua.includes(\"mac\")) return \"macOS\";\n if (ua.includes(\"android\")) return \"Android\";\n if (ua.includes(\"linux\")) return \"Linux\";\n\n return \"Unknown\";\n};\n\n/**\n * Detects the user's browser based on the user agent string.\n * Safe for SSR: falls back to \"Unknown\" on server.\n */\nexport const getBrowser = (): Browser => {\n const ua = (\n typeof navigator === \"undefined\" ? \"\" : navigator.userAgent\n ).toLowerCase();\n\n // Order matters: Edge must come before Chrome\n if (ua.includes(\"edg\")) return \"Edge\";\n if (ua.includes(\"chrome\")) return \"Chrome\";\n if (ua.includes(\"firefox\")) return \"Firefox\";\n if (ua.includes(\"safari\")) return \"Safari\";\n\n return \"Unknown\";\n};\n\n/**\n * Basic information about the user's system (OS and browser).\n * Safe for SSR: resolves to Unknown values on server.\n */\nexport const systemInfo = {\n os:\n typeof navigator === \"undefined\"\n ? (\"Unknown\" as OperatingSystem)\n : getOperatingSystem(),\n browser:\n typeof navigator === \"undefined\" ? (\"Unknown\" as Browser) : getBrowser(),\n};\n","import type { AppSettings, SystemTheme } from \"../models\";\n\n/**\n * Determines whether dark mode should be enabled based on user settings and system conditions.\n *\n * @param darkMode - User preference: 'light' | 'dark' | 'system' | 'auto'.\n * @param systemTheme - Detected OS-level theme: 'light' | 'dark'.\n * @param backgroundColor - The background color to assess contrast in 'auto' mode.\n * @returns True if dark mode should be used.\n */\nexport const isDarkMode = (\n darkMode: AppSettings[\"darkMode\"],\n systemTheme: SystemTheme,\n): boolean => {\n switch (darkMode) {\n case \"light\": {\n return false;\n }\n case \"dark\": {\n return true;\n }\n case \"system\": {\n return systemTheme === \"dark\";\n }\n default: {\n return false;\n }\n }\n};\n","/**\n * Converts a given date to a human-readable relative time string.\n *\n * @param {Date} date - The date to be converted.\n * @param lang\n * @returns {string} A string representing the relative time using `Intl` format (e.g., \"2 days ago\").\n */\nexport const timeAgo = (date: Date, lang?: string): string => {\n const locale =\n lang ?? (typeof navigator === \"undefined\" ? \"en-US\" : navigator.language);\n // Get the current date and time\n const now = new Date();\n date = new Date(date);\n // Calculate the time difference in seconds\n const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);\n\n // Create an Intl.RelativeTimeFormat instance with the user's language\n const rtf = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n\n // Determine the appropriate unit and format the result\n if (diffInSeconds < 60) {\n return rtf.format(-diffInSeconds, \"second\");\n }\n if (diffInSeconds < 3600) {\n const minutes = Math.floor(diffInSeconds / 60);\n return rtf.format(-minutes, \"minute\");\n }\n if (diffInSeconds < 86_400) {\n const hours = Math.floor(diffInSeconds / 3600);\n return rtf.format(-hours, \"hour\");\n }\n const days = Math.floor(diffInSeconds / 86_400);\n return rtf.format(-days, \"day\");\n};\n\nexport const timeAgoFromStart = (date: Date, lang?: string): string => {\n const locale =\n lang ?? (typeof navigator === \"undefined\" ? \"en-US\" : navigator.language);\n const now = new Date();\n date = new Date(date);\n const difference = (date.getTime() - now.getTime()) / 1000;\n const differenceHours = Math.floor(difference / (60 * 60));\n const differenceMinutes = Math.floor(\n (difference - 60 * 60 * differenceHours) / 60,\n );\n const diffInSeconds = Math.floor(\n difference - 60 * 60 * differenceHours - 60 * differenceMinutes,\n );\n\n const rtf = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n\n if (differenceMinutes === 0 && diffInSeconds < 60) {\n return rtf.format(diffInSeconds, \"second\");\n }\n if (differenceHours === 0 && differenceMinutes < 60) {\n return rtf.format(differenceMinutes, \"minute\");\n }\n if (differenceHours < 24) {\n const hours = `${new Intl.RelativeTimeFormat(locale, {\n numeric: \"auto\",\n }).format(differenceHours, \"hour\")}`;\n const minutes = ` ${new Intl.RelativeTimeFormat(locale, {\n localeMatcher: \"lookup\",\n numeric: \"always\",\n style: \"long\",\n }).format(differenceMinutes, \"minute\")}`.replace(/^\\D+/, \"\");\n return `${hours} ${minutes}`;\n }\n\n const days = Math.floor(diffInSeconds / 86_400);\n return rtf.format(days, \"day\");\n};\n","import { useEffect, useState } from \"react\";\n\n/**\n * A custom React hook to determine if the current device is a smaller device\n * based on the screen width.\n * @param [breakpoint=768] - The breakpoint in pixels at which a device is considered \"smaller\".\n * @returns {boolean} - A boolean value indicating whether the current device is a smaller device.\n */\nexport const useResponsiveDisplay = (breakpoint = 768): boolean => {\n const [isSmallerDevice, setIsSmallerDevice] = useState<boolean>(false);\n\n useEffect(() => {\n const checkScreenSize = () => {\n setIsSmallerDevice(window.innerWidth < breakpoint);\n };\n checkScreenSize();\n const handleResize = () => checkScreenSize();\n window.addEventListener(\"resize\", handleResize);\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n };\n }, [breakpoint]);\n\n return isSmallerDevice;\n};\n","import { useState, useEffect } from \"react\";\n\nimport type { SystemTheme } from \"../models\";\n\n/**\n * A React hook to detect the system theme preference.\n * @returns The current system theme ('light', 'dark', or 'unknown').\n */\nexport const useSystemTheme = (): SystemTheme => {\n const [theme, setTheme] = useState<SystemTheme>(\"unknown\");\n useEffect(() => {\n const mediaQueryListener = (e: MediaQueryListEvent) => {\n setTheme(e.matches ? \"dark\" : \"light\");\n };\n\n const prefersDarkScheme = globalThis.matchMedia(\n \"(prefers-color-scheme: dark)\",\n );\n setTheme(prefersDarkScheme.matches ? \"dark\" : \"light\");\n\n // Listen for changes in system theme\n prefersDarkScheme.addEventListener(\"change\", mediaQueryListener);\n\n return () => {\n prefersDarkScheme.removeEventListener(\"change\", mediaQueryListener);\n };\n }, []);\n\n return theme;\n};\n","import { useEffect, useMemo, useState } from \"react\";\n\nimport { normalizeThemes } from \"./helper\";\n\nimport type { DarkModeOptions } from \"../models\";\nimport type { ThemeN, ThemesProp } from \"./themeTypes\";\n\nconst APP_SETTINGS_KEY = \"appSettings\";\n\nexport const usePersistedAppSettings = ({\n themes,\n}: {\n themes?: ThemesProp;\n}): {\n theme: string;\n setTheme: (theme: string) => void;\n darkMode: DarkModeOptions;\n setDarkMode: (mode: DarkModeOptions) => void;\n themesSource: ThemeN[];\n selectedTheme: ThemeN;\n} => {\n const [theme, setTheme] = useState<string>(\"system\");\n const [darkMode, setDarkMode] = useState<DarkModeOptions>(\"auto\");\n const [isHydrated, setIsHydrated] = useState(false);\n\n const themesSource = useMemo(() => normalizeThemes(themes), [themes]);\n\n const selectedTheme = useMemo(\n () => themesSource.find((t) => t.name === theme) || themesSource[0],\n [theme, themesSource],\n );\n\n // Hydrate from localStorage on client\n useEffect(() => {\n if (globalThis.window === undefined) return;\n try {\n const storedRaw = globalThis.localStorage.getItem(APP_SETTINGS_KEY);\n if (storedRaw) {\n const stored = JSON.parse(storedRaw) as Partial<{\n theme: string;\n darkMode: DarkModeOptions;\n }>;\n if (stored.theme) setTheme(stored.theme);\n if (stored.darkMode) setDarkMode(stored.darkMode);\n }\n } catch {\n /* empty */\n } finally {\n setIsHydrated(true);\n }\n }, []);\n\n // Persist settings\n useEffect(() => {\n if (globalThis.window === undefined) return;\n if (!isHydrated) return;\n try {\n globalThis.localStorage.setItem(\n APP_SETTINGS_KEY,\n JSON.stringify({ theme, darkMode }),\n );\n } catch {\n /* empty */\n }\n }, [isHydrated, theme, darkMode]);\n\n return {\n theme,\n setTheme,\n darkMode,\n setDarkMode,\n themesSource,\n selectedTheme,\n };\n};\n","import type { ThemesProp } from \"./themeTypes\";\nimport type { ThemeOptions } from \"@mui/material/styles\";\n\nconst DEFAULT_THEME_NAME = \"Default\";\n\n/**\n * Normalizes theme input so the result always includes valid theme names.\n * - No input/empty: returns a single default theme.\n * - Single theme: fills a missing/blank name with the default.\n * - Multiple themes: requires each theme to have a non-empty name.\n */\nexport const normalizeThemes = (\n input?: ThemesProp,\n): (ThemeOptions & { name: string })[] => {\n if (!input || input.length === 0) return [{ name: DEFAULT_THEME_NAME }];\n\n if (input.length === 1) {\n const theme = input[0];\n const themeName =\n theme.name && theme.name.trim().length > 0\n ? theme.name\n : DEFAULT_THEME_NAME;\n return [\n {\n ...theme,\n name: themeName,\n },\n ];\n }\n\n for (const theme of input) {\n if (!(\"name\" in theme) || !theme.name || theme.name.trim().length === 0) {\n throw new Error(\n \"ThemeProviderWrapper: when providing multiple themes, each theme must include a non-empty `name`.\",\n );\n }\n }\n\n return input as (ThemeOptions & { name: string })[];\n};\n"],"mappings":"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","names":["styled","Button","DialogBtn","React","styled","ErrorOutlineRounded","Box","jsx","jsxs","ErrorBoundary","props","error","errorInfo","_a","_b","_c","state","Container","ErrorHeader","useEffect","useState","styled","Box","CircularProgress","Fragment","jsx","jsxs","Loading","showLoading","setShowLoading","timer","Container","styled","PathName","BrightnessAutoRoundedIcon","DarkModeRoundedIcon","LightModeRoundedIcon","PersonalVideoRoundedIcon","jsx","OPTION_ICON_SIZE","darkModeOptions","createContext","useContext","ThemeContext","useThemeSettings","context","useMemo","createTheme","MuiThemeProvider","commonComponentProps","theme","Global","css","useTheme","jsx","GlobalStyles","fontFamily","theme","isDarkMode","primaryColor","backgroundDefault","backgroundPaper","keyframes","fadeInLeft","fadeIn","slideIn","slideInBottom","scale","pulseAnimation","clr","shadowBlur","progressPulse","logoutAnimation","installAppAnimation","isHexColor","value","displayGreeting","currentHour","getDayIdentifier","date","year","month","day","getOperatingSystem","ua","getBrowser","systemInfo","isDarkMode","darkMode","systemTheme","timeAgo","date","lang","locale","now","diffInSeconds","rtf","minutes","hours","days","timeAgoFromStart","difference","differenceHours","differenceMinutes","useEffect","useState","useResponsiveDisplay","breakpoint","isSmallerDevice","setIsSmallerDevice","checkScreenSize","handleResize","useState","useEffect","useSystemTheme","theme","setTheme","mediaQueryListener","e","prefersDarkScheme","useEffect","useMemo","useState","DEFAULT_THEME_NAME","normalizeThemes","input","theme","themeName","APP_SETTINGS_KEY","usePersistedAppSettings","themes","theme","setTheme","useState","darkMode","setDarkMode","isHydrated","setIsHydrated","themesSource","useMemo","normalizeThemes","selectedTheme","t","useEffect","storedRaw","stored","e","jsx","jsxs","ThemeProviderWrapper","children","fontFamily","themes","systemTheme","useSystemTheme","theme","setTheme","darkMode","setDarkMode","selectedTheme","usePersistedAppSettings","mode","useMemo","isDarkMode","muiTheme","name","customTheme","createTheme","ThemeContext","MuiThemeProvider","GlobalStyles"]}
1
+ {"version":3,"sources":["../src/components/DialogBtn.ts","../src/components/ErrorBoundary.tsx","../src/components/Loading.tsx","../src/components/PathName.ts","../src/constants/darkModeOptions.tsx","../src/context/ThemeProviderWrapper.tsx","../src/context/settings/ThemeContext.tsx","../src/utils/normalizeThemes.ts","../src/context/settings/helper.ts","../src/context/settings/usePersistedAppSettings.ts","../src/utils/ssr/canUseDom.ts","../src/utils/storage/appSettingsStorage.ts","../src/styles/global/GlobalStyles.tsx","../src/styles/overrides/commonComponents.ts","../src/styles/tokens.ts","../src/styles/theme/createTheme.ts","../src/utils/browser/useResponsiveDisplay.ts","../src/utils/browser/useSystemTheme.ts","../src/utils/colorUtils.ts","../src/utils/displayGreeting.ts","../src/utils/getDayIdentifier.ts","../src/utils/getSystemInfo.ts","../src/utils/isDarkMode.ts","../src/utils/timeAgo.ts","../src/styles/theme/resolveEffectiveMode.ts","../src/styles/theme/selectThemeOptions.ts","../src/styles/typography/typography.ts","../src/styles/validateSchemeTokens.ts","../src/styles/keyframes.ts"],"sourcesContent":["import styled from \"@emotion/styled\";\nimport { Button } from \"@mui/material\";\n\nexport const DialogBtn = styled(Button)`\n padding: 10px 16px;\n border-radius: 16px;\n font-size: 16px;\n margin: 8px;\n`;\n","/* eslint-disable @typescript-eslint/class-methods-use-this -- only for ErrorBoundary */\nimport React from \"react\";\nimport styled from \"@emotion/styled\";\nimport ErrorOutlineRounded from \"@mui/icons-material/ErrorOutlineRounded\";\nimport { Box } from \"@mui/material\";\n\nimport type { ErrorInfo } from \"react\";\n\ninterface ErrorBoundaryProps {\n children: React.ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error?: Error;\n}\n\n/**\n * ErrorBoundary component that catches and displays errors.\n */\nexport class ErrorBoundary extends React.Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {\n hasError: false,\n };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return {\n hasError: true,\n error,\n };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n // eslint-disable-next-line no-console -- Allow console output for error reporting\n console.error(\"Error:\", error);\n // eslint-disable-next-line no-console -- Allow console output for error reporting\n console.error(\"Error Info:\", errorInfo);\n }\n\n render() {\n const { state, props } = this;\n if (state.hasError) {\n return (\n <Container>\n <ErrorHeader>\n <Box>Something went wrong.&nbsp;</Box>\n </ErrorHeader>\n <h3>\n <Box style={{ color: \"#ff3131\", display: \"inline-block\" }}>\n <ErrorOutlineRounded\n sx={{ verticalAlign: \"middle\", mb: \"4px\" }}\n />{\" \"}\n ERROR:\n </Box>{\" \"}\n <Box translate=\"no\">\n [{state.error?.name}] {state.error?.message}\n </Box>\n <Box style={{ color: \"#ff3131\", display: \"inline-block\" }}>\n <ErrorOutlineRounded\n sx={{ verticalAlign: \"middle\", mb: \"4px\" }}\n />{\" \"}\n Stack:\n </Box>{\" \"}\n <Box translate=\"no\">[{state.error?.stack}]</Box>\n </h3>\n </Container>\n );\n }\n\n return props.children;\n }\n}\n\nconst Container = styled.div`\n margin: 0 8vw;\n @media (max-width: 768px) {\n margin: 0;\n }\n`;\n\nconst ErrorHeader = styled.h1`\n margin-top: 32px;\n margin-bottom: 32px;\n font-size: 36px;\n color: #ff3131;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n @media (max-width: 768px) {\n text-align: left;\n justify-content: left;\n font-size: 30px;\n margin-top: 0;\n margin-bottom: 0;\n }\n`;\n","import { useEffect, useState } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { Box, CircularProgress } from \"@mui/material\";\n\nexport const Loading = () => {\n const [showLoading, setShowLoading] = useState<boolean>(false);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setShowLoading(true);\n }, 100); // Show the loading spinner after 100 milliseconds\n\n return () => clearTimeout(timer);\n }, []);\n\n return (\n <Container aria-live=\"polite\" role=\"status\">\n {showLoading && (\n <>\n <CircularProgress aria-label=\"loading\" size={80} thickness={4} />\n <h3 style={{ opacity: 0.8 }}>Loading Page...</h3>\n </>\n )}\n </Container>\n );\n};\n\nconst Container = styled(Box)`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n text-align: center;\n gap: 8px;\n`;\n","import styled from \"@emotion/styled\";\n\nexport const PathName = styled.code`\n background: #000000c8;\n color: white;\n padding: 4px 6px;\n border-radius: 8px;\n`;\n","import BrightnessAutoRoundedIcon from \"@mui/icons-material/BrightnessAutoRounded\";\nimport DarkModeRoundedIcon from \"@mui/icons-material/DarkModeRounded\";\nimport LightModeRoundedIcon from \"@mui/icons-material/LightModeRounded\";\nimport PersonalVideoRoundedIcon from \"@mui/icons-material/PersonalVideoRounded\";\n\nimport type { OptionItem } from \"@/models\";\n\nconst OPTION_ICON_SIZE = 32;\n\nexport const darkModeOptions: OptionItem[] = [\n {\n label: \"Auto\",\n value: \"auto\",\n icon: (\n <BrightnessAutoRoundedIcon\n color=\"inherit\"\n sx={{ fontSize: OPTION_ICON_SIZE }}\n />\n ),\n },\n {\n label: \"System\",\n value: \"system\",\n icon: (\n <PersonalVideoRoundedIcon\n color=\"inherit\"\n sx={{ fontSize: OPTION_ICON_SIZE }}\n />\n ),\n },\n {\n label: \"Light\",\n value: \"light\",\n icon: (\n <LightModeRoundedIcon\n color=\"inherit\"\n sx={{ fontSize: OPTION_ICON_SIZE }}\n />\n ),\n },\n {\n label: \"Dark\",\n value: \"dark\",\n icon: (\n <DarkModeRoundedIcon\n color=\"inherit\"\n sx={{ fontSize: OPTION_ICON_SIZE }}\n />\n ),\n },\n];\n","import { useMemo } from \"react\";\nimport { ThemeProvider as MuiThemeProvider } from \"@mui/material/styles\";\n\nimport {\n ThemeContext,\n resolveDefaultThemeName,\n usePersistedAppSettings,\n} from \"@/context/settings\";\nimport {\n GlobalStyles,\n buildMuiTheme,\n resolveEffectiveMode,\n selectThemeOptions,\n} from \"@/styles\";\nimport { useSystemTheme } from \"@/utils\";\n\nimport type { ThemesInput } from \"@/context/settings\";\nimport type { FC, PropsWithChildren } from \"react\";\n\ntype ThemeProviderWrapperProps = PropsWithChildren<{\n /** Optional font stack to apply across the app. */\n fontFamily?: string;\n /**\n * Optional list of theme presets.\n * Accepts only `ThemePreset[]`.\n */\n themes?: ThemesInput;\n}>;\n\nexport const ThemeProviderWrapper: FC<ThemeProviderWrapperProps> = ({\n children,\n fontFamily,\n themes,\n}) => {\n const systemTheme = useSystemTheme();\n const {\n theme,\n setTheme,\n darkMode,\n setDarkMode,\n themesSource,\n selectedTheme,\n selectedPreset,\n } = usePersistedAppSettings({ themes });\n\n const effectiveMode = useMemo(\n () => resolveEffectiveMode(darkMode, systemTheme),\n [darkMode, systemTheme],\n );\n const selectedOptions = useMemo(\n () => selectThemeOptions(selectedPreset, effectiveMode),\n [selectedPreset, effectiveMode],\n );\n\n const muiTheme = useMemo(\n () => buildMuiTheme(selectedOptions, effectiveMode),\n [selectedOptions, effectiveMode],\n );\n\n const defaultThemeName = useMemo(\n () => resolveDefaultThemeName(themesSource),\n [themesSource],\n );\n\n return (\n <ThemeContext.Provider\n value={{\n theme,\n darkMode,\n setTheme,\n setDarkMode,\n themes: themesSource,\n selectedTheme,\n defaultThemeName,\n }}\n >\n <MuiThemeProvider theme={muiTheme}>\n <GlobalStyles fontFamily={fontFamily} />\n {children}\n </MuiThemeProvider>\n </ThemeContext.Provider>\n );\n};\n","import { createContext, useContext } from \"react\";\n\nimport type { ThemeContextProps } from \"@/models\";\n\nexport const ThemeContext = createContext<ThemeContextProps | undefined>(\n undefined,\n);\n\nexport const useThemeSettings = (): ThemeContextProps => {\n const context = useContext(ThemeContext);\n if (!context)\n throw new Error(\n \"useThemeSettings must be used within ThemeProviderWrapper\",\n );\n return context;\n};\n","import type { ThemesInput } from \"@/context/settings/themeTypes\";\nimport type { NormalizedPreset, ThemePreset } from \"@/models/themePresets\";\nimport type { ThemeOptions } from \"@mui/material/styles\";\n\nconst DEFAULT_PRESET_ID = \"Default\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst normalizeId = (id: string | undefined): string => {\n const normalized = id?.trim();\n if (!normalized) {\n throw new Error(\"normalizeThemesInput: preset `id` must be a non-empty.\");\n }\n return normalized;\n};\n\nconst normalizeLabel = (\n label: string | undefined,\n fallback: string,\n): string => {\n const normalized = label?.trim();\n if (!normalized) {\n return fallback;\n }\n return normalized;\n};\n\nconst isThemePreset = (value: unknown): value is ThemePreset => {\n if (!isRecord(value)) return false;\n if (typeof value.id !== \"string\") return false;\n if (typeof value.label !== \"string\") return false;\n if (!(\"colorSchemes\" in value)) return false;\n\n const { colorSchemes } = value;\n return isRecord(colorSchemes);\n};\n\nconst normalizePresetLike = (\n input: unknown,\n index: number,\n): NormalizedPreset => {\n if (!isThemePreset(input)) {\n throw new Error(\n `normalizeThemesInput: invalid ThemePreset shape at index ${index}.`,\n );\n }\n\n const id = normalizeId(input.id);\n const label = normalizeLabel(input.label, id);\n const { colorSchemes } = input;\n const { light, dark } = colorSchemes;\n\n if (!isRecord(light)) {\n throw new Error(\n \"normalizeThemesInput: preset must include colorSchemes.light.\",\n );\n }\n if (!isRecord(dark)) {\n throw new Error(\n \"normalizeThemesInput: preset must include colorSchemes.dark.\",\n );\n }\n\n return {\n ...input,\n id,\n label,\n colorSchemes: {\n light: light as ThemeOptions,\n dark: dark as ThemeOptions,\n },\n meta: { origin: \"preset\" },\n };\n};\n\nconst dedupePresets = (presets: NormalizedPreset[]): NormalizedPreset[] => {\n const firstIndex = new Map<string, number>();\n const lastPreset = new Map<string, NormalizedPreset>();\n\n for (const [index, preset] of presets.entries()) {\n if (!firstIndex.has(preset.id)) {\n firstIndex.set(preset.id, index);\n }\n lastPreset.set(preset.id, preset);\n }\n\n const orderedIds = [...firstIndex.entries()]\n .sort(([, a], [, b]) => a - b)\n .map(([id]) => id);\n\n const deduped: NormalizedPreset[] = [];\n for (const id of orderedIds) {\n const preset = lastPreset.get(id);\n if (preset) deduped.push(preset);\n }\n\n return deduped;\n};\n\nconst createDefaultPreset = (): NormalizedPreset => ({\n id: DEFAULT_PRESET_ID,\n label: DEFAULT_PRESET_ID,\n colorSchemes: { light: {}, dark: {} },\n meta: { origin: \"custom\" },\n});\n\nexport const normalizeThemesInput = (\n input?: ThemesInput,\n): NormalizedPreset[] => {\n if (!input || input.length === 0) return [createDefaultPreset()];\n\n const normalized = input.map((item, index) =>\n normalizePresetLike(item, index),\n );\n if (normalized.length === 0) return [createDefaultPreset()];\n\n return dedupePresets(normalized);\n};\n","import { normalizeThemesInput } from \"@/utils/normalizeThemes\";\n\nimport type { ThemesInput } from \"./themeTypes\";\nimport type { DarkModeOptions, NamedThemeOptions } from \"@/models\";\nimport type { NormalizedPreset } from \"@/models/themePresets\";\n\nconst DEFAULT_THEME_NAME = \"Default\";\n\nconst presetToTheme = (preset: NormalizedPreset): NamedThemeOptions => ({\n name: preset.id,\n ...preset.colorSchemes.light,\n});\n\n/**\n * Normalizes preset input so the result always includes valid theme names.\n * - No input/empty: returns a single default theme.\n * - Duplicate preset ids: resolved with last-wins while keeping first-order.\n */\nexport const normalizeThemes = (input?: ThemesInput): NamedThemeOptions[] => {\n const presets = normalizeThemesInput(input);\n if (presets.length === 0) return [{ name: DEFAULT_THEME_NAME }];\n return presets.map((preset) => presetToTheme(preset));\n};\n\nexport const mergeThemes = (\n presets?: ThemesInput,\n customThemes?: ThemesInput,\n): NamedThemeOptions[] => {\n const merged = [...(presets ?? []), ...(customThemes ?? [])];\n return normalizeThemes(merged.length > 0 ? merged : undefined);\n};\n\nexport const resolveDefaultThemeName = (themes: NamedThemeOptions[]): string =>\n themes[0]?.name ?? DEFAULT_THEME_NAME;\n\nexport const resolveThemeName = (\n themeName: string | undefined,\n themes: NamedThemeOptions[],\n): string => {\n if (themeName && themes.some((theme) => theme.name === themeName)) {\n return themeName;\n }\n return resolveDefaultThemeName(themes);\n};\n\nexport const resolveThemeById = (\n themes: NamedThemeOptions[],\n themeId: string,\n): NamedThemeOptions | undefined =>\n themes.find((theme) => theme.name === themeId);\n\nexport const resolveDarkMode = (\n darkMode: DarkModeOptions | undefined,\n defaultMode: DarkModeOptions = \"system\",\n): DarkModeOptions => {\n if (!darkMode) return defaultMode;\n return darkMode;\n};\n","import { useEffect, useMemo, useState } from \"react\";\n\nimport { normalizeThemesInput } from \"@/utils/normalizeThemes\";\nimport {\n APP_SETTINGS_VERSION,\n readAppSettings,\n writeAppSettings,\n} from \"@/utils/storage\";\n\nimport { resolveDarkMode, resolveThemeName } from \"./helper\";\n\nimport type { ThemesInput } from \"./themeTypes\";\nimport type { DarkModeOptions, NamedThemeOptions } from \"@/models\";\nimport type { NormalizedPreset } from \"@/models/themePresets\";\n\nconst DEFAULT_DARK_MODE: DarkModeOptions = \"system\";\n\nexport const usePersistedAppSettings = ({\n themes,\n}: {\n themes?: ThemesInput;\n}): {\n theme: string;\n setTheme: (theme: string) => void;\n darkMode: DarkModeOptions;\n setDarkMode: (mode: DarkModeOptions) => void;\n presetsSource: NormalizedPreset[];\n selectedPreset: NormalizedPreset;\n themesSource: NamedThemeOptions[];\n selectedTheme: NamedThemeOptions;\n} => {\n const presetsSource = useMemo(() => normalizeThemesInput(themes), [themes]);\n const themesSource = useMemo(\n () =>\n presetsSource.map((preset) => ({\n name: preset.id,\n ...preset.colorSchemes.light,\n })),\n [presetsSource],\n );\n const [theme, setTheme] = useState<string>(() =>\n resolveThemeName(undefined, themesSource),\n );\n const [darkMode, setDarkMode] = useState<DarkModeOptions>(DEFAULT_DARK_MODE);\n const [isHydrated, setIsHydrated] = useState(false);\n\n const selectedPreset = useMemo(\n () =>\n presetsSource.find((preset) => preset.id === theme) || presetsSource[0],\n [theme, presetsSource],\n );\n const selectedTheme = useMemo(\n () => themesSource.find((t) => t.name === theme) || themesSource[0],\n [theme, themesSource],\n );\n\n // Hydrate from localStorage on client\n useEffect(() => {\n if (isHydrated) return;\n const stored = readAppSettings();\n setTheme(resolveThemeName(stored?.themeId, themesSource));\n setDarkMode(resolveDarkMode(stored?.darkMode, DEFAULT_DARK_MODE));\n setIsHydrated(true);\n }, [isHydrated, themesSource]);\n\n useEffect(() => {\n const resolvedTheme = resolveThemeName(theme, themesSource);\n if (resolvedTheme !== theme) {\n setTheme(resolvedTheme);\n }\n }, [theme, themesSource]);\n\n // Persist settings\n useEffect(() => {\n if (!isHydrated) return;\n writeAppSettings({\n version: APP_SETTINGS_VERSION,\n themeId: theme,\n darkMode,\n });\n }, [isHydrated, theme, darkMode]);\n\n return {\n theme,\n setTheme,\n darkMode,\n setDarkMode,\n presetsSource,\n selectedPreset,\n themesSource,\n selectedTheme,\n };\n};\n","export const canUseDom = (): boolean =>\n globalThis.window !== undefined && globalThis.document !== undefined;\n","import { canUseDom } from \"@/utils/ssr\";\n\nimport type { DarkModeOptions } from \"@/models\";\n\nconst APP_SETTINGS_KEY = \"appSettings\";\nexport const APP_SETTINGS_VERSION = 1;\nconst DARK_MODE_OPTIONS = new Set<DarkModeOptions>([\n \"system\",\n \"auto\",\n \"light\",\n \"dark\",\n]);\n\nconst isDarkModeOption = (value: unknown): value is DarkModeOptions =>\n typeof value === \"string\" && DARK_MODE_OPTIONS.has(value as DarkModeOptions);\n\nexport interface StoredAppSettings {\n version: typeof APP_SETTINGS_VERSION;\n themeId: string;\n darkMode: DarkModeOptions;\n}\n\nexport const readAppSettings = (): Partial<StoredAppSettings> | null => {\n if (!canUseDom() || globalThis.localStorage === undefined) return null;\n try {\n const storedRaw = globalThis.localStorage.getItem(APP_SETTINGS_KEY);\n if (!storedRaw) return null;\n const parsed = JSON.parse(storedRaw) as {\n version?: unknown;\n themeId?: unknown;\n theme?: unknown;\n darkMode?: unknown;\n };\n const darkMode = isDarkModeOption(parsed.darkMode)\n ? parsed.darkMode\n : undefined;\n if (parsed.version === APP_SETTINGS_VERSION) {\n const themeId =\n typeof parsed.themeId === \"string\" ? parsed.themeId : undefined;\n if (!themeId && !darkMode) return null;\n return { version: APP_SETTINGS_VERSION, themeId, darkMode };\n }\n\n const legacyTheme =\n typeof parsed.theme === \"string\" ? parsed.theme : undefined;\n if (!legacyTheme && !darkMode) return null;\n return { version: APP_SETTINGS_VERSION, themeId: legacyTheme, darkMode };\n } catch {\n return null;\n }\n};\n\nexport const writeAppSettings = (settings: StoredAppSettings): void => {\n if (!canUseDom() || globalThis.localStorage === undefined) return;\n try {\n globalThis.localStorage.setItem(APP_SETTINGS_KEY, JSON.stringify(settings));\n } catch {\n /* empty */\n }\n};\n","import { Global, css } from \"@emotion/react\";\nimport { useTheme } from \"@mui/material/styles\";\n\nimport type { FC } from \"react\";\n\n/**\n * Injects global styles into the document using Emotion.\n * These styles include font setup, base HTML styles, custom scrollbars,\n * selection styling, and some accessibility tweaks.\n *\n * Uses the MUI theme to dynamically adjust colors for light/dark mode.\n */\ninterface GlobalStylesProps {\n /** Optional font stack to apply across the app. */\n fontFamily?: string;\n}\n\nexport const GlobalStyles: FC<GlobalStylesProps> = ({ fontFamily }) => {\n const theme = useTheme();\n const isDarkMode = theme.palette.mode === \"dark\";\n\n const primaryColor = theme.palette.primary.main;\n const textColor = theme.palette.text.primary;\n const backgroundDefault = theme.palette.background.default;\n const backgroundPaper = theme.palette.background.paper;\n\n return (\n <Global\n styles={css`\n /* Allow application to control font via CSS var or prop */\n :root {\n ${fontFamily ? `--app-font-family: ${fontFamily};` : \"\"}\n }\n * {\n font-family:\n var(\n --app-font-family,\n \"Mulish\",\n system-ui,\n -apple-system,\n \"Segoe UI\",\n Roboto,\n Arial\n ),\n sans-serif !important;\n -webkit-tap-highlight-color: transparent;\n &::selection {\n background-color: ${`${primaryColor}e1`};\n }\n }\n\n html,\n body,\n #root {\n height: 100%;\n margin: 0;\n }\n\n :root {\n height: 100%;\n /* default fallback font; apps can override via --app-font-family */\n font-family: var(\n --app-font-family,\n \"Mulish\",\n system-ui,\n -apple-system,\n \"Segoe UI\",\n Roboto,\n Arial,\n sans-serif\n )\n sans-serif;\n line-height: 1.5;\n font-weight: 400;\n color-scheme: ${isDarkMode ? \"dark\" : \"light\"};\n font-synthesis: none;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n -webkit-text-size-adjust: 100%;\n }\n\n body {\n margin: 0;\n height: 100%;\n overflow: auto;\n touch-action: manipulation;\n background: ${backgroundDefault};\n color: ${textColor};\n background-attachment: fixed;\n background-size: cover;\n transition: 0.3s background;\n /* Firefox */\n scrollbar-color: ${primaryColor} ${backgroundDefault};\n scrollbar-width: thin;\n\n ::-webkit-scrollbar {\n width: 8px;\n background-color: ${backgroundDefault};\n }\n ::-webkit-scrollbar-thumb {\n background-color: ${primaryColor};\n border-radius: 64px;\n }\n ::-webkit-scrollbar-thumb:hover {\n background-color: ${`${primaryColor}d8`};\n }\n ::-webkit-scrollbar-track {\n border-radius: 64px;\n background-color: ${backgroundDefault};\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n }\n\n img {\n user-select: none;\n }\n\n input[type=\"file\"]::-webkit-file-upload-button {\n display: none;\n }\n\n input[type=\"datetime-local\"]:placeholder-shown {\n color: transparent !important;\n }\n\n pre {\n padding: 16px;\n border-radius: 18px;\n overflow-x: auto;\n }\n\n .MuiDialogContent-root,\n .MuiDrawer-paper,\n .customScrollbar,\n textarea {\n /* Firefox */\n scrollbar-color: ${primaryColor} ${backgroundPaper};\n scrollbar-width: thin;\n ::-webkit-scrollbar {\n width: 8px;\n background-color: ${backgroundPaper};\n }\n ::-webkit-scrollbar-thumb {\n background-color: ${primaryColor};\n border-radius: 64px;\n }\n ::-webkit-scrollbar-thumb:hover {\n background-color: ${`${primaryColor}d8`};\n }\n ::-webkit-scrollbar-track {\n border-radius: 64px;\n background-color: ${backgroundPaper};\n }\n }\n\n /* react-spring-bottom-sheet styles */\n div[role=\"dialog\"] {\n border-radius: 42px 42px 0 0;\n z-index: 9999999;\n }\n `}\n />\n );\n};\n","import { alpha } from \"@mui/material/styles\";\n\nimport { getSurfaceTokens } from \"../tokens\";\n\nimport type { Theme } from \"@mui/material\";\n\n/**\n * Common component style overrides and default props shared across the design system.\n * This object should be spread into the `components` field of the MUI theme.\n */\nexport const commonComponentProps: Theme[\"components\"] = {\n MuiTooltip: {\n defaultProps: {\n disableInteractive: true,\n },\n styleOverrides: {\n tooltip: ({ theme }) => ({\n backdropFilter: \"blur(6px)\",\n WebkitBackdropFilter: \"blur(6px)\",\n padding: \"8px 16px\",\n borderRadius: theme.shape.borderRadius,\n fontSize: theme.typography.pxToRem(12),\n }),\n },\n },\n\n MuiButton: {\n styleOverrides: {\n root: ({ theme }) => ({\n padding: \"12px 24px\",\n borderRadius: theme.shape.borderRadius,\n }),\n contained: {\n boxShadow: \"none\",\n },\n },\n },\n\n MuiSkeleton: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n },\n },\n\n MuiSelect: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n select: {\n display: \"flex\",\n justifyContent: \"flex-start\",\n alignItems: \"center\",\n gap: \"4px\",\n },\n },\n },\n\n MuiDialog: {\n defaultProps: {\n slotProps: {\n paper: {\n style: {\n padding: \"12px\",\n borderRadius: 24, // оставить явно, если это критично\n minWidth: \"400px\",\n },\n },\n },\n },\n styleOverrides: {\n root: {\n \"& .MuiDialog-container\": {\n backdropFilter: \"blur(4px)\",\n },\n },\n },\n },\n\n MuiAvatar: {\n styleOverrides: {\n root: {\n fontWeight: 500,\n },\n },\n },\n\n MuiAlert: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n },\n },\n\n MuiTextField: {\n defaultProps: {\n variant: \"outlined\", // по умолчанию, если нужно\n },\n styleOverrides: {\n root: ({ theme }) => ({\n \"& .MuiInputBase-root\": {\n borderRadius: theme.shape.borderRadius,\n },\n }),\n },\n },\n\n MuiOutlinedInput: {\n styleOverrides: {\n root: ({ theme }) => {\n const tokens = getSurfaceTokens(theme);\n return {\n color: tokens.textPrimary,\n \"& fieldset\": {\n borderColor: alpha(tokens.textPrimary, 0.16),\n },\n \"&:hover fieldset\": {\n borderColor: alpha(tokens.textPrimary, 0.28),\n },\n \"&.Mui-focused fieldset\": {\n borderColor: theme.palette.primary.main,\n },\n };\n },\n },\n },\n\n MuiInputLabel: {\n styleOverrides: {\n root: ({ theme }) => ({\n color: alpha(theme.palette.text.primary, 0.72),\n \"&.Mui-focused\": {\n color: theme.palette.primary.main,\n },\n }),\n },\n },\n MuiFormHelperText: {\n styleOverrides: {\n root: ({ theme }) => ({\n color: theme.palette.text.secondary,\n \"&.Mui-error\": {\n color: theme.palette.error.main,\n },\n }),\n },\n },\n\n MuiPaper: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n elevation8: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n },\n },\n\n MuiMenuItem: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n },\n },\n\n MuiBottomNavigationAction: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n padding: \"12px\",\n margin: 0,\n maxHeight: \"none\",\n }),\n },\n },\n\n MuiDialogContent: {\n styleOverrides: {\n root: {\n padding: 0,\n },\n },\n },\n\n MuiSlider: {\n styleOverrides: {\n valueLabel: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n padding: \"6px 14px\",\n \"&::before, &::after\": {\n display: \"none\",\n },\n }),\n },\n },\n\n MuiCircularProgress: {\n styleOverrides: {\n circle: {\n strokeLinecap: \"round\",\n },\n },\n },\n\n MuiTab: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n },\n },\n\n MuiAccordion: {\n styleOverrides: {\n root: {\n \"&::before\": {\n display: \"none\",\n },\n },\n },\n },\n};\n","import { alpha } from \"@mui/material/styles\";\n\nimport type { Theme } from \"@mui/material/styles\";\n\ntype ThemeWithPalette = Pick<Theme, \"palette\">;\n\nexport interface SurfaceTokens {\n pageBg: string;\n surfaceBg: string;\n textPrimary: string;\n textSecondary: string;\n divider: string;\n}\n\nexport const getSurfaceTokens = (theme: ThemeWithPalette): SurfaceTokens => ({\n pageBg: theme.palette.background.default,\n surfaceBg: theme.palette.background.paper,\n textPrimary: theme.palette.text.primary,\n textSecondary: theme.palette.text.secondary,\n divider: theme.palette.divider,\n});\n\nexport const alphaText = (theme: ThemeWithPalette, opacity: number): string =>\n alpha(theme.palette.text.primary, opacity);\n","import { createTheme } from \"@mui/material/styles\";\n\nimport type { ThemeModeBackground } from \"@/models\";\nimport type { PaletteMode, Theme, ThemeOptions } from \"@mui/material/styles\";\n\ntype ThemeInput = ThemeOptions & {\n background?: ThemeModeBackground;\n};\n\nexport const buildMuiTheme = (\n options: ThemeInput,\n mode: PaletteMode,\n): Theme => {\n const { background, palette, ...rest } = options;\n const resolvedBackground = background?.[mode];\n\n const paletteWithMode: ThemeOptions[\"palette\"] = {\n ...palette,\n mode,\n };\n\n if (resolvedBackground || palette?.background) {\n paletteWithMode.background = {\n ...palette?.background,\n ...resolvedBackground,\n };\n }\n\n return createTheme({\n ...rest,\n palette: paletteWithMode,\n });\n};\n","import { useEffect, useState } from \"react\";\n\nimport { canUseDom } from \"@/utils/ssr\";\n\n/**\n * A custom React hook to determine if the current device is a smaller device\n * based on the screen width.\n * @param [breakpoint=768] - The breakpoint in pixels at which a device is considered \"smaller\".\n * @returns {boolean} - A boolean value indicating whether the current device is a smaller device.\n */\nexport const useResponsiveDisplay = (breakpoint = 768): boolean => {\n const [isSmallerDevice, setIsSmallerDevice] = useState<boolean>(false);\n\n useEffect(() => {\n if (!canUseDom()) return () => {};\n const checkScreenSize = () => {\n setIsSmallerDevice(window.innerWidth < breakpoint);\n };\n checkScreenSize();\n const handleResize = () => checkScreenSize();\n window.addEventListener(\"resize\", handleResize);\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n };\n }, [breakpoint]);\n\n return isSmallerDevice;\n};\n","import { useEffect, useState } from \"react\";\n\nimport { canUseDom } from \"@/utils/ssr\";\n\nimport type { SystemTheme } from \"@/models\";\n\n/**\n * A React hook to detect the system theme preference.\n * @returns The current system theme ('light', 'dark', or 'unknown').\n */\nexport const useSystemTheme = (): SystemTheme => {\n const [theme, setTheme] = useState<SystemTheme>(\"unknown\");\n useEffect(() => {\n if (!canUseDom() || typeof globalThis.matchMedia !== \"function\") {\n setTheme(\"unknown\");\n return () => {};\n }\n\n const prefersDarkScheme = globalThis.matchMedia(\n \"(prefers-color-scheme: dark)\",\n );\n\n const updateTheme = (event?: MediaQueryListEvent) => {\n const matches = event ? event.matches : prefersDarkScheme.matches;\n setTheme(matches ? \"dark\" : \"light\");\n };\n\n updateTheme();\n\n // Listen for changes in system theme (guard for legacy environments)\n if (typeof prefersDarkScheme.addEventListener !== \"function\") {\n return () => {};\n }\n\n prefersDarkScheme.addEventListener(\"change\", updateTheme);\n return () => {\n prefersDarkScheme.removeEventListener(\"change\", updateTheme);\n };\n }, []);\n\n return theme;\n};\n","/**\n * Validates whether a given string is a valid 3- or 6-digit hex color code (e.g., \"#fff\" or \"#ffffff\").\n *\n * @param value - The string to check.\n * @returns `true` if the string is a valid hex color; otherwise, `false`.\n */\nexport const isHexColor = (value: string): boolean =>\n /^#([\\dA-Fa-f]{3}|[\\dA-Fa-f]{6})$/.test(value);\n","/**\n * Returns a greeting based on the current time.\n * @returns {string} The appropriate greeting.\n */\nexport const displayGreeting = (): string => {\n const currentHour = new Date().getHours();\n if (currentHour >= 5 && currentHour < 12) return \"Good morning\";\n if (currentHour > 12 && currentHour < 18) return \"Good afternoon\";\n return \"Good evening\";\n};\n","/**\n * Function to extract year, month, and day from a Date object\n */\nexport const getDayIdentifier = (date: Date) => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\"); // Months are zero-based in JavaScript\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n};\n","/**\n * A list of supported operating systems.\n */\nexport type OperatingSystem =\n | \"Windows\"\n | \"macOS\"\n | \"Linux\"\n | \"iOS\"\n | \"Android\"\n | \"Unknown\";\n\n/**\n * A list of supported browsers.\n */\nexport type Browser = \"Chrome\" | \"Firefox\" | \"Safari\" | \"Edge\" | \"Unknown\";\n\n/**\n * Detects the user's operating system based on the user agent string.\n * Safe for SSR: falls back to \"Unknown\" on server.\n */\nexport const getOperatingSystem = (): OperatingSystem => {\n const ua = (\n typeof navigator === \"undefined\" ? \"\" : navigator.userAgent\n ).toLowerCase();\n\n if (ua.includes(\"windows nt\")) return \"Windows\";\n if (ua.includes(\"iphone\") || ua.includes(\"ipad\") || ua.includes(\"ipod\"))\n return \"iOS\";\n if (ua.includes(\"mac\")) return \"macOS\";\n if (ua.includes(\"android\")) return \"Android\";\n if (ua.includes(\"linux\")) return \"Linux\";\n\n return \"Unknown\";\n};\n\n/**\n * Detects the user's browser based on the user agent string.\n * Safe for SSR: falls back to \"Unknown\" on server.\n */\nexport const getBrowser = (): Browser => {\n const ua = (\n typeof navigator === \"undefined\" ? \"\" : navigator.userAgent\n ).toLowerCase();\n\n // Order matters: Edge must come before Chrome\n if (ua.includes(\"edg\")) return \"Edge\";\n if (ua.includes(\"chrome\")) return \"Chrome\";\n if (ua.includes(\"firefox\")) return \"Firefox\";\n if (ua.includes(\"safari\")) return \"Safari\";\n\n return \"Unknown\";\n};\n\n/**\n * Basic information about the user's system (OS and browser).\n * Safe for SSR: resolves to Unknown values on server.\n */\nexport const systemInfo = {\n os:\n typeof navigator === \"undefined\"\n ? (\"Unknown\" as OperatingSystem)\n : getOperatingSystem(),\n browser:\n typeof navigator === \"undefined\" ? (\"Unknown\" as Browser) : getBrowser(),\n};\n","import type { AppSettings, SystemTheme } from \"@/models\";\n\n/**\n * Determines whether dark mode should be enabled based on user settings and system conditions.\n *\n * @param darkMode - User preference: 'light' | 'dark' | 'system' | 'auto'.\n * @param systemTheme - Detected OS-level theme: 'light' | 'dark'.\n * @returns True if dark mode should be used.\n */\nexport const isDarkMode = (\n darkMode: AppSettings[\"darkMode\"],\n systemTheme: SystemTheme,\n): boolean => {\n switch (darkMode) {\n case \"light\": {\n return false;\n }\n case \"dark\": {\n return true;\n }\n case \"system\":\n case \"auto\": {\n return systemTheme === \"dark\";\n }\n default: {\n return false;\n }\n }\n};\n","/**\n * Converts a given date to a human-readable relative time string.\n *\n * @param {Date} date - The date to be converted.\n * @param lang\n * @returns {string} A string representing the relative time using `Intl` format (e.g., \"2 days ago\").\n */\nexport const timeAgo = (date: Date, lang?: string): string => {\n const locale =\n lang ?? (typeof navigator === \"undefined\" ? \"en-US\" : navigator.language);\n // Get the current date and time\n const now = new Date();\n date = new Date(date);\n // Calculate the time difference in seconds\n const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);\n\n // Create an Intl.RelativeTimeFormat instance with the user's language\n const rtf = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n\n // Determine the appropriate unit and format the result\n if (diffInSeconds < 60) {\n return rtf.format(-diffInSeconds, \"second\");\n }\n if (diffInSeconds < 3600) {\n const minutes = Math.floor(diffInSeconds / 60);\n return rtf.format(-minutes, \"minute\");\n }\n if (diffInSeconds < 86_400) {\n const hours = Math.floor(diffInSeconds / 3600);\n return rtf.format(-hours, \"hour\");\n }\n const days = Math.floor(diffInSeconds / 86_400);\n return rtf.format(-days, \"day\");\n};\n\nexport const timeAgoFromStart = (date: Date, lang?: string): string => {\n const locale =\n lang ?? (typeof navigator === \"undefined\" ? \"en-US\" : navigator.language);\n const now = new Date();\n date = new Date(date);\n const difference = (date.getTime() - now.getTime()) / 1000;\n const differenceHours = Math.floor(difference / (60 * 60));\n const differenceMinutes = Math.floor(\n (difference - 60 * 60 * differenceHours) / 60,\n );\n const diffInSeconds = Math.floor(\n difference - 60 * 60 * differenceHours - 60 * differenceMinutes,\n );\n\n const rtf = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n\n if (differenceMinutes === 0 && diffInSeconds < 60) {\n return rtf.format(diffInSeconds, \"second\");\n }\n if (differenceHours === 0 && differenceMinutes < 60) {\n return rtf.format(differenceMinutes, \"minute\");\n }\n if (differenceHours < 24) {\n const hours = `${new Intl.RelativeTimeFormat(locale, {\n numeric: \"auto\",\n }).format(differenceHours, \"hour\")}`;\n const minutes = ` ${new Intl.RelativeTimeFormat(locale, {\n localeMatcher: \"lookup\",\n numeric: \"always\",\n style: \"long\",\n }).format(differenceMinutes, \"minute\")}`.replace(/^\\D+/, \"\");\n return `${hours} ${minutes}`;\n }\n\n const days = Math.floor(diffInSeconds / 86_400);\n return rtf.format(days, \"day\");\n};\n","import { isDarkMode } from \"@/utils\";\n\nimport type { DarkModeOptions, SystemTheme } from \"@/models\";\nimport type { PaletteMode } from \"@mui/material/styles\";\n\nexport const resolveEffectiveMode = (\n darkMode: DarkModeOptions,\n systemTheme: SystemTheme,\n): PaletteMode => (isDarkMode(darkMode, systemTheme) ? \"dark\" : \"light\");\n","import type { NormalizedPreset } from \"@/models/themePresets\";\nimport type { PaletteMode, ThemeOptions } from \"@mui/material/styles\";\n\nexport const selectThemeOptions = (\n preset: NormalizedPreset,\n mode: PaletteMode,\n): ThemeOptions => preset.colorSchemes[mode] ?? preset.colorSchemes.light;\n","import type {\n Components,\n Theme,\n TypographyVariantsOptions,\n} from \"@mui/material\";\n\nconst BASE_FONT_SIZE = 16;\nconst pxToRem = (px: number) => `${px / BASE_FONT_SIZE}rem`;\n\n/**\n * Mapping of custom typography variants to corresponding HTML elements.\n */\nexport const muiTypography: Components<Theme>[\"MuiTypography\"] = {\n defaultProps: {\n variantMapping: {\n // TEXT REGULAR\n text_xl_regular: \"p\",\n text_lg_regular: \"p\",\n text_md_regular: \"p\",\n text_sm_regular: \"p\",\n text_xs_regular: \"p\",\n text_2xs_regular: \"p\",\n\n // TEXT BOLD\n text_xl_bold: \"p\",\n text_lg_bold: \"p\",\n text_md_bold: \"p\",\n text_sm_bold: \"p\",\n text_xs_bold: \"p\",\n text_2xs_bold: \"p\",\n\n // TEXT SEMIBOLD\n text_xl_semibold: \"p\",\n text_lg_semibold: \"p\",\n text_md_semibold: \"p\",\n text_sm_semibold: \"p\",\n text_xs_semibold: \"p\",\n text_2xs_semibold: \"p\",\n\n // TEXT THIN\n text_xl_thin: \"p\",\n text_lg_thin: \"p\",\n text_md_thin: \"p\",\n text_sm_thin: \"p\",\n text_xs_thin: \"p\",\n text_2xs_thin: \"p\",\n\n // HEADER REGULAR\n header_2xl_regular: \"h1\",\n header_xl_regular: \"h2\",\n header_lg_regular: \"h3\",\n header_md_regular: \"h4\",\n header_sm_regular: \"h5\",\n header_xs_regular: \"h6\",\n\n // DISPLAY BOLD\n header_2xl_bold: \"h1\",\n header_xl_bold: \"h2\",\n header_lg_bold: \"h3\",\n header_md_bold: \"h4\",\n header_sm_bold: \"h5\",\n header_xs_bold: \"h6\",\n\n // HEADER SEMIBOLD\n header_2xl_semibold: \"h1\",\n header_xl_semibold: \"h2\",\n header_lg_semibold: \"h3\",\n header_md_semibold: \"h4\",\n header_sm_semibold: \"h5\",\n header_xs_semibold: \"h6\",\n },\n },\n};\n\n/**\n * Custom typography variant definitions with adjusted display sizes.\n */\nexport const typographyVariants: TypographyVariantsOptions = {\n text_xl_regular: {\n fontWeight: 400,\n fontSize: pxToRem(20),\n lineHeight: pxToRem(30),\n },\n text_lg_regular: {\n fontWeight: 400,\n fontSize: pxToRem(18),\n lineHeight: pxToRem(28),\n },\n text_md_regular: {\n fontWeight: 400,\n fontSize: pxToRem(16),\n lineHeight: pxToRem(24),\n },\n text_sm_regular: {\n fontWeight: 400,\n fontSize: pxToRem(14),\n lineHeight: pxToRem(20),\n },\n text_xs_regular: {\n fontWeight: 400,\n fontSize: pxToRem(12),\n lineHeight: pxToRem(18),\n },\n text_2xs_regular: {\n fontWeight: 400,\n fontSize: pxToRem(10),\n lineHeight: pxToRem(14),\n },\n\n text_xl_bold: {\n fontWeight: 700,\n fontSize: pxToRem(20),\n lineHeight: pxToRem(30),\n },\n text_lg_bold: {\n fontWeight: 700,\n fontSize: pxToRem(18),\n lineHeight: pxToRem(28),\n },\n text_md_bold: {\n fontWeight: 700,\n fontSize: pxToRem(16),\n lineHeight: pxToRem(24),\n },\n text_sm_bold: {\n fontWeight: 700,\n fontSize: pxToRem(14),\n lineHeight: pxToRem(20),\n },\n text_xs_bold: {\n fontWeight: 700,\n fontSize: pxToRem(12),\n lineHeight: pxToRem(18),\n },\n text_2xs_bold: {\n fontWeight: 700,\n fontSize: pxToRem(10),\n lineHeight: pxToRem(14),\n },\n\n text_xl_semibold: {\n fontWeight: 600,\n fontSize: pxToRem(20),\n lineHeight: pxToRem(30),\n },\n text_lg_semibold: {\n fontWeight: 600,\n fontSize: pxToRem(18),\n lineHeight: pxToRem(28),\n },\n text_md_semibold: {\n fontWeight: 600,\n fontSize: pxToRem(16),\n lineHeight: pxToRem(24),\n },\n text_sm_semibold: {\n fontWeight: 600,\n fontSize: pxToRem(14),\n lineHeight: pxToRem(20),\n },\n text_xs_semibold: {\n fontWeight: 600,\n fontSize: pxToRem(12),\n lineHeight: pxToRem(18),\n },\n text_2xs_semibold: {\n fontWeight: 600,\n fontSize: pxToRem(10),\n lineHeight: pxToRem(14),\n },\n\n text_xl_thin: {\n fontWeight: 100,\n fontSize: pxToRem(20),\n lineHeight: pxToRem(30),\n },\n text_lg_thin: {\n fontWeight: 100,\n fontSize: pxToRem(18),\n lineHeight: pxToRem(28),\n },\n text_md_thin: {\n fontWeight: 100,\n fontSize: pxToRem(16),\n lineHeight: pxToRem(24),\n },\n text_sm_thin: {\n fontWeight: 100,\n fontSize: pxToRem(14),\n lineHeight: pxToRem(20),\n },\n text_xs_thin: {\n fontWeight: 100,\n fontSize: pxToRem(12),\n lineHeight: pxToRem(18),\n },\n text_2xs_thin: {\n fontWeight: 100,\n fontSize: pxToRem(10),\n lineHeight: pxToRem(14),\n },\n\n header_2xl_regular: {\n fontWeight: 400,\n fontSize: pxToRem(34),\n lineHeight: pxToRem(42),\n },\n header_xl_regular: {\n fontWeight: 400,\n fontSize: pxToRem(32),\n lineHeight: pxToRem(40),\n },\n header_lg_regular: {\n fontWeight: 400,\n fontSize: pxToRem(28),\n lineHeight: pxToRem(36),\n },\n header_md_regular: {\n fontWeight: 400,\n fontSize: pxToRem(24),\n lineHeight: pxToRem(32),\n },\n header_sm_regular: {\n fontWeight: 400,\n fontSize: pxToRem(20),\n lineHeight: pxToRem(28),\n },\n header_xs_regular: {\n fontWeight: 400,\n fontSize: pxToRem(18),\n lineHeight: pxToRem(26),\n },\n\n header_2xl_bold: {\n fontWeight: 700,\n fontSize: pxToRem(34),\n lineHeight: pxToRem(42),\n },\n header_xl_bold: {\n fontWeight: 700,\n fontSize: pxToRem(32),\n lineHeight: pxToRem(40),\n },\n header_lg_bold: {\n fontWeight: 700,\n fontSize: pxToRem(28),\n lineHeight: pxToRem(36),\n },\n header_md_bold: {\n fontWeight: 700,\n fontSize: pxToRem(24),\n lineHeight: pxToRem(32),\n },\n header_sm_bold: {\n fontWeight: 700,\n fontSize: pxToRem(20),\n lineHeight: pxToRem(28),\n },\n header_xs_bold: {\n fontWeight: 700,\n fontSize: pxToRem(18),\n lineHeight: pxToRem(26),\n },\n\n header_2xl_semibold: {\n fontWeight: 600,\n fontSize: pxToRem(34),\n lineHeight: pxToRem(42),\n },\n header_xl_semibold: {\n fontWeight: 600,\n fontSize: pxToRem(32),\n lineHeight: pxToRem(40),\n },\n header_lg_semibold: {\n fontWeight: 600,\n fontSize: pxToRem(28),\n lineHeight: pxToRem(36),\n },\n header_md_semibold: {\n fontWeight: 600,\n fontSize: pxToRem(24),\n lineHeight: pxToRem(32),\n },\n header_sm_semibold: {\n fontWeight: 600,\n fontSize: pxToRem(20),\n lineHeight: pxToRem(28),\n },\n header_xs_semibold: {\n fontWeight: 600,\n fontSize: pxToRem(18),\n lineHeight: pxToRem(26),\n },\n};\n","import type { ThemeOptions } from \"@mui/material/styles\";\n\nexport const validateSchemeTokens = (options: ThemeOptions): string[] => {\n const warnings: string[] = [];\n const { palette } = options;\n if (!palette) {\n warnings.push(\"palette is missing.\");\n return warnings;\n }\n\n if (!palette.background?.default) {\n warnings.push(\"palette.background.default is missing.\");\n }\n if (!palette.background?.paper) {\n warnings.push(\"palette.background.paper is missing.\");\n }\n if (!palette.text?.primary) {\n warnings.push(\"palette.text.primary is missing.\");\n }\n if (!palette.text?.secondary) {\n warnings.push(\"palette.text.secondary is missing.\");\n }\n if (!palette.divider) {\n warnings.push(\"palette.divider is missing.\");\n }\n\n return warnings;\n};\n","import { keyframes } from \"@emotion/react\";\n\n/**\n * Fade in from the left with slight movement on the X-axis.\n */\nexport const fadeInLeft = keyframes`\n from {\n opacity: 0;\n transform: translateX(-40px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n`;\n\n/**\n * Simple fade in animation (opacity only).\n */\nexport const fadeIn = keyframes`\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n`;\n\n/**\n * Slide in from the left side of the screen.\n */\nexport const slideIn = keyframes`\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(0);\n }\n`;\n\n/**\n * Slide in from the bottom of the screen.\n */\nexport const slideInBottom = keyframes`\n from {\n transform: translateY(100%);\n }\n to {\n transform: translateY(0);\n }\n`;\n\n/**\n * Scale from 0 to full size.\n */\nexport const scale = keyframes`\n from {\n transform: scale(0);\n }\n to {\n transform: scale(1);\n }\n`;\n\n/**\n * Creates a pulsating animation using scale and box-shadow.\n * Simulates a glowing effect.\n *\n * @param clr - The base color for the shadow in hex format.\n * @param shadowBlur - The maximum spread of the shadow during the pulse (default: 12).\n * @returns Emotion keyframes animation.\n */\nexport const pulseAnimation = (clr: string, shadowBlur = 12) => keyframes`\n 0% {\n transform: scale(0.95);\n box-shadow: 0 0 0 0 ${clr}b2;\n }\n 70% {\n transform: scale(1);\n box-shadow: 0 0 0 ${shadowBlur}px ${clr}00;\n }\n 100% {\n transform: scale(0.95);\n box-shadow: 0 0 0 0 ${clr}00;\n }\n`;\n\n/**\n * Creates a glowing pulse animation using drop-shadow.\n * Used in progress or highlight elements.\n *\n * @param clr - The glow color in hex.\n * @returns Emotion keyframes animation.\n */\nexport const progressPulse = (clr: string) => keyframes`\n 0% {\n filter: none;\n }\n 50% {\n filter: drop-shadow(0 0 10px ${clr}78);\n }\n 100% {\n filter: none;\n }\n`;\n\n/**\n * A bounce-scale animation used during logout transition.\n */\nexport const logoutAnimation = keyframes`\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 50% {\n transform: scale(0.9) translateX(-2px);\n opacity: 0.7;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n`;\n\n/**\n * Subtle bounce animation used for install app prompts.\n */\nexport const installAppAnimation = keyframes`\n 0% {\n transform: translateY(0);\n }\n 30% {\n transform: translateY(-5px);\n }\n 50% {\n transform: translateY(2px);\n }\n 70% {\n transform: translateY(-2px);\n }\n 100% {\n transform: translateY(0);\n }\n`;\n"],"mappings":"0EAAA,OAAOA,OAAY,kBACnB,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAYF,GAAOC,EAAM;AAAA;AAAA;AAAA;AAAA;ECFtC,OAAOE,OAAW,QAClB,OAAOC,MAAY,kBACnB,OAAOC,MAAyB,0CAChC,OAAS,OAAAC,MAAW,gBA+CR,cAAAC,EAGA,QAAAC,MAHA,oBA/BL,IAAMC,EAAN,cAA4BN,GAAM,SAGvC,CACA,YAAYO,EAA2B,CACrC,MAAMA,CAAK,EACX,KAAK,MAAQ,CACX,SAAU,EACZ,CACF,CAEA,OAAO,yBAAyBC,EAAkC,CAChE,MAAO,CACL,SAAU,GACV,MAAAA,CACF,CACF,CAEA,kBAAkBA,EAAcC,EAA4B,CAE1D,QAAQ,MAAM,SAAUD,CAAK,EAE7B,QAAQ,MAAM,cAAeC,CAAS,CACxC,CAEA,QAAS,CA7CX,IAAAC,EAAAC,EAAAC,EA8CI,GAAM,CAAE,MAAAC,EAAO,MAAAN,CAAM,EAAI,KACzB,OAAIM,EAAM,SAENR,EAACS,GAAA,CACC,UAAAV,EAACW,GAAA,CACC,SAAAX,EAACD,EAAA,CAAI,qCAA2B,EAClC,EACAE,EAAC,MACC,UAAAA,EAACF,EAAA,CAAI,MAAO,CAAE,MAAO,UAAW,QAAS,cAAe,EACtD,UAAAC,EAACF,EAAA,CACC,GAAI,CAAE,cAAe,SAAU,GAAI,KAAM,EAC3C,EAAG,IAAI,UAET,EAAO,IACPG,EAACF,EAAA,CAAI,UAAU,KAAK,eAChBO,EAAAG,EAAM,QAAN,YAAAH,EAAa,KAAK,MAAGC,EAAAE,EAAM,QAAN,YAAAF,EAAa,SACtC,EACAN,EAACF,EAAA,CAAI,MAAO,CAAE,MAAO,UAAW,QAAS,cAAe,EACtD,UAAAC,EAACF,EAAA,CACC,GAAI,CAAE,cAAe,SAAU,GAAI,KAAM,EAC3C,EAAG,IAAI,UAET,EAAO,IACPG,EAACF,EAAA,CAAI,UAAU,KAAK,eAAES,EAAAC,EAAM,QAAN,YAAAD,EAAa,MAAM,KAAC,GAC5C,GACF,EAIGL,EAAM,QACf,CACF,EAEMO,GAAYb,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnBc,GAAcd,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ECtF3B,OAAS,aAAAe,GAAW,YAAAC,OAAgB,QACpC,OAAOC,OAAY,kBACnB,OAAS,OAAAC,GAAK,oBAAAC,OAAwB,gBAgB9B,mBAAAC,GACE,OAAAC,EADF,QAAAC,OAAA,oBAdD,IAAMC,GAAU,IAAM,CAC3B,GAAM,CAACC,EAAaC,CAAc,EAAIT,GAAkB,EAAK,EAE7D,OAAAD,GAAU,IAAM,CACd,IAAMW,EAAQ,WAAW,IAAM,CAC7BD,EAAe,EAAI,CACrB,EAAG,GAAG,EAEN,MAAO,IAAM,aAAaC,CAAK,CACjC,EAAG,CAAC,CAAC,EAGHL,EAACM,GAAA,CAAU,YAAU,SAAS,KAAK,SAChC,SAAAH,GACCF,GAAAF,GAAA,CACE,UAAAC,EAACF,GAAA,CAAiB,aAAW,UAAU,KAAM,GAAI,UAAW,EAAG,EAC/DE,EAAC,MAAG,MAAO,CAAE,QAAS,EAAI,EAAG,2BAAe,GAC9C,EAEJ,CAEJ,EAEMM,GAAYV,GAAOC,EAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EC3B5B,OAAOU,OAAY,kBAEZ,IAAMC,GAAWD,GAAO;AAAA;AAAA;AAAA;AAAA;ECF/B,OAAOE,OAA+B,4CACtC,OAAOC,OAAyB,sCAChC,OAAOC,OAA0B,uCACjC,OAAOC,OAA8B,2CAW/B,cAAAC,MAAA,oBAPN,IAAMC,EAAmB,GAEZC,GAAgC,CAC3C,CACE,MAAO,OACP,MAAO,OACP,KACEF,EAACJ,GAAA,CACC,MAAM,UACN,GAAI,CAAE,SAAUK,CAAiB,EACnC,CAEJ,EACA,CACE,MAAO,SACP,MAAO,SACP,KACED,EAACD,GAAA,CACC,MAAM,UACN,GAAI,CAAE,SAAUE,CAAiB,EACnC,CAEJ,EACA,CACE,MAAO,QACP,MAAO,QACP,KACED,EAACF,GAAA,CACC,MAAM,UACN,GAAI,CAAE,SAAUG,CAAiB,EACnC,CAEJ,EACA,CACE,MAAO,OACP,MAAO,OACP,KACED,EAACH,GAAA,CACC,MAAM,UACN,GAAI,CAAE,SAAUI,CAAiB,EACnC,CAEJ,CACF,EClDA,OAAS,WAAAE,MAAe,QACxB,OAAS,iBAAiBC,OAAwB,uBCDlD,OAAS,iBAAAC,GAAe,cAAAC,OAAkB,QAInC,IAAMC,EAAeF,GAC1B,MACF,EAEaG,EAAmB,IAAyB,CACvD,IAAMC,EAAUH,GAAWC,CAAY,EACvC,GAAI,CAACE,EACH,MAAM,IAAI,MACR,2DACF,EACF,OAAOA,CACT,ECXA,IAAMC,EAAoB,UAEpBC,EAAYC,GAChB,OAAOA,GAAU,UAAYA,IAAU,KAEnCC,GAAeC,GAAmC,CACtD,IAAMC,EAAaD,GAAA,YAAAA,EAAI,OACvB,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,wDAAwD,EAE1E,OAAOA,CACT,EAEMC,GAAiB,CACrBC,EACAC,IACW,CACX,IAAMH,EAAaE,GAAA,YAAAA,EAAO,OAC1B,OAAKF,GACIG,CAGX,EAEMC,GAAiBP,GAAyC,CAI9D,GAHI,CAACD,EAASC,CAAK,GACf,OAAOA,EAAM,IAAO,UACpB,OAAOA,EAAM,OAAU,UACvB,EAAE,iBAAkBA,GAAQ,MAAO,GAEvC,GAAM,CAAE,aAAAQ,CAAa,EAAIR,EACzB,OAAOD,EAASS,CAAY,CAC9B,EAEMC,GAAsB,CAC1BC,EACAC,IACqB,CACrB,GAAI,CAACJ,GAAcG,CAAK,EACtB,MAAM,IAAI,MACR,4DAA4DC,CAAK,GACnE,EAGF,IAAMT,EAAKD,GAAYS,EAAM,EAAE,EACzBL,EAAQD,GAAeM,EAAM,MAAOR,CAAE,EACtC,CAAE,aAAAM,CAAa,EAAIE,EACnB,CAAE,MAAAE,EAAO,KAAAC,CAAK,EAAIL,EAExB,GAAI,CAACT,EAASa,CAAK,EACjB,MAAM,IAAI,MACR,+DACF,EAEF,GAAI,CAACb,EAASc,CAAI,EAChB,MAAM,IAAI,MACR,8DACF,EAGF,MAAO,CACL,GAAGH,EACH,GAAAR,EACA,MAAAG,EACA,aAAc,CACZ,MAAOO,EACP,KAAMC,CACR,EACA,KAAM,CAAE,OAAQ,QAAS,CAC3B,CACF,EAEMC,GAAiBC,GAAoD,CACzE,IAAMC,EAAa,IAAI,IACjBC,EAAa,IAAI,IAEvB,OAAW,CAACN,EAAOO,CAAM,IAAKH,EAAQ,QAAQ,EACvCC,EAAW,IAAIE,EAAO,EAAE,GAC3BF,EAAW,IAAIE,EAAO,GAAIP,CAAK,EAEjCM,EAAW,IAAIC,EAAO,GAAIA,CAAM,EAGlC,IAAMC,EAAa,CAAC,GAAGH,EAAW,QAAQ,CAAC,EACxC,KAAK,CAAC,CAAC,CAAEI,CAAC,EAAG,CAAC,CAAEC,CAAC,IAAMD,EAAIC,CAAC,EAC5B,IAAI,CAAC,CAACnB,CAAE,IAAMA,CAAE,EAEboB,EAA8B,CAAC,EACrC,QAAWpB,KAAMiB,EAAY,CAC3B,IAAMD,EAASD,EAAW,IAAIf,CAAE,EAC5BgB,GAAQI,EAAQ,KAAKJ,CAAM,CACjC,CAEA,OAAOI,CACT,EAEMC,EAAsB,KAAyB,CACnD,GAAIzB,EACJ,MAAOA,EACP,aAAc,CAAE,MAAO,CAAC,EAAG,KAAM,CAAC,CAAE,EACpC,KAAM,CAAE,OAAQ,QAAS,CAC3B,GAEa0B,EACXd,GACuB,CACvB,GAAI,CAACA,GAASA,EAAM,SAAW,EAAG,MAAO,CAACa,EAAoB,CAAC,EAE/D,IAAMpB,EAAaO,EAAM,IAAI,CAACe,EAAMd,IAClCF,GAAoBgB,EAAMd,CAAK,CACjC,EACA,OAAIR,EAAW,SAAW,EAAU,CAACoB,EAAoB,CAAC,EAEnDT,GAAcX,CAAU,CACjC,EChHA,IAAMuB,EAAqB,UAErBC,GAAiBC,IAAiD,CACtE,KAAMA,EAAO,GACb,GAAGA,EAAO,aAAa,KACzB,GAOaC,EAAmBC,GAA6C,CAC3E,IAAMC,EAAUC,EAAqBF,CAAK,EAC1C,OAAIC,EAAQ,SAAW,EAAU,CAAC,CAAE,KAAML,CAAmB,CAAC,EACvDK,EAAQ,IAAKH,GAAWD,GAAcC,CAAM,CAAC,CACtD,EAEaK,EAAc,CACzBF,EACAG,IACwB,CACxB,IAAMC,EAAS,CAAC,GAAIJ,GAAA,KAAAA,EAAW,CAAC,EAAI,GAAIG,GAAA,KAAAA,EAAgB,CAAC,CAAE,EAC3D,OAAOL,EAAgBM,EAAO,OAAS,EAAIA,EAAS,MAAS,CAC/D,EAEaC,EAA2BC,GAAqC,CAhC7E,IAAAC,EAAAC,EAiCE,OAAAA,GAAAD,EAAAD,EAAO,CAAC,IAAR,YAAAC,EAAW,OAAX,KAAAC,EAAmBb,GAERc,EAAmB,CAC9BC,EACAJ,IAEII,GAAaJ,EAAO,KAAMK,GAAUA,EAAM,OAASD,CAAS,EACvDA,EAEFL,EAAwBC,CAAM,EAG1BM,EAAmB,CAC9BN,EACAO,IAEAP,EAAO,KAAMK,GAAUA,EAAM,OAASE,CAAO,EAElCC,EAAkB,CAC7BC,EACAC,EAA+B,WAE1BD,GAAiBC,ECvDxB,OAAS,aAAAC,EAAW,WAAAC,EAAS,YAAAC,MAAgB,QCAtC,IAAMC,EAAY,IACvB,WAAW,SAAW,QAAa,WAAW,WAAa,OCG7D,IAAMC,EAAmB,cACZC,EAAuB,EAC9BC,GAAoB,IAAI,IAAqB,CACjD,SACA,OACA,QACA,MACF,CAAC,EAEKC,GAAoBC,GACxB,OAAOA,GAAU,UAAYF,GAAkB,IAAIE,CAAwB,EAQhEC,EAAkB,IAAyC,CACtE,GAAI,CAACC,EAAU,GAAK,WAAW,eAAiB,OAAW,OAAO,KAClE,GAAI,CACF,IAAMC,EAAY,WAAW,aAAa,QAAQP,CAAgB,EAClE,GAAI,CAACO,EAAW,OAAO,KACvB,IAAMC,EAAS,KAAK,MAAMD,CAAS,EAM7BE,EAAWN,GAAiBK,EAAO,QAAQ,EAC7CA,EAAO,SACP,OACJ,GAAIA,EAAO,UAAYP,EAAsB,CAC3C,IAAMS,EACJ,OAAOF,EAAO,SAAY,SAAWA,EAAO,QAAU,OACxD,MAAI,CAACE,GAAW,CAACD,EAAiB,KAC3B,CAAE,QAASR,EAAsB,QAAAS,EAAS,SAAAD,CAAS,CAC5D,CAEA,IAAME,EACJ,OAAOH,EAAO,OAAU,SAAWA,EAAO,MAAQ,OACpD,MAAI,CAACG,GAAe,CAACF,EAAiB,KAC/B,CAAE,QAASR,EAAsB,QAASU,EAAa,SAAAF,CAAS,CACzE,OAAQ,GACN,OAAO,IACT,CACF,EAEaG,EAAoBC,GAAsC,CACrE,GAAI,GAACP,EAAU,GAAK,WAAW,eAAiB,QAChD,GAAI,CACF,WAAW,aAAa,QAAQN,EAAkB,KAAK,UAAUa,CAAQ,CAAC,CAC5E,OAAQC,EAAA,CAER,CACF,EF5CA,IAAMC,EAAqC,SAE9BC,EAA0B,CAAC,CACtC,OAAAC,CACF,IAWK,CACH,IAAMC,EAAgBC,EAAQ,IAAMC,EAAqBH,CAAM,EAAG,CAACA,CAAM,CAAC,EACpEI,EAAeF,EACnB,IACED,EAAc,IAAKI,IAAY,CAC7B,KAAMA,EAAO,GACb,GAAGA,EAAO,aAAa,KACzB,EAAE,EACJ,CAACJ,CAAa,CAChB,EACM,CAACK,EAAOC,CAAQ,EAAIC,EAAiB,IACzCC,EAAiB,OAAWL,CAAY,CAC1C,EACM,CAACM,EAAUC,CAAW,EAAIH,EAA0BV,CAAiB,EACrE,CAACc,EAAYC,CAAa,EAAIL,EAAS,EAAK,EAE5CM,EAAiBZ,EACrB,IACED,EAAc,KAAMI,GAAWA,EAAO,KAAOC,CAAK,GAAKL,EAAc,CAAC,EACxE,CAACK,EAAOL,CAAa,CACvB,EACMc,EAAgBb,EACpB,IAAME,EAAa,KAAMY,GAAMA,EAAE,OAASV,CAAK,GAAKF,EAAa,CAAC,EAClE,CAACE,EAAOF,CAAY,CACtB,EAGA,OAAAa,EAAU,IAAM,CACd,GAAIL,EAAY,OAChB,IAAMM,EAASC,EAAgB,EAC/BZ,EAASE,EAAiBS,GAAA,YAAAA,EAAQ,QAASd,CAAY,CAAC,EACxDO,EAAYS,EAAgBF,GAAA,YAAAA,EAAQ,SAAUpB,CAAiB,CAAC,EAChEe,EAAc,EAAI,CACpB,EAAG,CAACD,EAAYR,CAAY,CAAC,EAE7Ba,EAAU,IAAM,CACd,IAAMI,EAAgBZ,EAAiBH,EAAOF,CAAY,EACtDiB,IAAkBf,GACpBC,EAASc,CAAa,CAE1B,EAAG,CAACf,EAAOF,CAAY,CAAC,EAGxBa,EAAU,IAAM,CACTL,GACLU,EAAiB,CACf,QAASC,EACT,QAASjB,EACT,SAAAI,CACF,CAAC,CACH,EAAG,CAACE,EAAYN,EAAOI,CAAQ,CAAC,EAEzB,CACL,MAAAJ,EACA,SAAAC,EACA,SAAAG,EACA,YAAAC,EACA,cAAAV,EACA,eAAAa,EACA,aAAAV,EACA,cAAAW,CACF,CACF,EG5FA,OAAS,UAAAS,GAAQ,OAAAC,OAAW,iBAC5B,OAAS,YAAAC,OAAgB,uBA0BrB,cAAAC,OAAA,oBAVG,IAAMC,EAAsC,CAAC,CAAE,WAAAC,CAAW,IAAM,CACrE,IAAMC,EAAQJ,GAAS,EACjBK,EAAaD,EAAM,QAAQ,OAAS,OAEpCE,EAAeF,EAAM,QAAQ,QAAQ,KACrCG,EAAYH,EAAM,QAAQ,KAAK,QAC/BI,EAAoBJ,EAAM,QAAQ,WAAW,QAC7CK,EAAkBL,EAAM,QAAQ,WAAW,MAEjD,OACEH,GAACH,GAAA,CACC,OAAQC;AAAA;AAAA;AAAA,YAGFI,EAAa,sBAAsBA,CAAU,IAAM,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAgBjC,GAAGG,CAAY,IAAI;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,0BA2BzBD,EAAa,OAAS,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAa/BG,CAAiB;AAAA,mBACtBD,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA,6BAKCD,CAAY,IAAIE,CAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,gCAK9BA,CAAiB;AAAA;AAAA;AAAA,gCAGjBF,CAAY;AAAA;AAAA;AAAA;AAAA,gCAIZ,GAAGA,CAAY,IAAI;AAAA;AAAA;AAAA;AAAA,gCAInBE,CAAiB;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,6BAgCpBF,CAAY,IAAIG,CAAe;AAAA;AAAA;AAAA;AAAA,gCAI5BA,CAAe;AAAA;AAAA;AAAA,gCAGfH,CAAY;AAAA;AAAA;AAAA;AAAA,gCAIZ,GAAGA,CAAY,IAAI;AAAA;AAAA;AAAA;AAAA,gCAInBG,CAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAU3C,CAEJ,ECxKA,OAAS,SAAAC,MAAa,uBCAtB,OAAS,SAAAC,OAAa,uBAcf,IAAMC,GAAoBC,IAA4C,CAC3E,OAAQA,EAAM,QAAQ,WAAW,QACjC,UAAWA,EAAM,QAAQ,WAAW,MACpC,YAAaA,EAAM,QAAQ,KAAK,QAChC,cAAeA,EAAM,QAAQ,KAAK,UAClC,QAASA,EAAM,QAAQ,OACzB,GAEaC,GAAY,CAACD,EAAyBE,IACjDJ,GAAME,EAAM,QAAQ,KAAK,QAASE,CAAO,EDbpC,IAAMC,GAA4C,CACvD,WAAY,CACV,aAAc,CACZ,mBAAoB,EACtB,EACA,eAAgB,CACd,QAAS,CAAC,CAAE,MAAAC,CAAM,KAAO,CACvB,eAAgB,YAChB,qBAAsB,YACtB,QAAS,WACT,aAAcA,EAAM,MAAM,aAC1B,SAAUA,EAAM,WAAW,QAAQ,EAAE,CACvC,EACF,CACF,EAEA,UAAW,CACT,eAAgB,CACd,KAAM,CAAC,CAAE,MAAAA,CAAM,KAAO,CACpB,QAAS,YACT,aAAcA,EAAM,MAAM,YAC5B,GACA,UAAW,CACT,UAAW,MACb,CACF,CACF,EAEA,YAAa,CACX,eAAgB,CACd,KAAM,CAAC,CAAE,MAAAA,CAAM,KAAO,CACpB,aAAcA,EAAM,MAAM,YAC5B,EACF,CACF,EAEA,UAAW,CACT,eAAgB,CACd,KAAM,CAAC,CAAE,MAAAA,CAAM,KAAO,CACpB,aAAcA,EAAM,MAAM,YAC5B,GACA,OAAQ,CACN,QAAS,OACT,eAAgB,aAChB,WAAY,SACZ,IAAK,KACP,CACF,CACF,EAEA,UAAW,CACT,aAAc,CACZ,UAAW,CACT,MAAO,CACL,MAAO,CACL,QAAS,OACT,aAAc,GACd,SAAU,OACZ,CACF,CACF,CACF,EACA,eAAgB,CACd,KAAM,CACJ,yBAA0B,CACxB,eAAgB,WAClB,CACF,CACF,CACF,EAEA,UAAW,CACT,eAAgB,CACd,KAAM,CACJ,WAAY,GACd,CACF,CACF,EAEA,SAAU,CACR,eAAgB,CACd,KAAM,CAAC,CAAE,MAAAA,CAAM,KAAO,CACpB,aAAcA,EAAM,MAAM,YAC5B,EACF,CACF,EAEA,aAAc,CACZ,aAAc,CACZ,QAAS,UACX,EACA,eAAgB,CACd,KAAM,CAAC,CAAE,MAAAA,CAAM,KAAO,CACpB,uBAAwB,CACtB,aAAcA,EAAM,MAAM,YAC5B,CACF,EACF,CACF,EAEA,iBAAkB,CAChB,eAAgB,CACd,KAAM,CAAC,CAAE,MAAAA,CAAM,IAAM,CACnB,IAAMC,EAASC,GAAiBF,CAAK,EACrC,MAAO,CACL,MAAOC,EAAO,YACd,aAAc,CACZ,YAAaE,EAAMF,EAAO,YAAa,GAAI,CAC7C,EACA,mBAAoB,CAClB,YAAaE,EAAMF,EAAO,YAAa,GAAI,CAC7C,EACA,yBAA0B,CACxB,YAAaD,EAAM,QAAQ,QAAQ,IACrC,CACF,CACF,CACF,CACF,EAEA,cAAe,CACb,eAAgB,CACd,KAAM,CAAC,CAAE,MAAAA,CAAM,KAAO,CACpB,MAAOG,EAAMH,EAAM,QAAQ,KAAK,QAAS,GAAI,EAC7C,gBAAiB,CACf,MAAOA,EAAM,QAAQ,QAAQ,IAC/B,CACF,EACF,CACF,EACA,kBAAmB,CACjB,eAAgB,CACd,KAAM,CAAC,CAAE,MAAAA,CAAM,KAAO,CACpB,MAAOA,EAAM,QAAQ,KAAK,UAC1B,cAAe,CACb,MAAOA,EAAM,QAAQ,MAAM,IAC7B,CACF,EACF,CACF,EAEA,SAAU,CACR,eAAgB,CACd,KAAM,CAAC,CAAE,MAAAA,CAAM,KAAO,CACpB,aAAcA,EAAM,MAAM,YAC5B,GACA,WAAY,CAAC,CAAE,MAAAA,CAAM,KAAO,CAC1B,aAAcA,EAAM,MAAM,YAC5B,EACF,CACF,EAEA,YAAa,CACX,eAAgB,CACd,KAAM,CAAC,CAAE,MAAAA,CAAM,KAAO,CACpB,aAAcA,EAAM,MAAM,YAC5B,EACF,CACF,EAEA,0BAA2B,CACzB,eAAgB,CACd,KAAM,CAAC,CAAE,MAAAA,CAAM,KAAO,CACpB,aAAcA,EAAM,MAAM,aAC1B,QAAS,OACT,OAAQ,EACR,UAAW,MACb,EACF,CACF,EAEA,iBAAkB,CAChB,eAAgB,CACd,KAAM,CACJ,QAAS,CACX,CACF,CACF,EAEA,UAAW,CACT,eAAgB,CACd,WAAY,CAAC,CAAE,MAAAA,CAAM,KAAO,CAC1B,aAAcA,EAAM,MAAM,aAC1B,QAAS,WACT,sBAAuB,CACrB,QAAS,MACX,CACF,EACF,CACF,EAEA,oBAAqB,CACnB,eAAgB,CACd,OAAQ,CACN,cAAe,OACjB,CACF,CACF,EAEA,OAAQ,CACN,eAAgB,CACd,KAAM,CAAC,CAAE,MAAAA,CAAM,KAAO,CACpB,aAAcA,EAAM,MAAM,YAC5B,EACF,CACF,EAEA,aAAc,CACZ,eAAgB,CACd,KAAM,CACJ,YAAa,CACX,QAAS,MACX,CACF,CACF,CACF,CACF,EElOA,OAAS,eAAAI,OAAmB,uBASrB,IAAMC,EAAgB,CAC3BC,EACAC,IACU,CACV,GAAM,CAAE,WAAAC,EAAY,QAAAC,EAAS,GAAGC,CAAK,EAAIJ,EACnCK,EAAqBH,GAAA,YAAAA,EAAaD,GAElCK,EAA2C,CAC/C,GAAGH,EACH,KAAAF,CACF,EAEA,OAAII,GAAsBF,GAAA,MAAAA,EAAS,cACjCG,EAAgB,WAAa,CAC3B,GAAGH,GAAA,YAAAA,EAAS,WACZ,GAAGE,CACL,GAGKP,GAAY,CACjB,GAAGM,EACH,QAASE,CACX,CAAC,CACH,EChCA,OAAS,aAAAC,GAAW,YAAAC,OAAgB,QAU7B,IAAMC,GAAuB,CAACC,EAAa,MAAiB,CACjE,GAAM,CAACC,EAAiBC,CAAkB,EAAIC,GAAkB,EAAK,EAErE,OAAAC,GAAU,IAAM,CACd,GAAI,CAACC,EAAU,EAAG,MAAO,IAAM,CAAC,EAChC,IAAMC,EAAkB,IAAM,CAC5BJ,EAAmB,OAAO,WAAaF,CAAU,CACnD,EACAM,EAAgB,EAChB,IAAMC,EAAe,IAAMD,EAAgB,EAC3C,cAAO,iBAAiB,SAAUC,CAAY,EACvC,IAAM,CACX,OAAO,oBAAoB,SAAUA,CAAY,CACnD,CACF,EAAG,CAACP,CAAU,CAAC,EAERC,CACT,EC3BA,OAAS,aAAAO,GAAW,YAAAC,OAAgB,QAU7B,IAAMC,EAAiB,IAAmB,CAC/C,GAAM,CAACC,EAAOC,CAAQ,EAAIC,GAAsB,SAAS,EACzD,OAAAC,GAAU,IAAM,CACd,GAAI,CAACC,EAAU,GAAK,OAAO,WAAW,YAAe,WACnD,OAAAH,EAAS,SAAS,EACX,IAAM,CAAC,EAGhB,IAAMI,EAAoB,WAAW,WACnC,8BACF,EAEMC,EAAeC,GAAgC,CACnD,IAAMC,EAAUD,EAAQA,EAAM,QAAUF,EAAkB,QAC1DJ,EAASO,EAAU,OAAS,OAAO,CACrC,EAKA,OAHAF,EAAY,EAGR,OAAOD,EAAkB,kBAAqB,WACzC,IAAM,CAAC,GAGhBA,EAAkB,iBAAiB,SAAUC,CAAW,EACjD,IAAM,CACXD,EAAkB,oBAAoB,SAAUC,CAAW,CAC7D,EACF,EAAG,CAAC,CAAC,EAEEN,CACT,ECnCO,IAAMS,GAAcC,GACzB,mCAAmC,KAAKA,CAAK,ECHxC,IAAMC,GAAkB,IAAc,CAC3C,IAAMC,EAAc,IAAI,KAAK,EAAE,SAAS,EACxC,OAAIA,GAAe,GAAKA,EAAc,GAAW,eAC7CA,EAAc,IAAMA,EAAc,GAAW,iBAC1C,cACT,ECNO,IAAMC,GAAoBC,GAAe,CAC9C,IAAMC,EAAOD,EAAK,YAAY,EACxBE,EAAQ,OAAOF,EAAK,SAAS,EAAI,CAAC,EAAE,SAAS,EAAG,GAAG,EACnDG,EAAM,OAAOH,EAAK,QAAQ,CAAC,EAAE,SAAS,EAAG,GAAG,EAClD,MAAO,GAAGC,CAAI,IAAIC,CAAK,IAAIC,CAAG,EAChC,ECYO,IAAMC,GAAqB,IAAuB,CACvD,IAAMC,GACJ,OAAO,WAAc,YAAc,GAAK,UAAU,WAClD,YAAY,EAEd,OAAIA,EAAG,SAAS,YAAY,EAAU,UAClCA,EAAG,SAAS,QAAQ,GAAKA,EAAG,SAAS,MAAM,GAAKA,EAAG,SAAS,MAAM,EAC7D,MACLA,EAAG,SAAS,KAAK,EAAU,QAC3BA,EAAG,SAAS,SAAS,EAAU,UAC/BA,EAAG,SAAS,OAAO,EAAU,QAE1B,SACT,EAMaC,GAAa,IAAe,CACvC,IAAMD,GACJ,OAAO,WAAc,YAAc,GAAK,UAAU,WAClD,YAAY,EAGd,OAAIA,EAAG,SAAS,KAAK,EAAU,OAC3BA,EAAG,SAAS,QAAQ,EAAU,SAC9BA,EAAG,SAAS,SAAS,EAAU,UAC/BA,EAAG,SAAS,QAAQ,EAAU,SAE3B,SACT,EAMaE,GAAa,CACxB,GACE,OAAO,WAAc,YAChB,UACDH,GAAmB,EACzB,QACE,OAAO,WAAc,YAAe,UAAwBE,GAAW,CAC3E,ECvDO,IAAME,GAAa,CACxBC,EACAC,IACY,CACZ,OAAQD,EAAU,CAChB,IAAK,QACH,MAAO,GAET,IAAK,OACH,MAAO,GAET,IAAK,SACL,IAAK,OACH,OAAOC,IAAgB,OAEzB,QACE,MAAO,EAEX,CACF,ECrBO,IAAMC,GAAU,CAACC,EAAYC,IAA0B,CAC5D,IAAMC,EACJD,GAAA,KAAAA,EAAS,OAAO,WAAc,YAAc,QAAU,UAAU,SAE5DE,EAAM,IAAI,KAChBH,EAAO,IAAI,KAAKA,CAAI,EAEpB,IAAMI,EAAgB,KAAK,OAAOD,EAAI,QAAQ,EAAIH,EAAK,QAAQ,GAAK,GAAI,EAGlEK,EAAM,IAAI,KAAK,mBAAmBH,EAAQ,CAAE,QAAS,MAAO,CAAC,EAGnE,GAAIE,EAAgB,GAClB,OAAOC,EAAI,OAAO,CAACD,EAAe,QAAQ,EAE5C,GAAIA,EAAgB,KAAM,CACxB,IAAME,EAAU,KAAK,MAAMF,EAAgB,EAAE,EAC7C,OAAOC,EAAI,OAAO,CAACC,EAAS,QAAQ,CACtC,CACA,GAAIF,EAAgB,MAAQ,CAC1B,IAAMG,EAAQ,KAAK,MAAMH,EAAgB,IAAI,EAC7C,OAAOC,EAAI,OAAO,CAACE,EAAO,MAAM,CAClC,CACA,IAAMC,EAAO,KAAK,MAAMJ,EAAgB,KAAM,EAC9C,OAAOC,EAAI,OAAO,CAACG,EAAM,KAAK,CAChC,EAEaC,GAAmB,CAACT,EAAYC,IAA0B,CACrE,IAAMC,EACJD,GAAA,KAAAA,EAAS,OAAO,WAAc,YAAc,QAAU,UAAU,SAC5DE,EAAM,IAAI,KAChBH,EAAO,IAAI,KAAKA,CAAI,EACpB,IAAMU,GAAcV,EAAK,QAAQ,EAAIG,EAAI,QAAQ,GAAK,IAChDQ,EAAkB,KAAK,MAAMD,GAAc,GAAK,GAAG,EACnDE,EAAoB,KAAK,OAC5BF,EAAa,GAAK,GAAKC,GAAmB,EAC7C,EACMP,EAAgB,KAAK,MACzBM,EAAa,GAAK,GAAKC,EAAkB,GAAKC,CAChD,EAEMP,EAAM,IAAI,KAAK,mBAAmBH,EAAQ,CAAE,QAAS,MAAO,CAAC,EAEnE,GAAIU,IAAsB,GAAKR,EAAgB,GAC7C,OAAOC,EAAI,OAAOD,EAAe,QAAQ,EAE3C,GAAIO,IAAoB,GAAKC,EAAoB,GAC/C,OAAOP,EAAI,OAAOO,EAAmB,QAAQ,EAE/C,GAAID,EAAkB,GAAI,CACxB,IAAMJ,EAAQ,GAAG,IAAI,KAAK,mBAAmBL,EAAQ,CACnD,QAAS,MACX,CAAC,EAAE,OAAOS,EAAiB,MAAM,CAAC,GAC5BL,EAAU,IAAI,IAAI,KAAK,mBAAmBJ,EAAQ,CACtD,cAAe,SACf,QAAS,SACT,MAAO,MACT,CAAC,EAAE,OAAOU,EAAmB,QAAQ,CAAC,GAAG,QAAQ,OAAQ,EAAE,EAC3D,MAAO,GAAGL,CAAK,IAAID,CAAO,EAC5B,CAEA,IAAME,EAAO,KAAK,MAAMJ,EAAgB,KAAM,EAC9C,OAAOC,EAAI,OAAOG,EAAM,KAAK,CAC/B,EClEO,IAAMK,EAAuB,CAClCC,EACAC,IACiBC,GAAWF,EAAUC,CAAW,EAAI,OAAS,QCLzD,IAAME,EAAqB,CAChCC,EACAC,IACc,CANhB,IAAAC,EAMmB,OAAAA,EAAAF,EAAO,aAAaC,CAAI,IAAxB,KAAAC,EAA6BF,EAAO,aAAa,OCCpE,IAAMG,EAAWC,GAAe,GAAGA,EAAK,EAAc,MAKzCC,GAAoD,CAC/D,aAAc,CACZ,eAAgB,CAEd,gBAAiB,IACjB,gBAAiB,IACjB,gBAAiB,IACjB,gBAAiB,IACjB,gBAAiB,IACjB,iBAAkB,IAGlB,aAAc,IACd,aAAc,IACd,aAAc,IACd,aAAc,IACd,aAAc,IACd,cAAe,IAGf,iBAAkB,IAClB,iBAAkB,IAClB,iBAAkB,IAClB,iBAAkB,IAClB,iBAAkB,IAClB,kBAAmB,IAGnB,aAAc,IACd,aAAc,IACd,aAAc,IACd,aAAc,IACd,aAAc,IACd,cAAe,IAGf,mBAAoB,KACpB,kBAAmB,KACnB,kBAAmB,KACnB,kBAAmB,KACnB,kBAAmB,KACnB,kBAAmB,KAGnB,gBAAiB,KACjB,eAAgB,KAChB,eAAgB,KAChB,eAAgB,KAChB,eAAgB,KAChB,eAAgB,KAGhB,oBAAqB,KACrB,mBAAoB,KACpB,mBAAoB,KACpB,mBAAoB,KACpB,mBAAoB,KACpB,mBAAoB,IACtB,CACF,CACF,EAKaC,GAAgD,CAC3D,gBAAiB,CACf,WAAY,IACZ,SAAUH,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,gBAAiB,CACf,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,gBAAiB,CACf,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,gBAAiB,CACf,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,gBAAiB,CACf,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,iBAAkB,CAChB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EAEA,aAAc,CACZ,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,aAAc,CACZ,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,aAAc,CACZ,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,aAAc,CACZ,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,aAAc,CACZ,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,cAAe,CACb,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EAEA,iBAAkB,CAChB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,iBAAkB,CAChB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,iBAAkB,CAChB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,iBAAkB,CAChB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,iBAAkB,CAChB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,kBAAmB,CACjB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EAEA,aAAc,CACZ,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,aAAc,CACZ,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,aAAc,CACZ,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,aAAc,CACZ,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,aAAc,CACZ,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,cAAe,CACb,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EAEA,mBAAoB,CAClB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,kBAAmB,CACjB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,kBAAmB,CACjB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,kBAAmB,CACjB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,kBAAmB,CACjB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,kBAAmB,CACjB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EAEA,gBAAiB,CACf,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,eAAgB,CACd,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,eAAgB,CACd,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,eAAgB,CACd,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,eAAgB,CACd,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,eAAgB,CACd,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EAEA,oBAAqB,CACnB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,mBAAoB,CAClB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,mBAAoB,CAClB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,mBAAoB,CAClB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,mBAAoB,CAClB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,EACA,mBAAoB,CAClB,WAAY,IACZ,SAAUA,EAAQ,EAAE,EACpB,WAAYA,EAAQ,EAAE,CACxB,CACF,ECpSO,IAAMI,GAAwBC,GAAoC,CAFzE,IAAAC,EAAAC,EAAAC,EAAAC,EAGE,IAAMC,EAAqB,CAAC,EACtB,CAAE,QAAAC,CAAQ,EAAIN,EACpB,OAAKM,IAKAL,EAAAK,EAAQ,aAAR,MAAAL,EAAoB,SACvBI,EAAS,KAAK,wCAAwC,GAEnDH,EAAAI,EAAQ,aAAR,MAAAJ,EAAoB,OACvBG,EAAS,KAAK,sCAAsC,GAEjDF,EAAAG,EAAQ,OAAR,MAAAH,EAAc,SACjBE,EAAS,KAAK,kCAAkC,GAE7CD,EAAAE,EAAQ,OAAR,MAAAF,EAAc,WACjBC,EAAS,KAAK,oCAAoC,EAE/CC,EAAQ,SACXD,EAAS,KAAK,6BAA6B,EAGtCA,IApBLA,EAAS,KAAK,qBAAqB,EAC5BA,EAoBX,EC3BA,OAAS,aAAAE,MAAiB,iBAKnB,IAAMC,GAAaD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcbE,GAASF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYTG,GAAUH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYVI,GAAgBJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYhBK,GAAQL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBRM,GAAiB,CAACC,EAAaC,EAAa,KAAOR;AAAA;AAAA;AAAA,0BAGtCO,CAAG;AAAA;AAAA;AAAA;AAAA,wBAILC,CAAU,MAAMD,CAAG;AAAA;AAAA;AAAA;AAAA,0BAIjBA,CAAG;AAAA;AAAA,EAWhBE,GAAiBF,GAAgBP;AAAA;AAAA;AAAA;AAAA;AAAA,mCAKXO,CAAG;AAAA;AAAA;AAAA;AAAA;AAAA,EAUzBG,GAAkBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBlBW,GAAsBX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EvBnD7B,OACE,OAAAY,GADF,QAAAC,OAAA,oBA/CC,IAAMC,GAAsD,CAAC,CAClE,SAAAC,EACA,WAAAC,EACA,OAAAC,CACF,IAAM,CACJ,IAAMC,EAAcC,EAAe,EAC7B,CACJ,MAAAC,EACA,SAAAC,EACA,SAAAC,EACA,YAAAC,EACA,aAAAC,EACA,cAAAC,EACA,eAAAC,CACF,EAAIC,EAAwB,CAAE,OAAAV,CAAO,CAAC,EAEhCW,EAAgBC,EACpB,IAAMC,EAAqBR,EAAUJ,CAAW,EAChD,CAACI,EAAUJ,CAAW,CACxB,EACMa,EAAkBF,EACtB,IAAMG,EAAmBN,EAAgBE,CAAa,EACtD,CAACF,EAAgBE,CAAa,CAChC,EAEMK,GAAWJ,EACf,IAAMK,EAAcH,EAAiBH,CAAa,EAClD,CAACG,EAAiBH,CAAa,CACjC,EAEMO,GAAmBN,EACvB,IAAMO,EAAwBZ,CAAY,EAC1C,CAACA,CAAY,CACf,EAEA,OACEZ,GAACyB,EAAa,SAAb,CACC,MAAO,CACL,MAAAjB,EACA,SAAAE,EACA,SAAAD,EACA,YAAAE,EACA,OAAQC,EACR,cAAAC,EACA,iBAAAU,EACF,EAEA,SAAAtB,GAACyB,GAAA,CAAiB,MAAOL,GACvB,UAAArB,GAAC2B,EAAA,CAAa,WAAYvB,EAAY,EACrCD,GACH,EACF,CAEJ","names":["styled","Button","DialogBtn","React","styled","ErrorOutlineRounded","Box","jsx","jsxs","ErrorBoundary","props","error","errorInfo","_a","_b","_c","state","Container","ErrorHeader","useEffect","useState","styled","Box","CircularProgress","Fragment","jsx","jsxs","Loading","showLoading","setShowLoading","timer","Container","styled","PathName","BrightnessAutoRoundedIcon","DarkModeRoundedIcon","LightModeRoundedIcon","PersonalVideoRoundedIcon","jsx","OPTION_ICON_SIZE","darkModeOptions","useMemo","MuiThemeProvider","createContext","useContext","ThemeContext","useThemeSettings","context","DEFAULT_PRESET_ID","isRecord","value","normalizeId","id","normalized","normalizeLabel","label","fallback","isThemePreset","colorSchemes","normalizePresetLike","input","index","light","dark","dedupePresets","presets","firstIndex","lastPreset","preset","orderedIds","a","b","deduped","createDefaultPreset","normalizeThemesInput","item","DEFAULT_THEME_NAME","presetToTheme","preset","normalizeThemes","input","presets","normalizeThemesInput","mergeThemes","customThemes","merged","resolveDefaultThemeName","themes","_a","_b","resolveThemeName","themeName","theme","resolveThemeById","themeId","resolveDarkMode","darkMode","defaultMode","useEffect","useMemo","useState","canUseDom","APP_SETTINGS_KEY","APP_SETTINGS_VERSION","DARK_MODE_OPTIONS","isDarkModeOption","value","readAppSettings","canUseDom","storedRaw","parsed","darkMode","themeId","legacyTheme","writeAppSettings","settings","e","DEFAULT_DARK_MODE","usePersistedAppSettings","themes","presetsSource","useMemo","normalizeThemesInput","themesSource","preset","theme","setTheme","useState","resolveThemeName","darkMode","setDarkMode","isHydrated","setIsHydrated","selectedPreset","selectedTheme","t","useEffect","stored","readAppSettings","resolveDarkMode","resolvedTheme","writeAppSettings","APP_SETTINGS_VERSION","Global","css","useTheme","jsx","GlobalStyles","fontFamily","theme","isDarkMode","primaryColor","textColor","backgroundDefault","backgroundPaper","alpha","alpha","getSurfaceTokens","theme","alphaText","opacity","commonComponentProps","theme","tokens","getSurfaceTokens","alpha","createTheme","buildMuiTheme","options","mode","background","palette","rest","resolvedBackground","paletteWithMode","useEffect","useState","useResponsiveDisplay","breakpoint","isSmallerDevice","setIsSmallerDevice","useState","useEffect","canUseDom","checkScreenSize","handleResize","useEffect","useState","useSystemTheme","theme","setTheme","useState","useEffect","canUseDom","prefersDarkScheme","updateTheme","event","matches","isHexColor","value","displayGreeting","currentHour","getDayIdentifier","date","year","month","day","getOperatingSystem","ua","getBrowser","systemInfo","isDarkMode","darkMode","systemTheme","timeAgo","date","lang","locale","now","diffInSeconds","rtf","minutes","hours","days","timeAgoFromStart","difference","differenceHours","differenceMinutes","resolveEffectiveMode","darkMode","systemTheme","isDarkMode","selectThemeOptions","preset","mode","_a","pxToRem","px","muiTypography","typographyVariants","validateSchemeTokens","options","_a","_b","_c","_d","warnings","palette","keyframes","fadeInLeft","fadeIn","slideIn","slideInBottom","scale","pulseAnimation","clr","shadowBlur","progressPulse","logoutAnimation","installAppAnimation","jsx","jsxs","ThemeProviderWrapper","children","fontFamily","themes","systemTheme","useSystemTheme","theme","setTheme","darkMode","setDarkMode","themesSource","selectedTheme","selectedPreset","usePersistedAppSettings","effectiveMode","useMemo","resolveEffectiveMode","selectedOptions","selectThemeOptions","muiTheme","buildMuiTheme","defaultThemeName","resolveDefaultThemeName","ThemeContext","MuiThemeProvider","GlobalStyles"]}