@atomazing-org/design-system 1.0.13 → 1.0.15
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/README.MD +166 -127
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +9 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.MD
CHANGED
|
@@ -3,204 +3,243 @@
|
|
|
3
3
|
1. [Introduction](#1-introduction)
|
|
4
4
|
2. [Installation](#2-installation)
|
|
5
5
|
3. [Usage](#3-usage)
|
|
6
|
-
3.1 [
|
|
7
|
-
3.2 [
|
|
8
|
-
3.3 [
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
5. [Animations](#5-animations)
|
|
14
|
-
6. [Theming](#6-theming)
|
|
15
|
-
6.1 [Theme Creation](#61-theme-creation)
|
|
16
|
-
6.2 [Dark Mode Strategy](#62-dark-mode-strategy)
|
|
17
|
-
7. [Typography Configuration](#7-typography-configuration)
|
|
18
|
-
8. [Contributing](#8-contributing)
|
|
19
|
-
9. [License](#9-license)
|
|
6
|
+
3.1 [ThemeProvider Setup](#31-themeprovider-setup)
|
|
7
|
+
3.2 [Switching Theme Mode (Light/Dark)](#34-switching-theme-mode-lightdark)
|
|
8
|
+
3.3 [Custom Theme Colors](#35-custom-theme-colors)
|
|
9
|
+
4. [Peer Dependencies & Requirements](#4-peer-dependencies--requirements)
|
|
10
|
+
5. [Utilities](#5-utilities)
|
|
11
|
+
5.1 [Color Utilities](#51-color-utilities)
|
|
12
|
+
5.2 [System Info](#52-system-info)
|
|
20
13
|
|
|
21
14
|
## 1. Introduction
|
|
22
15
|
|
|
23
|
-
**@atomazing-org/design-system** is a
|
|
24
|
-
It offers a consistent foundation for building modern web interfaces with minimal configuration.
|
|
16
|
+
**@atomazing-org/design-system** is a flexible, modern, and themeable design system built on top of [Material UI (MUI)](https://mui.com/) and [Emotion](https://emotion.sh/).
|
|
25
17
|
|
|
26
|
-
|
|
18
|
+
It provides a unified approach to building consistent, responsive, and accessible UIs across multiple frontend applications — with minimal setup and full customizability.
|
|
27
19
|
|
|
28
|
-
|
|
29
|
-
- ✍️ Extended typography variants
|
|
30
|
-
- 🎨 Global styles (with dark/light mode support)
|
|
31
|
-
- 🧩 Component style overrides
|
|
32
|
-
- 🛠 Utility functions (e.g., color contrast, system info)
|
|
33
|
-
- 🎞 Smooth keyframe animations
|
|
20
|
+
### 🔧 What’s Included
|
|
34
21
|
|
|
35
|
-
|
|
22
|
+
- 🌈 **Custom MUI Theme Generator**
|
|
23
|
+
Create light/dark themes with primary/background colors in a single line.
|
|
24
|
+
|
|
25
|
+
- ✍️ **Extended Typography Variants**
|
|
26
|
+
Includes consistent, scalable font sizes and weights beyond MUI defaults.
|
|
27
|
+
|
|
28
|
+
- 🎨 **Global Styles**
|
|
29
|
+
Applies CSS resets, adaptive contrast, scrollbar styling, and system theming.
|
|
30
|
+
|
|
31
|
+
- 🧩 **Component Style Overrides**
|
|
32
|
+
Predefined visual rules for MUI components like buttons, dialogs, sliders, etc.
|
|
33
|
+
|
|
34
|
+
- 🛠 **Utility Functions**
|
|
35
|
+
Helpful tools like color contrast calculation, system info detection, and dark mode strategy.
|
|
36
|
+
|
|
37
|
+
- 🎞 **Predefined Animations**
|
|
38
|
+
Keyframes for transitions like fade, slide, pulse, and more.
|
|
39
|
+
|
|
40
|
+
### 🚀 When to Use
|
|
41
|
+
|
|
42
|
+
Use this design system when:
|
|
43
|
+
|
|
44
|
+
- You’re building apps that require a **consistent design language**.
|
|
45
|
+
- You want to **save time on theming and component styling**.
|
|
46
|
+
- You work across multiple projects and need **reusable design tokens**.
|
|
47
|
+
- You want **dark mode support**, animations, and global styles out of the box.
|
|
48
|
+
|
|
49
|
+
This package is ideal for both small projects and large enterprise frontends looking to maintain style consistency and speed up delivery.
|
|
50
|
+
|
|
51
|
+
---
|
|
36
52
|
|
|
37
53
|
## 2. Installation
|
|
38
54
|
|
|
39
|
-
To install
|
|
55
|
+
To install `@atomazing-org/design-system`, use your preferred package manager:
|
|
40
56
|
|
|
41
57
|
```bash
|
|
42
|
-
#
|
|
58
|
+
# npm
|
|
43
59
|
npm install @atomazing-org/design-system
|
|
44
60
|
```
|
|
45
61
|
|
|
46
62
|
```bash
|
|
47
|
-
#
|
|
63
|
+
# yarn
|
|
48
64
|
yarn add @atomazing-org/design-system
|
|
49
65
|
```
|
|
50
66
|
|
|
51
67
|
```bash
|
|
52
|
-
#
|
|
68
|
+
# pnpm
|
|
53
69
|
pnpm add @atomazing-org/design-system
|
|
54
70
|
```
|
|
55
71
|
|
|
72
|
+
> **Note:** This package includes only the core functionality.
|
|
73
|
+
> You must also install the required **peer dependencies** to ensure proper integration with MUI and Emotion.
|
|
56
74
|
|
|
57
|
-
## 3.
|
|
58
|
-
|
|
59
|
-
The `@atomazing-org/design-system` package relies on several peer dependencies to integrate properly with your application stack.
|
|
75
|
+
## 3. Usage
|
|
60
76
|
|
|
61
|
-
|
|
77
|
+
This section describes how to use the design system in your application, including theme setup, global styles, switching between light and dark modes, and accessing theme context via a custom hook.
|
|
62
78
|
|
|
63
|
-
|
|
64
|
-
|----------------------|------------------|-------------------------------------|
|
|
65
|
-
| `@mui/material` | `^7.2.0` | Core MUI theming and components |
|
|
66
|
-
| `@mui/icons-material`| `^7.2.0` | Icon support |
|
|
67
|
-
| `@emotion/react` | `^11.0.0` | Emotion styling engine (required) |
|
|
68
|
-
| `@emotion/styled` | `^11.0.0` | Styled components with Emotion |
|
|
69
|
-
| `@emotion/css` | `^11.13.5` | (Optional) Raw className utility |
|
|
79
|
+
### 3.1 ThemeProvider Setup
|
|
70
80
|
|
|
71
|
-
|
|
81
|
+
To enable theming, wrap your application with the `ThemeProviderWrapper` provided by `@atomazing-org/design-system`.
|
|
82
|
+
This wrapper handles theme creation, dark mode toggling, system preferences, and context setup — all out of the box.
|
|
72
83
|
|
|
73
|
-
|
|
74
|
-
|
|
84
|
+
```tsx
|
|
85
|
+
import { GlobalStyles, ThemeProviderWrapper } from '@atomazing-org/design-system';
|
|
75
86
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
87
|
+
export const App = () => (
|
|
88
|
+
<ThemeProviderWrapper>
|
|
89
|
+
<GlobalStyles />
|
|
90
|
+
{/* Your application content */}
|
|
91
|
+
</ThemeProviderWrapper>
|
|
92
|
+
);
|
|
79
93
|
```
|
|
80
94
|
|
|
81
|
-
|
|
95
|
+
### 🔍 Key Notes
|
|
82
96
|
|
|
83
|
-
|
|
97
|
+
- `ThemeProviderWrapper` abstracts away the creation and management of the MUI theme.
|
|
98
|
+
- It provides built-in support for dark mode, system preferences, and the `useAppThemeProvider` hook.
|
|
99
|
+
- `GlobalStyles` ensures base UI styles adapt to the current theme.
|
|
100
|
+
- Place the wrapper as high in the component tree as possible to ensure theme availability across the app.
|
|
84
101
|
|
|
85
|
-
###
|
|
86
|
-
- Dynamically generate MUI themes using custom primary and secondary colors.
|
|
87
|
-
- Supports light, dark, system, and auto modes.
|
|
88
|
-
- Automatically adapts based on background contrast.
|
|
102
|
+
### 3.2 Switching Theme Mode (Light/Dark)
|
|
89
103
|
|
|
90
|
-
|
|
91
|
-
- Global style customizations for common MUI components (e.g. `Button`, `Tooltip`, `Dialog`, `Slider`).
|
|
92
|
-
- Shared defaults to ensure consistent spacing, border-radius, shadows, and blur effects.
|
|
104
|
+
The design system includes a built-in hook — `useThemeSettings()` — to manage theme mode and apply it consistently across your app.
|
|
93
105
|
|
|
94
|
-
|
|
95
|
-
-
|
|
96
|
-
-
|
|
97
|
-
-
|
|
106
|
+
It supports four modes out of the box:
|
|
107
|
+
- `light`
|
|
108
|
+
- `dark`
|
|
109
|
+
- `system` — matches the user’s OS-level preference
|
|
110
|
+
- `auto` — determines best contrast based on theme background
|
|
98
111
|
|
|
99
|
-
|
|
100
|
-
- Applies global CSS resets and base styles (scrollbars, font, highlight colors).
|
|
101
|
-
- Reacts to theme mode (`light` or `dark`) to dynamically adjust UI contrast.
|
|
102
|
-
- Uses Emotion’s `<Global />` component under the hood.
|
|
112
|
+
#### 🧩 Example: Custom Toggle with Options
|
|
103
113
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
114
|
+
```tsx
|
|
115
|
+
import {
|
|
116
|
+
useThemeSettings,
|
|
117
|
+
themes,
|
|
118
|
+
} from '@atomazing-org/design-system';
|
|
107
119
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
120
|
+
const { darkMode, setDarkMode } = useThemeSettings();
|
|
121
|
+
|
|
122
|
+
<CustomRadioGroup
|
|
123
|
+
options={[
|
|
124
|
+
{ label: 'Auto', value: 'auto' },
|
|
125
|
+
{ label: 'System', value: 'system' },
|
|
126
|
+
{ label: 'Light', value: 'light' },
|
|
127
|
+
{ label: 'Dark', value: 'dark' },
|
|
128
|
+
]}
|
|
129
|
+
value={darkMode}
|
|
130
|
+
onChange={val => setDarkMode(val)}
|
|
131
|
+
/>
|
|
132
|
+
```
|
|
112
133
|
|
|
113
|
-
---
|
|
114
134
|
|
|
115
|
-
|
|
135
|
+
### 3.3 Custom Theme Colors
|
|
116
136
|
|
|
117
|
-
|
|
137
|
+
The design system allows you to create and switch between custom color themes using the `createCustomTheme()` function internally via `ThemeProviderWrapper`.
|
|
118
138
|
|
|
119
|
-
|
|
139
|
+
You can define as many themes as needed by specifying:
|
|
140
|
+
- `primaryColor`: main branding color
|
|
141
|
+
- `secondaryColor` (optional): used for background and surface elements
|
|
120
142
|
|
|
121
|
-
|
|
143
|
+
#### 🎨 Example: Theme Definitions
|
|
122
144
|
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
145
|
+
```ts
|
|
146
|
+
export const themeConfig = {
|
|
147
|
+
BPM: {
|
|
148
|
+
primaryColor: '#203959',
|
|
149
|
+
secondaryColor: '#ffffff',
|
|
150
|
+
},
|
|
151
|
+
Lanit: {
|
|
152
|
+
primaryColor: '#33ccff',
|
|
153
|
+
secondaryColor: '#f7f7f7',
|
|
154
|
+
},
|
|
155
|
+
"Dark Purple": {
|
|
156
|
+
primaryColor: '#b624ff',
|
|
157
|
+
},
|
|
158
|
+
"Light Orange": {
|
|
159
|
+
primaryColor: '#F26E56',
|
|
160
|
+
secondaryColor: '#F6F6F6',
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
```
|
|
127
164
|
|
|
128
|
-
|
|
129
|
-
createCustomTheme,
|
|
130
|
-
GlobalStyles,
|
|
131
|
-
} from '@atomazing-org/design-system';
|
|
165
|
+
## 4. Peer Dependencies & Requirements
|
|
132
166
|
|
|
133
|
-
|
|
167
|
+
The `@atomazing-org/design-system` package is built on top of [Material UI v7](https://mui.com/) and [Emotion](https://emotion.sh/) and requires the following peer dependencies to be present in your project.
|
|
134
168
|
|
|
135
|
-
|
|
169
|
+
Install them manually if not already included:
|
|
136
170
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
171
|
+
### 📦 Required Peer Dependencies
|
|
172
|
+
|
|
173
|
+
| Package | Version | Purpose |
|
|
174
|
+
|----------------------------|------------|-----------------------------------------|
|
|
175
|
+
| `@mui/material` | ^7.0.0 | Core MUI components and theming |
|
|
176
|
+
| `@mui/icons-material` | ^7.0.0 | MUI icon set |
|
|
177
|
+
| `@emotion/react` | ^11.0.0 | Emotion’s core rendering runtime |
|
|
178
|
+
| `@emotion/styled` | ^11.0.0 | Styled components engine |
|
|
179
|
+
| `@emotion/css` | ^11.0.0 | (Optional) For raw CSS class generation |
|
|
180
|
+
|
|
181
|
+
You can install all required peers with:
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
npm install @mui/material @mui/icons-material @emotion/react @emotion/styled @emotion/css
|
|
144
185
|
```
|
|
145
186
|
|
|
146
|
-
##
|
|
187
|
+
## 5. Utilities
|
|
147
188
|
|
|
148
|
-
The design system
|
|
189
|
+
The design system includes a collection of lightweight, framework-agnostic utility functions and hooks to support theming, contrast handling, and device detection.
|
|
149
190
|
|
|
150
|
-
|
|
191
|
+
---
|
|
151
192
|
|
|
152
|
-
|
|
193
|
+
### 5.1 Color Utilities
|
|
153
194
|
|
|
154
|
-
|
|
155
|
-
import { createCustomTheme } from '@atomazing-org/design-system';
|
|
195
|
+
#### 🎯 `getFontColor(backgroundColor: string): string`
|
|
156
196
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
);
|
|
197
|
+
Returns the best readable font color (`dark` or `light`) based on the background brightness.
|
|
198
|
+
|
|
199
|
+
```ts
|
|
200
|
+
const textColor = getFontColor('#ffffff'); // → "#101727" (dark)
|
|
162
201
|
```
|
|
163
202
|
|
|
164
|
-
|
|
203
|
+
- Accepts any valid hex color (`#fff`, `#ffffff`)
|
|
204
|
+
- Automatically expands short hex (`#abc` → `#aabbcc`)
|
|
205
|
+
- Uses WCAG-recommended brightness formula
|
|
206
|
+
- Returns fallback (`fontDark`) if invalid color
|
|
165
207
|
|
|
166
|
-
|
|
208
|
+
This is useful for generating accessible dynamic UI colors — especially in theme builders or color pickers.
|
|
167
209
|
|
|
168
|
-
|
|
210
|
+
---
|
|
169
211
|
|
|
170
|
-
###
|
|
212
|
+
### 5.2 System Info
|
|
171
213
|
|
|
172
|
-
|
|
214
|
+
#### 🧩 `systemInfo: { os: OperatingSystem; browser: Browser }`
|
|
173
215
|
|
|
174
|
-
|
|
175
|
-
// ✅ Recommended (tree-shakable)
|
|
176
|
-
import { fadeIn, getFontColor } from '@atomazing-org/design-system';
|
|
216
|
+
Detects the user's operating system and browser at runtime based on the `navigator.userAgent`.
|
|
177
217
|
|
|
178
|
-
|
|
179
|
-
|
|
218
|
+
```ts
|
|
219
|
+
console.log(systemInfo.os); // "macOS" | "Windows" | "Linux" | ...
|
|
220
|
+
console.log(systemInfo.browser); // "Chrome" | "Safari" | ...
|
|
180
221
|
```
|
|
181
222
|
|
|
182
|
-
|
|
223
|
+
> Uses lightweight string matching for compatibility across most modern devices.
|
|
183
224
|
|
|
184
|
-
|
|
225
|
+
#### 🌓 `useSystemTheme(): 'light' | 'dark' | 'unknown'`
|
|
185
226
|
|
|
186
|
-
|
|
227
|
+
React hook that listens for system-level theme changes.
|
|
187
228
|
|
|
188
|
-
|
|
229
|
+
```ts
|
|
230
|
+
const systemTheme = useSystemTheme();
|
|
189
231
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
npm install
|
|
232
|
+
useEffect(() => {
|
|
233
|
+
console.log('System prefers:', systemTheme);
|
|
234
|
+
}, [systemTheme]);
|
|
194
235
|
```
|
|
195
236
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
You are free to use, modify, distribute, and sublicense the design system in your projects, whether personal or commercial.
|
|
237
|
+
- Responds to changes in `(prefers-color-scheme)`
|
|
238
|
+
- Automatically updates the value when system settings are changed
|
|
239
|
+
- Useful for defaulting UI themes before user makes a selection
|
|
201
240
|
|
|
202
241
|
---
|
|
203
242
|
|
|
204
|
-
|
|
205
|
-
|
|
243
|
+
These utilities are tree-shakable and can be used independently of the rest of the design system.
|
|
244
|
+
|
|
206
245
|
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var ke=Object.create;var b=Object.defineProperty;var Te=Object.getOwnPropertyDescriptor;var we=Object.getOwnPropertyNames;var ve=Object.getPrototypeOf,Me=Object.prototype.hasOwnProperty;var Se=(e,r)=>{for(var t in r)b(e,t,{get:r[t],enumerable:!0})},z=(e,r,t,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of we(r))!Me.call(e,i)&&i!==t&&b(e,i,{get:()=>r[i],enumerable:!(o=Te(r,i))||o.enumerable});return e};var x=(e,r,t)=>(t=e!=null?ke(ve(e)):{},z(r||!e||!e.__esModule?b(t,"default",{value:e,enumerable:!0}):t,e)),Pe=e=>z(b({},"__esModule",{value:!0}),e);var Ie={};Se(Ie,{ColorPalette:()=>s,DialogBtn:()=>N,ErrorBoundary:()=>_,GlobalStyles:()=>K,Loading:()=>G,PathName:()=>j,ThemeProviderWrapper:()=>_e,commonComponentProps:()=>v,createCustomTheme:()=>y,displayGreeting:()=>me,fadeIn:()=>re,fadeInLeft:()=>ee,getDayIdentifier:()=>fe,getFontColor:()=>u,installAppAnimation:()=>pe,isDarkMode:()=>M,isFontLight:()=>J,isHexColor:()=>$,logoutAnimation:()=>se,progressPulse:()=>ae,pulseAnimation:()=>ne,scale:()=>ie,slideIn:()=>te,slideInBottom:()=>oe,systemInfo:()=>ue,themeConfig:()=>w,themes:()=>h,timeAgo:()=>he,timeAgoFromStart:()=>xe,typographyProps:()=>le,typographyVariants:()=>de,useResponsiveDisplay:()=>ge,useSystemTheme:()=>E,useThemeSettings:()=>V});module.exports=Pe(Ie);var W=x(require("@emotion/styled")),H=require("@mui/material"),N=(0,W.default)(H.Button)`
|
|
2
2
|
padding: 10px 16px;
|
|
3
3
|
border-radius: 16px;
|
|
4
4
|
font-size: 16px;
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
margin-top: 0;
|
|
25
25
|
margin-bottom: 0;
|
|
26
26
|
}
|
|
27
|
-
`;var
|
|
27
|
+
`;var C=require("react"),U=x(require("@emotion/styled")),k=require("@mui/material"),c=require("react/jsx-runtime"),G=()=>{let[e,r]=(0,C.useState)(!1);return(0,C.useEffect)(()=>{let t=setTimeout(()=>{r(!0)},100);return()=>clearTimeout(t)},[]),(0,c.jsx)(Re,{children:e&&(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(k.CircularProgress,{"aria-label":"loading",size:80,thickness:4}),(0,c.jsx)("h3",{style:{opacity:.8},children:"Loading Page..."})]})})},Re=(0,U.default)(k.Box)`
|
|
28
28
|
position: absolute;
|
|
29
29
|
top: 50%;
|
|
30
30
|
left: 50%;
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
color: white;
|
|
41
41
|
padding: 4px 6px;
|
|
42
42
|
border-radius: 8px;
|
|
43
|
-
`;var T=require("react")
|
|
43
|
+
`;var T=require("react"),B=(0,T.createContext)(void 0),V=()=>{let e=(0,T.useContext)(B);if(!e)throw new Error("useThemeSettings must be used within ThemeProviderWrapper");return e};var f=require("react"),ye=require("@emotion/react"),be=require("@mui/material/styles");var s={fontDark:"#101727",fontLight:"#f0f0f0",darkMode:"#383838",lightMode:"#ffffff",purple:"#b624ff",red:"#ff3131",orange:"#ff9318",orangeDark:"#ff9500"},w={Lanit:{primaryColor:"#33ccff",secondaryColor:"#f7f7f7"},BPM:{primaryColor:"#203959",secondaryColor:"#ffffff"},Pampa:{primaryColor:"#ffe22e",secondaryColor:"#fafafa"},Hurma:{primaryColor:"#f6883d",secondaryColor:"#ffffff"},"Dark Purple":{primaryColor:s.purple},"Light Purple":{primaryColor:s.purple,secondaryColor:"#edeef6"},"Dark Blue":{primaryColor:"#106cff",secondaryColor:"#090815"},"Light Blue":{primaryColor:"#278ad2",secondaryColor:"#dddaf6"},"Dark Pink":{primaryColor:"#f2369d",secondaryColor:"#191218"},"Light Pink":{primaryColor:"#e5369a",secondaryColor:"#ffe3ff"},"Blush Blossom":{primaryColor:"#EC407A",secondaryColor:"#FCE4EC"},Cheesecake:{primaryColor:"#E14C94",secondaryColor:"#FDF0D5"},"Mystic Coral":{primaryColor:"#ff7b9c",secondaryColor:"#4a2333"},"Dark Orange":{primaryColor:"#FF5631",secondaryColor:"#0D0D0D"},"Light Orange":{primaryColor:"#F26E56",secondaryColor:"#F6F6F6"},Aurora:{primaryColor:"#00e952",secondaryColor:"#011926"}};var $=e=>/^#([\dA-Fa-f]{3}|[\dA-Fa-f]{6})$/.test(e),u=e=>{if(!$(e))return console.error("Invalid hex color provided:",e),s.fontDark;let r=e.slice(1),t=r.length===3?r.split("").map(l=>l+l).join(""):r,o=Number.parseInt(t.slice(0,2),16),i=Number.parseInt(t.slice(2,4),16),n=Number.parseInt(t.slice(4,6),16);return Math.round((o*299+i*587+n*114)/1e3)>128?s.fontDark:s.fontLight},J=e=>u(e)===s.fontLight;var v={MuiTooltip:{defaultProps:{disableInteractive:!0},styleOverrides:{tooltip:({theme:e})=>({color:e.palette.mode==="dark"?"#fff":"#000",backgroundColor:e.palette.mode==="dark"?"#141431dd":"#ededf3dd",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,color:"#fff"}}},MuiAlert:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius})}},MuiTextField:{styleOverrides:{root:({theme:e})=>({"& .MuiInputBase-root":{borderRadius:e.shape.borderRadius}})}},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"})}},MuiIcon:{styleOverrides:{root:{borderRadius:"100%"}}},MuiDialogContent:{styleOverrides:{root:{padding:0}}},MuiSlider:{styleOverrides:{valueLabel:({theme:e})=>({borderRadius:e.shape.borderRadius,padding:"6px 14px",color:e.palette.mode==="dark"?"#fff":"#000",backgroundColor:e.palette.mode==="dark"?"#141431dd":"#ededf3dd","&::before, &::after":{display:"none"}})}},MuiCircularProgress:{styleOverrides:{circle:{strokeLinecap:"round"}}},MuiTab:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius})}},MuiAccordion:{styleOverrides:{root:{"&::before":{display:"none"}}}}};var Q=require("@mui/material");var y=(e,r="#232e58",t="dark")=>(0,Q.createTheme)({palette:{primary:{main:e},secondary:{main:r},warning:{main:t==="dark"?s.orange:s.orangeDark},error:{main:s.red},mode:t},components:{...v},shape:{borderRadius:24}}),h=Object.entries(w).map(([e,r])=>({name:e,MuiTheme:y(r.primaryColor,r.secondaryColor)})),M=(e,r,t)=>{switch(e){case"light":return!1;case"dark":return!0;case"system":return r==="dark";case"auto":return u(t)===s.fontLight;default:return!1}};var A=require("react"),S=require("@emotion/react"),q=require("@mui/material/styles");var Z=require("react/jsx-runtime"),K=()=>{let e=(0,q.useTheme)(),r=e.palette.mode==="dark",t=e.palette.primary.main,o=e.palette.secondary.main,i=(0,A.useMemo)(()=>u(t),[t]),n=(0,A.useMemo)(()=>u(o),[o]);return(0,Z.jsx)(S.Global,{styles:S.css`
|
|
44
44
|
* {
|
|
45
45
|
font-family: "Poppins", sans-serif !important;
|
|
46
46
|
-webkit-tap-highlight-color: transparent;
|
|
@@ -250,5 +250,5 @@
|
|
|
250
250
|
100% {
|
|
251
251
|
transform: translateY(0);
|
|
252
252
|
}
|
|
253
|
-
`;var le={MuiTypography:{defaultProps:{variantMapping:{...Object.fromEntries(["xl","lg","md","sm","xs","2xs"].flatMap(e=>[[`text_${e}_regular`,"p"],[`text_${e}_bold`,"p"],[`text_${e}_semibold`,"p"],[`text_${e}_thin`,"p"]])),display_2xl_regular:"h1",display_xl_regular:"h2",display_lg_regular:"h3",display_md_regular:"h4",display_sm_regular:"h5",display_xs_regular:"h6",display_2xl_bold:"h1",display_xl_bold:"h2",display_lg_bold:"h3",display_md_bold:"h4",display_sm_bold:"h5",display_xs_bold:"h6"}}}},de={text_xl_regular:{font:"400 20px/30px inherit inherit"},text_lg_regular:{font:"400 18px/28px inherit inherit"},text_md_regular:{font:"400 16px/24px inherit inherit"},text_sm_regular:{font:"400 14px/20px inherit inherit"},text_xs_regular:{font:"400 12px/18px inherit inherit"},text_2xs_regular:{font:"400 10px/14px inherit inherit"},text_xl_bold:{font:"600 20px/30px inherit inherit"},text_lg_bold:{font:"700 18px/28px inherit inherit"},text_md_bold:{font:"700 16px/24px inherit inherit"},text_sm_bold:{font:"700 14px/20px inherit inherit"},text_xs_bold:{font:"700 12px/18px inherit inherit"},text_2xs_bold:{font:"700 10px/14px inherit inherit"},text_xl_semibold:{font:"600 20px/30px inherit inherit"},text_lg_semibold:{font:"600 18px/28px inherit inherit"},text_md_semibold:{font:"600 16px/24px inherit inherit"},text_sm_semibold:{font:"600 14px/20px inherit inherit"},text_xs_semibold:{font:"600 12px/18px inherit inherit"},text_2xs_semibold:{font:"600 10px/14px inherit inherit"},text_xl_thin:{font:"100 20px/30px inherit inherit"},text_lg_thin:{font:"100 18px/28px inherit inherit"},text_md_thin:{font:"100 16px/24px inherit inherit"},text_sm_thin:{font:"100 14px/20px inherit inherit"},text_xs_thin:{font:"100 12px/18px inherit inherit"},text_2xs_thin:{font:"100 10px/14px inherit inherit"},display_2xl_regular:{font:"400 72px/90px inherit inherit"},display_xl_regular:{font:"400 60px/72px inherit inherit"},display_lg_regular:{font:"400 48px/60px inherit inherit"},display_md_regular:{font:"400 36px/44px inherit inherit"},display_sm_regular:{font:"400 30px/38px inherit inherit"},display_xs_regular:{font:"400 24px/32px inherit inherit"},display_2xl_bold:{font:"700 72px/90px inherit inherit"},display_xl_bold:{font:"700 60px/72px inherit inherit"},display_lg_bold:{font:"700 48px/60px inherit inherit"},display_md_bold:{font:"700 36px/44px inherit inherit"},display_sm_bold:{font:"700 30px/38px inherit inherit"},display_xs_bold:{font:"700 24px/32px inherit inherit"}};var me=()=>{let r=new Date().getHours(),t;return r<12&&r>=5?t="\u0414\u043E\u0431\u0440\u043E\u0435 \u0443\u0442\u0440\u043E,":r<18&&r>12?t="\u0414\u043E\u0431\u0440\u044B\u0439 \u0434\u0435\u043D\u044C,":t="\u0414\u043E\u0431\u0440\u044B\u0439 \u0432\u0435\u0447\u0435\u0440,",t};var
|
|
253
|
+
`;var le={MuiTypography:{defaultProps:{variantMapping:{...Object.fromEntries(["xl","lg","md","sm","xs","2xs"].flatMap(e=>[[`text_${e}_regular`,"p"],[`text_${e}_bold`,"p"],[`text_${e}_semibold`,"p"],[`text_${e}_thin`,"p"]])),display_2xl_regular:"h1",display_xl_regular:"h2",display_lg_regular:"h3",display_md_regular:"h4",display_sm_regular:"h5",display_xs_regular:"h6",display_2xl_bold:"h1",display_xl_bold:"h2",display_lg_bold:"h3",display_md_bold:"h4",display_sm_bold:"h5",display_xs_bold:"h6"}}}},de={text_xl_regular:{font:"400 20px/30px inherit inherit"},text_lg_regular:{font:"400 18px/28px inherit inherit"},text_md_regular:{font:"400 16px/24px inherit inherit"},text_sm_regular:{font:"400 14px/20px inherit inherit"},text_xs_regular:{font:"400 12px/18px inherit inherit"},text_2xs_regular:{font:"400 10px/14px inherit inherit"},text_xl_bold:{font:"600 20px/30px inherit inherit"},text_lg_bold:{font:"700 18px/28px inherit inherit"},text_md_bold:{font:"700 16px/24px inherit inherit"},text_sm_bold:{font:"700 14px/20px inherit inherit"},text_xs_bold:{font:"700 12px/18px inherit inherit"},text_2xs_bold:{font:"700 10px/14px inherit inherit"},text_xl_semibold:{font:"600 20px/30px inherit inherit"},text_lg_semibold:{font:"600 18px/28px inherit inherit"},text_md_semibold:{font:"600 16px/24px inherit inherit"},text_sm_semibold:{font:"600 14px/20px inherit inherit"},text_xs_semibold:{font:"600 12px/18px inherit inherit"},text_2xs_semibold:{font:"600 10px/14px inherit inherit"},text_xl_thin:{font:"100 20px/30px inherit inherit"},text_lg_thin:{font:"100 18px/28px inherit inherit"},text_md_thin:{font:"100 16px/24px inherit inherit"},text_sm_thin:{font:"100 14px/20px inherit inherit"},text_xs_thin:{font:"100 12px/18px inherit inherit"},text_2xs_thin:{font:"100 10px/14px inherit inherit"},display_2xl_regular:{font:"400 72px/90px inherit inherit"},display_xl_regular:{font:"400 60px/72px inherit inherit"},display_lg_regular:{font:"400 48px/60px inherit inherit"},display_md_regular:{font:"400 36px/44px inherit inherit"},display_sm_regular:{font:"400 30px/38px inherit inherit"},display_xs_regular:{font:"400 24px/32px inherit inherit"},display_2xl_bold:{font:"700 72px/90px inherit inherit"},display_xl_bold:{font:"700 60px/72px inherit inherit"},display_lg_bold:{font:"700 48px/60px inherit inherit"},display_md_bold:{font:"700 36px/44px inherit inherit"},display_sm_bold:{font:"700 30px/38px inherit inherit"},display_xs_bold:{font:"700 24px/32px inherit inherit"}};var me=()=>{let r=new Date().getHours(),t;return r<12&&r>=5?t="\u0414\u043E\u0431\u0440\u043E\u0435 \u0443\u0442\u0440\u043E,":r<18&&r>12?t="\u0414\u043E\u0431\u0440\u044B\u0439 \u0434\u0435\u043D\u044C,":t="\u0414\u043E\u0431\u0440\u044B\u0439 \u0432\u0435\u0447\u0435\u0440,",t};var fe=e=>{let r=e.getFullYear(),t=String(e.getMonth()+1).padStart(2,"0"),o=String(e.getDate()).padStart(2,"0");return`${r}-${t}-${o}`};var{userAgent:ce}=globalThis.navigator,Fe=()=>{let e=ce.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"},Oe=()=>{let e=ce.toLowerCase();return e.includes("edg")?"Edge":e.includes("chrome")?"Chrome":e.includes("firefox")?"Firefox":e.includes("safari")?"Safari":"Unknown"},ue={os:Fe(),browser:Oe()};var he=(e,r=navigator.language||"en-US")=>{let t=new Date;e=new Date(e);let o=Math.floor((t.getTime()-e.getTime())/1e3),i=new Intl.RelativeTimeFormat(r,{numeric:"auto"});if(o<60)return i.format(-o,"second");if(o<3600){let a=Math.floor(o/60);return i.format(-a,"minute")}if(o<86400){let a=Math.floor(o/3600);return i.format(-a,"hour")}let n=Math.floor(o/86400);return i.format(-n,"day")},xe=(e,r=navigator.language||"en-US")=>{let t=new Date;e=new Date(e);let o=(e.getTime()-t.getTime())/1e3,i=Math.floor(o/(60*60)),n=Math.floor((o-60*60*i)/60),a=Math.floor(o-60*60*i-60*n),l=new Intl.RelativeTimeFormat(r,{numeric:"auto"});if(n===0&&a<60)return l.format(a,"second");if(i===0&&n<60)return l.format(n,"minute");if(i<24){let O=`${new Intl.RelativeTimeFormat(r,{numeric:"auto"}).format(i,"hour")}`,d=` ${new Intl.RelativeTimeFormat(r,{localeMatcher:"lookup",numeric:"always",style:"long"}).format(n,"minute")}`.replace(/^\D+/,"");return`${O} ${d}`}let F=Math.floor(a/86400);return l.format(F,"day")};var P=require("react"),ge=(e=768)=>{let[r,t]=(0,P.useState)(!1);return(0,P.useEffect)(()=>{let o=()=>{t(window.innerWidth<e)};o();let i=()=>o();return window.addEventListener("resize",i),()=>{window.removeEventListener("resize",i)}},[e]),r};var D=require("react"),E=()=>{let[e,r]=(0,D.useState)("unknown");return(0,D.useEffect)(()=>{let t=i=>{r(i.matches?"dark":"light")},o=globalThis.matchMedia("(prefers-color-scheme: dark)");return r(o.matches?"dark":"light"),o.addEventListener("change",t),()=>{o.removeEventListener("change",t)}},[]),e};var R=require("react/jsx-runtime"),_e=({children:e})=>{let r=E(),[t,o]=(0,f.useState)(()=>{let d=localStorage.getItem("appSettings");return d&&JSON.parse(d).theme||"system"}),[i,n]=(0,f.useState)(()=>{let d=localStorage.getItem("appSettings");return d&&JSON.parse(d).darkMode||"auto"});(0,f.useEffect)(()=>{localStorage.setItem("appSettings",JSON.stringify({theme:t,darkMode:i}))},[t,i]);let a=(0,f.useMemo)(()=>{var d;return r==="unknown"?h[0].MuiTheme:t==="system"?r==="dark"?h[0].MuiTheme:h[1].MuiTheme:((d=h.find(Ce=>Ce.name===t))==null?void 0:d.MuiTheme)||h[0].MuiTheme},[r,t]),l=(0,f.useMemo)(()=>M(i,r,a.palette.secondary.main)?"dark":"light",[i,r,a]),F=(0,f.useMemo)(()=>y(a.palette.primary.main,a.palette.secondary.main,l),[a,l]),O=(0,f.useMemo)(()=>({darkMode:l==="dark"}),[l]);return(0,R.jsx)(B.Provider,{value:{theme:t,darkMode:i,setTheme:o,setDarkMode:n},children:(0,R.jsx)(be.ThemeProvider,{theme:F,children:(0,R.jsx)(ye.ThemeProvider,{theme:O,children:e})})})};0&&(module.exports={ColorPalette,DialogBtn,ErrorBoundary,GlobalStyles,Loading,PathName,ThemeProviderWrapper,commonComponentProps,createCustomTheme,displayGreeting,fadeIn,fadeInLeft,getDayIdentifier,getFontColor,installAppAnimation,isDarkMode,isFontLight,isHexColor,logoutAnimation,progressPulse,pulseAnimation,scale,slideIn,slideInBottom,systemInfo,themeConfig,themes,timeAgo,timeAgoFromStart,typographyProps,typographyVariants,useResponsiveDisplay,useSystemTheme,useThemeSettings});
|
|
254
254
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/DialogBtn.ts","../src/components/ErrorBoundary.tsx","../src/components/Loading.tsx","../src/components/PathName.ts","../src/context/ThemeContext.tsx","../src/context/ThemeProviderWrapper.tsx","../src/styles/themeConfig.ts","../src/styles/colorUtils.ts","../src/styles/commonComponents.ts","../src/styles/createTheme.ts","../src/styles/globalStyles.tsx","../src/styles/keyframes.ts","../src/styles/typography.ts","../src/utils/displayGreeting.ts","../src/utils/getDayIdentifier.ts","../src/utils/getSystemInfo.ts","../src/utils/timeAgo.ts","../src/utils/useResponsiveDisplay.ts","../src/utils/useSystemTheme.ts"],"sourcesContent":["export * from \"./components\";\nexport * from \"./context\";\nexport * from \"./styles\";\nexport * from \"./utils\";\nexport * from \"./models\";\n","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 */\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 -- Выводим ошибку в консоль\n console.error(\"Error:\", error);\n // eslint-disable-next-line no-console -- Выводим ошибку в консоль\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>Ошибка. </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>\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 { 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","// src/context/ThemeProvider.tsx\nimport { useMemo, useState, useEffect } from \"react\";\nimport { ThemeProvider as EmotionThemeProvider } from \"@emotion/react\";\nimport { ThemeProvider as MuiThemeProvider } from \"@mui/material/styles\";\n\nimport { themes, createCustomTheme, isDarkMode } from \"../styles\";\nimport { useSystemTheme } from \"../utils\";\n\nimport { ThemeContext } from \"./ThemeContext\";\n\nimport type { FC, PropsWithChildren } from \"react\";\n\nexport const ThemeProviderWrapper: FC<PropsWithChildren> = ({ children }) => {\n const systemTheme = useSystemTheme();\n\n const [theme, setTheme] = useState<string>(() => {\n const stored = localStorage.getItem(\"appSettings\");\n return stored ? JSON.parse(stored).theme || \"system\" : \"system\";\n });\n\n const [darkMode, setDarkMode] = useState<\n \"light\" | \"dark\" | \"system\" | \"auto\"\n >(() => {\n const stored = localStorage.getItem(\"appSettings\");\n return stored ? JSON.parse(stored).darkMode || \"auto\" : \"auto\";\n });\n\n useEffect(() => {\n localStorage.setItem(\"appSettings\", JSON.stringify({ theme, darkMode }));\n }, [theme, darkMode]);\n\n const selectedTheme = useMemo(() => {\n if (systemTheme === \"unknown\") return themes[0].MuiTheme;\n if (theme === \"system\") {\n return systemTheme === \"dark\" ? themes[0].MuiTheme : themes[1].MuiTheme;\n }\n return themes.find((t) => t.name === theme)?.MuiTheme || themes[0].MuiTheme;\n }, [systemTheme, theme]);\n\n const mode = useMemo(\n () =>\n isDarkMode(darkMode, systemTheme, selectedTheme.palette.secondary.main)\n ? \"dark\"\n : \"light\",\n [darkMode, systemTheme, selectedTheme],\n );\n\n const muiTheme = useMemo(\n () =>\n createCustomTheme(\n selectedTheme.palette.primary.main,\n selectedTheme.palette.secondary.main,\n mode,\n ),\n [selectedTheme, mode],\n );\n\n const emotionTheme = useMemo(() => ({ darkMode: mode === \"dark\" }), [mode]);\n\n return (\n <ThemeContext.Provider value={{ theme, darkMode, setTheme, setDarkMode }}>\n <MuiThemeProvider theme={muiTheme}>\n <EmotionThemeProvider theme={emotionTheme}>\n {children}\n </EmotionThemeProvider>\n </MuiThemeProvider>\n </ThemeContext.Provider>\n );\n};\n","export const ColorPalette = {\n fontDark: \"#101727\",\n fontLight: \"#f0f0f0\",\n darkMode: \"#383838\",\n lightMode: \"#ffffff\",\n purple: \"#b624ff\",\n red: \"#ff3131\",\n orange: \"#ff9318\",\n orangeDark: \"#ff9500\",\n} as const;\n\nexport const themeConfig: Record<\n string,\n { primaryColor: string; secondaryColor?: string }\n> = {\n \"Dark Purple\": {\n // Default dark theme\n primaryColor: ColorPalette.purple,\n },\n \"Light Purple\": {\n // Default light theme\n primaryColor: ColorPalette.purple,\n secondaryColor: \"#edeef6\",\n },\n \"Dark Blue\": {\n primaryColor: \"#106cff\",\n secondaryColor: \"#090815\",\n },\n \"Light Blue\": {\n primaryColor: \"#278ad2\",\n secondaryColor: \"#dddaf6\",\n },\n \"Dark Pink\": {\n primaryColor: \"#f2369d\",\n secondaryColor: \"#191218\",\n },\n \"Light Pink\": {\n primaryColor: \"#e5369a\",\n secondaryColor: \"#ffe3ff\",\n },\n \"Blush Blossom\": {\n primaryColor: \"#EC407A\",\n secondaryColor: \"#FCE4EC\",\n },\n Cheesecake: {\n primaryColor: \"#E14C94\",\n secondaryColor: \"#FDF0D5\",\n },\n \"Mystic Coral\": {\n primaryColor: \"#ff7b9c\",\n secondaryColor: \"#4a2333\",\n },\n \"Dark Orange\": {\n primaryColor: \"#FF5631\",\n secondaryColor: \"#0D0D0D\",\n },\n \"Light Orange\": {\n primaryColor: \"#F26E56\",\n secondaryColor: \"#F6F6F6\",\n },\n Aurora: {\n primaryColor: \"#00e952\",\n secondaryColor: \"#011926\",\n },\n};\n","import { ColorPalette } from \"./themeConfig\";\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/**\n * Determines the ideal font color (white or black) for contrast against a given background color.\n *\n * Uses luminance calculation (YIQ) to ensure accessibility and visual clarity.\n *\n * @param backgroundColor - A valid hex color (e.g., \"#ffffff\").\n * @returns A hex color string (`fontLight` or `fontDark`) suitable for overlay text.\n */\nexport const getFontColor = (backgroundColor: string): string => {\n if (!isHexColor(backgroundColor)) {\n // eslint-disable-next-line no-console -- Allow\n console.error(\"Invalid hex color provided:\", backgroundColor);\n return ColorPalette.fontDark;\n }\n\n const hex = backgroundColor.slice(1);\n\n const fullHex =\n hex.length === 3\n ? hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : hex;\n\n const r = Number.parseInt(fullHex.slice(0, 2), 16);\n const g = Number.parseInt(fullHex.slice(2, 4), 16);\n const b = Number.parseInt(fullHex.slice(4, 6), 16);\n\n const brightness = Math.round((r * 299 + g * 587 + b * 114) / 1000);\n\n return brightness > 128 ? ColorPalette.fontDark : ColorPalette.fontLight;\n};\n\n/**\n * Determines whether the ideal font color for a background is light (i.e., white).\n *\n * @param color - The background color in hex.\n * @returns `true` if white text is recommended; otherwise, `false`.\n */\nexport const isFontLight = (color: string): boolean =>\n getFontColor(color) === ColorPalette.fontLight;\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 color: theme.palette.mode === \"dark\" ? \"#fff\" : \"#000\",\n backgroundColor:\n theme.palette.mode === \"dark\" ? \"#141431dd\" : \"#ededf3dd\",\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 color: \"#fff\",\n },\n },\n },\n\n MuiAlert: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n },\n },\n\n MuiTextField: {\n styleOverrides: {\n root: ({ theme }) => ({\n \"& .MuiInputBase-root\": {\n borderRadius: theme.shape.borderRadius,\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 MuiIcon: {\n styleOverrides: {\n root: {\n borderRadius: '100%'\n }\n },\n },\n\n MuiDialogContent: {\n styleOverrides: {\n root: {\n padding: '0 !important'\n }\n },\n },\n\n MuiSlider: {\n styleOverrides: {\n valueLabel: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n padding: \"6px 14px\",\n color: theme.palette.mode === \"dark\" ? \"#fff\" : \"#000\",\n backgroundColor:\n theme.palette.mode === \"dark\" ? \"#141431dd\" : \"#ededf3dd\",\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 { createTheme } from \"@mui/material\";\n\nimport { getFontColor } from \"./colorUtils\";\nimport { commonComponentProps } from \"./commonComponents\";\nimport { ColorPalette, themeConfig } from \"./themeConfig\";\n\nimport type { AppSettings, SystemTheme } from \"../models\";\nimport type { PaletteMode, Theme } from \"@mui/material\";\n\n/**\n * Generates a custom MUI theme using a primary color, background color, and color mode.\n *\n * @param primaryColor - The main color used for primary palette.\n * @param backgroundColor - Background color (used as secondary). Defaults to dark blue.\n * @param mode - MUI palette mode ('light' | 'dark'). Defaults to 'dark'.\n * @returns A MUI Theme object.\n */\nexport const createCustomTheme = (\n primaryColor: string,\n backgroundColor = \"#232e58\",\n mode: PaletteMode = \"dark\",\n): Theme =>\n createTheme({\n palette: {\n primary: { main: primaryColor },\n secondary: { main: backgroundColor },\n warning: {\n main: mode === \"dark\" ? ColorPalette.orange : ColorPalette.orangeDark,\n },\n error: { main: ColorPalette.red },\n mode,\n },\n components: {\n ...commonComponentProps,\n },\n shape: { borderRadius: 24 },\n });\n\n/**\n * A predefined list of named themes based on the `themeConfig` definition.\n */\nexport const themes: { name: string; MuiTheme: Theme }[] = Object.entries(\n themeConfig,\n).map(([name, config]) => ({\n name,\n MuiTheme: createCustomTheme(config.primaryColor, config.secondaryColor),\n}));\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 backgroundColor: string,\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 case \"auto\": {\n return getFontColor(backgroundColor) === ColorPalette.fontLight;\n }\n default: {\n return false;\n }\n }\n};\n","import { useMemo } from \"react\";\nimport { Global, css } from \"@emotion/react\";\nimport { useTheme } from \"@mui/material/styles\";\n\nimport { getFontColor } from \"./colorUtils\";\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 */\nexport const GlobalStyles: FC = () => {\n const theme = useTheme();\n const isDarkMode = theme.palette.mode === \"dark\";\n\n const primaryColor = theme.palette.primary.main;\n const secondaryColor = theme.palette.secondary.main;\n\n const primaryFontColor = useMemo(\n () => getFontColor(primaryColor),\n [primaryColor],\n );\n const secondaryFontColor = useMemo(\n () => getFontColor(secondaryColor),\n [secondaryColor],\n );\n\n return (\n <Global\n styles={css`\n * {\n font-family: \"Poppins\", sans-serif !important;\n -webkit-tap-highlight-color: transparent;\n &::selection {\n background-color: ${`${primaryColor}e1`};\n color: ${primaryFontColor};\n }\n }\n\n :root {\n height: 100%;\n font-family: \"Poppins\", sans-serif;\n line-height: 1.5;\n font-weight: 400;\n color-scheme: ${isDarkMode ? \"dark\" : \"light\"};\n color: ${secondaryFontColor};\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 --rsbs-backdrop-bg: rgba(0, 0, 0, 0.3);\n --rsbs-bg: ${isDarkMode ? \"#383838\" : \"#ffffff\"};\n }\n\n body {\n margin: 0;\n height: 100%;\n touch-action: manipulation;\n background: ${secondaryColor};\n background-attachment: fixed;\n background-size: cover;\n transition: 0.3s background;\n\n ::-webkit-scrollbar {\n width: 8px;\n background-color: ${secondaryColor};\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: ${secondaryColor};\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 background-color: #000000d7;\n color: white;\n padding: 16px;\n border-radius: 18px;\n overflow-x: auto;\n }\n\n .MuiDialogContent-root,\n .MuiDrawer-paper,\n .customScrollbar,\n textarea {\n ::-webkit-scrollbar {\n width: 8px;\n border-radius: 4px;\n background-color: #84848415;\n }\n ::-webkit-scrollbar-thumb {\n background-color: #8484844b;\n border-radius: 4px;\n }\n ::-webkit-scrollbar-thumb:hover {\n background-color: #84848476;\n }\n ::-webkit-scrollbar-track {\n border-radius: 4px;\n background-color: #84848415;\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 div[data-rsbs-backdrop] {\n z-index: 999;\n }\n\n div[data-rsbs-header] {\n z-index: 999999;\n box-shadow: none;\n &::before {\n width: 60px;\n height: 6px;\n border-radius: 100px;\n background: ${isDarkMode ? \"#717171\" : \"#cfcfcf\"};\n margin-top: 3px;\n }\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","import type { Theme } from \"@mui/material\";\nimport type { TypographyVariantsOptions } from \"@mui/material/styles/createTypography\";\n\n/**\n * Default MUI Typography variant-to-element mapping.\n * Custom variants are mapped to HTML tags like <p>, <h1>, etc.\n */\nexport const typographyProps: Theme[\"components\"] = {\n MuiTypography: {\n defaultProps: {\n variantMapping: {\n // Text variants\n ...Object.fromEntries(\n [\"xl\", \"lg\", \"md\", \"sm\", \"xs\", \"2xs\"].flatMap((size) => [\n [`text_${size}_regular`, \"p\"],\n [`text_${size}_bold`, \"p\"],\n [`text_${size}_semibold`, \"p\"],\n [`text_${size}_thin`, \"p\"],\n ]),\n ),\n // Display variants\n display_2xl_regular: \"h1\",\n display_xl_regular: \"h2\",\n display_lg_regular: \"h3\",\n display_md_regular: \"h4\",\n display_sm_regular: \"h5\",\n display_xs_regular: \"h6\",\n display_2xl_bold: \"h1\",\n display_xl_bold: \"h2\",\n display_lg_bold: \"h3\",\n display_md_bold: \"h4\",\n display_sm_bold: \"h5\",\n display_xs_bold: \"h6\",\n },\n },\n },\n};\n\n/**\n * Custom typography variants.\n * Defines font-weight, size, line-height and optionally fallback font.\n */\nexport const typographyVariants: TypographyVariantsOptions = {\n // TEXT_REGULAR\n text_xl_regular: { font: \"400 20px/30px inherit inherit\" },\n text_lg_regular: { font: \"400 18px/28px inherit inherit\" },\n text_md_regular: { font: \"400 16px/24px inherit inherit\" },\n text_sm_regular: { font: \"400 14px/20px inherit inherit\" },\n text_xs_regular: { font: \"400 12px/18px inherit inherit\" },\n text_2xs_regular: { font: \"400 10px/14px inherit inherit\" },\n\n // TEXT_BOLD\n text_xl_bold: { font: \"600 20px/30px inherit inherit\" },\n text_lg_bold: { font: \"700 18px/28px inherit inherit\" },\n text_md_bold: { font: \"700 16px/24px inherit inherit\" },\n text_sm_bold: { font: \"700 14px/20px inherit inherit\" },\n text_xs_bold: { font: \"700 12px/18px inherit inherit\" },\n text_2xs_bold: { font: \"700 10px/14px inherit inherit\" },\n\n // TEXT_SEMIBOLD\n text_xl_semibold: { font: \"600 20px/30px inherit inherit\" },\n text_lg_semibold: { font: \"600 18px/28px inherit inherit\" },\n text_md_semibold: { font: \"600 16px/24px inherit inherit\" },\n text_sm_semibold: { font: \"600 14px/20px inherit inherit\" },\n text_xs_semibold: { font: \"600 12px/18px inherit inherit\" },\n text_2xs_semibold: { font: \"600 10px/14px inherit inherit\" },\n\n // TEXT_THIN\n text_xl_thin: { font: \"100 20px/30px inherit inherit\" },\n text_lg_thin: { font: \"100 18px/28px inherit inherit\" },\n text_md_thin: { font: \"100 16px/24px inherit inherit\" },\n text_sm_thin: { font: \"100 14px/20px inherit inherit\" },\n text_xs_thin: { font: \"100 12px/18px inherit inherit\" },\n text_2xs_thin: { font: \"100 10px/14px inherit inherit\" },\n\n // DISPLAY_REGULAR\n display_2xl_regular: { font: \"400 72px/90px inherit inherit\" },\n display_xl_regular: { font: \"400 60px/72px inherit inherit\" },\n display_lg_regular: { font: \"400 48px/60px inherit inherit\" },\n display_md_regular: { font: \"400 36px/44px inherit inherit\" },\n display_sm_regular: { font: \"400 30px/38px inherit inherit\" },\n display_xs_regular: { font: \"400 24px/32px inherit inherit\" },\n\n // DISPLAY_BOLD\n display_2xl_bold: { font: \"700 72px/90px inherit inherit\" },\n display_xl_bold: { font: \"700 60px/72px inherit inherit\" },\n display_lg_bold: { font: \"700 48px/60px inherit inherit\" },\n display_md_bold: { font: \"700 36px/44px inherit inherit\" },\n display_sm_bold: { font: \"700 30px/38px inherit inherit\" },\n display_xs_bold: { font: \"700 24px/32px inherit inherit\" },\n};\n","/**\n * Returns a greeting based on the current time.\n * @returns {string} The appropriate greeting.\n */\nexport const displayGreeting = (): string => {\n const currentTime = new Date();\n const currentHour = currentTime.getHours();\n let greeting: string;\n if (currentHour < 12 && currentHour >= 5) {\n greeting = \"Доброе утро,\";\n } else if (currentHour < 18 && currentHour > 12) {\n greeting = \"Добрый день,\";\n } else {\n greeting = \"Добрый вечер,\";\n }\n\n return greeting;\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\nconst { userAgent } = globalThis.navigator;\n\n/**\n * Detects the user's operating system based on the user agent string.\n *\n * @returns {OperatingSystem} The name of the detected operating system.\n */\nexport const getOperatingSystem = (): OperatingSystem => {\n const ua = userAgent.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 *\n * @returns {Browser} The name of the detected browser.\n */\nexport const getBrowser = (): Browser => {\n const ua = userAgent.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 */\nexport const systemInfo = {\n os: getOperatingSystem(),\n browser: getBrowser(),\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 = (\n date: Date,\n lang = navigator.language || \"en-US\",\n): string => {\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(lang, { 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 = (\n date: Date,\n lang = navigator.language || \"en-US\",\n): string => {\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(lang, { 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(lang, {\n numeric: \"auto\",\n }).format(differenceHours, \"hour\")}`;\n const minutes = ` ${new Intl.RelativeTimeFormat(lang, {\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"],"mappings":"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","names":["index_exports","__export","ColorPalette","DialogBtn","ErrorBoundary","GlobalStyles","Loading","PathName","ThemeProviderWrapper","commonComponentProps","createCustomTheme","displayGreeting","fadeIn","fadeInLeft","getDayIdentifier","getFontColor","installAppAnimation","isDarkMode","isFontLight","isHexColor","logoutAnimation","progressPulse","pulseAnimation","scale","slideIn","slideInBottom","systemInfo","themeConfig","themes","timeAgo","timeAgoFromStart","typographyProps","typographyVariants","useResponsiveDisplay","useSystemTheme","useThemeSettings","__toCommonJS","import_styled","import_material","DialogBtn","styled","import_react","import_styled","import_ErrorOutlineRounded","import_material","import_jsx_runtime","ErrorBoundary","React","props","error","errorInfo","_a","_b","_c","state","Container","ErrorHeader","ErrorOutlineRounded","styled","import_react","import_styled","import_material","import_jsx_runtime","Loading","showLoading","setShowLoading","timer","Container","styled","import_styled","PathName","styled","import_react","ThemeContext","useThemeSettings","context","import_react","import_styles","ColorPalette","themeConfig","isHexColor","value","getFontColor","backgroundColor","ColorPalette","hex","fullHex","c","r","g","b","isFontLight","color","commonComponentProps","theme","import_material","createCustomTheme","primaryColor","backgroundColor","mode","ColorPalette","commonComponentProps","themes","themeConfig","name","config","isDarkMode","darkMode","systemTheme","getFontColor","import_react","import_styles","import_jsx_runtime","GlobalStyles","theme","isDarkMode","primaryColor","secondaryColor","primaryFontColor","getFontColor","secondaryFontColor","import_react","fadeInLeft","fadeIn","slideIn","slideInBottom","scale","pulseAnimation","clr","shadowBlur","progressPulse","logoutAnimation","installAppAnimation","typographyProps","size","typographyVariants","displayGreeting","currentHour","greeting","getDayIdentifier","date","year","month","day","userAgent","getOperatingSystem","ua","getBrowser","systemInfo","timeAgo","date","lang","now","diffInSeconds","rtf","minutes","hours","days","timeAgoFromStart","difference","differenceHours","differenceMinutes","import_react","useResponsiveDisplay","breakpoint","isSmallerDevice","setIsSmallerDevice","checkScreenSize","handleResize","import_react","useSystemTheme","theme","setTheme","mediaQueryListener","e","prefersDarkScheme","import_jsx_runtime","ThemeProviderWrapper","children","systemTheme","useSystemTheme","theme","setTheme","stored","darkMode","setDarkMode","selectedTheme","_a","themes","t","mode","isDarkMode","muiTheme","createCustomTheme","emotionTheme","ThemeContext","MuiThemeProvider","EmotionThemeProvider"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/DialogBtn.ts","../src/components/ErrorBoundary.tsx","../src/components/Loading.tsx","../src/components/PathName.ts","../src/context/ThemeContext.tsx","../src/context/ThemeProviderWrapper.tsx","../src/styles/themeConfig.ts","../src/styles/colorUtils.ts","../src/styles/commonComponents.ts","../src/styles/createTheme.ts","../src/styles/globalStyles.tsx","../src/styles/keyframes.ts","../src/styles/typography.ts","../src/utils/displayGreeting.ts","../src/utils/getDayIdentifier.ts","../src/utils/getSystemInfo.ts","../src/utils/timeAgo.ts","../src/utils/useResponsiveDisplay.ts","../src/utils/useSystemTheme.ts"],"sourcesContent":["export * from \"./components\";\nexport * from \"./context\";\nexport * from \"./styles\";\nexport * from \"./utils\";\nexport * from \"./models\";\n","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 */\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 -- Выводим ошибку в консоль\n console.error(\"Error:\", error);\n // eslint-disable-next-line no-console -- Выводим ошибку в консоль\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>Ошибка. </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>\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 { 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","// src/context/ThemeProvider.tsx\nimport { useMemo, useState, useEffect } from \"react\";\nimport { ThemeProvider as EmotionThemeProvider } from \"@emotion/react\";\nimport { ThemeProvider as MuiThemeProvider } from \"@mui/material/styles\";\n\nimport { themes, createCustomTheme, isDarkMode } from \"../styles\";\nimport { useSystemTheme } from \"../utils\";\n\nimport { ThemeContext } from \"./ThemeContext\";\n\nimport type { FC, PropsWithChildren } from \"react\";\n\nexport const ThemeProviderWrapper: FC<PropsWithChildren> = ({ children }) => {\n const systemTheme = useSystemTheme();\n\n const [theme, setTheme] = useState<string>(() => {\n const stored = localStorage.getItem(\"appSettings\");\n return stored ? JSON.parse(stored).theme || \"system\" : \"system\";\n });\n\n const [darkMode, setDarkMode] = useState<\n \"light\" | \"dark\" | \"system\" | \"auto\"\n >(() => {\n const stored = localStorage.getItem(\"appSettings\");\n return stored ? JSON.parse(stored).darkMode || \"auto\" : \"auto\";\n });\n\n useEffect(() => {\n localStorage.setItem(\"appSettings\", JSON.stringify({ theme, darkMode }));\n }, [theme, darkMode]);\n\n const selectedTheme = useMemo(() => {\n if (systemTheme === \"unknown\") return themes[0].MuiTheme;\n if (theme === \"system\") {\n return systemTheme === \"dark\" ? themes[0].MuiTheme : themes[1].MuiTheme;\n }\n return themes.find((t) => t.name === theme)?.MuiTheme || themes[0].MuiTheme;\n }, [systemTheme, theme]);\n\n const mode = useMemo(\n () =>\n isDarkMode(darkMode, systemTheme, selectedTheme.palette.secondary.main)\n ? \"dark\"\n : \"light\",\n [darkMode, systemTheme, selectedTheme],\n );\n\n const muiTheme = useMemo(\n () =>\n createCustomTheme(\n selectedTheme.palette.primary.main,\n selectedTheme.palette.secondary.main,\n mode,\n ),\n [selectedTheme, mode],\n );\n\n const emotionTheme = useMemo(() => ({ darkMode: mode === \"dark\" }), [mode]);\n\n return (\n <ThemeContext.Provider value={{ theme, darkMode, setTheme, setDarkMode }}>\n <MuiThemeProvider theme={muiTheme}>\n <EmotionThemeProvider theme={emotionTheme}>\n {children}\n </EmotionThemeProvider>\n </MuiThemeProvider>\n </ThemeContext.Provider>\n );\n};\n","export const ColorPalette = {\n fontDark: \"#101727\",\n fontLight: \"#f0f0f0\",\n darkMode: \"#383838\",\n lightMode: \"#ffffff\",\n purple: \"#b624ff\",\n red: \"#ff3131\",\n orange: \"#ff9318\",\n orangeDark: \"#ff9500\",\n} as const;\n\nexport const themeConfig: Record<\n string,\n { primaryColor: string; secondaryColor?: string }\n> = {\n Lanit: {\n primaryColor: '#33ccff',\n secondaryColor: '#f7f7f7',\n },\n BPM: {\n primaryColor: '#203959',\n secondaryColor: '#ffffff',\n },\n Pampa: {\n primaryColor: '#ffe22e',\n secondaryColor: '#fafafa',\n },\n Hurma: {\n primaryColor: '#f6883d',\n secondaryColor: '#ffffff',\n },\n \"Dark Purple\": {\n // Default dark theme\n primaryColor: ColorPalette.purple,\n },\n \"Light Purple\": {\n // Default light theme\n primaryColor: ColorPalette.purple,\n secondaryColor: \"#edeef6\",\n },\n \"Dark Blue\": {\n primaryColor: \"#106cff\",\n secondaryColor: \"#090815\",\n },\n \"Light Blue\": {\n primaryColor: \"#278ad2\",\n secondaryColor: \"#dddaf6\",\n },\n \"Dark Pink\": {\n primaryColor: \"#f2369d\",\n secondaryColor: \"#191218\",\n },\n \"Light Pink\": {\n primaryColor: \"#e5369a\",\n secondaryColor: \"#ffe3ff\",\n },\n \"Blush Blossom\": {\n primaryColor: \"#EC407A\",\n secondaryColor: \"#FCE4EC\",\n },\n Cheesecake: {\n primaryColor: \"#E14C94\",\n secondaryColor: \"#FDF0D5\",\n },\n \"Mystic Coral\": {\n primaryColor: \"#ff7b9c\",\n secondaryColor: \"#4a2333\",\n },\n \"Dark Orange\": {\n primaryColor: \"#FF5631\",\n secondaryColor: \"#0D0D0D\",\n },\n \"Light Orange\": {\n primaryColor: \"#F26E56\",\n secondaryColor: \"#F6F6F6\",\n },\n Aurora: {\n primaryColor: \"#00e952\",\n secondaryColor: \"#011926\",\n },\n};\n","import { ColorPalette } from \"./themeConfig\";\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/**\n * Determines the ideal font color (white or black) for contrast against a given background color.\n *\n * Uses luminance calculation (YIQ) to ensure accessibility and visual clarity.\n *\n * @param backgroundColor - A valid hex color (e.g., \"#ffffff\").\n * @returns A hex color string (`fontLight` or `fontDark`) suitable for overlay text.\n */\nexport const getFontColor = (backgroundColor: string): string => {\n if (!isHexColor(backgroundColor)) {\n // eslint-disable-next-line no-console -- Allow\n console.error(\"Invalid hex color provided:\", backgroundColor);\n return ColorPalette.fontDark;\n }\n\n const hex = backgroundColor.slice(1);\n\n const fullHex =\n hex.length === 3\n ? hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : hex;\n\n const r = Number.parseInt(fullHex.slice(0, 2), 16);\n const g = Number.parseInt(fullHex.slice(2, 4), 16);\n const b = Number.parseInt(fullHex.slice(4, 6), 16);\n\n const brightness = Math.round((r * 299 + g * 587 + b * 114) / 1000);\n\n return brightness > 128 ? ColorPalette.fontDark : ColorPalette.fontLight;\n};\n\n/**\n * Determines whether the ideal font color for a background is light (i.e., white).\n *\n * @param color - The background color in hex.\n * @returns `true` if white text is recommended; otherwise, `false`.\n */\nexport const isFontLight = (color: string): boolean =>\n getFontColor(color) === ColorPalette.fontLight;\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 color: theme.palette.mode === \"dark\" ? \"#fff\" : \"#000\",\n backgroundColor:\n theme.palette.mode === \"dark\" ? \"#141431dd\" : \"#ededf3dd\",\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 color: \"#fff\",\n },\n },\n },\n\n MuiAlert: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n },\n },\n\n MuiTextField: {\n styleOverrides: {\n root: ({ theme }) => ({\n \"& .MuiInputBase-root\": {\n borderRadius: theme.shape.borderRadius,\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 MuiIcon: {\n styleOverrides: {\n root: {\n borderRadius: '100%'\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 color: theme.palette.mode === \"dark\" ? \"#fff\" : \"#000\",\n backgroundColor:\n theme.palette.mode === \"dark\" ? \"#141431dd\" : \"#ededf3dd\",\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 { createTheme } from \"@mui/material\";\n\nimport { getFontColor } from \"./colorUtils\";\nimport { commonComponentProps } from \"./commonComponents\";\nimport { ColorPalette, themeConfig } from \"./themeConfig\";\n\nimport type { AppSettings, SystemTheme } from \"../models\";\nimport type { PaletteMode, Theme } from \"@mui/material\";\n\n/**\n * Generates a custom MUI theme using a primary color, background color, and color mode.\n *\n * @param primaryColor - The main color used for primary palette.\n * @param backgroundColor - Background color (used as secondary). Defaults to dark blue.\n * @param mode - MUI palette mode ('light' | 'dark'). Defaults to 'dark'.\n * @returns A MUI Theme object.\n */\nexport const createCustomTheme = (\n primaryColor: string,\n backgroundColor = \"#232e58\",\n mode: PaletteMode = \"dark\",\n): Theme =>\n createTheme({\n palette: {\n primary: { main: primaryColor },\n secondary: { main: backgroundColor },\n warning: {\n main: mode === \"dark\" ? ColorPalette.orange : ColorPalette.orangeDark,\n },\n error: { main: ColorPalette.red },\n mode,\n },\n components: {\n ...commonComponentProps,\n },\n shape: { borderRadius: 24 },\n });\n\n/**\n * A predefined list of named themes based on the `themeConfig` definition.\n */\nexport const themes: { name: string; MuiTheme: Theme }[] = Object.entries(\n themeConfig,\n).map(([name, config]) => ({\n name,\n MuiTheme: createCustomTheme(config.primaryColor, config.secondaryColor),\n}));\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 backgroundColor: string,\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 case \"auto\": {\n return getFontColor(backgroundColor) === ColorPalette.fontLight;\n }\n default: {\n return false;\n }\n }\n};\n","import { useMemo } from \"react\";\nimport { Global, css } from \"@emotion/react\";\nimport { useTheme } from \"@mui/material/styles\";\n\nimport { getFontColor } from \"./colorUtils\";\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 */\nexport const GlobalStyles: FC = () => {\n const theme = useTheme();\n const isDarkMode = theme.palette.mode === \"dark\";\n\n const primaryColor = theme.palette.primary.main;\n const secondaryColor = theme.palette.secondary.main;\n\n const primaryFontColor = useMemo(\n () => getFontColor(primaryColor),\n [primaryColor],\n );\n const secondaryFontColor = useMemo(\n () => getFontColor(secondaryColor),\n [secondaryColor],\n );\n\n return (\n <Global\n styles={css`\n * {\n font-family: \"Poppins\", sans-serif !important;\n -webkit-tap-highlight-color: transparent;\n &::selection {\n background-color: ${`${primaryColor}e1`};\n color: ${primaryFontColor};\n }\n }\n\n :root {\n height: 100%;\n font-family: \"Poppins\", sans-serif;\n line-height: 1.5;\n font-weight: 400;\n color-scheme: ${isDarkMode ? \"dark\" : \"light\"};\n color: ${secondaryFontColor};\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 --rsbs-backdrop-bg: rgba(0, 0, 0, 0.3);\n --rsbs-bg: ${isDarkMode ? \"#383838\" : \"#ffffff\"};\n }\n\n body {\n margin: 0;\n height: 100%;\n touch-action: manipulation;\n background: ${secondaryColor};\n background-attachment: fixed;\n background-size: cover;\n transition: 0.3s background;\n\n ::-webkit-scrollbar {\n width: 8px;\n background-color: ${secondaryColor};\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: ${secondaryColor};\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 background-color: #000000d7;\n color: white;\n padding: 16px;\n border-radius: 18px;\n overflow-x: auto;\n }\n\n .MuiDialogContent-root,\n .MuiDrawer-paper,\n .customScrollbar,\n textarea {\n ::-webkit-scrollbar {\n width: 8px;\n border-radius: 4px;\n background-color: #84848415;\n }\n ::-webkit-scrollbar-thumb {\n background-color: #8484844b;\n border-radius: 4px;\n }\n ::-webkit-scrollbar-thumb:hover {\n background-color: #84848476;\n }\n ::-webkit-scrollbar-track {\n border-radius: 4px;\n background-color: #84848415;\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 div[data-rsbs-backdrop] {\n z-index: 999;\n }\n\n div[data-rsbs-header] {\n z-index: 999999;\n box-shadow: none;\n &::before {\n width: 60px;\n height: 6px;\n border-radius: 100px;\n background: ${isDarkMode ? \"#717171\" : \"#cfcfcf\"};\n margin-top: 3px;\n }\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","import type { Theme } from \"@mui/material\";\nimport type { TypographyVariantsOptions } from \"@mui/material/styles/createTypography\";\n\n/**\n * Default MUI Typography variant-to-element mapping.\n * Custom variants are mapped to HTML tags like <p>, <h1>, etc.\n */\nexport const typographyProps: Theme[\"components\"] = {\n MuiTypography: {\n defaultProps: {\n variantMapping: {\n // Text variants\n ...Object.fromEntries(\n [\"xl\", \"lg\", \"md\", \"sm\", \"xs\", \"2xs\"].flatMap((size) => [\n [`text_${size}_regular`, \"p\"],\n [`text_${size}_bold`, \"p\"],\n [`text_${size}_semibold`, \"p\"],\n [`text_${size}_thin`, \"p\"],\n ]),\n ),\n // Display variants\n display_2xl_regular: \"h1\",\n display_xl_regular: \"h2\",\n display_lg_regular: \"h3\",\n display_md_regular: \"h4\",\n display_sm_regular: \"h5\",\n display_xs_regular: \"h6\",\n display_2xl_bold: \"h1\",\n display_xl_bold: \"h2\",\n display_lg_bold: \"h3\",\n display_md_bold: \"h4\",\n display_sm_bold: \"h5\",\n display_xs_bold: \"h6\",\n },\n },\n },\n};\n\n/**\n * Custom typography variants.\n * Defines font-weight, size, line-height and optionally fallback font.\n */\nexport const typographyVariants: TypographyVariantsOptions = {\n // TEXT_REGULAR\n text_xl_regular: { font: \"400 20px/30px inherit inherit\" },\n text_lg_regular: { font: \"400 18px/28px inherit inherit\" },\n text_md_regular: { font: \"400 16px/24px inherit inherit\" },\n text_sm_regular: { font: \"400 14px/20px inherit inherit\" },\n text_xs_regular: { font: \"400 12px/18px inherit inherit\" },\n text_2xs_regular: { font: \"400 10px/14px inherit inherit\" },\n\n // TEXT_BOLD\n text_xl_bold: { font: \"600 20px/30px inherit inherit\" },\n text_lg_bold: { font: \"700 18px/28px inherit inherit\" },\n text_md_bold: { font: \"700 16px/24px inherit inherit\" },\n text_sm_bold: { font: \"700 14px/20px inherit inherit\" },\n text_xs_bold: { font: \"700 12px/18px inherit inherit\" },\n text_2xs_bold: { font: \"700 10px/14px inherit inherit\" },\n\n // TEXT_SEMIBOLD\n text_xl_semibold: { font: \"600 20px/30px inherit inherit\" },\n text_lg_semibold: { font: \"600 18px/28px inherit inherit\" },\n text_md_semibold: { font: \"600 16px/24px inherit inherit\" },\n text_sm_semibold: { font: \"600 14px/20px inherit inherit\" },\n text_xs_semibold: { font: \"600 12px/18px inherit inherit\" },\n text_2xs_semibold: { font: \"600 10px/14px inherit inherit\" },\n\n // TEXT_THIN\n text_xl_thin: { font: \"100 20px/30px inherit inherit\" },\n text_lg_thin: { font: \"100 18px/28px inherit inherit\" },\n text_md_thin: { font: \"100 16px/24px inherit inherit\" },\n text_sm_thin: { font: \"100 14px/20px inherit inherit\" },\n text_xs_thin: { font: \"100 12px/18px inherit inherit\" },\n text_2xs_thin: { font: \"100 10px/14px inherit inherit\" },\n\n // DISPLAY_REGULAR\n display_2xl_regular: { font: \"400 72px/90px inherit inherit\" },\n display_xl_regular: { font: \"400 60px/72px inherit inherit\" },\n display_lg_regular: { font: \"400 48px/60px inherit inherit\" },\n display_md_regular: { font: \"400 36px/44px inherit inherit\" },\n display_sm_regular: { font: \"400 30px/38px inherit inherit\" },\n display_xs_regular: { font: \"400 24px/32px inherit inherit\" },\n\n // DISPLAY_BOLD\n display_2xl_bold: { font: \"700 72px/90px inherit inherit\" },\n display_xl_bold: { font: \"700 60px/72px inherit inherit\" },\n display_lg_bold: { font: \"700 48px/60px inherit inherit\" },\n display_md_bold: { font: \"700 36px/44px inherit inherit\" },\n display_sm_bold: { font: \"700 30px/38px inherit inherit\" },\n display_xs_bold: { font: \"700 24px/32px inherit inherit\" },\n};\n","/**\n * Returns a greeting based on the current time.\n * @returns {string} The appropriate greeting.\n */\nexport const displayGreeting = (): string => {\n const currentTime = new Date();\n const currentHour = currentTime.getHours();\n let greeting: string;\n if (currentHour < 12 && currentHour >= 5) {\n greeting = \"Доброе утро,\";\n } else if (currentHour < 18 && currentHour > 12) {\n greeting = \"Добрый день,\";\n } else {\n greeting = \"Добрый вечер,\";\n }\n\n return greeting;\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\nconst { userAgent } = globalThis.navigator;\n\n/**\n * Detects the user's operating system based on the user agent string.\n *\n * @returns {OperatingSystem} The name of the detected operating system.\n */\nexport const getOperatingSystem = (): OperatingSystem => {\n const ua = userAgent.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 *\n * @returns {Browser} The name of the detected browser.\n */\nexport const getBrowser = (): Browser => {\n const ua = userAgent.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 */\nexport const systemInfo = {\n os: getOperatingSystem(),\n browser: getBrowser(),\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 = (\n date: Date,\n lang = navigator.language || \"en-US\",\n): string => {\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(lang, { 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 = (\n date: Date,\n lang = navigator.language || \"en-US\",\n): string => {\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(lang, { 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(lang, {\n numeric: \"auto\",\n }).format(differenceHours, \"hour\")}`;\n const minutes = ` ${new Intl.RelativeTimeFormat(lang, {\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"],"mappings":"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","names":["index_exports","__export","ColorPalette","DialogBtn","ErrorBoundary","GlobalStyles","Loading","PathName","ThemeProviderWrapper","commonComponentProps","createCustomTheme","displayGreeting","fadeIn","fadeInLeft","getDayIdentifier","getFontColor","installAppAnimation","isDarkMode","isFontLight","isHexColor","logoutAnimation","progressPulse","pulseAnimation","scale","slideIn","slideInBottom","systemInfo","themeConfig","themes","timeAgo","timeAgoFromStart","typographyProps","typographyVariants","useResponsiveDisplay","useSystemTheme","useThemeSettings","__toCommonJS","import_styled","import_material","DialogBtn","styled","import_react","import_styled","import_ErrorOutlineRounded","import_material","import_jsx_runtime","ErrorBoundary","React","props","error","errorInfo","_a","_b","_c","state","Container","ErrorHeader","ErrorOutlineRounded","styled","import_react","import_styled","import_material","import_jsx_runtime","Loading","showLoading","setShowLoading","timer","Container","styled","import_styled","PathName","styled","import_react","ThemeContext","useThemeSettings","context","import_react","import_styles","ColorPalette","themeConfig","isHexColor","value","getFontColor","backgroundColor","ColorPalette","hex","fullHex","c","r","g","b","isFontLight","color","commonComponentProps","theme","import_material","createCustomTheme","primaryColor","backgroundColor","mode","ColorPalette","commonComponentProps","themes","themeConfig","name","config","isDarkMode","darkMode","systemTheme","getFontColor","import_react","import_styles","import_jsx_runtime","GlobalStyles","theme","isDarkMode","primaryColor","secondaryColor","primaryFontColor","getFontColor","secondaryFontColor","import_react","fadeInLeft","fadeIn","slideIn","slideInBottom","scale","pulseAnimation","clr","shadowBlur","progressPulse","logoutAnimation","installAppAnimation","typographyProps","size","typographyVariants","displayGreeting","currentHour","greeting","getDayIdentifier","date","year","month","day","userAgent","getOperatingSystem","ua","getBrowser","systemInfo","timeAgo","date","lang","now","diffInSeconds","rtf","minutes","hours","days","timeAgoFromStart","difference","differenceHours","differenceMinutes","import_react","useResponsiveDisplay","breakpoint","isSmallerDevice","setIsSmallerDevice","checkScreenSize","handleResize","import_react","useSystemTheme","theme","setTheme","mediaQueryListener","e","prefersDarkScheme","import_jsx_runtime","ThemeProviderWrapper","children","systemTheme","useSystemTheme","theme","setTheme","stored","darkMode","setDarkMode","selectedTheme","_a","themes","t","mode","isDarkMode","muiTheme","createCustomTheme","emotionTheme","ThemeContext","MuiThemeProvider","EmotionThemeProvider"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import L from"@emotion/styled";import{Button as
|
|
1
|
+
import L from"@emotion/styled";import{Button as B}from"@mui/material";var $=L(B)`
|
|
2
2
|
padding: 10px 16px;
|
|
3
3
|
border-radius: 16px;
|
|
4
4
|
font-size: 16px;
|
|
5
5
|
margin: 8px;
|
|
6
|
-
`;import A from"react";import D from"@emotion/styled";import P from"@mui/icons-material/ErrorOutlineRounded";import{Box as
|
|
6
|
+
`;import A from"react";import D from"@emotion/styled";import P from"@mui/icons-material/ErrorOutlineRounded";import{Box as u}from"@mui/material";import{jsx as h,jsxs as c}from"react/jsx-runtime";var _=class extends A.Component{constructor(r){super(r),this.state={hasError:!1}}static getDerivedStateFromError(r){return{hasError:!0,error:r}}componentDidCatch(r,t){console.error("Error:",r),console.error("Error Info:",t)}render(){var o,i,n;let{state:r,props:t}=this;return r.hasError?c(z,{children:[h(W,{children:h(u,{children:"\u041E\u0448\u0438\u0431\u043A\u0430.\xA0"})}),c("h3",{children:[c(u,{style:{color:"#ff3131",display:"inline-block"},children:[h(P,{sx:{verticalAlign:"middle",mb:"4px"}})," ","ERROR:"]})," ",c(u,{translate:"no",children:["[",(o=r.error)==null?void 0:o.name,"] ",(i=r.error)==null?void 0:i.message]}),c(u,{style:{color:"#ff3131",display:"inline-block"},children:[h(P,{sx:{verticalAlign:"middle",mb:"4px"}})," ","Stack:"]})," ",c(u,{translate:"no",children:["[",(n=r.error)==null?void 0:n.stack,"]"]})]})]}):t.children}},z=D.div`
|
|
7
7
|
margin: 0 8vw;
|
|
8
8
|
@media (max-width: 768px) {
|
|
9
9
|
margin: 0;
|
|
@@ -24,7 +24,7 @@ import L from"@emotion/styled";import{Button as $}from"@mui/material";var B=L($)
|
|
|
24
24
|
margin-top: 0;
|
|
25
25
|
margin-bottom: 0;
|
|
26
26
|
}
|
|
27
|
-
`;import{useEffect as
|
|
27
|
+
`;import{useEffect as H,useState as N}from"react";import Y from"@emotion/styled";import{Box as U,CircularProgress as G}from"@mui/material";import{Fragment as V,jsx as C,jsxs as J}from"react/jsx-runtime";var X=()=>{let[e,r]=N(!1);return H(()=>{let t=setTimeout(()=>{r(!0)},100);return()=>clearTimeout(t)},[]),C(j,{children:e&&J(V,{children:[C(G,{"aria-label":"loading",size:80,thickness:4}),C("h3",{style:{opacity:.8},children:"Loading Page..."})]})})},j=Y(U)`
|
|
28
28
|
position: absolute;
|
|
29
29
|
top: 50%;
|
|
30
30
|
left: 50%;
|
|
@@ -40,7 +40,7 @@ import L from"@emotion/styled";import{Button as $}from"@mui/material";var B=L($)
|
|
|
40
40
|
color: white;
|
|
41
41
|
padding: 4px 6px;
|
|
42
42
|
border-radius: 8px;
|
|
43
|
-
`;import{createContext as K,useContext as Z}from"react";var
|
|
43
|
+
`;import{createContext as K,useContext as Z}from"react";var k=K(void 0),ee=()=>{let e=Z(k);if(!e)throw new Error("useThemeSettings must be used within ThemeProviderWrapper");return e};import{useMemo as g,useState as O,useEffect as Re}from"react";import{ThemeProvider as Fe}from"@emotion/react";import{ThemeProvider as Oe}from"@mui/material/styles";var s={fontDark:"#101727",fontLight:"#f0f0f0",darkMode:"#383838",lightMode:"#ffffff",purple:"#b624ff",red:"#ff3131",orange:"#ff9318",orangeDark:"#ff9500"},T={Lanit:{primaryColor:"#33ccff",secondaryColor:"#f7f7f7"},BPM:{primaryColor:"#203959",secondaryColor:"#ffffff"},Pampa:{primaryColor:"#ffe22e",secondaryColor:"#fafafa"},Hurma:{primaryColor:"#f6883d",secondaryColor:"#ffffff"},"Dark Purple":{primaryColor:s.purple},"Light Purple":{primaryColor:s.purple,secondaryColor:"#edeef6"},"Dark Blue":{primaryColor:"#106cff",secondaryColor:"#090815"},"Light Blue":{primaryColor:"#278ad2",secondaryColor:"#dddaf6"},"Dark Pink":{primaryColor:"#f2369d",secondaryColor:"#191218"},"Light Pink":{primaryColor:"#e5369a",secondaryColor:"#ffe3ff"},"Blush Blossom":{primaryColor:"#EC407A",secondaryColor:"#FCE4EC"},Cheesecake:{primaryColor:"#E14C94",secondaryColor:"#FDF0D5"},"Mystic Coral":{primaryColor:"#ff7b9c",secondaryColor:"#4a2333"},"Dark Orange":{primaryColor:"#FF5631",secondaryColor:"#0D0D0D"},"Light Orange":{primaryColor:"#F26E56",secondaryColor:"#F6F6F6"},Aurora:{primaryColor:"#00e952",secondaryColor:"#011926"}};var E=e=>/^#([\dA-Fa-f]{3}|[\dA-Fa-f]{6})$/.test(e),m=e=>{if(!E(e))return console.error("Invalid hex color provided:",e),s.fontDark;let r=e.slice(1),t=r.length===3?r.split("").map(p=>p+p).join(""):r,o=Number.parseInt(t.slice(0,2),16),i=Number.parseInt(t.slice(2,4),16),n=Number.parseInt(t.slice(4,6),16);return Math.round((o*299+i*587+n*114)/1e3)>128?s.fontDark:s.fontLight},re=e=>m(e)===s.fontLight;var w={MuiTooltip:{defaultProps:{disableInteractive:!0},styleOverrides:{tooltip:({theme:e})=>({color:e.palette.mode==="dark"?"#fff":"#000",backgroundColor:e.palette.mode==="dark"?"#141431dd":"#ededf3dd",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,color:"#fff"}}},MuiAlert:{styleOverrides:{root:({theme:e})=>({borderRadius:e.shape.borderRadius})}},MuiTextField:{styleOverrides:{root:({theme:e})=>({"& .MuiInputBase-root":{borderRadius:e.shape.borderRadius}})}},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"})}},MuiIcon:{styleOverrides:{root:{borderRadius:"100%"}}},MuiDialogContent:{styleOverrides:{root:{padding:0}}},MuiSlider:{styleOverrides:{valueLabel:({theme:e})=>({borderRadius:e.shape.borderRadius,padding:"6px 14px",color:e.palette.mode==="dark"?"#fff":"#000",backgroundColor:e.palette.mode==="dark"?"#141431dd":"#ededf3dd","&::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 te}from"@mui/material";var x=(e,r="#232e58",t="dark")=>te({palette:{primary:{main:e},secondary:{main:r},warning:{main:t==="dark"?s.orange:s.orangeDark},error:{main:s.red},mode:t},components:{...w},shape:{borderRadius:24}}),f=Object.entries(T).map(([e,r])=>({name:e,MuiTheme:x(r.primaryColor,r.secondaryColor)})),v=(e,r,t)=>{switch(e){case"light":return!1;case"dark":return!0;case"system":return r==="dark";case"auto":return m(t)===s.fontLight;default:return!1}};import{useMemo as R}from"react";import{Global as oe,css as ie}from"@emotion/react";import{useTheme as ne}from"@mui/material/styles";import{jsx as se}from"react/jsx-runtime";var ae=()=>{let e=ne(),r=e.palette.mode==="dark",t=e.palette.primary.main,o=e.palette.secondary.main,i=R(()=>m(t),[t]),n=R(()=>m(o),[o]);return se(oe,{styles:ie`
|
|
44
44
|
* {
|
|
45
45
|
font-family: "Poppins", sans-serif !important;
|
|
46
46
|
-webkit-tap-highlight-color: transparent;
|
|
@@ -191,14 +191,14 @@ import L from"@emotion/styled";import{Button as $}from"@mui/material";var B=L($)
|
|
|
191
191
|
to {
|
|
192
192
|
transform: translateY(0);
|
|
193
193
|
}
|
|
194
|
-
`,
|
|
194
|
+
`,fe=d`
|
|
195
195
|
from {
|
|
196
196
|
transform: scale(0);
|
|
197
197
|
}
|
|
198
198
|
to {
|
|
199
199
|
transform: scale(1);
|
|
200
200
|
}
|
|
201
|
-
`,
|
|
201
|
+
`,ce=(e,r=12)=>d`
|
|
202
202
|
0% {
|
|
203
203
|
transform: scale(0.95);
|
|
204
204
|
box-shadow: 0 0 0 0 ${e}b2;
|
|
@@ -211,7 +211,7 @@ import L from"@emotion/styled";import{Button as $}from"@mui/material";var B=L($)
|
|
|
211
211
|
transform: scale(0.95);
|
|
212
212
|
box-shadow: 0 0 0 0 ${e}00;
|
|
213
213
|
}
|
|
214
|
-
`,
|
|
214
|
+
`,ue=e=>d`
|
|
215
215
|
0% {
|
|
216
216
|
filter: none;
|
|
217
217
|
}
|
|
@@ -221,7 +221,7 @@ import L from"@emotion/styled";import{Button as $}from"@mui/material";var B=L($)
|
|
|
221
221
|
100% {
|
|
222
222
|
filter: none;
|
|
223
223
|
}
|
|
224
|
-
`,
|
|
224
|
+
`,he=d`
|
|
225
225
|
0% {
|
|
226
226
|
transform: scale(1);
|
|
227
227
|
opacity: 1;
|
|
@@ -250,5 +250,5 @@ import L from"@emotion/styled";import{Button as $}from"@mui/material";var B=L($)
|
|
|
250
250
|
100% {
|
|
251
251
|
transform: translateY(0);
|
|
252
252
|
}
|
|
253
|
-
`;var ge={MuiTypography:{defaultProps:{variantMapping:{...Object.fromEntries(["xl","lg","md","sm","xs","2xs"].flatMap(e=>[[`text_${e}_regular`,"p"],[`text_${e}_bold`,"p"],[`text_${e}_semibold`,"p"],[`text_${e}_thin`,"p"]])),display_2xl_regular:"h1",display_xl_regular:"h2",display_lg_regular:"h3",display_md_regular:"h4",display_sm_regular:"h5",display_xs_regular:"h6",display_2xl_bold:"h1",display_xl_bold:"h2",display_lg_bold:"h3",display_md_bold:"h4",display_sm_bold:"h5",display_xs_bold:"h6"}}}},ye={text_xl_regular:{font:"400 20px/30px inherit inherit"},text_lg_regular:{font:"400 18px/28px inherit inherit"},text_md_regular:{font:"400 16px/24px inherit inherit"},text_sm_regular:{font:"400 14px/20px inherit inherit"},text_xs_regular:{font:"400 12px/18px inherit inherit"},text_2xs_regular:{font:"400 10px/14px inherit inherit"},text_xl_bold:{font:"600 20px/30px inherit inherit"},text_lg_bold:{font:"700 18px/28px inherit inherit"},text_md_bold:{font:"700 16px/24px inherit inherit"},text_sm_bold:{font:"700 14px/20px inherit inherit"},text_xs_bold:{font:"700 12px/18px inherit inherit"},text_2xs_bold:{font:"700 10px/14px inherit inherit"},text_xl_semibold:{font:"600 20px/30px inherit inherit"},text_lg_semibold:{font:"600 18px/28px inherit inherit"},text_md_semibold:{font:"600 16px/24px inherit inherit"},text_sm_semibold:{font:"600 14px/20px inherit inherit"},text_xs_semibold:{font:"600 12px/18px inherit inherit"},text_2xs_semibold:{font:"600 10px/14px inherit inherit"},text_xl_thin:{font:"100 20px/30px inherit inherit"},text_lg_thin:{font:"100 18px/28px inherit inherit"},text_md_thin:{font:"100 16px/24px inherit inherit"},text_sm_thin:{font:"100 14px/20px inherit inherit"},text_xs_thin:{font:"100 12px/18px inherit inherit"},text_2xs_thin:{font:"100 10px/14px inherit inherit"},display_2xl_regular:{font:"400 72px/90px inherit inherit"},display_xl_regular:{font:"400 60px/72px inherit inherit"},display_lg_regular:{font:"400 48px/60px inherit inherit"},display_md_regular:{font:"400 36px/44px inherit inherit"},display_sm_regular:{font:"400 30px/38px inherit inherit"},display_xs_regular:{font:"400 24px/32px inherit inherit"},display_2xl_bold:{font:"700 72px/90px inherit inherit"},display_xl_bold:{font:"700 60px/72px inherit inherit"},display_lg_bold:{font:"700 48px/60px inherit inherit"},display_md_bold:{font:"700 36px/44px inherit inherit"},display_sm_bold:{font:"700 30px/38px inherit inherit"},display_xs_bold:{font:"700 24px/32px inherit inherit"}};var be=()=>{let r=new Date().getHours(),t;return r<12&&r>=5?t="\u0414\u043E\u0431\u0440\u043E\u0435 \u0443\u0442\u0440\u043E,":r<18&&r>12?t="\u0414\u043E\u0431\u0440\u044B\u0439 \u0434\u0435\u043D\u044C,":t="\u0414\u043E\u0431\u0440\u044B\u0439 \u0432\u0435\u0447\u0435\u0440,",t};var _e=e=>{let r=e.getFullYear(),t=String(e.getMonth()+1).padStart(2,"0"),o=String(e.getDate()).padStart(2,"0");return`${r}-${t}-${o}`};var{userAgent:F}=globalThis.navigator,
|
|
253
|
+
`;var ge={MuiTypography:{defaultProps:{variantMapping:{...Object.fromEntries(["xl","lg","md","sm","xs","2xs"].flatMap(e=>[[`text_${e}_regular`,"p"],[`text_${e}_bold`,"p"],[`text_${e}_semibold`,"p"],[`text_${e}_thin`,"p"]])),display_2xl_regular:"h1",display_xl_regular:"h2",display_lg_regular:"h3",display_md_regular:"h4",display_sm_regular:"h5",display_xs_regular:"h6",display_2xl_bold:"h1",display_xl_bold:"h2",display_lg_bold:"h3",display_md_bold:"h4",display_sm_bold:"h5",display_xs_bold:"h6"}}}},ye={text_xl_regular:{font:"400 20px/30px inherit inherit"},text_lg_regular:{font:"400 18px/28px inherit inherit"},text_md_regular:{font:"400 16px/24px inherit inherit"},text_sm_regular:{font:"400 14px/20px inherit inherit"},text_xs_regular:{font:"400 12px/18px inherit inherit"},text_2xs_regular:{font:"400 10px/14px inherit inherit"},text_xl_bold:{font:"600 20px/30px inherit inherit"},text_lg_bold:{font:"700 18px/28px inherit inherit"},text_md_bold:{font:"700 16px/24px inherit inherit"},text_sm_bold:{font:"700 14px/20px inherit inherit"},text_xs_bold:{font:"700 12px/18px inherit inherit"},text_2xs_bold:{font:"700 10px/14px inherit inherit"},text_xl_semibold:{font:"600 20px/30px inherit inherit"},text_lg_semibold:{font:"600 18px/28px inherit inherit"},text_md_semibold:{font:"600 16px/24px inherit inherit"},text_sm_semibold:{font:"600 14px/20px inherit inherit"},text_xs_semibold:{font:"600 12px/18px inherit inherit"},text_2xs_semibold:{font:"600 10px/14px inherit inherit"},text_xl_thin:{font:"100 20px/30px inherit inherit"},text_lg_thin:{font:"100 18px/28px inherit inherit"},text_md_thin:{font:"100 16px/24px inherit inherit"},text_sm_thin:{font:"100 14px/20px inherit inherit"},text_xs_thin:{font:"100 12px/18px inherit inherit"},text_2xs_thin:{font:"100 10px/14px inherit inherit"},display_2xl_regular:{font:"400 72px/90px inherit inherit"},display_xl_regular:{font:"400 60px/72px inherit inherit"},display_lg_regular:{font:"400 48px/60px inherit inherit"},display_md_regular:{font:"400 36px/44px inherit inherit"},display_sm_regular:{font:"400 30px/38px inherit inherit"},display_xs_regular:{font:"400 24px/32px inherit inherit"},display_2xl_bold:{font:"700 72px/90px inherit inherit"},display_xl_bold:{font:"700 60px/72px inherit inherit"},display_lg_bold:{font:"700 48px/60px inherit inherit"},display_md_bold:{font:"700 36px/44px inherit inherit"},display_sm_bold:{font:"700 30px/38px inherit inherit"},display_xs_bold:{font:"700 24px/32px inherit inherit"}};var be=()=>{let r=new Date().getHours(),t;return r<12&&r>=5?t="\u0414\u043E\u0431\u0440\u043E\u0435 \u0443\u0442\u0440\u043E,":r<18&&r>12?t="\u0414\u043E\u0431\u0440\u044B\u0439 \u0434\u0435\u043D\u044C,":t="\u0414\u043E\u0431\u0440\u044B\u0439 \u0432\u0435\u0447\u0435\u0440,",t};var _e=e=>{let r=e.getFullYear(),t=String(e.getMonth()+1).padStart(2,"0"),o=String(e.getDate()).padStart(2,"0");return`${r}-${t}-${o}`};var{userAgent:F}=globalThis.navigator,Ce=()=>{let e=F.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"},ke=()=>{let e=F.toLowerCase();return e.includes("edg")?"Edge":e.includes("chrome")?"Chrome":e.includes("firefox")?"Firefox":e.includes("safari")?"Safari":"Unknown"},Te={os:Ce(),browser:ke()};var we=(e,r=navigator.language||"en-US")=>{let t=new Date;e=new Date(e);let o=Math.floor((t.getTime()-e.getTime())/1e3),i=new Intl.RelativeTimeFormat(r,{numeric:"auto"});if(o<60)return i.format(-o,"second");if(o<3600){let a=Math.floor(o/60);return i.format(-a,"minute")}if(o<86400){let a=Math.floor(o/3600);return i.format(-a,"hour")}let n=Math.floor(o/86400);return i.format(-n,"day")},ve=(e,r=navigator.language||"en-US")=>{let t=new Date;e=new Date(e);let o=(e.getTime()-t.getTime())/1e3,i=Math.floor(o/(60*60)),n=Math.floor((o-60*60*i)/60),a=Math.floor(o-60*60*i-60*n),p=new Intl.RelativeTimeFormat(r,{numeric:"auto"});if(n===0&&a<60)return p.format(a,"second");if(i===0&&n<60)return p.format(n,"minute");if(i<24){let b=`${new Intl.RelativeTimeFormat(r,{numeric:"auto"}).format(i,"hour")}`,l=` ${new Intl.RelativeTimeFormat(r,{localeMatcher:"lookup",numeric:"always",style:"long"}).format(n,"minute")}`.replace(/^\D+/,"");return`${b} ${l}`}let y=Math.floor(a/86400);return p.format(y,"day")};import{useEffect as Me,useState as Se}from"react";var Pe=(e=768)=>{let[r,t]=Se(!1);return Me(()=>{let o=()=>{t(window.innerWidth<e)};o();let i=()=>o();return window.addEventListener("resize",i),()=>{window.removeEventListener("resize",i)}},[e]),r};import{useState as De,useEffect as Ee}from"react";var M=()=>{let[e,r]=De("unknown");return Ee(()=>{let t=i=>{r(i.matches?"dark":"light")},o=globalThis.matchMedia("(prefers-color-scheme: dark)");return r(o.matches?"dark":"light"),o.addEventListener("change",t),()=>{o.removeEventListener("change",t)}},[]),e};import{jsx as S}from"react/jsx-runtime";var Ie=({children:e})=>{let r=M(),[t,o]=O(()=>{let l=localStorage.getItem("appSettings");return l&&JSON.parse(l).theme||"system"}),[i,n]=O(()=>{let l=localStorage.getItem("appSettings");return l&&JSON.parse(l).darkMode||"auto"});Re(()=>{localStorage.setItem("appSettings",JSON.stringify({theme:t,darkMode:i}))},[t,i]);let a=g(()=>{var l;return r==="unknown"?f[0].MuiTheme:t==="system"?r==="dark"?f[0].MuiTheme:f[1].MuiTheme:((l=f.find(I=>I.name===t))==null?void 0:l.MuiTheme)||f[0].MuiTheme},[r,t]),p=g(()=>v(i,r,a.palette.secondary.main)?"dark":"light",[i,r,a]),y=g(()=>x(a.palette.primary.main,a.palette.secondary.main,p),[a,p]),b=g(()=>({darkMode:p==="dark"}),[p]);return S(k.Provider,{value:{theme:t,darkMode:i,setTheme:o,setDarkMode:n},children:S(Oe,{theme:y,children:S(Fe,{theme:b,children:e})})})};export{s as ColorPalette,$ as DialogBtn,_ as ErrorBoundary,ae as GlobalStyles,X as Loading,q as PathName,Ie as ThemeProviderWrapper,w as commonComponentProps,x as createCustomTheme,be as displayGreeting,le as fadeIn,pe as fadeInLeft,_e as getDayIdentifier,m as getFontColor,xe as installAppAnimation,v as isDarkMode,re as isFontLight,E as isHexColor,he as logoutAnimation,ue as progressPulse,ce as pulseAnimation,fe as scale,de as slideIn,me as slideInBottom,Te as systemInfo,T as themeConfig,f as themes,we as timeAgo,ve as timeAgoFromStart,ge as typographyProps,ye as typographyVariants,Pe as useResponsiveDisplay,M as useSystemTheme,ee as useThemeSettings};
|
|
254
254
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/DialogBtn.ts","../src/components/ErrorBoundary.tsx","../src/components/Loading.tsx","../src/components/PathName.ts","../src/context/ThemeContext.tsx","../src/context/ThemeProviderWrapper.tsx","../src/styles/themeConfig.ts","../src/styles/colorUtils.ts","../src/styles/commonComponents.ts","../src/styles/createTheme.ts","../src/styles/globalStyles.tsx","../src/styles/keyframes.ts","../src/styles/typography.ts","../src/utils/displayGreeting.ts","../src/utils/getDayIdentifier.ts","../src/utils/getSystemInfo.ts","../src/utils/timeAgo.ts","../src/utils/useResponsiveDisplay.ts","../src/utils/useSystemTheme.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 */\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 -- Выводим ошибку в консоль\n console.error(\"Error:\", error);\n // eslint-disable-next-line no-console -- Выводим ошибку в консоль\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>Ошибка. </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>\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 { 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","// src/context/ThemeProvider.tsx\nimport { useMemo, useState, useEffect } from \"react\";\nimport { ThemeProvider as EmotionThemeProvider } from \"@emotion/react\";\nimport { ThemeProvider as MuiThemeProvider } from \"@mui/material/styles\";\n\nimport { themes, createCustomTheme, isDarkMode } from \"../styles\";\nimport { useSystemTheme } from \"../utils\";\n\nimport { ThemeContext } from \"./ThemeContext\";\n\nimport type { FC, PropsWithChildren } from \"react\";\n\nexport const ThemeProviderWrapper: FC<PropsWithChildren> = ({ children }) => {\n const systemTheme = useSystemTheme();\n\n const [theme, setTheme] = useState<string>(() => {\n const stored = localStorage.getItem(\"appSettings\");\n return stored ? JSON.parse(stored).theme || \"system\" : \"system\";\n });\n\n const [darkMode, setDarkMode] = useState<\n \"light\" | \"dark\" | \"system\" | \"auto\"\n >(() => {\n const stored = localStorage.getItem(\"appSettings\");\n return stored ? JSON.parse(stored).darkMode || \"auto\" : \"auto\";\n });\n\n useEffect(() => {\n localStorage.setItem(\"appSettings\", JSON.stringify({ theme, darkMode }));\n }, [theme, darkMode]);\n\n const selectedTheme = useMemo(() => {\n if (systemTheme === \"unknown\") return themes[0].MuiTheme;\n if (theme === \"system\") {\n return systemTheme === \"dark\" ? themes[0].MuiTheme : themes[1].MuiTheme;\n }\n return themes.find((t) => t.name === theme)?.MuiTheme || themes[0].MuiTheme;\n }, [systemTheme, theme]);\n\n const mode = useMemo(\n () =>\n isDarkMode(darkMode, systemTheme, selectedTheme.palette.secondary.main)\n ? \"dark\"\n : \"light\",\n [darkMode, systemTheme, selectedTheme],\n );\n\n const muiTheme = useMemo(\n () =>\n createCustomTheme(\n selectedTheme.palette.primary.main,\n selectedTheme.palette.secondary.main,\n mode,\n ),\n [selectedTheme, mode],\n );\n\n const emotionTheme = useMemo(() => ({ darkMode: mode === \"dark\" }), [mode]);\n\n return (\n <ThemeContext.Provider value={{ theme, darkMode, setTheme, setDarkMode }}>\n <MuiThemeProvider theme={muiTheme}>\n <EmotionThemeProvider theme={emotionTheme}>\n {children}\n </EmotionThemeProvider>\n </MuiThemeProvider>\n </ThemeContext.Provider>\n );\n};\n","export const ColorPalette = {\n fontDark: \"#101727\",\n fontLight: \"#f0f0f0\",\n darkMode: \"#383838\",\n lightMode: \"#ffffff\",\n purple: \"#b624ff\",\n red: \"#ff3131\",\n orange: \"#ff9318\",\n orangeDark: \"#ff9500\",\n} as const;\n\nexport const themeConfig: Record<\n string,\n { primaryColor: string; secondaryColor?: string }\n> = {\n \"Dark Purple\": {\n // Default dark theme\n primaryColor: ColorPalette.purple,\n },\n \"Light Purple\": {\n // Default light theme\n primaryColor: ColorPalette.purple,\n secondaryColor: \"#edeef6\",\n },\n \"Dark Blue\": {\n primaryColor: \"#106cff\",\n secondaryColor: \"#090815\",\n },\n \"Light Blue\": {\n primaryColor: \"#278ad2\",\n secondaryColor: \"#dddaf6\",\n },\n \"Dark Pink\": {\n primaryColor: \"#f2369d\",\n secondaryColor: \"#191218\",\n },\n \"Light Pink\": {\n primaryColor: \"#e5369a\",\n secondaryColor: \"#ffe3ff\",\n },\n \"Blush Blossom\": {\n primaryColor: \"#EC407A\",\n secondaryColor: \"#FCE4EC\",\n },\n Cheesecake: {\n primaryColor: \"#E14C94\",\n secondaryColor: \"#FDF0D5\",\n },\n \"Mystic Coral\": {\n primaryColor: \"#ff7b9c\",\n secondaryColor: \"#4a2333\",\n },\n \"Dark Orange\": {\n primaryColor: \"#FF5631\",\n secondaryColor: \"#0D0D0D\",\n },\n \"Light Orange\": {\n primaryColor: \"#F26E56\",\n secondaryColor: \"#F6F6F6\",\n },\n Aurora: {\n primaryColor: \"#00e952\",\n secondaryColor: \"#011926\",\n },\n};\n","import { ColorPalette } from \"./themeConfig\";\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/**\n * Determines the ideal font color (white or black) for contrast against a given background color.\n *\n * Uses luminance calculation (YIQ) to ensure accessibility and visual clarity.\n *\n * @param backgroundColor - A valid hex color (e.g., \"#ffffff\").\n * @returns A hex color string (`fontLight` or `fontDark`) suitable for overlay text.\n */\nexport const getFontColor = (backgroundColor: string): string => {\n if (!isHexColor(backgroundColor)) {\n // eslint-disable-next-line no-console -- Allow\n console.error(\"Invalid hex color provided:\", backgroundColor);\n return ColorPalette.fontDark;\n }\n\n const hex = backgroundColor.slice(1);\n\n const fullHex =\n hex.length === 3\n ? hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : hex;\n\n const r = Number.parseInt(fullHex.slice(0, 2), 16);\n const g = Number.parseInt(fullHex.slice(2, 4), 16);\n const b = Number.parseInt(fullHex.slice(4, 6), 16);\n\n const brightness = Math.round((r * 299 + g * 587 + b * 114) / 1000);\n\n return brightness > 128 ? ColorPalette.fontDark : ColorPalette.fontLight;\n};\n\n/**\n * Determines whether the ideal font color for a background is light (i.e., white).\n *\n * @param color - The background color in hex.\n * @returns `true` if white text is recommended; otherwise, `false`.\n */\nexport const isFontLight = (color: string): boolean =>\n getFontColor(color) === ColorPalette.fontLight;\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 color: theme.palette.mode === \"dark\" ? \"#fff\" : \"#000\",\n backgroundColor:\n theme.palette.mode === \"dark\" ? \"#141431dd\" : \"#ededf3dd\",\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 color: \"#fff\",\n },\n },\n },\n\n MuiAlert: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n },\n },\n\n MuiTextField: {\n styleOverrides: {\n root: ({ theme }) => ({\n \"& .MuiInputBase-root\": {\n borderRadius: theme.shape.borderRadius,\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 MuiIcon: {\n styleOverrides: {\n root: {\n borderRadius: '100%'\n }\n },\n },\n\n MuiDialogContent: {\n styleOverrides: {\n root: {\n padding: '0 !important'\n }\n },\n },\n\n MuiSlider: {\n styleOverrides: {\n valueLabel: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n padding: \"6px 14px\",\n color: theme.palette.mode === \"dark\" ? \"#fff\" : \"#000\",\n backgroundColor:\n theme.palette.mode === \"dark\" ? \"#141431dd\" : \"#ededf3dd\",\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 { createTheme } from \"@mui/material\";\n\nimport { getFontColor } from \"./colorUtils\";\nimport { commonComponentProps } from \"./commonComponents\";\nimport { ColorPalette, themeConfig } from \"./themeConfig\";\n\nimport type { AppSettings, SystemTheme } from \"../models\";\nimport type { PaletteMode, Theme } from \"@mui/material\";\n\n/**\n * Generates a custom MUI theme using a primary color, background color, and color mode.\n *\n * @param primaryColor - The main color used for primary palette.\n * @param backgroundColor - Background color (used as secondary). Defaults to dark blue.\n * @param mode - MUI palette mode ('light' | 'dark'). Defaults to 'dark'.\n * @returns A MUI Theme object.\n */\nexport const createCustomTheme = (\n primaryColor: string,\n backgroundColor = \"#232e58\",\n mode: PaletteMode = \"dark\",\n): Theme =>\n createTheme({\n palette: {\n primary: { main: primaryColor },\n secondary: { main: backgroundColor },\n warning: {\n main: mode === \"dark\" ? ColorPalette.orange : ColorPalette.orangeDark,\n },\n error: { main: ColorPalette.red },\n mode,\n },\n components: {\n ...commonComponentProps,\n },\n shape: { borderRadius: 24 },\n });\n\n/**\n * A predefined list of named themes based on the `themeConfig` definition.\n */\nexport const themes: { name: string; MuiTheme: Theme }[] = Object.entries(\n themeConfig,\n).map(([name, config]) => ({\n name,\n MuiTheme: createCustomTheme(config.primaryColor, config.secondaryColor),\n}));\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 backgroundColor: string,\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 case \"auto\": {\n return getFontColor(backgroundColor) === ColorPalette.fontLight;\n }\n default: {\n return false;\n }\n }\n};\n","import { useMemo } from \"react\";\nimport { Global, css } from \"@emotion/react\";\nimport { useTheme } from \"@mui/material/styles\";\n\nimport { getFontColor } from \"./colorUtils\";\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 */\nexport const GlobalStyles: FC = () => {\n const theme = useTheme();\n const isDarkMode = theme.palette.mode === \"dark\";\n\n const primaryColor = theme.palette.primary.main;\n const secondaryColor = theme.palette.secondary.main;\n\n const primaryFontColor = useMemo(\n () => getFontColor(primaryColor),\n [primaryColor],\n );\n const secondaryFontColor = useMemo(\n () => getFontColor(secondaryColor),\n [secondaryColor],\n );\n\n return (\n <Global\n styles={css`\n * {\n font-family: \"Poppins\", sans-serif !important;\n -webkit-tap-highlight-color: transparent;\n &::selection {\n background-color: ${`${primaryColor}e1`};\n color: ${primaryFontColor};\n }\n }\n\n :root {\n height: 100%;\n font-family: \"Poppins\", sans-serif;\n line-height: 1.5;\n font-weight: 400;\n color-scheme: ${isDarkMode ? \"dark\" : \"light\"};\n color: ${secondaryFontColor};\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 --rsbs-backdrop-bg: rgba(0, 0, 0, 0.3);\n --rsbs-bg: ${isDarkMode ? \"#383838\" : \"#ffffff\"};\n }\n\n body {\n margin: 0;\n height: 100%;\n touch-action: manipulation;\n background: ${secondaryColor};\n background-attachment: fixed;\n background-size: cover;\n transition: 0.3s background;\n\n ::-webkit-scrollbar {\n width: 8px;\n background-color: ${secondaryColor};\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: ${secondaryColor};\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 background-color: #000000d7;\n color: white;\n padding: 16px;\n border-radius: 18px;\n overflow-x: auto;\n }\n\n .MuiDialogContent-root,\n .MuiDrawer-paper,\n .customScrollbar,\n textarea {\n ::-webkit-scrollbar {\n width: 8px;\n border-radius: 4px;\n background-color: #84848415;\n }\n ::-webkit-scrollbar-thumb {\n background-color: #8484844b;\n border-radius: 4px;\n }\n ::-webkit-scrollbar-thumb:hover {\n background-color: #84848476;\n }\n ::-webkit-scrollbar-track {\n border-radius: 4px;\n background-color: #84848415;\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 div[data-rsbs-backdrop] {\n z-index: 999;\n }\n\n div[data-rsbs-header] {\n z-index: 999999;\n box-shadow: none;\n &::before {\n width: 60px;\n height: 6px;\n border-radius: 100px;\n background: ${isDarkMode ? \"#717171\" : \"#cfcfcf\"};\n margin-top: 3px;\n }\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","import type { Theme } from \"@mui/material\";\nimport type { TypographyVariantsOptions } from \"@mui/material/styles/createTypography\";\n\n/**\n * Default MUI Typography variant-to-element mapping.\n * Custom variants are mapped to HTML tags like <p>, <h1>, etc.\n */\nexport const typographyProps: Theme[\"components\"] = {\n MuiTypography: {\n defaultProps: {\n variantMapping: {\n // Text variants\n ...Object.fromEntries(\n [\"xl\", \"lg\", \"md\", \"sm\", \"xs\", \"2xs\"].flatMap((size) => [\n [`text_${size}_regular`, \"p\"],\n [`text_${size}_bold`, \"p\"],\n [`text_${size}_semibold`, \"p\"],\n [`text_${size}_thin`, \"p\"],\n ]),\n ),\n // Display variants\n display_2xl_regular: \"h1\",\n display_xl_regular: \"h2\",\n display_lg_regular: \"h3\",\n display_md_regular: \"h4\",\n display_sm_regular: \"h5\",\n display_xs_regular: \"h6\",\n display_2xl_bold: \"h1\",\n display_xl_bold: \"h2\",\n display_lg_bold: \"h3\",\n display_md_bold: \"h4\",\n display_sm_bold: \"h5\",\n display_xs_bold: \"h6\",\n },\n },\n },\n};\n\n/**\n * Custom typography variants.\n * Defines font-weight, size, line-height and optionally fallback font.\n */\nexport const typographyVariants: TypographyVariantsOptions = {\n // TEXT_REGULAR\n text_xl_regular: { font: \"400 20px/30px inherit inherit\" },\n text_lg_regular: { font: \"400 18px/28px inherit inherit\" },\n text_md_regular: { font: \"400 16px/24px inherit inherit\" },\n text_sm_regular: { font: \"400 14px/20px inherit inherit\" },\n text_xs_regular: { font: \"400 12px/18px inherit inherit\" },\n text_2xs_regular: { font: \"400 10px/14px inherit inherit\" },\n\n // TEXT_BOLD\n text_xl_bold: { font: \"600 20px/30px inherit inherit\" },\n text_lg_bold: { font: \"700 18px/28px inherit inherit\" },\n text_md_bold: { font: \"700 16px/24px inherit inherit\" },\n text_sm_bold: { font: \"700 14px/20px inherit inherit\" },\n text_xs_bold: { font: \"700 12px/18px inherit inherit\" },\n text_2xs_bold: { font: \"700 10px/14px inherit inherit\" },\n\n // TEXT_SEMIBOLD\n text_xl_semibold: { font: \"600 20px/30px inherit inherit\" },\n text_lg_semibold: { font: \"600 18px/28px inherit inherit\" },\n text_md_semibold: { font: \"600 16px/24px inherit inherit\" },\n text_sm_semibold: { font: \"600 14px/20px inherit inherit\" },\n text_xs_semibold: { font: \"600 12px/18px inherit inherit\" },\n text_2xs_semibold: { font: \"600 10px/14px inherit inherit\" },\n\n // TEXT_THIN\n text_xl_thin: { font: \"100 20px/30px inherit inherit\" },\n text_lg_thin: { font: \"100 18px/28px inherit inherit\" },\n text_md_thin: { font: \"100 16px/24px inherit inherit\" },\n text_sm_thin: { font: \"100 14px/20px inherit inherit\" },\n text_xs_thin: { font: \"100 12px/18px inherit inherit\" },\n text_2xs_thin: { font: \"100 10px/14px inherit inherit\" },\n\n // DISPLAY_REGULAR\n display_2xl_regular: { font: \"400 72px/90px inherit inherit\" },\n display_xl_regular: { font: \"400 60px/72px inherit inherit\" },\n display_lg_regular: { font: \"400 48px/60px inherit inherit\" },\n display_md_regular: { font: \"400 36px/44px inherit inherit\" },\n display_sm_regular: { font: \"400 30px/38px inherit inherit\" },\n display_xs_regular: { font: \"400 24px/32px inherit inherit\" },\n\n // DISPLAY_BOLD\n display_2xl_bold: { font: \"700 72px/90px inherit inherit\" },\n display_xl_bold: { font: \"700 60px/72px inherit inherit\" },\n display_lg_bold: { font: \"700 48px/60px inherit inherit\" },\n display_md_bold: { font: \"700 36px/44px inherit inherit\" },\n display_sm_bold: { font: \"700 30px/38px inherit inherit\" },\n display_xs_bold: { font: \"700 24px/32px inherit inherit\" },\n};\n","/**\n * Returns a greeting based on the current time.\n * @returns {string} The appropriate greeting.\n */\nexport const displayGreeting = (): string => {\n const currentTime = new Date();\n const currentHour = currentTime.getHours();\n let greeting: string;\n if (currentHour < 12 && currentHour >= 5) {\n greeting = \"Доброе утро,\";\n } else if (currentHour < 18 && currentHour > 12) {\n greeting = \"Добрый день,\";\n } else {\n greeting = \"Добрый вечер,\";\n }\n\n return greeting;\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\nconst { userAgent } = globalThis.navigator;\n\n/**\n * Detects the user's operating system based on the user agent string.\n *\n * @returns {OperatingSystem} The name of the detected operating system.\n */\nexport const getOperatingSystem = (): OperatingSystem => {\n const ua = userAgent.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 *\n * @returns {Browser} The name of the detected browser.\n */\nexport const getBrowser = (): Browser => {\n const ua = userAgent.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 */\nexport const systemInfo = {\n os: getOperatingSystem(),\n browser: getBrowser(),\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 = (\n date: Date,\n lang = navigator.language || \"en-US\",\n): string => {\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(lang, { 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 = (\n date: Date,\n lang = navigator.language || \"en-US\",\n): string => {\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(lang, { 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(lang, {\n numeric: \"auto\",\n }).format(differenceHours, \"hour\")}`;\n const minutes = ` ${new Intl.RelativeTimeFormat(lang, {\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"],"mappings":"AAAA,OAAOA,MAAY,kBACnB,OAAS,UAAAC,MAAc,gBAEhB,IAAMC,EAAYF,EAAOC,CAAM;AAAA;AAAA;AAAA;AAAA;ECFtC,OAAOE,MAAW,QAClB,OAAOC,MAAY,kBACnB,OAAOC,MAAyB,0CAChC,OAAS,OAAAC,MAAW,gBAgDR,cAAAC,EAGA,QAAAC,MAHA,oBA/BL,IAAMC,EAAN,cAA4BN,EAAM,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,CA9CX,IAAAC,EAAAC,EAAAC,EA+CI,GAAM,CAAE,MAAAC,EAAO,MAAAN,CAAM,EAAI,KACzB,OAAIM,EAAM,SAENR,EAACS,EAAA,CACC,UAAAV,EAACW,EAAA,CACC,SAAAX,EAACD,EAAA,CAAI,qDAAa,EACpB,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,EAAYb,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnBc,EAAcd,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ECvF3B,OAAS,aAAAe,EAAW,YAAAC,MAAgB,QACpC,OAAOC,MAAY,kBACnB,OAAS,OAAAC,EAAK,oBAAAC,MAAwB,gBAgB9B,mBAAAC,EACE,OAAAC,EADF,QAAAC,MAAA,oBAdD,IAAMC,EAAU,IAAM,CAC3B,GAAM,CAACC,EAAaC,CAAc,EAAIT,EAAkB,EAAK,EAE7D,OAAAD,EAAU,IAAM,CACd,IAAMW,EAAQ,WAAW,IAAM,CAC7BD,EAAe,EAAI,CACrB,EAAG,GAAG,EAEN,MAAO,IAAM,aAAaC,CAAK,CACjC,EAAG,CAAC,CAAC,EAGHL,EAACM,EAAA,CACE,SAAAH,GACCF,EAAAF,EAAA,CACE,UAAAC,EAACF,EAAA,CAAiB,aAAW,UAAU,KAAM,GAAI,UAAW,EAAG,EAC/DE,EAAC,MAAG,MAAO,CAAE,QAAS,EAAI,EAAG,2BAAe,GAC9C,EAEJ,CAEJ,EAEMM,EAAYV,EAAOC,CAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EC3B5B,OAAOU,MAAY,kBAEZ,IAAMC,EAAWD,EAAO;AAAA;AAAA;AAAA;AAAA;ECF/B,OAAS,iBAAAE,EAAe,cAAAC,MAAkB,QAInC,IAAMC,EAAeF,EAC1B,MACF,EAEaG,GAAmB,IAAyB,CACvD,IAAMC,EAAUH,EAAWC,CAAY,EACvC,GAAI,CAACE,EACH,MAAM,IAAI,MACR,2DACF,EACF,OAAOA,CACT,ECdA,OAAS,WAAAC,EAAS,YAAAC,EAAU,aAAAC,OAAiB,QAC7C,OAAS,iBAAiBC,OAA4B,iBACtD,OAAS,iBAAiBC,OAAwB,uBCH3C,IAAMC,EAAe,CAC1B,SAAU,UACV,UAAW,UACX,SAAU,UACV,UAAW,UACX,OAAQ,UACR,IAAK,UACL,OAAQ,UACR,WAAY,SACd,EAEaC,EAGT,CACF,cAAe,CAEb,aAAcD,EAAa,MAC7B,EACA,eAAgB,CAEd,aAAcA,EAAa,OAC3B,eAAgB,SAClB,EACA,YAAa,CACX,aAAc,UACd,eAAgB,SAClB,EACA,aAAc,CACZ,aAAc,UACd,eAAgB,SAClB,EACA,YAAa,CACX,aAAc,UACd,eAAgB,SAClB,EACA,aAAc,CACZ,aAAc,UACd,eAAgB,SAClB,EACA,gBAAiB,CACf,aAAc,UACd,eAAgB,SAClB,EACA,WAAY,CACV,aAAc,UACd,eAAgB,SAClB,EACA,eAAgB,CACd,aAAc,UACd,eAAgB,SAClB,EACA,cAAe,CACb,aAAc,UACd,eAAgB,SAClB,EACA,eAAgB,CACd,aAAc,UACd,eAAgB,SAClB,EACA,OAAQ,CACN,aAAc,UACd,eAAgB,SAClB,CACF,ECxDO,IAAME,EAAcC,GACzB,mCAAmC,KAAKA,CAAK,EAUlCC,EAAgBC,GAAoC,CAC/D,GAAI,CAACH,EAAWG,CAAe,EAE7B,eAAQ,MAAM,8BAA+BA,CAAe,EACrDC,EAAa,SAGtB,IAAMC,EAAMF,EAAgB,MAAM,CAAC,EAE7BG,EACJD,EAAI,SAAW,EACXA,EACG,MAAM,EAAE,EACR,IAAKE,GAAMA,EAAIA,CAAC,EAChB,KAAK,EAAE,EACVF,EAEAG,EAAI,OAAO,SAASF,EAAQ,MAAM,EAAG,CAAC,EAAG,EAAE,EAC3CG,EAAI,OAAO,SAASH,EAAQ,MAAM,EAAG,CAAC,EAAG,EAAE,EAC3CI,EAAI,OAAO,SAASJ,EAAQ,MAAM,EAAG,CAAC,EAAG,EAAE,EAIjD,OAFmB,KAAK,OAAOE,EAAI,IAAMC,EAAI,IAAMC,EAAI,KAAO,GAAI,EAE9C,IAAMN,EAAa,SAAWA,EAAa,SACjE,EAQaO,GAAeC,GAC1BV,EAAaU,CAAK,IAAMR,EAAa,UC9ChC,IAAMS,EAA4C,CACvD,WAAY,CACV,aAAc,CACZ,mBAAoB,EACtB,EACA,eAAgB,CACd,QAAS,CAAC,CAAE,MAAAC,CAAM,KAAO,CACvB,MAAOA,EAAM,QAAQ,OAAS,OAAS,OAAS,OAChD,gBACEA,EAAM,QAAQ,OAAS,OAAS,YAAc,YAChD,eAAgB,YAChB,qBAAsB,YACtB,QAAS,WACT,aAAcA,EAAM,MAAM,aAC1B,SAAU,MACZ,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,IACZ,MAAO,MACT,CACF,CACF,EAEA,SAAU,CACR,eAAgB,CACd,KAAM,CAAC,CAAE,MAAAA,CAAM,KAAO,CACpB,aAAcA,EAAM,MAAM,YAC5B,EACF,CACF,EAEA,aAAc,CACZ,eAAgB,CACd,KAAM,CAAC,CAAE,MAAAA,CAAM,KAAO,CACpB,uBAAwB,CACtB,aAAcA,EAAM,MAAM,YAC5B,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,QAAS,CACP,eAAgB,CACd,KAAM,CACJ,aAAc,MAChB,CACF,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,MAAOA,EAAM,QAAQ,OAAS,OAAS,OAAS,OAChD,gBACEA,EAAM,QAAQ,OAAS,OAAS,YAAc,YAChD,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,ECjMA,OAAS,eAAAC,OAAmB,gBAiBrB,IAAMC,EAAoB,CAC/BC,EACAC,EAAkB,UAClBC,EAAoB,SAEpBC,GAAY,CACV,QAAS,CACP,QAAS,CAAE,KAAMH,CAAa,EAC9B,UAAW,CAAE,KAAMC,CAAgB,EACnC,QAAS,CACP,KAAMC,IAAS,OAASE,EAAa,OAASA,EAAa,UAC7D,EACA,MAAO,CAAE,KAAMA,EAAa,GAAI,EAChC,KAAAF,CACF,EACA,WAAY,CACV,GAAGG,CACL,EACA,MAAO,CAAE,aAAc,EAAG,CAC5B,CAAC,EAKUC,EAA8C,OAAO,QAChEC,CACF,EAAE,IAAI,CAAC,CAACC,EAAMC,CAAM,KAAO,CACzB,KAAAD,EACA,SAAUT,EAAkBU,EAAO,aAAcA,EAAO,cAAc,CACxE,EAAE,EAUWC,EAAa,CACxBC,EACAC,EACAX,IACY,CACZ,OAAQU,EAAU,CAChB,IAAK,QACH,MAAO,GAET,IAAK,OACH,MAAO,GAET,IAAK,SACH,OAAOC,IAAgB,OAEzB,IAAK,OACH,OAAOC,EAAaZ,CAAe,IAAMG,EAAa,UAExD,QACE,MAAO,EAEX,CACF,EC9EA,OAAS,WAAAU,MAAe,QACxB,OAAS,UAAAC,GAAQ,OAAAC,OAAW,iBAC5B,OAAS,YAAAC,OAAgB,uBA8BrB,cAAAC,OAAA,oBAjBG,IAAMC,GAAmB,IAAM,CACpC,IAAMC,EAAQC,GAAS,EACjBC,EAAaF,EAAM,QAAQ,OAAS,OAEpCG,EAAeH,EAAM,QAAQ,QAAQ,KACrCI,EAAiBJ,EAAM,QAAQ,UAAU,KAEzCK,EAAmBC,EACvB,IAAMC,EAAaJ,CAAY,EAC/B,CAACA,CAAY,CACf,EACMK,EAAqBF,EACzB,IAAMC,EAAaH,CAAc,EACjC,CAACA,CAAc,CACjB,EAEA,OACEN,GAACW,GAAA,CACC,OAAQC;AAAA;AAAA;AAAA;AAAA;AAAA,gCAKkB,GAAGP,CAAY,IAAI;AAAA,qBAC9BE,CAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BASXH,EAAa,OAAS,OAAO;AAAA,mBACpCM,CAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAQdN,EAAa,UAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAOjCE,CAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAONA,CAAc;AAAA;AAAA;AAAA,gCAGdD,CAAY;AAAA;AAAA;AAAA;AAAA,gCAIZ,GAAGA,CAAY,IAAI;AAAA;AAAA;AAAA;AAAA,gCAInBC,CAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAoEpBF,EAAa,UAAY,SAAS;AAAA;AAAA;AAAA;AAAA,QAKxD,CAEJ,EC7JA,OAAS,aAAAS,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;ECxH5B,IAAMY,GAAuC,CAClD,cAAe,CACb,aAAc,CACZ,eAAgB,CAEd,GAAG,OAAO,YACR,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAK,EAAE,QAASC,GAAS,CACtD,CAAC,QAAQA,CAAI,WAAY,GAAG,EAC5B,CAAC,QAAQA,CAAI,QAAS,GAAG,EACzB,CAAC,QAAQA,CAAI,YAAa,GAAG,EAC7B,CAAC,QAAQA,CAAI,QAAS,GAAG,CAC3B,CAAC,CACH,EAEA,oBAAqB,KACrB,mBAAoB,KACpB,mBAAoB,KACpB,mBAAoB,KACpB,mBAAoB,KACpB,mBAAoB,KACpB,iBAAkB,KAClB,gBAAiB,KACjB,gBAAiB,KACjB,gBAAiB,KACjB,gBAAiB,KACjB,gBAAiB,IACnB,CACF,CACF,CACF,EAMaC,GAAgD,CAE3D,gBAAiB,CAAE,KAAM,+BAAgC,EACzD,gBAAiB,CAAE,KAAM,+BAAgC,EACzD,gBAAiB,CAAE,KAAM,+BAAgC,EACzD,gBAAiB,CAAE,KAAM,+BAAgC,EACzD,gBAAiB,CAAE,KAAM,+BAAgC,EACzD,iBAAkB,CAAE,KAAM,+BAAgC,EAG1D,aAAc,CAAE,KAAM,+BAAgC,EACtD,aAAc,CAAE,KAAM,+BAAgC,EACtD,aAAc,CAAE,KAAM,+BAAgC,EACtD,aAAc,CAAE,KAAM,+BAAgC,EACtD,aAAc,CAAE,KAAM,+BAAgC,EACtD,cAAe,CAAE,KAAM,+BAAgC,EAGvD,iBAAkB,CAAE,KAAM,+BAAgC,EAC1D,iBAAkB,CAAE,KAAM,+BAAgC,EAC1D,iBAAkB,CAAE,KAAM,+BAAgC,EAC1D,iBAAkB,CAAE,KAAM,+BAAgC,EAC1D,iBAAkB,CAAE,KAAM,+BAAgC,EAC1D,kBAAmB,CAAE,KAAM,+BAAgC,EAG3D,aAAc,CAAE,KAAM,+BAAgC,EACtD,aAAc,CAAE,KAAM,+BAAgC,EACtD,aAAc,CAAE,KAAM,+BAAgC,EACtD,aAAc,CAAE,KAAM,+BAAgC,EACtD,aAAc,CAAE,KAAM,+BAAgC,EACtD,cAAe,CAAE,KAAM,+BAAgC,EAGvD,oBAAqB,CAAE,KAAM,+BAAgC,EAC7D,mBAAoB,CAAE,KAAM,+BAAgC,EAC5D,mBAAoB,CAAE,KAAM,+BAAgC,EAC5D,mBAAoB,CAAE,KAAM,+BAAgC,EAC5D,mBAAoB,CAAE,KAAM,+BAAgC,EAC5D,mBAAoB,CAAE,KAAM,+BAAgC,EAG5D,iBAAkB,CAAE,KAAM,+BAAgC,EAC1D,gBAAiB,CAAE,KAAM,+BAAgC,EACzD,gBAAiB,CAAE,KAAM,+BAAgC,EACzD,gBAAiB,CAAE,KAAM,+BAAgC,EACzD,gBAAiB,CAAE,KAAM,+BAAgC,EACzD,gBAAiB,CAAE,KAAM,+BAAgC,CAC3D,ECtFO,IAAMC,GAAkB,IAAc,CAE3C,IAAMC,EADc,IAAI,KAAK,EACG,SAAS,EACrCC,EACJ,OAAID,EAAc,IAAMA,GAAe,EACrCC,EAAW,iEACFD,EAAc,IAAMA,EAAc,GAC3CC,EAAW,iEAEXA,EAAW,uEAGNA,CACT,ECdO,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,ECQA,GAAM,CAAE,UAAAC,CAAU,EAAI,WAAW,UAOpBC,GAAqB,IAAuB,CACvD,IAAMC,EAAKF,EAAU,YAAY,EAEjC,OAAIE,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,EAOaC,GAAa,IAAe,CACvC,IAAMD,EAAKF,EAAU,YAAY,EAGjC,OAAIE,EAAG,SAAS,KAAK,EAAU,OAC3BA,EAAG,SAAS,QAAQ,EAAU,SAC9BA,EAAG,SAAS,SAAS,EAAU,UAC/BA,EAAG,SAAS,QAAQ,EAAU,SAE3B,SACT,EAKaE,GAAa,CACxB,GAAIH,GAAmB,EACvB,QAASE,GAAW,CACtB,ECpDO,IAAME,GAAU,CACrBC,EACAC,EAAO,UAAU,UAAY,UAClB,CAEX,IAAMC,EAAM,IAAI,KAChBF,EAAO,IAAI,KAAKA,CAAI,EAEpB,IAAMG,EAAgB,KAAK,OAAOD,EAAI,QAAQ,EAAIF,EAAK,QAAQ,GAAK,GAAI,EAGlEI,EAAM,IAAI,KAAK,mBAAmBH,EAAM,CAAE,QAAS,MAAO,CAAC,EAGjE,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,CAC9BR,EACAC,EAAO,UAAU,UAAY,UAClB,CACX,IAAMC,EAAM,IAAI,KAChBF,EAAO,IAAI,KAAKA,CAAI,EACpB,IAAMS,GAAcT,EAAK,QAAQ,EAAIE,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,EAAM,CAAE,QAAS,MAAO,CAAC,EAEjE,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,EAAM,CACjD,QAAS,MACX,CAAC,EAAE,OAAOS,EAAiB,MAAM,CAAC,GAC5BL,EAAU,IAAI,IAAI,KAAK,mBAAmBJ,EAAM,CACpD,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,ECzEA,OAAS,aAAAK,GAAW,YAAAC,OAAgB,QAQ7B,IAAMC,GAAuB,CAACC,EAAa,MAAiB,CACjE,GAAM,CAACC,EAAiBC,CAAkB,EAAIJ,GAAkB,EAAK,EAErE,OAAAD,GAAU,IAAM,CACd,IAAMM,EAAkB,IAAM,CAC5BD,EAAmB,OAAO,WAAaF,CAAU,CACnD,EACAG,EAAgB,EAChB,IAAMC,EAAe,IAAMD,EAAgB,EAC3C,cAAO,iBAAiB,SAAUC,CAAY,EACvC,IAAM,CACX,OAAO,oBAAoB,SAAUA,CAAY,CACnD,CACF,EAAG,CAACJ,CAAU,CAAC,EAERC,CACT,ECxBA,OAAS,YAAAI,GAAU,aAAAC,OAAiB,QAQ7B,IAAMC,EAAiB,IAAmB,CAC/C,GAAM,CAACC,EAAOC,CAAQ,EAAIJ,GAAsB,SAAS,EACzD,OAAAC,GAAU,IAAM,CACd,IAAMI,EAAsBC,GAA2B,CACrDF,EAASE,EAAE,QAAU,OAAS,OAAO,CACvC,EAEMC,EAAoB,WAAW,WACnC,8BACF,EACA,OAAAH,EAASG,EAAkB,QAAU,OAAS,OAAO,EAGrDA,EAAkB,iBAAiB,SAAUF,CAAkB,EAExD,IAAM,CACXE,EAAkB,oBAAoB,SAAUF,CAAkB,CACpE,CACF,EAAG,CAAC,CAAC,EAEEF,CACT,EbiCQ,cAAAK,MAAA,oBAlDD,IAAMC,GAA8C,CAAC,CAAE,SAAAC,CAAS,IAAM,CAC3E,IAAMC,EAAcC,EAAe,EAE7B,CAACC,EAAOC,CAAQ,EAAIC,EAAiB,IAAM,CAC/C,IAAMC,EAAS,aAAa,QAAQ,aAAa,EACjD,OAAOA,GAAS,KAAK,MAAMA,CAAM,EAAE,OAAS,QAC9C,CAAC,EAEK,CAACC,EAAUC,CAAW,EAAIH,EAE9B,IAAM,CACN,IAAMC,EAAS,aAAa,QAAQ,aAAa,EACjD,OAAOA,GAAS,KAAK,MAAMA,CAAM,EAAE,UAAY,MACjD,CAAC,EAEDG,GAAU,IAAM,CACd,aAAa,QAAQ,cAAe,KAAK,UAAU,CAAE,MAAAN,EAAO,SAAAI,CAAS,CAAC,CAAC,CACzE,EAAG,CAACJ,EAAOI,CAAQ,CAAC,EAEpB,IAAMG,EAAgBC,EAAQ,IAAM,CA/BtC,IAAAC,EAgCI,OAAIX,IAAgB,UAAkBY,EAAO,CAAC,EAAE,SAC5CV,IAAU,SACLF,IAAgB,OAASY,EAAO,CAAC,EAAE,SAAWA,EAAO,CAAC,EAAE,WAE1DD,EAAAC,EAAO,KAAMC,GAAMA,EAAE,OAASX,CAAK,IAAnC,YAAAS,EAAsC,WAAYC,EAAO,CAAC,EAAE,QACrE,EAAG,CAACZ,EAAaE,CAAK,CAAC,EAEjBY,EAAOJ,EACX,IACEK,EAAWT,EAAUN,EAAaS,EAAc,QAAQ,UAAU,IAAI,EAClE,OACA,QACN,CAACH,EAAUN,EAAaS,CAAa,CACvC,EAEMO,EAAWN,EACf,IACEO,EACER,EAAc,QAAQ,QAAQ,KAC9BA,EAAc,QAAQ,UAAU,KAChCK,CACF,EACF,CAACL,EAAeK,CAAI,CACtB,EAEMI,EAAeR,EAAQ,KAAO,CAAE,SAAUI,IAAS,MAAO,GAAI,CAACA,CAAI,CAAC,EAE1E,OACEjB,EAACsB,EAAa,SAAb,CAAsB,MAAO,CAAE,MAAAjB,EAAO,SAAAI,EAAU,SAAAH,EAAU,YAAAI,CAAY,EACrE,SAAAV,EAACuB,GAAA,CAAiB,MAAOJ,EACvB,SAAAnB,EAACwB,GAAA,CAAqB,MAAOH,EAC1B,SAAAnB,EACH,EACF,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","createContext","useContext","ThemeContext","useThemeSettings","context","useMemo","useState","useEffect","EmotionThemeProvider","MuiThemeProvider","ColorPalette","themeConfig","isHexColor","value","getFontColor","backgroundColor","ColorPalette","hex","fullHex","c","r","g","b","isFontLight","color","commonComponentProps","theme","createTheme","createCustomTheme","primaryColor","backgroundColor","mode","createTheme","ColorPalette","commonComponentProps","themes","themeConfig","name","config","isDarkMode","darkMode","systemTheme","getFontColor","useMemo","Global","css","useTheme","jsx","GlobalStyles","theme","useTheme","isDarkMode","primaryColor","secondaryColor","primaryFontColor","useMemo","getFontColor","secondaryFontColor","Global","css","keyframes","fadeInLeft","fadeIn","slideIn","slideInBottom","scale","pulseAnimation","clr","shadowBlur","progressPulse","logoutAnimation","installAppAnimation","typographyProps","size","typographyVariants","displayGreeting","currentHour","greeting","getDayIdentifier","date","year","month","day","userAgent","getOperatingSystem","ua","getBrowser","systemInfo","timeAgo","date","lang","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","jsx","ThemeProviderWrapper","children","systemTheme","useSystemTheme","theme","setTheme","useState","stored","darkMode","setDarkMode","useEffect","selectedTheme","useMemo","_a","themes","t","mode","isDarkMode","muiTheme","createCustomTheme","emotionTheme","ThemeContext","MuiThemeProvider","EmotionThemeProvider"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/DialogBtn.ts","../src/components/ErrorBoundary.tsx","../src/components/Loading.tsx","../src/components/PathName.ts","../src/context/ThemeContext.tsx","../src/context/ThemeProviderWrapper.tsx","../src/styles/themeConfig.ts","../src/styles/colorUtils.ts","../src/styles/commonComponents.ts","../src/styles/createTheme.ts","../src/styles/globalStyles.tsx","../src/styles/keyframes.ts","../src/styles/typography.ts","../src/utils/displayGreeting.ts","../src/utils/getDayIdentifier.ts","../src/utils/getSystemInfo.ts","../src/utils/timeAgo.ts","../src/utils/useResponsiveDisplay.ts","../src/utils/useSystemTheme.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 */\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 -- Выводим ошибку в консоль\n console.error(\"Error:\", error);\n // eslint-disable-next-line no-console -- Выводим ошибку в консоль\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>Ошибка. </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>\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 { 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","// src/context/ThemeProvider.tsx\nimport { useMemo, useState, useEffect } from \"react\";\nimport { ThemeProvider as EmotionThemeProvider } from \"@emotion/react\";\nimport { ThemeProvider as MuiThemeProvider } from \"@mui/material/styles\";\n\nimport { themes, createCustomTheme, isDarkMode } from \"../styles\";\nimport { useSystemTheme } from \"../utils\";\n\nimport { ThemeContext } from \"./ThemeContext\";\n\nimport type { FC, PropsWithChildren } from \"react\";\n\nexport const ThemeProviderWrapper: FC<PropsWithChildren> = ({ children }) => {\n const systemTheme = useSystemTheme();\n\n const [theme, setTheme] = useState<string>(() => {\n const stored = localStorage.getItem(\"appSettings\");\n return stored ? JSON.parse(stored).theme || \"system\" : \"system\";\n });\n\n const [darkMode, setDarkMode] = useState<\n \"light\" | \"dark\" | \"system\" | \"auto\"\n >(() => {\n const stored = localStorage.getItem(\"appSettings\");\n return stored ? JSON.parse(stored).darkMode || \"auto\" : \"auto\";\n });\n\n useEffect(() => {\n localStorage.setItem(\"appSettings\", JSON.stringify({ theme, darkMode }));\n }, [theme, darkMode]);\n\n const selectedTheme = useMemo(() => {\n if (systemTheme === \"unknown\") return themes[0].MuiTheme;\n if (theme === \"system\") {\n return systemTheme === \"dark\" ? themes[0].MuiTheme : themes[1].MuiTheme;\n }\n return themes.find((t) => t.name === theme)?.MuiTheme || themes[0].MuiTheme;\n }, [systemTheme, theme]);\n\n const mode = useMemo(\n () =>\n isDarkMode(darkMode, systemTheme, selectedTheme.palette.secondary.main)\n ? \"dark\"\n : \"light\",\n [darkMode, systemTheme, selectedTheme],\n );\n\n const muiTheme = useMemo(\n () =>\n createCustomTheme(\n selectedTheme.palette.primary.main,\n selectedTheme.palette.secondary.main,\n mode,\n ),\n [selectedTheme, mode],\n );\n\n const emotionTheme = useMemo(() => ({ darkMode: mode === \"dark\" }), [mode]);\n\n return (\n <ThemeContext.Provider value={{ theme, darkMode, setTheme, setDarkMode }}>\n <MuiThemeProvider theme={muiTheme}>\n <EmotionThemeProvider theme={emotionTheme}>\n {children}\n </EmotionThemeProvider>\n </MuiThemeProvider>\n </ThemeContext.Provider>\n );\n};\n","export const ColorPalette = {\n fontDark: \"#101727\",\n fontLight: \"#f0f0f0\",\n darkMode: \"#383838\",\n lightMode: \"#ffffff\",\n purple: \"#b624ff\",\n red: \"#ff3131\",\n orange: \"#ff9318\",\n orangeDark: \"#ff9500\",\n} as const;\n\nexport const themeConfig: Record<\n string,\n { primaryColor: string; secondaryColor?: string }\n> = {\n Lanit: {\n primaryColor: '#33ccff',\n secondaryColor: '#f7f7f7',\n },\n BPM: {\n primaryColor: '#203959',\n secondaryColor: '#ffffff',\n },\n Pampa: {\n primaryColor: '#ffe22e',\n secondaryColor: '#fafafa',\n },\n Hurma: {\n primaryColor: '#f6883d',\n secondaryColor: '#ffffff',\n },\n \"Dark Purple\": {\n // Default dark theme\n primaryColor: ColorPalette.purple,\n },\n \"Light Purple\": {\n // Default light theme\n primaryColor: ColorPalette.purple,\n secondaryColor: \"#edeef6\",\n },\n \"Dark Blue\": {\n primaryColor: \"#106cff\",\n secondaryColor: \"#090815\",\n },\n \"Light Blue\": {\n primaryColor: \"#278ad2\",\n secondaryColor: \"#dddaf6\",\n },\n \"Dark Pink\": {\n primaryColor: \"#f2369d\",\n secondaryColor: \"#191218\",\n },\n \"Light Pink\": {\n primaryColor: \"#e5369a\",\n secondaryColor: \"#ffe3ff\",\n },\n \"Blush Blossom\": {\n primaryColor: \"#EC407A\",\n secondaryColor: \"#FCE4EC\",\n },\n Cheesecake: {\n primaryColor: \"#E14C94\",\n secondaryColor: \"#FDF0D5\",\n },\n \"Mystic Coral\": {\n primaryColor: \"#ff7b9c\",\n secondaryColor: \"#4a2333\",\n },\n \"Dark Orange\": {\n primaryColor: \"#FF5631\",\n secondaryColor: \"#0D0D0D\",\n },\n \"Light Orange\": {\n primaryColor: \"#F26E56\",\n secondaryColor: \"#F6F6F6\",\n },\n Aurora: {\n primaryColor: \"#00e952\",\n secondaryColor: \"#011926\",\n },\n};\n","import { ColorPalette } from \"./themeConfig\";\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/**\n * Determines the ideal font color (white or black) for contrast against a given background color.\n *\n * Uses luminance calculation (YIQ) to ensure accessibility and visual clarity.\n *\n * @param backgroundColor - A valid hex color (e.g., \"#ffffff\").\n * @returns A hex color string (`fontLight` or `fontDark`) suitable for overlay text.\n */\nexport const getFontColor = (backgroundColor: string): string => {\n if (!isHexColor(backgroundColor)) {\n // eslint-disable-next-line no-console -- Allow\n console.error(\"Invalid hex color provided:\", backgroundColor);\n return ColorPalette.fontDark;\n }\n\n const hex = backgroundColor.slice(1);\n\n const fullHex =\n hex.length === 3\n ? hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : hex;\n\n const r = Number.parseInt(fullHex.slice(0, 2), 16);\n const g = Number.parseInt(fullHex.slice(2, 4), 16);\n const b = Number.parseInt(fullHex.slice(4, 6), 16);\n\n const brightness = Math.round((r * 299 + g * 587 + b * 114) / 1000);\n\n return brightness > 128 ? ColorPalette.fontDark : ColorPalette.fontLight;\n};\n\n/**\n * Determines whether the ideal font color for a background is light (i.e., white).\n *\n * @param color - The background color in hex.\n * @returns `true` if white text is recommended; otherwise, `false`.\n */\nexport const isFontLight = (color: string): boolean =>\n getFontColor(color) === ColorPalette.fontLight;\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 color: theme.palette.mode === \"dark\" ? \"#fff\" : \"#000\",\n backgroundColor:\n theme.palette.mode === \"dark\" ? \"#141431dd\" : \"#ededf3dd\",\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 color: \"#fff\",\n },\n },\n },\n\n MuiAlert: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n }),\n },\n },\n\n MuiTextField: {\n styleOverrides: {\n root: ({ theme }) => ({\n \"& .MuiInputBase-root\": {\n borderRadius: theme.shape.borderRadius,\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 MuiIcon: {\n styleOverrides: {\n root: {\n borderRadius: '100%'\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 color: theme.palette.mode === \"dark\" ? \"#fff\" : \"#000\",\n backgroundColor:\n theme.palette.mode === \"dark\" ? \"#141431dd\" : \"#ededf3dd\",\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 { createTheme } from \"@mui/material\";\n\nimport { getFontColor } from \"./colorUtils\";\nimport { commonComponentProps } from \"./commonComponents\";\nimport { ColorPalette, themeConfig } from \"./themeConfig\";\n\nimport type { AppSettings, SystemTheme } from \"../models\";\nimport type { PaletteMode, Theme } from \"@mui/material\";\n\n/**\n * Generates a custom MUI theme using a primary color, background color, and color mode.\n *\n * @param primaryColor - The main color used for primary palette.\n * @param backgroundColor - Background color (used as secondary). Defaults to dark blue.\n * @param mode - MUI palette mode ('light' | 'dark'). Defaults to 'dark'.\n * @returns A MUI Theme object.\n */\nexport const createCustomTheme = (\n primaryColor: string,\n backgroundColor = \"#232e58\",\n mode: PaletteMode = \"dark\",\n): Theme =>\n createTheme({\n palette: {\n primary: { main: primaryColor },\n secondary: { main: backgroundColor },\n warning: {\n main: mode === \"dark\" ? ColorPalette.orange : ColorPalette.orangeDark,\n },\n error: { main: ColorPalette.red },\n mode,\n },\n components: {\n ...commonComponentProps,\n },\n shape: { borderRadius: 24 },\n });\n\n/**\n * A predefined list of named themes based on the `themeConfig` definition.\n */\nexport const themes: { name: string; MuiTheme: Theme }[] = Object.entries(\n themeConfig,\n).map(([name, config]) => ({\n name,\n MuiTheme: createCustomTheme(config.primaryColor, config.secondaryColor),\n}));\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 backgroundColor: string,\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 case \"auto\": {\n return getFontColor(backgroundColor) === ColorPalette.fontLight;\n }\n default: {\n return false;\n }\n }\n};\n","import { useMemo } from \"react\";\nimport { Global, css } from \"@emotion/react\";\nimport { useTheme } from \"@mui/material/styles\";\n\nimport { getFontColor } from \"./colorUtils\";\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 */\nexport const GlobalStyles: FC = () => {\n const theme = useTheme();\n const isDarkMode = theme.palette.mode === \"dark\";\n\n const primaryColor = theme.palette.primary.main;\n const secondaryColor = theme.palette.secondary.main;\n\n const primaryFontColor = useMemo(\n () => getFontColor(primaryColor),\n [primaryColor],\n );\n const secondaryFontColor = useMemo(\n () => getFontColor(secondaryColor),\n [secondaryColor],\n );\n\n return (\n <Global\n styles={css`\n * {\n font-family: \"Poppins\", sans-serif !important;\n -webkit-tap-highlight-color: transparent;\n &::selection {\n background-color: ${`${primaryColor}e1`};\n color: ${primaryFontColor};\n }\n }\n\n :root {\n height: 100%;\n font-family: \"Poppins\", sans-serif;\n line-height: 1.5;\n font-weight: 400;\n color-scheme: ${isDarkMode ? \"dark\" : \"light\"};\n color: ${secondaryFontColor};\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 --rsbs-backdrop-bg: rgba(0, 0, 0, 0.3);\n --rsbs-bg: ${isDarkMode ? \"#383838\" : \"#ffffff\"};\n }\n\n body {\n margin: 0;\n height: 100%;\n touch-action: manipulation;\n background: ${secondaryColor};\n background-attachment: fixed;\n background-size: cover;\n transition: 0.3s background;\n\n ::-webkit-scrollbar {\n width: 8px;\n background-color: ${secondaryColor};\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: ${secondaryColor};\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 background-color: #000000d7;\n color: white;\n padding: 16px;\n border-radius: 18px;\n overflow-x: auto;\n }\n\n .MuiDialogContent-root,\n .MuiDrawer-paper,\n .customScrollbar,\n textarea {\n ::-webkit-scrollbar {\n width: 8px;\n border-radius: 4px;\n background-color: #84848415;\n }\n ::-webkit-scrollbar-thumb {\n background-color: #8484844b;\n border-radius: 4px;\n }\n ::-webkit-scrollbar-thumb:hover {\n background-color: #84848476;\n }\n ::-webkit-scrollbar-track {\n border-radius: 4px;\n background-color: #84848415;\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 div[data-rsbs-backdrop] {\n z-index: 999;\n }\n\n div[data-rsbs-header] {\n z-index: 999999;\n box-shadow: none;\n &::before {\n width: 60px;\n height: 6px;\n border-radius: 100px;\n background: ${isDarkMode ? \"#717171\" : \"#cfcfcf\"};\n margin-top: 3px;\n }\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","import type { Theme } from \"@mui/material\";\nimport type { TypographyVariantsOptions } from \"@mui/material/styles/createTypography\";\n\n/**\n * Default MUI Typography variant-to-element mapping.\n * Custom variants are mapped to HTML tags like <p>, <h1>, etc.\n */\nexport const typographyProps: Theme[\"components\"] = {\n MuiTypography: {\n defaultProps: {\n variantMapping: {\n // Text variants\n ...Object.fromEntries(\n [\"xl\", \"lg\", \"md\", \"sm\", \"xs\", \"2xs\"].flatMap((size) => [\n [`text_${size}_regular`, \"p\"],\n [`text_${size}_bold`, \"p\"],\n [`text_${size}_semibold`, \"p\"],\n [`text_${size}_thin`, \"p\"],\n ]),\n ),\n // Display variants\n display_2xl_regular: \"h1\",\n display_xl_regular: \"h2\",\n display_lg_regular: \"h3\",\n display_md_regular: \"h4\",\n display_sm_regular: \"h5\",\n display_xs_regular: \"h6\",\n display_2xl_bold: \"h1\",\n display_xl_bold: \"h2\",\n display_lg_bold: \"h3\",\n display_md_bold: \"h4\",\n display_sm_bold: \"h5\",\n display_xs_bold: \"h6\",\n },\n },\n },\n};\n\n/**\n * Custom typography variants.\n * Defines font-weight, size, line-height and optionally fallback font.\n */\nexport const typographyVariants: TypographyVariantsOptions = {\n // TEXT_REGULAR\n text_xl_regular: { font: \"400 20px/30px inherit inherit\" },\n text_lg_regular: { font: \"400 18px/28px inherit inherit\" },\n text_md_regular: { font: \"400 16px/24px inherit inherit\" },\n text_sm_regular: { font: \"400 14px/20px inherit inherit\" },\n text_xs_regular: { font: \"400 12px/18px inherit inherit\" },\n text_2xs_regular: { font: \"400 10px/14px inherit inherit\" },\n\n // TEXT_BOLD\n text_xl_bold: { font: \"600 20px/30px inherit inherit\" },\n text_lg_bold: { font: \"700 18px/28px inherit inherit\" },\n text_md_bold: { font: \"700 16px/24px inherit inherit\" },\n text_sm_bold: { font: \"700 14px/20px inherit inherit\" },\n text_xs_bold: { font: \"700 12px/18px inherit inherit\" },\n text_2xs_bold: { font: \"700 10px/14px inherit inherit\" },\n\n // TEXT_SEMIBOLD\n text_xl_semibold: { font: \"600 20px/30px inherit inherit\" },\n text_lg_semibold: { font: \"600 18px/28px inherit inherit\" },\n text_md_semibold: { font: \"600 16px/24px inherit inherit\" },\n text_sm_semibold: { font: \"600 14px/20px inherit inherit\" },\n text_xs_semibold: { font: \"600 12px/18px inherit inherit\" },\n text_2xs_semibold: { font: \"600 10px/14px inherit inherit\" },\n\n // TEXT_THIN\n text_xl_thin: { font: \"100 20px/30px inherit inherit\" },\n text_lg_thin: { font: \"100 18px/28px inherit inherit\" },\n text_md_thin: { font: \"100 16px/24px inherit inherit\" },\n text_sm_thin: { font: \"100 14px/20px inherit inherit\" },\n text_xs_thin: { font: \"100 12px/18px inherit inherit\" },\n text_2xs_thin: { font: \"100 10px/14px inherit inherit\" },\n\n // DISPLAY_REGULAR\n display_2xl_regular: { font: \"400 72px/90px inherit inherit\" },\n display_xl_regular: { font: \"400 60px/72px inherit inherit\" },\n display_lg_regular: { font: \"400 48px/60px inherit inherit\" },\n display_md_regular: { font: \"400 36px/44px inherit inherit\" },\n display_sm_regular: { font: \"400 30px/38px inherit inherit\" },\n display_xs_regular: { font: \"400 24px/32px inherit inherit\" },\n\n // DISPLAY_BOLD\n display_2xl_bold: { font: \"700 72px/90px inherit inherit\" },\n display_xl_bold: { font: \"700 60px/72px inherit inherit\" },\n display_lg_bold: { font: \"700 48px/60px inherit inherit\" },\n display_md_bold: { font: \"700 36px/44px inherit inherit\" },\n display_sm_bold: { font: \"700 30px/38px inherit inherit\" },\n display_xs_bold: { font: \"700 24px/32px inherit inherit\" },\n};\n","/**\n * Returns a greeting based on the current time.\n * @returns {string} The appropriate greeting.\n */\nexport const displayGreeting = (): string => {\n const currentTime = new Date();\n const currentHour = currentTime.getHours();\n let greeting: string;\n if (currentHour < 12 && currentHour >= 5) {\n greeting = \"Доброе утро,\";\n } else if (currentHour < 18 && currentHour > 12) {\n greeting = \"Добрый день,\";\n } else {\n greeting = \"Добрый вечер,\";\n }\n\n return greeting;\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\nconst { userAgent } = globalThis.navigator;\n\n/**\n * Detects the user's operating system based on the user agent string.\n *\n * @returns {OperatingSystem} The name of the detected operating system.\n */\nexport const getOperatingSystem = (): OperatingSystem => {\n const ua = userAgent.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 *\n * @returns {Browser} The name of the detected browser.\n */\nexport const getBrowser = (): Browser => {\n const ua = userAgent.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 */\nexport const systemInfo = {\n os: getOperatingSystem(),\n browser: getBrowser(),\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 = (\n date: Date,\n lang = navigator.language || \"en-US\",\n): string => {\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(lang, { 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 = (\n date: Date,\n lang = navigator.language || \"en-US\",\n): string => {\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(lang, { 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(lang, {\n numeric: \"auto\",\n }).format(differenceHours, \"hour\")}`;\n const minutes = ` ${new Intl.RelativeTimeFormat(lang, {\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"],"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","createContext","useContext","ThemeContext","useThemeSettings","context","useMemo","useState","useEffect","EmotionThemeProvider","MuiThemeProvider","ColorPalette","themeConfig","isHexColor","value","getFontColor","backgroundColor","ColorPalette","hex","fullHex","c","r","g","b","isFontLight","color","commonComponentProps","theme","createTheme","createCustomTheme","primaryColor","backgroundColor","mode","createTheme","ColorPalette","commonComponentProps","themes","themeConfig","name","config","isDarkMode","darkMode","systemTheme","getFontColor","useMemo","Global","css","useTheme","jsx","GlobalStyles","theme","useTheme","isDarkMode","primaryColor","secondaryColor","primaryFontColor","useMemo","getFontColor","secondaryFontColor","Global","css","keyframes","fadeInLeft","fadeIn","slideIn","slideInBottom","scale","pulseAnimation","clr","shadowBlur","progressPulse","logoutAnimation","installAppAnimation","typographyProps","size","typographyVariants","displayGreeting","currentHour","greeting","getDayIdentifier","date","year","month","day","userAgent","getOperatingSystem","ua","getBrowser","systemInfo","timeAgo","date","lang","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","jsx","ThemeProviderWrapper","children","systemTheme","useSystemTheme","theme","setTheme","useState","stored","darkMode","setDarkMode","useEffect","selectedTheme","useMemo","_a","themes","t","mode","isDarkMode","muiTheme","createCustomTheme","emotionTheme","ThemeContext","MuiThemeProvider","EmotionThemeProvider"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atomazing-org/design-system",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.15",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A library providing a set of useful utils, MUI style extensions, and components to build your application.",
|
|
6
6
|
"author": "PonomarevBPM + MarkSinD",
|