@atomazing-org/design-system 1.2.9 → 2.0.2
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/AGENTS.md +92 -0
- package/README.MD +47 -392
- package/dist/index.d.ts +21 -1000
- package/dist/index.js +37 -118
- package/dist/presets/index.d.ts +26 -7
- package/dist/presets/index.js +339 -2
- package/dist/{typography-Dq0wCojD.d.mts → typography-B-BeIk0v.d.ts} +4 -5
- package/migrations/README.UPDATE.md +41 -0
- package/migrations/docs/migrations/design-system/README.md +100 -0
- package/migrations/docs/migrations/design-system/routes/adopt-existing/AEROCRM-EXAMPLE.md +197 -0
- package/migrations/docs/migrations/design-system/routes/adopt-existing/RUNBOOK.md +194 -0
- package/migrations/docs/migrations/design-system/routes/adopt-existing/migration.spec.json +109 -0
- package/migrations/docs/migrations/design-system/routes/greenfield/RUNBOOK.md +61 -0
- package/migrations/docs/migrations/design-system/routes/greenfield/migration.spec.json +58 -0
- package/migrations/docs/migrations/design-system/routes/mui4-to-latest/RUNBOOK.md +140 -0
- package/migrations/docs/migrations/design-system/routes/mui4-to-latest/migration.spec.json +143 -0
- package/migrations/docs/migrations/design-system/routes/mui4-to-latest/token-map.csv +4 -0
- package/migrations/docs/migrations/design-system/schema/migration.spec.schema.json +63 -0
- package/migrations/docs/migrations/design-system/shared/FOUNDATION.md +39 -0
- package/migrations/docs/migrations/design-system/shared/WORKING-RULES.md +194 -0
- package/migrations/docs/migrations/design-system/shared/acceptance.md +83 -0
- package/migrations/docs/migrations/design-system/shared/common-regressions.md +218 -0
- package/migrations/docs/migrations/design-system/shared/gates.md +71 -0
- package/migrations/docs/migrations/design-system/shared/manual-qa-matrix.md +70 -0
- package/migrations/docs/migrations/design-system/shared/phase-exit-criteria.md +129 -0
- package/migrations/docs/migrations/design-system/shared/phases.md +377 -0
- package/migrations/docs/migrations/design-system/shared/rollback.md +13 -0
- package/migrations/skills/design-system-consumer-agent/SKILL.md +84 -0
- package/migrations/skills/design-system-migration-agent/SKILL.md +158 -0
- package/package.json +40 -17
- package/dist/chunk-OYZ4FCLV.mjs +0 -2
- package/dist/chunk-OYZ4FCLV.mjs.map +0 -1
- package/dist/index.d.mts +0 -1181
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -273
- package/dist/index.mjs.map +0 -1
- package/dist/presets/index.d.mts +0 -17
- package/dist/presets/index.js.map +0 -1
- package/dist/presets/index.mjs +0 -2
- package/dist/presets/index.mjs.map +0 -1
- package/dist/typography-Dq0wCojD.d.ts +0 -121
package/dist/index.mjs
DELETED
|
@@ -1,273 +0,0 @@
|
|
|
1
|
-
import{a as le,c as me,e as de,g as pe,i as he}from"./chunk-OYZ4FCLV.mjs";import fe from"@emotion/styled";import{Button as ce}from"@mui/material";var ue=fe(ce)`
|
|
2
|
-
padding: 10px 16px;
|
|
3
|
-
border-radius: 16px;
|
|
4
|
-
font-size: 16px;
|
|
5
|
-
margin: 8px;
|
|
6
|
-
`;import ge from"react";import Y from"@emotion/styled";import V from"@mui/icons-material/ErrorOutlineRounded";import{Box as y}from"@mui/material";import{jsx as k,jsxs as g}from"react/jsx-runtime";var D=class extends ge.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,i,s;let{state:t,props:r}=this;return t.hasError?g(xe,{children:[k(be,{children:k(y,{children:"Something went wrong.\xA0"})}),g("h3",{children:[g(y,{style:{color:"#ff3131",display:"inline-block"},children:[k(V,{sx:{verticalAlign:"middle",mb:"4px"}})," ","ERROR:"]})," ",g(y,{translate:"no",children:["[",(n=t.error)==null?void 0:n.name,"] ",(i=t.error)==null?void 0:i.message]}),g(y,{style:{color:"#ff3131",display:"inline-block"},children:[k(V,{sx:{verticalAlign:"middle",mb:"4px"}})," ","Stack:"]})," ",g(y,{translate:"no",children:["[",(s=t.error)==null?void 0:s.stack,"]"]})]})]}):r.children}},xe=Y.div`
|
|
7
|
-
margin: 0 8vw;
|
|
8
|
-
@media (max-width: 768px) {
|
|
9
|
-
margin: 0;
|
|
10
|
-
}
|
|
11
|
-
`,be=Y.h1`
|
|
12
|
-
margin-top: 32px;
|
|
13
|
-
margin-bottom: 32px;
|
|
14
|
-
font-size: 36px;
|
|
15
|
-
color: #ff3131;
|
|
16
|
-
text-align: center;
|
|
17
|
-
display: flex;
|
|
18
|
-
align-items: center;
|
|
19
|
-
justify-content: center;
|
|
20
|
-
@media (max-width: 768px) {
|
|
21
|
-
text-align: left;
|
|
22
|
-
justify-content: left;
|
|
23
|
-
font-size: 30px;
|
|
24
|
-
margin-top: 0;
|
|
25
|
-
margin-bottom: 0;
|
|
26
|
-
}
|
|
27
|
-
`;import{useEffect as ye,useState as Se}from"react";import Te from"@emotion/styled";import{Box as _e,CircularProgress as ke}from"@mui/material";import{Fragment as we,jsx as E,jsxs as Pe}from"react/jsx-runtime";var ve=()=>{let[e,t]=Se(!1);return ye(()=>{let r=setTimeout(()=>{t(!0)},100);return()=>clearTimeout(r)},[]),E(Me,{"aria-live":"polite",role:"status",children:e&&Pe(we,{children:[E(ke,{"aria-label":"loading",size:80,thickness:4}),E("h3",{style:{opacity:.8},children:"Loading Page..."})]})})},Me=Te(_e)`
|
|
28
|
-
position: absolute;
|
|
29
|
-
top: 50%;
|
|
30
|
-
left: 50%;
|
|
31
|
-
transform: translate(-50%, -50%);
|
|
32
|
-
display: flex;
|
|
33
|
-
justify-content: center;
|
|
34
|
-
align-items: center;
|
|
35
|
-
flex-direction: column;
|
|
36
|
-
text-align: center;
|
|
37
|
-
gap: 8px;
|
|
38
|
-
`;import Oe from"@emotion/styled";var ze=Oe.code`
|
|
39
|
-
background: #000000c8;
|
|
40
|
-
color: white;
|
|
41
|
-
padding: 4px 6px;
|
|
42
|
-
border-radius: 8px;
|
|
43
|
-
`;import Ie from"@mui/icons-material/BrightnessAutoRounded";import De from"@mui/icons-material/DarkModeRounded";import Ee from"@mui/icons-material/LightModeRounded";import We from"@mui/icons-material/PersonalVideoRounded";import{jsx as M}from"react/jsx-runtime";var v=32,Re=[{label:"Auto",value:"auto",icon:M(Ie,{color:"inherit",sx:{fontSize:v}})},{label:"System",value:"system",icon:M(We,{color:"inherit",sx:{fontSize:v}})},{label:"Light",value:"light",icon:M(Ee,{color:"inherit",sx:{fontSize:v}})},{label:"Dark",value:"dark",icon:M(De,{color:"inherit",sx:{fontSize:v}})}];import{useMemo as T}from"react";import{ThemeProvider as ft}from"@mui/material/styles";import{createContext as Ne,useContext as He}from"react";var w=Ne(void 0),X=()=>{let e=He(w);if(!e)throw new Error("useThemeSettings must be used within ThemeProviderWrapper");return e};var K="Default",P=e=>typeof e=="object"&&e!==null,Ae=e=>{let t=e==null?void 0:e.trim();if(!t)throw new Error("normalizeThemesInput: preset `id` must be a non-empty.");return t},Ce=(e,t)=>{let r=e==null?void 0:e.trim();return r||t},Be=e=>{if(!P(e)||typeof e.id!="string"||typeof e.label!="string"||!("colorSchemes"in e))return!1;let{colorSchemes:t}=e;return P(t)},$e=(e,t)=>{if(!Be(e))throw new Error(`normalizeThemesInput: invalid ThemePreset shape at index ${t}.`);let r=Ae(e.id),n=Ce(e.label,r),{colorSchemes:i}=e,{light:s,dark:a}=i;if(!P(s))throw new Error("normalizeThemesInput: preset must include colorSchemes.light.");if(!P(a))throw new Error("normalizeThemesInput: preset must include colorSchemes.dark.");return{...e,id:r,label:n,colorSchemes:{light:s,dark:a},meta:{origin:"preset"}}},Le=e=>{let t=new Map,r=new Map;for(let[s,a]of e.entries())t.has(a.id)||t.set(a.id,s),r.set(a.id,a);let n=[...t.keys()],i=[];for(let s of n){let a=r.get(s);a&&i.push(a)}return i},Z=()=>({id:K,label:K,colorSchemes:{light:{},dark:{}},meta:{origin:"custom"}}),O=e=>{if(!e||e.length===0)return[Z()];let t=e.map((r,n)=>$e(r,n));return t.length===0?[Z()]:Le(t)};var J="Default",Fe=e=>({name:e.id,...e.colorSchemes.light}),W=e=>{let t=O(e);return t.length===0?[{name:J}]:t.map(r=>Fe(r))},j=(e,t)=>{let r=[...e!=null?e:[],...t!=null?t:[]];return W(r.length>0?r:void 0)},S=e=>{var t,r;return(r=(t=e[0])==null?void 0:t.name)!=null?r:J},R=(e,t)=>e&&t.some(r=>r.name===e)?e:S(t),q=(e,t)=>e.find(r=>r.name===t),Q=(e,t="system")=>e||t;import{useMemo as I,useSyncExternalStore as Ve}from"react";var p=()=>globalThis.window!==void 0&&globalThis.document!==void 0;var ee="appSettings",c=1,Ge=new Set(["system","auto","light","dark"]),Ue=e=>typeof e=="string"&&Ge.has(e),N=()=>{if(!p()||globalThis.localStorage===void 0)return null;try{let e=globalThis.localStorage.getItem(ee);if(!e)return null;let t=JSON.parse(e),r=Ue(t.darkMode)?t.darkMode:void 0;if(t.version===c){let i=typeof t.themeId=="string"?t.themeId:void 0;return!i&&!r?null:{version:c,themeId:i,darkMode:r}}let n=typeof t.theme=="string"?t.theme:void 0;return!n&&!r?null:{version:c,themeId:n,darkMode:r}}catch(e){return null}},z=e=>{if(!(!p()||globalThis.localStorage===void 0))try{globalThis.localStorage.setItem(ee,JSON.stringify(e))}catch(t){}};var H="appSettings:change",Ye=()=>{let e=N();if(!e)return"";let t=typeof e.themeId=="string"?e.themeId:"",r=typeof e.darkMode=="string"?e.darkMode:"";return`${t}::${r}`},Xe=()=>"",Ke=e=>{if(!p()||typeof globalThis.addEventListener!="function"||typeof globalThis.removeEventListener!="function")return()=>{};let t=()=>{e()};return globalThis.addEventListener(H,t),globalThis.addEventListener("storage",t),()=>{globalThis.removeEventListener(H,t),globalThis.removeEventListener("storage",t)}},te=()=>{!p()||typeof globalThis.dispatchEvent!="function"||typeof globalThis.Event!="function"||globalThis.dispatchEvent(new Event(H))},A=({themes:e,defaultDarkMode:t="light"})=>{let r=I(()=>O(e),[e]),n=I(()=>r.map(d=>({name:d.id,...d.colorSchemes.light})),[r]),i=Ve(Ke,Ye,Xe),[s="",a=""]=i.split("::"),l=R(s||void 0,n),m=Q(a||void 0,t),f=I(()=>r.find(d=>d.id===l)||r[0],[l,r]),x=I(()=>n.find(d=>d.name===l)||n[0],[l,n]);return{theme:l,setTheme:d=>{let u=R(d,n);z({version:c,themeId:u,darkMode:m}),te()},darkMode:m,setDarkMode:d=>{z({version:c,themeId:l,darkMode:d}),te()},presetsSource:r,selectedPreset:f,themesSource:n,selectedTheme:x}};import{Global as Ze,css as Je}from"@emotion/react";import{alpha as oe,useTheme as je}from"@mui/material/styles";import{jsx as qe}from"react/jsx-runtime";var C=({fontFamily:e})=>{let t=je(),r=t.palette.mode==="dark",n=t.palette.primary.main,i=t.palette.text.primary,s=t.palette.background.default,a=t.palette.background.paper,l=oe(t.palette.text.primary,r?.35:.25),m=oe(t.palette.text.primary,r?.55:.45);return qe(Ze,{styles:Je`
|
|
44
|
-
/* Allow application to control font via CSS var or prop */
|
|
45
|
-
:root {
|
|
46
|
-
${e?`--app-font-family: ${e};`:""}
|
|
47
|
-
}
|
|
48
|
-
* {
|
|
49
|
-
font-family:
|
|
50
|
-
var(
|
|
51
|
-
--app-font-family,
|
|
52
|
-
"Mulish",
|
|
53
|
-
system-ui,
|
|
54
|
-
-apple-system,
|
|
55
|
-
"Segoe UI",
|
|
56
|
-
Roboto,
|
|
57
|
-
Arial
|
|
58
|
-
),
|
|
59
|
-
sans-serif !important;
|
|
60
|
-
-webkit-tap-highlight-color: transparent;
|
|
61
|
-
&::selection {
|
|
62
|
-
background-color: ${`${n}e1`};
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
html,
|
|
67
|
-
body,
|
|
68
|
-
#root {
|
|
69
|
-
height: 100%;
|
|
70
|
-
margin: 0;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
:root {
|
|
74
|
-
height: 100%;
|
|
75
|
-
/* default fallback font; apps can override via --app-font-family */
|
|
76
|
-
font-family: var(
|
|
77
|
-
--app-font-family,
|
|
78
|
-
"Mulish",
|
|
79
|
-
system-ui,
|
|
80
|
-
-apple-system,
|
|
81
|
-
"Segoe UI",
|
|
82
|
-
Roboto,
|
|
83
|
-
Arial,
|
|
84
|
-
sans-serif
|
|
85
|
-
)
|
|
86
|
-
sans-serif;
|
|
87
|
-
line-height: 1.5;
|
|
88
|
-
font-weight: 400;
|
|
89
|
-
color-scheme: ${r?"dark":"light"};
|
|
90
|
-
font-synthesis: none;
|
|
91
|
-
text-rendering: optimizeLegibility;
|
|
92
|
-
-webkit-font-smoothing: antialiased;
|
|
93
|
-
-moz-osx-font-smoothing: grayscale;
|
|
94
|
-
-webkit-text-size-adjust: 100%;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
body {
|
|
98
|
-
margin: 0;
|
|
99
|
-
height: 100%;
|
|
100
|
-
overflow: auto;
|
|
101
|
-
touch-action: manipulation;
|
|
102
|
-
background: ${s};
|
|
103
|
-
color: ${i};
|
|
104
|
-
background-attachment: fixed;
|
|
105
|
-
background-size: cover;
|
|
106
|
-
transition: 0.3s background;
|
|
107
|
-
/* Scrollbars: neutral (b2b-friendly) */
|
|
108
|
-
/* Firefox */
|
|
109
|
-
scrollbar-color: ${l} ${s};
|
|
110
|
-
scrollbar-width: thin;
|
|
111
|
-
/* WebKit */
|
|
112
|
-
&::-webkit-scrollbar {
|
|
113
|
-
width: 10px;
|
|
114
|
-
height: 10px;
|
|
115
|
-
}
|
|
116
|
-
&::-webkit-scrollbar-track {
|
|
117
|
-
background: ${s};
|
|
118
|
-
}
|
|
119
|
-
&::-webkit-scrollbar-thumb {
|
|
120
|
-
background-color: ${l};
|
|
121
|
-
border-radius: 999px;
|
|
122
|
-
border: 3px solid ${s};
|
|
123
|
-
background-clip: padding-box;
|
|
124
|
-
}
|
|
125
|
-
&::-webkit-scrollbar-thumb:hover {
|
|
126
|
-
background-color: ${m};
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
a {
|
|
131
|
-
text-decoration: none;
|
|
132
|
-
color: inherit;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
img {
|
|
136
|
-
user-select: none;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
input[type="file"]::-webkit-file-upload-button {
|
|
140
|
-
display: none;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
input[type="datetime-local"]:placeholder-shown {
|
|
144
|
-
color: transparent !important;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
pre {
|
|
148
|
-
padding: 16px;
|
|
149
|
-
border-radius: 18px;
|
|
150
|
-
overflow-x: auto;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
.MuiDialogContent-root,
|
|
154
|
-
.MuiDrawer-paper,
|
|
155
|
-
.customScrollbar,
|
|
156
|
-
textarea {
|
|
157
|
-
/* Firefox */
|
|
158
|
-
scrollbar-color: ${l} ${a};
|
|
159
|
-
scrollbar-width: thin;
|
|
160
|
-
/* WebKit */
|
|
161
|
-
&::-webkit-scrollbar {
|
|
162
|
-
width: 10px;
|
|
163
|
-
height: 10px;
|
|
164
|
-
}
|
|
165
|
-
&::-webkit-scrollbar-track {
|
|
166
|
-
background: ${a};
|
|
167
|
-
}
|
|
168
|
-
&::-webkit-scrollbar-thumb {
|
|
169
|
-
background-color: ${l};
|
|
170
|
-
border-radius: 999px;
|
|
171
|
-
border: 3px solid ${a};
|
|
172
|
-
background-clip: padding-box;
|
|
173
|
-
}
|
|
174
|
-
&::-webkit-scrollbar-thumb:hover {
|
|
175
|
-
background-color: ${m};
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/* react-spring-bottom-sheet styles */
|
|
180
|
-
div[role="dialog"] {
|
|
181
|
-
z-index: 9999;
|
|
182
|
-
}
|
|
183
|
-
`})};import{alpha as B}from"@mui/material/styles";import{alpha as Qe}from"@mui/material/styles";var re=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}),Oo=(e,t)=>Qe(e.palette.text.primary,t);var et={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=re(e);return{color:t.textPrimary,"& fieldset":{borderColor:B(t.textPrimary,.16)},"&:hover fieldset":{borderColor:B(t.textPrimary,.28)},"&.Mui-focused fieldset":{borderColor:e.palette.primary.main}}}}},MuiInputLabel:{styleOverrides:{root:({theme:e})=>({color:B(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 tt}from"@mui/material/styles";var $=(e,t)=>{let{background:r,palette:n,...i}=e,s=r==null?void 0:r[t],a={...n,mode:t};return(s||n!=null&&n.background)&&(a.background={...n==null?void 0:n.background,...s}),tt({...i,palette:a})};import{useEffect as ot,useState as rt}from"react";var nt=(e=768)=>{let[t,r]=rt(!1);return ot(()=>{if(!p())return()=>{};let n=()=>{r(window.innerWidth<e)};n();let i=()=>n();return window.addEventListener("resize",i),()=>{window.removeEventListener("resize",i)}},[e]),t};import{useSyncExternalStore as it}from"react";var st=()=>!p()||typeof globalThis.matchMedia!="function"?"unknown":globalThis.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light",at=()=>"unknown",lt=e=>{if(!p()||typeof globalThis.matchMedia!="function")return()=>{};let t=globalThis.matchMedia("(prefers-color-scheme: dark)");if(typeof t.addEventListener!="function")return()=>{};let r=()=>{e()};return t.addEventListener("change",r),()=>{t.removeEventListener("change",r)}},L=()=>it(lt,st,at);var Yo=e=>/^#([\dA-Fa-f]{3}|[\dA-Fa-f]{6})$/.test(e);var Ko=()=>{let e=new Date().getHours();return e>=5&&e<12?"Good morning":e>12&&e<18?"Good afternoon":"Good evening"};var Jo=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 mt=()=>{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"},dt=()=>{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"},qo={os:typeof navigator=="undefined"?"Unknown":mt(),browser:typeof navigator=="undefined"?"Unknown":dt()};var ne=(e,t)=>{switch(e){case"light":return!1;case"dark":return!0;case"system":case"auto":return t==="dark";default:return!1}};var tr=(e,t)=>{let r=t!=null?t:typeof navigator=="undefined"?"en-US":navigator.language,n=new Date;e=new Date(e);let i=Math.floor((n.getTime()-e.getTime())/1e3),s=new Intl.RelativeTimeFormat(r,{numeric:"auto"});if(i<60)return s.format(-i,"second");if(i<3600){let l=Math.floor(i/60);return s.format(-l,"minute")}if(i<86400){let l=Math.floor(i/3600);return s.format(-l,"hour")}let a=Math.floor(i/86400);return s.format(-a,"day")},or=(e,t)=>{let r=t!=null?t:typeof navigator=="undefined"?"en-US":navigator.language,n=new Date;e=new Date(e);let i=(e.getTime()-n.getTime())/1e3,s=Math.floor(i/(60*60)),a=Math.floor((i-60*60*s)/60),l=Math.floor(i-60*60*s-60*a),m=new Intl.RelativeTimeFormat(r,{numeric:"auto"});if(a===0&&l<60)return m.format(l,"second");if(s===0&&a<60)return m.format(a,"minute");if(s<24){let x=`${new Intl.RelativeTimeFormat(r,{numeric:"auto"}).format(s,"hour")}`,b=` ${new Intl.RelativeTimeFormat(r,{localeMatcher:"lookup",numeric:"always",style:"long"}).format(a,"minute")}`.replace(/^\D+/,"");return`${x} ${b}`}let f=Math.floor(l/86400);return m.format(f,"day")};var F=(e,t)=>ne(e,t)?"dark":"light";var G=(e,t)=>{var r;return(r=e.colorSchemes[t])!=null?r:e.colorSchemes.light};var o=e=>`${e/16}rem`,pt={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"}}},ht={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 cr=e=>{var n,i,s,a;let t=[],{palette:r}=e;return r?((n=r.background)!=null&&n.default||t.push("palette.background.default is missing."),(i=r.background)!=null&&i.paper||t.push("palette.background.paper is missing."),(s=r.text)!=null&&s.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 h}from"@emotion/react";var xr=h`
|
|
184
|
-
from {
|
|
185
|
-
opacity: 0;
|
|
186
|
-
transform: translateX(-40px);
|
|
187
|
-
}
|
|
188
|
-
to {
|
|
189
|
-
opacity: 1;
|
|
190
|
-
transform: translateX(0);
|
|
191
|
-
}
|
|
192
|
-
`,br=h`
|
|
193
|
-
from {
|
|
194
|
-
opacity: 0;
|
|
195
|
-
}
|
|
196
|
-
to {
|
|
197
|
-
opacity: 1;
|
|
198
|
-
}
|
|
199
|
-
`,yr=h`
|
|
200
|
-
from {
|
|
201
|
-
transform: translateX(-100%);
|
|
202
|
-
}
|
|
203
|
-
to {
|
|
204
|
-
transform: translateX(0);
|
|
205
|
-
}
|
|
206
|
-
`,Sr=h`
|
|
207
|
-
from {
|
|
208
|
-
transform: translateY(100%);
|
|
209
|
-
}
|
|
210
|
-
to {
|
|
211
|
-
transform: translateY(0);
|
|
212
|
-
}
|
|
213
|
-
`,Tr=h`
|
|
214
|
-
from {
|
|
215
|
-
transform: scale(0);
|
|
216
|
-
}
|
|
217
|
-
to {
|
|
218
|
-
transform: scale(1);
|
|
219
|
-
}
|
|
220
|
-
`,_r=(e,t=12)=>h`
|
|
221
|
-
0% {
|
|
222
|
-
transform: scale(0.95);
|
|
223
|
-
box-shadow: 0 0 0 0 ${e}b2;
|
|
224
|
-
}
|
|
225
|
-
70% {
|
|
226
|
-
transform: scale(1);
|
|
227
|
-
box-shadow: 0 0 0 ${t}px ${e}00;
|
|
228
|
-
}
|
|
229
|
-
100% {
|
|
230
|
-
transform: scale(0.95);
|
|
231
|
-
box-shadow: 0 0 0 0 ${e}00;
|
|
232
|
-
}
|
|
233
|
-
`,kr=e=>h`
|
|
234
|
-
0% {
|
|
235
|
-
filter: none;
|
|
236
|
-
}
|
|
237
|
-
50% {
|
|
238
|
-
filter: drop-shadow(0 0 10px ${e}78);
|
|
239
|
-
}
|
|
240
|
-
100% {
|
|
241
|
-
filter: none;
|
|
242
|
-
}
|
|
243
|
-
`,vr=h`
|
|
244
|
-
0% {
|
|
245
|
-
transform: scale(1);
|
|
246
|
-
opacity: 1;
|
|
247
|
-
}
|
|
248
|
-
50% {
|
|
249
|
-
transform: scale(0.9) translateX(-2px);
|
|
250
|
-
opacity: 0.7;
|
|
251
|
-
}
|
|
252
|
-
100% {
|
|
253
|
-
transform: scale(1);
|
|
254
|
-
opacity: 1;
|
|
255
|
-
}
|
|
256
|
-
`,Mr=h`
|
|
257
|
-
0% {
|
|
258
|
-
transform: translateY(0);
|
|
259
|
-
}
|
|
260
|
-
30% {
|
|
261
|
-
transform: translateY(-5px);
|
|
262
|
-
}
|
|
263
|
-
50% {
|
|
264
|
-
transform: translateY(2px);
|
|
265
|
-
}
|
|
266
|
-
70% {
|
|
267
|
-
transform: translateY(-2px);
|
|
268
|
-
}
|
|
269
|
-
100% {
|
|
270
|
-
transform: translateY(0);
|
|
271
|
-
}
|
|
272
|
-
`;import{jsx as ie,jsxs as ut}from"react/jsx-runtime";var ct=({children:e,fontFamily:t,themes:r,darkMode:n})=>{let i=L(),{theme:s,setTheme:a,darkMode:l,setDarkMode:m,themesSource:f,selectedTheme:x,selectedPreset:b}=A({themes:r,defaultDarkMode:n}),_=n!=null?n:l,d=T(()=>n?()=>{}:m,[n,m]),u=T(()=>F(_,i),[_,i]),U=T(()=>G(b,u),[b,u]),se=T(()=>$(U,u),[U,u]),ae=T(()=>S(f),[f]);return ie(w.Provider,{value:{theme:s,darkMode:_,setTheme:a,setDarkMode:d,themes:f,selectedTheme:x,defaultThemeName:ae},children:ut(ft,{theme:se,children:[ie(C,{fontFamily:t}),e]})})};export{c as APP_SETTINGS_VERSION,ue as DialogBtn,D as ErrorBoundary,C as GlobalStyles,ve as Loading,ze as PathName,ct as ThemeProviderWrapper,Oo as alphaText,$ as buildMuiTheme,p as canUseDom,et as commonComponentProps,Re as darkModeOptions,Ko as displayGreeting,le as editorialClassic,br as fadeIn,xr as fadeInLeft,dt as getBrowser,Jo as getDayIdentifier,mt as getOperatingSystem,re as getSurfaceTokens,Mr as installAppAnimation,ne as isDarkMode,Yo as isHexColor,vr as logoutAnimation,j as mergeThemes,me as modernMinimal,pt as muiTypography,de as neoGlass,W as normalizeThemes,kr as progressPulse,_r as pulseAnimation,N as readAppSettings,S as resolveDefaultThemeName,F as resolveEffectiveMode,q as resolveThemeById,pe as retroTerminal,Tr as scale,G as selectThemeOptions,yr as slideIn,Sr as slideInBottom,qo as systemInfo,tr as timeAgo,or as timeAgoFromStart,ht as typographyVariants,nt as useResponsiveDisplay,L as useSystemTheme,X as useThemeSettings,cr as validateSchemeTokens,he as warmEarth,z as writeAppSettings};
|
|
273
|
-
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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. </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 { DarkModeOptions } from \"@/models\";\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 * Forces dark mode regardless of persisted settings and system preference.\n * When set, `setDarkMode` becomes a no-op.\n */\n darkMode?: DarkModeOptions;\n}>;\n\nexport const ThemeProviderWrapper: FC<ThemeProviderWrapperProps> = ({\n children,\n fontFamily,\n themes,\n darkMode: darkModeProp,\n}) => {\n const systemTheme = useSystemTheme();\n const {\n theme,\n setTheme,\n darkMode: persistedDarkMode,\n setDarkMode: setPersistedDarkMode,\n themesSource,\n selectedTheme,\n selectedPreset,\n } = usePersistedAppSettings({ themes, defaultDarkMode: darkModeProp });\n\n const darkMode = darkModeProp ?? persistedDarkMode;\n const setDarkMode = useMemo(\n () => (darkModeProp ? () => {} : setPersistedDarkMode),\n [darkModeProp, setPersistedDarkMode],\n );\n\n const effectiveMode = useMemo(\n () => resolveEffectiveMode(darkMode, systemTheme),\n [darkMode, systemTheme],\n );\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.keys()];\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 { useMemo, useSyncExternalStore } from \"react\";\n\nimport { normalizeThemesInput } from \"@/utils/normalizeThemes\";\nimport { canUseDom } from \"@/utils/ssr\";\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 APP_SETTINGS_CHANGE_EVENT = \"appSettings:change\";\n\ninterface Props {\n themes?: ThemesInput;\n defaultDarkMode?: DarkModeOptions;\n}\n\ninterface ReturnValue {\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\nconst getSettingsSnapshot = (): string => {\n const stored = readAppSettings();\n if (!stored) return \"\";\n\n const themeId = typeof stored.themeId === \"string\" ? stored.themeId : \"\";\n const darkMode = typeof stored.darkMode === \"string\" ? stored.darkMode : \"\";\n return `${themeId}::${darkMode}`;\n};\n\nconst getServerSnapshot = (): string => \"\";\n\nconst subscribe = (onStoreChange: () => void): (() => void) => {\n if (\n !canUseDom() ||\n typeof globalThis.addEventListener !== \"function\" ||\n typeof globalThis.removeEventListener !== \"function\"\n ) {\n return () => {};\n }\n\n const onChange = () => {\n onStoreChange();\n };\n\n globalThis.addEventListener(APP_SETTINGS_CHANGE_EVENT, onChange);\n globalThis.addEventListener(\"storage\", onChange);\n return () => {\n globalThis.removeEventListener(APP_SETTINGS_CHANGE_EVENT, onChange);\n globalThis.removeEventListener(\"storage\", onChange);\n };\n};\n\nconst notify = (): void => {\n if (\n !canUseDom() ||\n typeof globalThis.dispatchEvent !== \"function\" ||\n typeof globalThis.Event !== \"function\"\n ) {\n return;\n }\n\n globalThis.dispatchEvent(new Event(APP_SETTINGS_CHANGE_EVENT));\n};\n\nexport const usePersistedAppSettings = ({\n themes,\n defaultDarkMode = \"light\",\n}: Props): ReturnValue => {\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\n const settingsSnapshot = useSyncExternalStore(\n subscribe,\n getSettingsSnapshot,\n getServerSnapshot,\n );\n const [storedThemeId = \"\", storedDarkMode = \"\"] =\n settingsSnapshot.split(\"::\");\n\n const theme = resolveThemeName(storedThemeId || undefined, themesSource);\n const darkMode = resolveDarkMode(\n (storedDarkMode || undefined) as DarkModeOptions | undefined,\n defaultDarkMode,\n );\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 const setTheme = (nextTheme: string) => {\n const resolvedThemeId = resolveThemeName(nextTheme, themesSource);\n writeAppSettings({\n version: APP_SETTINGS_VERSION,\n themeId: resolvedThemeId,\n darkMode,\n });\n notify();\n };\n\n const setDarkMode = (mode: DarkModeOptions) => {\n writeAppSettings({\n version: APP_SETTINGS_VERSION,\n themeId: theme,\n darkMode: mode,\n });\n notify();\n };\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 { alpha, 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 const scrollbarThumb = alpha(\n theme.palette.text.primary,\n isDarkMode ? 0.35 : 0.25,\n );\n const scrollbarThumbHover = alpha(\n theme.palette.text.primary,\n isDarkMode ? 0.55 : 0.45,\n );\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 /* Scrollbars: neutral (b2b-friendly) */\n /* Firefox */\n scrollbar-color: ${scrollbarThumb} ${backgroundDefault};\n scrollbar-width: thin;\n /* WebKit */\n &::-webkit-scrollbar {\n width: 10px;\n height: 10px;\n }\n &::-webkit-scrollbar-track {\n background: ${backgroundDefault};\n }\n &::-webkit-scrollbar-thumb {\n background-color: ${scrollbarThumb};\n border-radius: 999px;\n border: 3px solid ${backgroundDefault};\n background-clip: padding-box;\n }\n &::-webkit-scrollbar-thumb:hover {\n background-color: ${scrollbarThumbHover};\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: ${scrollbarThumb} ${backgroundPaper};\n scrollbar-width: thin;\n /* WebKit */\n &::-webkit-scrollbar {\n width: 10px;\n height: 10px;\n }\n &::-webkit-scrollbar-track {\n background: ${backgroundPaper};\n }\n &::-webkit-scrollbar-thumb {\n background-color: ${scrollbarThumb};\n border-radius: 999px;\n border: 3px solid ${backgroundPaper};\n background-clip: padding-box;\n }\n &::-webkit-scrollbar-thumb:hover {\n background-color: ${scrollbarThumbHover};\n }\n }\n\n /* react-spring-bottom-sheet styles */\n div[role=\"dialog\"] {\n z-index: 9999;\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 { useSyncExternalStore } from \"react\";\n\nimport { canUseDom } from \"@/utils/ssr\";\n\nimport type { SystemTheme } from \"@/models\";\n\nconst getSnapshot = (): SystemTheme => {\n if (!canUseDom() || typeof globalThis.matchMedia !== \"function\") {\n return \"unknown\";\n }\n\n return globalThis.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n};\n\nconst getServerSnapshot = (): SystemTheme => \"unknown\";\n\nconst subscribe = (onStoreChange: () => void): (() => void) => {\n if (!canUseDom() || typeof globalThis.matchMedia !== \"function\") {\n return () => {};\n }\n\n const prefersDarkScheme = globalThis.matchMedia(\n \"(prefers-color-scheme: dark)\",\n );\n\n if (typeof prefersDarkScheme.addEventListener !== \"function\") {\n return () => {};\n }\n\n const onChange = () => {\n onStoreChange();\n };\n\n prefersDarkScheme.addEventListener(\"change\", onChange);\n return () => {\n prefersDarkScheme.removeEventListener(\"change\", onChange);\n };\n};\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 useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\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":"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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","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","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","useMemo","useSyncExternalStore","canUseDom","APP_SETTINGS_KEY","APP_SETTINGS_VERSION","DARK_MODE_OPTIONS","isDarkModeOption","value","readAppSettings","canUseDom","storedRaw","parsed","darkMode","themeId","legacyTheme","writeAppSettings","settings","e","APP_SETTINGS_CHANGE_EVENT","getSettingsSnapshot","stored","readAppSettings","themeId","darkMode","getServerSnapshot","subscribe","onStoreChange","canUseDom","onChange","notify","usePersistedAppSettings","themes","defaultDarkMode","presetsSource","useMemo","normalizeThemesInput","themesSource","preset","settingsSnapshot","useSyncExternalStore","storedThemeId","storedDarkMode","theme","resolveThemeName","resolveDarkMode","selectedPreset","selectedTheme","t","nextTheme","resolvedThemeId","writeAppSettings","APP_SETTINGS_VERSION","mode","Global","css","alpha","useTheme","jsx","GlobalStyles","fontFamily","theme","isDarkMode","primaryColor","textColor","backgroundDefault","backgroundPaper","scrollbarThumb","scrollbarThumbHover","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","useSyncExternalStore","getSnapshot","canUseDom","getServerSnapshot","subscribe","onStoreChange","prefersDarkScheme","onChange","useSystemTheme","useSyncExternalStore","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","darkModeProp","systemTheme","useSystemTheme","theme","setTheme","persistedDarkMode","setPersistedDarkMode","themesSource","selectedTheme","selectedPreset","usePersistedAppSettings","darkMode","setDarkMode","useMemo","effectiveMode","resolveEffectiveMode","selectedOptions","selectThemeOptions","muiTheme","buildMuiTheme","defaultThemeName","resolveDefaultThemeName","ThemeContext","MuiThemeProvider","GlobalStyles"]}
|
package/dist/presets/index.d.mts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { a as ThemePreset } from '../typography-Dq0wCojD.mjs';
|
|
2
|
-
import '@mui/material/styles';
|
|
3
|
-
import 'react';
|
|
4
|
-
|
|
5
|
-
declare const editorialClassic: ThemePreset;
|
|
6
|
-
|
|
7
|
-
declare const modernMinimal: ThemePreset;
|
|
8
|
-
|
|
9
|
-
declare const neoGlass: ThemePreset;
|
|
10
|
-
|
|
11
|
-
declare const retroTerminal: ThemePreset;
|
|
12
|
-
|
|
13
|
-
declare const warmEarth: ThemePreset;
|
|
14
|
-
|
|
15
|
-
declare const defaultThemes: ThemePreset[];
|
|
16
|
-
|
|
17
|
-
export { ThemePreset, defaultThemes, editorialClassic, modernMinimal, neoGlass, retroTerminal, warmEarth };
|