underpost 2.8.84 → 2.8.86
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/.env.development +1 -0
- package/.env.production +1 -0
- package/.env.test +1 -0
- package/.github/workflows/{ghpkg.yml → ghpkg.ci.yml} +1 -1
- package/.github/workflows/{npmpkg.yml → npmpkg.ci.yml} +1 -1
- package/.github/workflows/{publish.yml → publish.ci.yml} +1 -1
- package/.github/workflows/{pwa-microservices-template.page.yml → pwa-microservices-template-page.cd.yml} +2 -2
- package/.github/workflows/{pwa-microservices-template.test.yml → pwa-microservices-template-test.ci.yml} +1 -1
- package/.github/workflows/release.cd.yml +37 -0
- package/.vscode/settings.json +0 -1
- package/README.md +16 -10
- package/bin/build.js +15 -5
- package/bin/cyberia0.js +78 -0
- package/bin/db.js +1 -3
- package/bin/deploy.js +29 -431
- package/bin/file.js +26 -9
- package/cli.md +102 -61
- package/conf.js +1 -1
- package/manifests/deployment/{dd-template-development → dd-default-development}/deployment.yaml +16 -16
- package/manifests/deployment/{dd-template-development → dd-default-development}/proxy.yaml +3 -3
- package/manifests/grafana/deployment.yaml +57 -0
- package/manifests/grafana/kustomization.yaml +7 -0
- package/manifests/grafana/pvc.yaml +12 -0
- package/manifests/grafana/service.yaml +14 -0
- package/manifests/maas/gpu-diag.sh +1 -1
- package/manifests/maas/ssh-cluster-info.sh +14 -0
- package/manifests/prometheus/deployment.yaml +82 -0
- package/package.json +4 -7
- package/src/api/user/user.router.js +24 -1
- package/src/api/user/user.service.js +9 -38
- package/src/cli/cluster.js +83 -29
- package/src/cli/cron.js +12 -45
- package/src/cli/db.js +149 -0
- package/src/cli/deploy.js +40 -81
- package/src/cli/index.js +29 -6
- package/src/cli/monitor.js +9 -16
- package/src/cli/repository.js +12 -5
- package/src/cli/run.js +175 -7
- package/src/cli/ssh.js +32 -0
- package/src/client/Default.index.js +7 -5
- package/src/client/components/core/Account.js +7 -3
- package/src/client/components/core/Chat.js +1 -1
- package/src/client/components/core/CommonJs.js +24 -22
- package/src/client/components/core/Content.js +12 -12
- package/src/client/components/core/Css.js +262 -18
- package/src/client/components/core/CssCore.js +8 -8
- package/src/client/components/core/Docs.js +14 -61
- package/src/client/components/core/DropDown.js +137 -82
- package/src/client/components/core/EventsUI.js +92 -5
- package/src/client/components/core/Input.js +6 -1
- package/src/client/components/core/LoadingAnimation.js +8 -15
- package/src/client/components/core/LogIn.js +3 -0
- package/src/client/components/core/LogOut.js +1 -1
- package/src/client/components/core/Modal.js +601 -137
- package/src/client/components/core/NotificationManager.js +2 -2
- package/src/client/components/core/ObjectLayerEngine.js +638 -0
- package/src/client/components/core/Panel.js +158 -34
- package/src/client/components/core/PanelForm.js +12 -3
- package/src/client/components/core/Recover.js +6 -3
- package/src/client/components/core/Router.js +77 -17
- package/src/client/components/core/Scroll.js +65 -120
- package/src/client/components/core/SignUp.js +1 -0
- package/src/client/components/core/SocketIo.js +3 -3
- package/src/client/components/core/Translate.js +6 -2
- package/src/client/components/core/VanillaJs.js +48 -5
- package/src/client/components/core/Worker.js +3 -1
- package/src/client/components/default/CssDefault.js +17 -3
- package/src/client/components/default/MenuDefault.js +266 -47
- package/src/client/components/default/RoutesDefault.js +8 -14
- package/src/client/public/default/android-chrome-144x144.png +0 -0
- package/src/client/public/default/android-chrome-192x192.png +0 -0
- package/src/client/public/default/android-chrome-256x256.png +0 -0
- package/src/client/public/default/android-chrome-36x36.png +0 -0
- package/src/client/public/default/android-chrome-48x48.png +0 -0
- package/src/client/public/default/android-chrome-72x72.png +0 -0
- package/src/client/public/default/android-chrome-96x96.png +0 -0
- package/src/client/public/default/apple-touch-icon-114x114-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
- package/src/client/public/default/apple-touch-icon-120x120-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
- package/src/client/public/default/apple-touch-icon-144x144-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
- package/src/client/public/default/apple-touch-icon-152x152-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
- package/src/client/public/default/apple-touch-icon-180x180-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
- package/src/client/public/default/apple-touch-icon-57x57-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
- package/src/client/public/default/apple-touch-icon-60x60-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
- package/src/client/public/default/apple-touch-icon-72x72-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
- package/src/client/public/default/apple-touch-icon-76x76-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
- package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon.png +0 -0
- package/src/client/public/default/assets/background/dark.jpg +0 -0
- package/src/client/public/default/assets/background/dark.svg +557 -0
- package/src/client/public/default/assets/logo/base-icon.png +0 -0
- package/src/client/public/default/assets/logo/underpost.gif +0 -0
- package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
- package/src/client/public/default/favicon-16x16.png +0 -0
- package/src/client/public/default/favicon-32x32.png +0 -0
- package/src/client/public/default/favicon.ico +0 -0
- package/src/client/public/default/mstile-144x144.png +0 -0
- package/src/client/public/default/mstile-150x150.png +0 -0
- package/src/client/public/default/mstile-310x150.png +0 -0
- package/src/client/public/default/mstile-310x310.png +0 -0
- package/src/client/public/default/mstile-70x70.png +0 -0
- package/src/client/public/default/safari-pinned-tab.svg +24 -0
- package/src/client/ssr/body/DefaultSplashScreen.js +2 -2
- package/src/index.js +9 -1
- package/src/mailer/MailerProvider.js +37 -0
- package/src/monitor.js +24 -0
- package/src/runtime/lampp/Dockerfile +30 -39
- package/src/runtime/lampp/Lampp.js +11 -2
- package/src/server/client-build-docs.js +205 -0
- package/src/server/client-build-live.js +1 -1
- package/src/server/client-build.js +16 -166
- package/src/server/client-dev-server.js +1 -1
- package/src/server/conf.js +14 -277
- package/src/server/proxy.js +1 -2
- package/src/server/start.js +3 -3
- package/src/server/valkey.js +102 -41
- package/docker-compose.yml +0 -67
- package/prometheus.yml +0 -36
|
@@ -31,8 +31,6 @@ VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=bierner
|
|
|
31
31
|
|
|
32
32
|
*/
|
|
33
33
|
|
|
34
|
-
// Docs by https://mintlify.com
|
|
35
|
-
|
|
36
34
|
/**
|
|
37
35
|
* Query selector.
|
|
38
36
|
*
|
|
@@ -149,8 +147,40 @@ const pasteData = () => new Promise((resolve) => navigator.clipboard.readText().
|
|
|
149
147
|
* @memberof VanillaJS
|
|
150
148
|
*/
|
|
151
149
|
const setPath = (path = '/', stateStorage = {}, title = '') => {
|
|
152
|
-
if (
|
|
153
|
-
|
|
150
|
+
if (!path) path = '/';
|
|
151
|
+
|
|
152
|
+
const [inputPath, inputSearch] = `${path}`.split('?');
|
|
153
|
+
|
|
154
|
+
let sanitizedPath = (inputPath[0] !== '/' ? `/${inputPath}` : inputPath)
|
|
155
|
+
.trim()
|
|
156
|
+
.replaceAll('//', '/')
|
|
157
|
+
.replaceAll(`\\`, '/');
|
|
158
|
+
|
|
159
|
+
if (sanitizedPath.length > 1 && sanitizedPath[sanitizedPath.length - 1] === '/')
|
|
160
|
+
sanitizedPath = sanitizedPath.slice(0, -1);
|
|
161
|
+
|
|
162
|
+
if (window.location.pathname === sanitizedPath && (!inputSearch || inputSearch === location.search)) {
|
|
163
|
+
console.warn('Prevent overwriting same path', {
|
|
164
|
+
inputPath: inputPath,
|
|
165
|
+
inputSearch: inputSearch,
|
|
166
|
+
sanitizedPath: sanitizedPath,
|
|
167
|
+
currentLocationSearch: location.search,
|
|
168
|
+
currentLocationHash: location.hash,
|
|
169
|
+
});
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
console.warn('Set path', {
|
|
173
|
+
inputPath: inputPath,
|
|
174
|
+
inputSearch: inputSearch,
|
|
175
|
+
sanitizedPath: sanitizedPath,
|
|
176
|
+
currentLocationSearch: location.search,
|
|
177
|
+
currentLocationHash: location.hash,
|
|
178
|
+
});
|
|
179
|
+
return history.pushState(
|
|
180
|
+
stateStorage,
|
|
181
|
+
title,
|
|
182
|
+
`${sanitizedPath}${inputSearch ? `?${inputSearch}` : ''}${location.hash ?? ''}`,
|
|
183
|
+
);
|
|
154
184
|
};
|
|
155
185
|
|
|
156
186
|
/**
|
|
@@ -355,7 +385,6 @@ const getBlobFromUint8ArrayFile = (data = [[]], mimetype = 'application/octet-st
|
|
|
355
385
|
* @memberof VanillaJS
|
|
356
386
|
*/
|
|
357
387
|
const getProxyPath = () => {
|
|
358
|
-
// warning: evaluates headers html source
|
|
359
388
|
let path = location.pathname.split('/')[1] ? `/${location.pathname.split('/')[1]}/` : '/';
|
|
360
389
|
if (window.Routes && path !== '/' && path.slice(0, -1) in window.Routes()) path = '/';
|
|
361
390
|
return path;
|
|
@@ -428,6 +457,19 @@ const getLang = () =>
|
|
|
428
457
|
.slice(0, 2)
|
|
429
458
|
.toLowerCase();
|
|
430
459
|
|
|
460
|
+
function hexToRgbA(hex) {
|
|
461
|
+
let c;
|
|
462
|
+
if (/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)) {
|
|
463
|
+
c = hex.substring(1).split('');
|
|
464
|
+
if (c.length == 3) {
|
|
465
|
+
c = [c[0], c[0], c[1], c[1], c[2], c[2]];
|
|
466
|
+
}
|
|
467
|
+
c = '0x' + c.join('');
|
|
468
|
+
return [(c >> 16) & 255, (c >> 8) & 255, c & 255];
|
|
469
|
+
}
|
|
470
|
+
throw new Error('Invalid Hex');
|
|
471
|
+
}
|
|
472
|
+
|
|
431
473
|
export {
|
|
432
474
|
s,
|
|
433
475
|
htmls,
|
|
@@ -457,4 +499,5 @@ export {
|
|
|
457
499
|
isDevInstance,
|
|
458
500
|
getDataFromInputFile,
|
|
459
501
|
getLang,
|
|
502
|
+
hexToRgbA,
|
|
460
503
|
};
|
|
@@ -12,7 +12,8 @@ const logger = loggerFactory(import.meta);
|
|
|
12
12
|
const Worker = {
|
|
13
13
|
devMode: () => location.origin.match('localhost') || location.origin.match('127.0.0.1'),
|
|
14
14
|
instance: async function ({ router, render }) {
|
|
15
|
-
|
|
15
|
+
Worker.title = `${s('title').textContent}`;
|
|
16
|
+
// logger.warn('Init worker', Worker.title);
|
|
16
17
|
window.ononline = async () => {
|
|
17
18
|
logger.warn('ononline');
|
|
18
19
|
};
|
|
@@ -81,6 +82,7 @@ const Worker = {
|
|
|
81
82
|
}
|
|
82
83
|
window.serviceWorkerReady = true;
|
|
83
84
|
},
|
|
85
|
+
|
|
84
86
|
// Get the current service worker registration.
|
|
85
87
|
getRegistration: async function () {
|
|
86
88
|
return await navigator.serviceWorker.getRegistration();
|
|
@@ -1,13 +1,27 @@
|
|
|
1
|
+
import { subThemeManager } from '../core/Css.js';
|
|
2
|
+
|
|
3
|
+
const CssCommonDefault = async () => {
|
|
4
|
+
// use #4f46e5, #7c3aed);
|
|
5
|
+
subThemeManager.setDarkTheme('#7c3aed');
|
|
6
|
+
subThemeManager.setLightTheme('#7c3aed');
|
|
7
|
+
|
|
8
|
+
return html``;
|
|
9
|
+
};
|
|
10
|
+
|
|
1
11
|
const CssDefaultDark = {
|
|
2
12
|
theme: 'default-dark',
|
|
3
13
|
dark: true,
|
|
4
|
-
render: async () =>
|
|
14
|
+
render: async () => {
|
|
15
|
+
return (await CssCommonDefault()) + html``;
|
|
16
|
+
},
|
|
5
17
|
};
|
|
6
18
|
|
|
7
19
|
const CssDefaultLight = {
|
|
8
20
|
theme: 'default-light',
|
|
9
21
|
dark: false,
|
|
10
|
-
render: async () =>
|
|
22
|
+
render: async () => {
|
|
23
|
+
return (await CssCommonDefault()) + html``;
|
|
24
|
+
},
|
|
11
25
|
};
|
|
12
26
|
|
|
13
|
-
export { CssDefaultDark, CssDefaultLight };
|
|
27
|
+
export { CssDefaultDark, CssCommonDefault, CssDefaultLight };
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import { Account } from '../core/Account.js';
|
|
2
2
|
import { BtnIcon } from '../core/BtnIcon.js';
|
|
3
3
|
import { getId, newInstance } from '../core/CommonJs.js';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
borderChar,
|
|
6
|
+
boxShadow,
|
|
7
|
+
Css,
|
|
8
|
+
darkTheme,
|
|
9
|
+
extractBackgroundImageUrl,
|
|
10
|
+
renderCssAttr,
|
|
11
|
+
ThemeEvents,
|
|
12
|
+
Themes,
|
|
13
|
+
} from '../core/Css.js';
|
|
5
14
|
import { EventsUI } from '../core/EventsUI.js';
|
|
6
15
|
import { LogIn } from '../core/LogIn.js';
|
|
7
16
|
import { LogOut } from '../core/LogOut.js';
|
|
@@ -26,7 +35,7 @@ const MenuDefault = {
|
|
|
26
35
|
const id = getId(this.Data, 'menu-');
|
|
27
36
|
this.Data[id] = {};
|
|
28
37
|
const RouterInstance = RouterDefault();
|
|
29
|
-
const {
|
|
38
|
+
const { BannerAppTemplate } = RouterInstance;
|
|
30
39
|
const { barConfig } = await Themes[Css.currentTheme]();
|
|
31
40
|
const heightTopBar = 50;
|
|
32
41
|
const heightBottomBar = 50;
|
|
@@ -35,6 +44,7 @@ const MenuDefault = {
|
|
|
35
44
|
await Modal.Render({
|
|
36
45
|
id: 'modal-menu',
|
|
37
46
|
html: html`
|
|
47
|
+
<div class="style-lading-render"></div>
|
|
38
48
|
<div class="fl menu-btn-container">
|
|
39
49
|
${await BtnIcon.Render({
|
|
40
50
|
class: 'in wfa main-btn-menu main-btn-home main-btn-menu-active',
|
|
@@ -105,17 +115,6 @@ const MenuDefault = {
|
|
|
105
115
|
handleContainerClass: 'handle-btn-container',
|
|
106
116
|
tooltipHtml: await Badge.Render(buildBadgeToolTipMenuOption('settings')),
|
|
107
117
|
})}
|
|
108
|
-
${await BtnIcon.Render({
|
|
109
|
-
class: 'in wfa main-btn-menu main-btn-docs hide',
|
|
110
|
-
label: renderMenuLabel({
|
|
111
|
-
icon: html`<i class="fas fa-book"></i>`,
|
|
112
|
-
text: html`<span class="menu-label-text">${Translate.Render('docs')}</span>`,
|
|
113
|
-
}),
|
|
114
|
-
attrs: `data-id="docs"`,
|
|
115
|
-
tabHref: `${getProxyPath()}docs`,
|
|
116
|
-
handleContainerClass: 'handle-btn-container',
|
|
117
|
-
tooltipHtml: await Badge.Render(buildBadgeToolTipMenuOption('docs')),
|
|
118
|
-
})}
|
|
119
118
|
${await BtnIcon.Render({
|
|
120
119
|
class: 'in wfa main-btn-menu main-btn-recover hide',
|
|
121
120
|
label: renderMenuLabel({
|
|
@@ -163,21 +162,270 @@ const MenuDefault = {
|
|
|
163
162
|
</div>
|
|
164
163
|
`,
|
|
165
164
|
barConfig: newInstance(barConfig),
|
|
166
|
-
title:
|
|
165
|
+
title: BannerAppTemplate,
|
|
167
166
|
// titleClass: 'hide',
|
|
168
167
|
titleRender: () => {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
168
|
+
ThemeEvents['titleRender'] = () => {
|
|
169
|
+
const srcLogo = `${getProxyPath()}apple-touch-icon-114x114-precomposed.png`;
|
|
170
|
+
|
|
171
|
+
htmls(
|
|
172
|
+
'.action-btn-app-icon-render',
|
|
173
|
+
html`<img class="inl top-bar-app-icon ${darkTheme ? 'negative-color' : ''}" src="${srcLogo}" />`,
|
|
174
|
+
);
|
|
175
|
+
};
|
|
176
|
+
setTimeout(ThemeEvents['titleRender']);
|
|
172
177
|
return '';
|
|
173
178
|
},
|
|
174
179
|
mode: 'slide-menu',
|
|
175
180
|
RouterInstance,
|
|
176
181
|
heightTopBar,
|
|
177
182
|
heightBottomBar,
|
|
178
|
-
htmlMainBody:
|
|
183
|
+
htmlMainBody: async () => {
|
|
184
|
+
setTimeout(() => {
|
|
185
|
+
EventsUI.onClick('.get-started-button', (e) => {
|
|
186
|
+
e.preventDefault();
|
|
187
|
+
location.href = `https://www.nexodev.org/docs/?cid=src`;
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
return html`
|
|
191
|
+
<div class="landing-container">
|
|
192
|
+
<div class="content-wrapper">
|
|
193
|
+
<h1 class="animated-text">
|
|
194
|
+
<span class="greeting">Hello, World!</span>
|
|
195
|
+
<span class="subtitle">Welcome to Our Platform</span>
|
|
196
|
+
</h1>
|
|
197
|
+
|
|
198
|
+
<div class="features">
|
|
199
|
+
<div class="feature-card">
|
|
200
|
+
<i class="icon">🚀</i>
|
|
201
|
+
<h3>Fast & Reliable</h3>
|
|
202
|
+
<p>Lightning-fast performance with 99.9% uptime</p>
|
|
203
|
+
</div>
|
|
204
|
+
<div class="feature-card">
|
|
205
|
+
<i class="icon">🎨</i>
|
|
206
|
+
<h3>Beautiful UI</h3>
|
|
207
|
+
<p>Modern and intuitive user interface</p>
|
|
208
|
+
</div>
|
|
209
|
+
<div class="feature-card">
|
|
210
|
+
<i class="icon">⚡</i>
|
|
211
|
+
<h3>Powerful Features</h3>
|
|
212
|
+
<p>Everything you need in one place</p>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
|
|
216
|
+
<button class="cta-button get-started-button">
|
|
217
|
+
Get Started
|
|
218
|
+
<span class="button-icon">→</span>
|
|
219
|
+
</button>
|
|
220
|
+
</div>
|
|
221
|
+
</div>
|
|
222
|
+
`;
|
|
223
|
+
},
|
|
179
224
|
});
|
|
180
225
|
|
|
226
|
+
ThemeEvents['main-theme-handler'] = () => {
|
|
227
|
+
if (darkTheme) {
|
|
228
|
+
const backgroundImage = `${getProxyPath()}assets/background/dark.svg`;
|
|
229
|
+
htmls(
|
|
230
|
+
`.style-ssr-background-image`,
|
|
231
|
+
css`
|
|
232
|
+
.ssr-background-image {
|
|
233
|
+
background-image: url('${backgroundImage}');
|
|
234
|
+
}
|
|
235
|
+
`,
|
|
236
|
+
);
|
|
237
|
+
} else {
|
|
238
|
+
const backgroundImage = `${getProxyPath()}assets/background/white0-min.jpg`;
|
|
239
|
+
htmls(
|
|
240
|
+
`.style-ssr-background-image`,
|
|
241
|
+
css`
|
|
242
|
+
.ssr-background-image {
|
|
243
|
+
background-image: url('${backgroundImage}');
|
|
244
|
+
}
|
|
245
|
+
`,
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
htmls(
|
|
249
|
+
`.style-lading-render`,
|
|
250
|
+
html` <style>
|
|
251
|
+
.landing-container {
|
|
252
|
+
min-height: calc(100vh - ${heightTopBar + heightBottomBar}px);
|
|
253
|
+
display: flex;
|
|
254
|
+
/* align-items: center; */
|
|
255
|
+
justify-content: center;
|
|
256
|
+
|
|
257
|
+
padding: 2rem;
|
|
258
|
+
color: ${darkTheme ? '#fff' : '#333'};
|
|
259
|
+
transition: all 0.3s ease;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.content-wrapper {
|
|
263
|
+
text-align: center;
|
|
264
|
+
max-width: 1200px;
|
|
265
|
+
width: 100%;
|
|
266
|
+
padding: 2rem;
|
|
267
|
+
animation: fadeIn 1s ease-out;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.animated-text {
|
|
271
|
+
margin-bottom: 3rem;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.greeting {
|
|
275
|
+
display: block;
|
|
276
|
+
font-size: 3.5rem;
|
|
277
|
+
font-weight: 700;
|
|
278
|
+
margin-bottom: 1rem;
|
|
279
|
+
background: linear-gradient(90deg, #4f46e5, #7c3aed);
|
|
280
|
+
-webkit-background-clip: text;
|
|
281
|
+
-webkit-text-fill-color: transparent;
|
|
282
|
+
animation: slideIn 1s ease-out;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.subtitle {
|
|
286
|
+
display: block;
|
|
287
|
+
font-size: 1.5rem;
|
|
288
|
+
color: ${darkTheme ? '#a0aec0' : '#4a5568'};
|
|
289
|
+
margin-top: 1rem;
|
|
290
|
+
opacity: 0;
|
|
291
|
+
animation: fadeInUp 0.8s ease-out 0.3s forwards;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.features {
|
|
295
|
+
display: grid;
|
|
296
|
+
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
|
297
|
+
gap: 2rem;
|
|
298
|
+
margin: 4rem 0;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.feature-card {
|
|
302
|
+
background: ${darkTheme ? 'rgba(255, 255, 255, 0.05)' : 'white'};
|
|
303
|
+
padding: 2rem;
|
|
304
|
+
border-radius: 12px;
|
|
305
|
+
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
|
|
306
|
+
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
|
307
|
+
opacity: 0;
|
|
308
|
+
animation: fadeInUp 0.6s ease-out forwards;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
.feature-card:nth-child(1) {
|
|
312
|
+
animation-delay: 0.5s;
|
|
313
|
+
}
|
|
314
|
+
.feature-card:nth-child(2) {
|
|
315
|
+
animation-delay: 0.7s;
|
|
316
|
+
}
|
|
317
|
+
.feature-card:nth-child(3) {
|
|
318
|
+
animation-delay: 0.9s;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.feature-card:hover {
|
|
322
|
+
transform: translateY(-5px);
|
|
323
|
+
box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
.feature-card .icon {
|
|
327
|
+
font-size: 2.5rem;
|
|
328
|
+
margin-bottom: 1rem;
|
|
329
|
+
display: inline-block;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
.feature-card h3 {
|
|
333
|
+
font-size: 1.25rem;
|
|
334
|
+
margin-bottom: 0.75rem;
|
|
335
|
+
color: ${darkTheme ? '#e2e8f0' : '#2d3748'};
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
.feature-card p {
|
|
339
|
+
color: ${darkTheme ? '#a0aec0' : '#4a5568'};
|
|
340
|
+
line-height: 1.6;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.cta-button {
|
|
344
|
+
background: linear-gradient(90deg, #4f46e5, #7c3aed);
|
|
345
|
+
color: white;
|
|
346
|
+
border: none;
|
|
347
|
+
padding: 1rem 2.5rem;
|
|
348
|
+
font-size: 1.1rem;
|
|
349
|
+
border-radius: 50px;
|
|
350
|
+
cursor: pointer;
|
|
351
|
+
display: inline-flex;
|
|
352
|
+
align-items: center;
|
|
353
|
+
gap: 0.5rem;
|
|
354
|
+
transition: all 0.3s ease;
|
|
355
|
+
box-shadow: 0 4px 15px rgba(79, 70, 229, 0.3);
|
|
356
|
+
opacity: 0;
|
|
357
|
+
animation: fadeIn 0.8s ease-out 1.2s forwards;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
.cta-button:hover {
|
|
361
|
+
transform: translateY(-2px);
|
|
362
|
+
box-shadow: 0 6px 20px rgba(79, 70, 229, 0.4);
|
|
363
|
+
background: linear-gradient(90deg, #3e38b4, #602bbc);
|
|
364
|
+
color: white;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
.cta-button:active {
|
|
368
|
+
transform: translateY(0);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
.button-icon {
|
|
372
|
+
transition: transform 0.3s ease;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
.cta-button:hover .button-icon {
|
|
376
|
+
transform: translateX(4px);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
@keyframes fadeIn {
|
|
380
|
+
from {
|
|
381
|
+
opacity: 0;
|
|
382
|
+
}
|
|
383
|
+
to {
|
|
384
|
+
opacity: 1;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
@keyframes fadeInUp {
|
|
389
|
+
from {
|
|
390
|
+
opacity: 0;
|
|
391
|
+
transform: translateY(20px);
|
|
392
|
+
}
|
|
393
|
+
to {
|
|
394
|
+
opacity: 1;
|
|
395
|
+
transform: translateY(0);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
@keyframes slideIn {
|
|
400
|
+
from {
|
|
401
|
+
opacity: 0;
|
|
402
|
+
transform: translateX(-30px);
|
|
403
|
+
}
|
|
404
|
+
to {
|
|
405
|
+
opacity: 1;
|
|
406
|
+
transform: translateX(0);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
@media (max-width: 768px) {
|
|
411
|
+
.greeting {
|
|
412
|
+
font-size: 2.5rem;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
.subtitle {
|
|
416
|
+
font-size: 1.25rem;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
.features {
|
|
420
|
+
grid-template-columns: 1fr;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
</style>`,
|
|
424
|
+
);
|
|
425
|
+
};
|
|
426
|
+
|
|
427
|
+
setTimeout(ThemeEvents['main-theme-handler']);
|
|
428
|
+
|
|
181
429
|
this.Data[id].sortable = new Sortable(s(`.menu-btn-container`), {
|
|
182
430
|
animation: 150,
|
|
183
431
|
group: `menu-sortable`,
|
|
@@ -337,35 +585,6 @@ const MenuDefault = {
|
|
|
337
585
|
});
|
|
338
586
|
});
|
|
339
587
|
|
|
340
|
-
EventsUI.onClick(`.main-btn-docs`, async () => {
|
|
341
|
-
const { barConfig } = await Themes[Css.currentTheme]();
|
|
342
|
-
await Modal.Render({
|
|
343
|
-
id: 'modal-docs',
|
|
344
|
-
route: 'docs',
|
|
345
|
-
barConfig,
|
|
346
|
-
title: renderViewTitle({
|
|
347
|
-
icon: html`<i class="fas fa-book"></i>`,
|
|
348
|
-
text: Translate.Render('docs'),
|
|
349
|
-
}),
|
|
350
|
-
html: async () =>
|
|
351
|
-
await Docs.Init({
|
|
352
|
-
idModal: 'modal-docs',
|
|
353
|
-
modalOptions: {
|
|
354
|
-
barMode: undefined,
|
|
355
|
-
},
|
|
356
|
-
}),
|
|
357
|
-
handleType: 'bar',
|
|
358
|
-
observer: true,
|
|
359
|
-
maximize: true,
|
|
360
|
-
mode: 'view',
|
|
361
|
-
slideMenu: 'modal-menu',
|
|
362
|
-
RouterInstance,
|
|
363
|
-
heightTopBar,
|
|
364
|
-
heightBottomBar,
|
|
365
|
-
barMode,
|
|
366
|
-
});
|
|
367
|
-
});
|
|
368
|
-
|
|
369
588
|
EventsUI.onClick(`.main-btn-recover`, async () => {
|
|
370
589
|
const { barConfig } = await Themes[Css.currentTheme]();
|
|
371
590
|
await Modal.Render({
|
|
@@ -4,7 +4,7 @@ import { getProxyPath, s } from '../core/VanillaJs.js';
|
|
|
4
4
|
|
|
5
5
|
const logger = loggerFactory(import.meta);
|
|
6
6
|
|
|
7
|
-
const
|
|
7
|
+
const BannerAppTemplate = html`<strong class="inl" style="font-family: system-ui">PWA</strong>`;
|
|
8
8
|
|
|
9
9
|
// Router
|
|
10
10
|
const RoutesDefault = () => {
|
|
@@ -12,30 +12,24 @@ const RoutesDefault = () => {
|
|
|
12
12
|
'/': {
|
|
13
13
|
title: 'Home',
|
|
14
14
|
render: () => Modal.onHomeRouterEvent(),
|
|
15
|
-
upperCase: false,
|
|
16
15
|
},
|
|
17
16
|
'/home': { title: 'home', render: () => Modal.onHomeRouterEvent() },
|
|
18
|
-
'/settings': { title: 'settings', render: () => s(`.main-btn-settings`).click()
|
|
19
|
-
'/log-in': { title: 'log-in', render: () => s(`.main-btn-log-in`).click()
|
|
20
|
-
'/sign-up': { title: 'sign-up', render: () => s(`.main-btn-sign-up`).click()
|
|
17
|
+
'/settings': { title: 'settings', render: () => s(`.main-btn-settings`).click() },
|
|
18
|
+
'/log-in': { title: 'log-in', render: () => s(`.main-btn-log-in`).click() },
|
|
19
|
+
'/sign-up': { title: 'sign-up', render: () => s(`.main-btn-sign-up`).click() },
|
|
21
20
|
'/log-out': {
|
|
22
21
|
title: 'log-out',
|
|
23
22
|
render: () => s(`.main-btn-log-out`).click(),
|
|
24
|
-
hideDisplay: true,
|
|
25
|
-
translateTitle: true,
|
|
26
23
|
},
|
|
27
24
|
'/account': {
|
|
28
25
|
title: 'account',
|
|
29
26
|
render: () => s(`.main-btn-account`).click(),
|
|
30
|
-
hideDisplay: true,
|
|
31
|
-
translateTitle: true,
|
|
32
27
|
},
|
|
33
|
-
'/docs': { title: 'docs', render: () => s(`.main-btn-docs`).click()
|
|
34
|
-
'/recover': { title: 'recover', render: () => s(`.main-btn-recover`).click()
|
|
28
|
+
'/docs': { title: 'docs', render: () => s(`.main-btn-docs`).click() },
|
|
29
|
+
'/recover': { title: 'recover', render: () => s(`.main-btn-recover`).click() },
|
|
35
30
|
'/default-management': {
|
|
36
31
|
title: 'default-management',
|
|
37
32
|
render: () => s(`.main-btn-default-management`).click(),
|
|
38
|
-
translateTitle: true,
|
|
39
33
|
},
|
|
40
34
|
'/404': { title: '404 Not Found', render: () => s(`.main-btn-404`).click() },
|
|
41
35
|
'/500': { title: '500 Server Error', render: () => s(`.main-btn-500`).click() },
|
|
@@ -45,7 +39,7 @@ const RoutesDefault = () => {
|
|
|
45
39
|
window.Routes = RoutesDefault;
|
|
46
40
|
|
|
47
41
|
const RouterDefault = () => {
|
|
48
|
-
return { Routes: RoutesDefault,
|
|
42
|
+
return { Routes: RoutesDefault, BannerAppTemplate };
|
|
49
43
|
};
|
|
50
44
|
|
|
51
|
-
export { RoutesDefault, RouterDefault,
|
|
45
|
+
export { RoutesDefault, RouterDefault, BannerAppTemplate };
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|