nyte 1.1.3 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/console.d.ts +0 -2
- package/dist/api/console.js +5 -18
- package/dist/builder.js +129 -5
- package/dist/client/DefaultNotFound.js +149 -143
- package/dist/client/ErrorModal.d.ts +19 -0
- package/dist/client/ErrorModal.js +199 -0
- package/dist/client/entry.client.d.ts +4 -1
- package/dist/client/entry.client.js +117 -33
- package/dist/helpers.js +13 -5
- package/dist/hotReload.d.ts +3 -2
- package/dist/hotReload.js +274 -112
- package/dist/index.js +82 -58
- package/dist/renderer.js +175 -133
- package/dist/security.selftest.d.ts +1 -0
- package/dist/security.selftest.js +170 -0
- package/package.json +8 -7
- package/src/api/console.ts +1 -13
- package/src/builder.js +141 -6
- package/src/client/DefaultNotFound.tsx +229 -172
- package/src/client/ErrorModal.tsx +305 -0
- package/src/client/entry.client.tsx +154 -42
- package/src/helpers.ts +15 -5
- package/src/hotReload.ts +279 -120
- package/src/index.ts +83 -61
- package/src/renderer.tsx +177 -135
- package/src/security.selftest.ts +192 -0
package/dist/api/console.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Options as BoxenOptions } from 'boxen';
|
|
2
1
|
/**
|
|
3
2
|
* Um "handle" para uma linha dinâmica. As instâncias desta classe
|
|
4
3
|
* são retornadas por `Console.dynamicLine()` e usadas para controlar
|
|
@@ -76,6 +75,5 @@ export default class Console {
|
|
|
76
75
|
Field: string;
|
|
77
76
|
Value: any;
|
|
78
77
|
}>): void;
|
|
79
|
-
static box(content: string, options?: BoxenOptions): void;
|
|
80
78
|
static dynamicLine(initialContent: string): DynamicLine;
|
|
81
79
|
}
|
package/dist/api/console.js
CHANGED
|
@@ -1,9 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.Levels = exports.Colors = exports.DynamicLine = void 0;
|
|
7
2
|
/*
|
|
8
3
|
* This file is part of the Nyte.js Project.
|
|
9
4
|
* Copyright (c) 2026 itsmuzin
|
|
@@ -20,7 +15,11 @@ exports.Levels = exports.Colors = exports.DynamicLine = void 0;
|
|
|
20
15
|
* See the License for the specific language governing permissions and
|
|
21
16
|
* limitations under the License.
|
|
22
17
|
*/
|
|
23
|
-
|
|
18
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
19
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.Levels = exports.Colors = exports.DynamicLine = void 0;
|
|
24
23
|
const node_readline_1 = __importDefault(require("node:readline"));
|
|
25
24
|
/**
|
|
26
25
|
* Um "handle" para uma linha dinâmica. As instâncias desta classe
|
|
@@ -295,18 +294,6 @@ class Console {
|
|
|
295
294
|
output += bottom + '\n';
|
|
296
295
|
this.writeStatic(output);
|
|
297
296
|
}
|
|
298
|
-
static box(content, options) {
|
|
299
|
-
const defaultOptions = {
|
|
300
|
-
padding: 1,
|
|
301
|
-
margin: 1,
|
|
302
|
-
borderStyle: 'round',
|
|
303
|
-
borderColor: 'cyan',
|
|
304
|
-
titleAlignment: 'left',
|
|
305
|
-
};
|
|
306
|
-
const finalOptions = { ...defaultOptions, ...options };
|
|
307
|
-
const boxedContent = (0, boxen_1.default)(content, finalOptions);
|
|
308
|
-
this.writeStatic(boxedContent + '\n');
|
|
309
|
-
}
|
|
310
297
|
static dynamicLine(initialContent) {
|
|
311
298
|
return new DynamicLine(initialContent);
|
|
312
299
|
}
|
package/dist/builder.js
CHANGED
|
@@ -347,13 +347,70 @@ async function watchWithChunks(entryPoint, outdir, hotReloadManager = null) {
|
|
|
347
347
|
// Adiciona notificação de build via plugin
|
|
348
348
|
config.plugins.push({
|
|
349
349
|
name: 'build-notifier',
|
|
350
|
+
// Controle de ciclo: um ciclo começa no buildStart e termina no buildEnd.
|
|
351
|
+
// Se houve erro no ciclo, não podemos considerar "complete".
|
|
352
|
+
buildStart() {
|
|
353
|
+
this.__nyteCycleHadError = false;
|
|
354
|
+
},
|
|
350
355
|
closeBundle() {
|
|
351
|
-
|
|
352
|
-
|
|
356
|
+
// closeBundle pode rodar em situações inesperadas; não usamos isso pra limpar erro.
|
|
357
|
+
},
|
|
358
|
+
buildEnd(error) {
|
|
359
|
+
if (error) {
|
|
360
|
+
this.__nyteCycleHadError = true;
|
|
361
|
+
if (hotReloadManager) {
|
|
362
|
+
hotReloadManager.onBuildComplete(false, {
|
|
363
|
+
message: error.message,
|
|
364
|
+
name: error.name,
|
|
365
|
+
stack: error.stack,
|
|
366
|
+
// Vite/Rollup às vezes coloca infos adicionais
|
|
367
|
+
cause: error.cause,
|
|
368
|
+
loc: error.loc,
|
|
369
|
+
frame: error.frame,
|
|
370
|
+
id: error.id,
|
|
371
|
+
plugin: error.plugin,
|
|
372
|
+
pluginCode: error.pluginCode,
|
|
373
|
+
watchFiles: error.watchFiles
|
|
374
|
+
});
|
|
375
|
+
}
|
|
353
376
|
}
|
|
354
377
|
}
|
|
355
378
|
});
|
|
356
379
|
const watcher = await viteBuild(config);
|
|
380
|
+
// Flags do ciclo do watcher (mais confiável para decidir sucesso)
|
|
381
|
+
let watcherCycleHadError = false;
|
|
382
|
+
if (watcher && typeof watcher.on === 'function') {
|
|
383
|
+
watcher.on('event', (event) => {
|
|
384
|
+
if (!event)
|
|
385
|
+
return;
|
|
386
|
+
if (event.code === 'ERROR') {
|
|
387
|
+
watcherCycleHadError = true;
|
|
388
|
+
if (hotReloadManager) {
|
|
389
|
+
hotReloadManager.onBuildComplete(false, {
|
|
390
|
+
message: event.error?.message || 'Unknown build error',
|
|
391
|
+
name: event.error?.name,
|
|
392
|
+
stack: event.error?.stack,
|
|
393
|
+
cause: event.error?.cause,
|
|
394
|
+
loc: event.error?.loc,
|
|
395
|
+
frame: event.error?.frame,
|
|
396
|
+
id: event.error?.id,
|
|
397
|
+
plugin: event.error?.plugin,
|
|
398
|
+
pluginCode: event.error?.pluginCode,
|
|
399
|
+
watchFiles: event.error?.watchFiles
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
if (event.code === 'BUNDLE_END') {
|
|
404
|
+
if (hotReloadManager) {
|
|
405
|
+
if (!watcherCycleHadError) {
|
|
406
|
+
hotReloadManager.onBuildComplete(true);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
// Próximo ciclo
|
|
410
|
+
watcherCycleHadError = false;
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
}
|
|
357
414
|
// Aguarda o primeiro build terminar
|
|
358
415
|
await new Promise((resolve) => {
|
|
359
416
|
let initialBuild = true;
|
|
@@ -370,6 +427,13 @@ async function watchWithChunks(entryPoint, outdir, hotReloadManager = null) {
|
|
|
370
427
|
}
|
|
371
428
|
catch (error) {
|
|
372
429
|
Console.error('Error starting watch mode with chunks:', error);
|
|
430
|
+
if (hotReloadManager) {
|
|
431
|
+
hotReloadManager.onBuildComplete(false, {
|
|
432
|
+
message: error.message,
|
|
433
|
+
name: error.name,
|
|
434
|
+
stack: error.stack
|
|
435
|
+
});
|
|
436
|
+
}
|
|
373
437
|
throw error;
|
|
374
438
|
}
|
|
375
439
|
}
|
|
@@ -391,16 +455,76 @@ async function watch(entryPoint, outfile, hotReloadManager = null) {
|
|
|
391
455
|
};
|
|
392
456
|
config.plugins.push({
|
|
393
457
|
name: 'build-notifier',
|
|
458
|
+
buildStart() {
|
|
459
|
+
this.__nyteCycleHadError = false;
|
|
460
|
+
},
|
|
394
461
|
closeBundle() {
|
|
395
|
-
|
|
396
|
-
|
|
462
|
+
// Ignorado para sinalização de sucesso
|
|
463
|
+
},
|
|
464
|
+
buildEnd(error) {
|
|
465
|
+
if (error) {
|
|
466
|
+
this.__nyteCycleHadError = true;
|
|
467
|
+
if (hotReloadManager) {
|
|
468
|
+
hotReloadManager.onBuildComplete(false, {
|
|
469
|
+
message: error.message,
|
|
470
|
+
name: error.name,
|
|
471
|
+
stack: error.stack,
|
|
472
|
+
cause: error.cause,
|
|
473
|
+
loc: error.loc,
|
|
474
|
+
frame: error.frame,
|
|
475
|
+
id: error.id,
|
|
476
|
+
plugin: error.plugin,
|
|
477
|
+
pluginCode: error.pluginCode,
|
|
478
|
+
watchFiles: error.watchFiles
|
|
479
|
+
});
|
|
480
|
+
}
|
|
397
481
|
}
|
|
398
482
|
}
|
|
399
483
|
});
|
|
400
|
-
await viteBuild(config);
|
|
484
|
+
const watcher = await viteBuild(config);
|
|
485
|
+
let watcherCycleHadError = false;
|
|
486
|
+
if (watcher && typeof watcher.on === 'function') {
|
|
487
|
+
watcher.on('event', (event) => {
|
|
488
|
+
if (!event)
|
|
489
|
+
return;
|
|
490
|
+
if (event.code === 'ERROR') {
|
|
491
|
+
watcherCycleHadError = true;
|
|
492
|
+
if (hotReloadManager) {
|
|
493
|
+
hotReloadManager.onBuildComplete(false, {
|
|
494
|
+
message: event.error?.message || 'Unknown build error',
|
|
495
|
+
name: event.error?.name,
|
|
496
|
+
stack: event.error?.stack,
|
|
497
|
+
cause: event.error?.cause,
|
|
498
|
+
loc: event.error?.loc,
|
|
499
|
+
frame: event.error?.frame,
|
|
500
|
+
id: event.error?.id,
|
|
501
|
+
plugin: event.error?.plugin,
|
|
502
|
+
pluginCode: event.error?.pluginCode,
|
|
503
|
+
watchFiles: event.error?.watchFiles
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
if (event.code === 'BUNDLE_END') {
|
|
508
|
+
if (hotReloadManager) {
|
|
509
|
+
if (!watcherCycleHadError) {
|
|
510
|
+
hotReloadManager.onBuildComplete(true);
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
watcherCycleHadError = false;
|
|
514
|
+
}
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
// (removido) await viteBuild(config); // já estamos em watch mode
|
|
401
518
|
}
|
|
402
519
|
catch (error) {
|
|
403
520
|
Console.error('Error starting watch mode:', error);
|
|
521
|
+
if (hotReloadManager) {
|
|
522
|
+
hotReloadManager.onBuildComplete(false, {
|
|
523
|
+
message: error.message,
|
|
524
|
+
name: error.name,
|
|
525
|
+
stack: error.stack
|
|
526
|
+
});
|
|
527
|
+
}
|
|
404
528
|
throw error;
|
|
405
529
|
}
|
|
406
530
|
}
|
|
@@ -2,159 +2,165 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.default = ErrorPage;
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
/*
|
|
6
|
+
* This file is part of the Nyte.js Project.
|
|
7
|
+
* Copyright (c) 2026 itsmuzin
|
|
8
|
+
*/
|
|
9
|
+
const react_1 = require("react");
|
|
5
10
|
const lucide_react_1 = require("lucide-react");
|
|
6
11
|
function ErrorPage() {
|
|
12
|
+
// State for interactive hover effects
|
|
13
|
+
const [hoverHome, setHoverHome] = (0, react_1.useState)(false);
|
|
14
|
+
const [hoverRetry, setHoverRetry] = (0, react_1.useState)(false);
|
|
15
|
+
const [mounted, setMounted] = (0, react_1.useState)(false);
|
|
16
|
+
const [path, setPath] = (0, react_1.useState)('/');
|
|
17
|
+
(0, react_1.useEffect)(() => {
|
|
18
|
+
setMounted(true);
|
|
19
|
+
if (typeof window !== 'undefined') {
|
|
20
|
+
setPath(window.location.pathname);
|
|
21
|
+
}
|
|
22
|
+
}, []);
|
|
23
|
+
// --- GLOBAL STYLES (Reset & Fonts & Solid Background) ---
|
|
7
24
|
const globalStyles = `
|
|
8
|
-
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700;900&display=swap');
|
|
25
|
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700;900&family=JetBrains+Mono:wght@400;500&display=swap');
|
|
9
26
|
|
|
10
27
|
body {
|
|
11
28
|
margin: 0;
|
|
12
29
|
padding: 0;
|
|
13
|
-
|
|
14
|
-
color: #
|
|
15
|
-
|
|
30
|
+
/* SOLID DARK BACKGROUND HERE */
|
|
31
|
+
background-color: #0d0d0d;
|
|
32
|
+
color: #e2e8f0;
|
|
33
|
+
font-family: 'Inter', system-ui, sans-serif;
|
|
16
34
|
overflow: hidden;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
justify-content: center;
|
|
20
|
-
min-height: 100vh;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
.bg-glow {
|
|
24
|
-
position: fixed;
|
|
25
|
-
top: 50%;
|
|
26
|
-
left: 50%;
|
|
27
|
-
transform: translate(-50%, -50%);
|
|
28
|
-
width: 500px;
|
|
29
|
-
height: 500px;
|
|
30
|
-
background: radial-gradient(circle, rgba(34, 211, 238, 0.15) 0%, transparent 70%);
|
|
31
|
-
filter: blur(60px);
|
|
32
|
-
z-index: -1;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
.glass-container {
|
|
36
|
-
background: rgba(255, 255, 255, 0.02);
|
|
37
|
-
backdrop-filter: blur(20px);
|
|
38
|
-
border: 1px solid rgba(255, 255, 255, 0.05);
|
|
39
|
-
padding: 3rem;
|
|
40
|
-
border-radius: 2rem;
|
|
41
|
-
display: flex;
|
|
42
|
-
flex-direction: column;
|
|
43
|
-
align-items: center;
|
|
44
|
-
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
|
|
45
|
-
max-width: 90%;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
.error-code {
|
|
49
|
-
font-size: 8rem;
|
|
50
|
-
font-weight: 900;
|
|
51
|
-
line-height: 1;
|
|
52
|
-
letter-spacing: -0.05em;
|
|
53
|
-
background: linear-gradient(to bottom, #fff, #94a3b8);
|
|
54
|
-
-webkit-background-clip: text;
|
|
55
|
-
-webkit-text-fill-color: transparent;
|
|
56
|
-
margin-bottom: 1rem;
|
|
35
|
+
height: 100vh;
|
|
36
|
+
width: 100vw;
|
|
57
37
|
position: relative;
|
|
58
38
|
}
|
|
59
39
|
|
|
60
|
-
|
|
61
|
-
content: '404';
|
|
62
|
-
position: absolute;
|
|
63
|
-
left: 2px;
|
|
64
|
-
top: 2px;
|
|
65
|
-
z-index: -1;
|
|
66
|
-
background: linear-gradient(to bottom, #22d3ee, transparent);
|
|
67
|
-
-webkit-background-clip: text;
|
|
68
|
-
-webkit-text-fill-color: transparent;
|
|
69
|
-
opacity: 0.5;
|
|
70
|
-
filter: blur(8px);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
.divider {
|
|
74
|
-
width: 40px;
|
|
75
|
-
height: 4px;
|
|
76
|
-
background: #22d3ee;
|
|
77
|
-
border-radius: 2px;
|
|
78
|
-
margin-bottom: 2rem;
|
|
79
|
-
box-shadow: 0 0 15px rgba(34, 211, 238, 0.5);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
.message {
|
|
83
|
-
font-size: 1.25rem;
|
|
84
|
-
color: #94a3b8;
|
|
85
|
-
font-weight: 500;
|
|
86
|
-
margin-bottom: 2.5rem;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
.actions {
|
|
90
|
-
display: flex;
|
|
91
|
-
gap: 1rem;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
.btn {
|
|
95
|
-
display: flex;
|
|
96
|
-
align-items: center;
|
|
97
|
-
gap: 0.5rem;
|
|
98
|
-
padding: 0.75rem 1.5rem;
|
|
99
|
-
border-radius: 0.75rem;
|
|
100
|
-
font-size: 0.875rem;
|
|
101
|
-
font-weight: 600;
|
|
102
|
-
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
103
|
-
cursor: pointer;
|
|
104
|
-
border: none;
|
|
105
|
-
text-decoration: none;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
.btn-primary {
|
|
109
|
-
background: #22d3ee;
|
|
110
|
-
color: #030712;
|
|
111
|
-
box-shadow: 0 10px 15px -3px rgba(34, 211, 238, 0.3);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
.btn-primary:hover {
|
|
115
|
-
background: #67e8f9;
|
|
116
|
-
transform: translateY(-2px);
|
|
117
|
-
box-shadow: 0 20px 25px -5px rgba(34, 211, 238, 0.4);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
.btn-secondary {
|
|
121
|
-
background: rgba(255, 255, 255, 0.05);
|
|
122
|
-
color: #fff;
|
|
123
|
-
backdrop-filter: blur(10px);
|
|
124
|
-
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
.btn-secondary:hover {
|
|
128
|
-
background: rgba(255, 255, 255, 0.1);
|
|
129
|
-
border-color: rgba(34, 211, 238, 0.3);
|
|
130
|
-
transform: translateY(-2px);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
.brand {
|
|
134
|
-
position: absolute;
|
|
135
|
-
bottom: 3rem;
|
|
136
|
-
display: flex;
|
|
137
|
-
align-items: center;
|
|
138
|
-
gap: 0.75rem;
|
|
139
|
-
opacity: 0.6;
|
|
140
|
-
transition: opacity 0.3s;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
.brand:hover {
|
|
144
|
-
opacity: 1;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
.brand img {
|
|
148
|
-
width: 24px;
|
|
149
|
-
height: 24px;
|
|
150
|
-
object-fit: contain;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
.brand span {
|
|
154
|
-
font-size: 0.875rem;
|
|
155
|
-
font-weight: 700;
|
|
156
|
-
letter-spacing: -0.025em;
|
|
157
|
-
}
|
|
40
|
+
* { box-sizing: border-box; }
|
|
158
41
|
`;
|
|
159
|
-
|
|
42
|
+
// --- INLINE STYLES ---
|
|
43
|
+
// Container updated for absolute perfect centering
|
|
44
|
+
const containerStyle = {
|
|
45
|
+
position: 'absolute',
|
|
46
|
+
top: '50%',
|
|
47
|
+
left: '50%',
|
|
48
|
+
transform: 'translate(-50%, -50%)',
|
|
49
|
+
display: 'flex',
|
|
50
|
+
flexDirection: 'column',
|
|
51
|
+
alignItems: 'center',
|
|
52
|
+
justifyContent: 'center',
|
|
53
|
+
zIndex: 10,
|
|
54
|
+
width: '100%',
|
|
55
|
+
pointerEvents: 'none', // Allows clicks to pass through container areas not covered by children
|
|
56
|
+
};
|
|
57
|
+
const cardStyle = {
|
|
58
|
+
width: 'min(90%, 500px)',
|
|
59
|
+
display: 'flex',
|
|
60
|
+
flexDirection: 'column',
|
|
61
|
+
// Super Glassmorphism Dark (Matching Modal)
|
|
62
|
+
background: 'rgba(10, 10, 12, 0.95)',
|
|
63
|
+
// Cyan Glow Border + Deep Shadow
|
|
64
|
+
boxShadow: '0 0 0 1px rgba(34, 211, 238, 0.15), 0 40px 80px -20px rgba(0, 0, 0, 0.8)',
|
|
65
|
+
borderRadius: 20,
|
|
66
|
+
overflow: 'hidden',
|
|
67
|
+
position: 'relative',
|
|
68
|
+
transform: mounted ? 'scale(1) translateY(0)' : 'scale(0.98) translateY(10px)',
|
|
69
|
+
opacity: mounted ? 1 : 0,
|
|
70
|
+
transition: 'transform 0.5s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.5s ease',
|
|
71
|
+
pointerEvents: 'auto', // Re-enable clicks on the card itself
|
|
72
|
+
};
|
|
73
|
+
// The Signature Neon Line
|
|
74
|
+
const neonLine = {
|
|
75
|
+
height: '1px',
|
|
76
|
+
width: '100%',
|
|
77
|
+
background: 'linear-gradient(90deg, transparent, #06b6d4, #22d3ee, transparent)',
|
|
78
|
+
boxShadow: '0 0 15px rgba(34, 211, 238, 0.6)',
|
|
79
|
+
};
|
|
80
|
+
const contentStyle = {
|
|
81
|
+
padding: '32px',
|
|
82
|
+
display: 'flex',
|
|
83
|
+
flexDirection: 'column',
|
|
84
|
+
alignItems: 'center',
|
|
85
|
+
textAlign: 'center',
|
|
86
|
+
};
|
|
87
|
+
const codeStyle = {
|
|
88
|
+
fontSize: 80,
|
|
89
|
+
fontWeight: 900,
|
|
90
|
+
lineHeight: 1,
|
|
91
|
+
letterSpacing: '-0.04em',
|
|
92
|
+
color: '#fff',
|
|
93
|
+
// Subtle Gradient Text
|
|
94
|
+
background: 'linear-gradient(180deg, #ffffff 0%, #94a3b8 100%)',
|
|
95
|
+
WebkitBackgroundClip: 'text',
|
|
96
|
+
WebkitTextFillColor: 'transparent',
|
|
97
|
+
marginBottom: 16,
|
|
98
|
+
filter: 'drop-shadow(0 0 20px rgba(34, 211, 238, 0.15))',
|
|
99
|
+
};
|
|
100
|
+
const terminalBoxStyle = {
|
|
101
|
+
width: '100%',
|
|
102
|
+
background: 'rgba(0, 0, 0, 0.4)',
|
|
103
|
+
borderRadius: 12,
|
|
104
|
+
padding: '16px',
|
|
105
|
+
marginBottom: 24,
|
|
106
|
+
border: '1px solid rgba(255, 255, 255, 0.05)',
|
|
107
|
+
fontFamily: '"JetBrains Mono", monospace',
|
|
108
|
+
fontSize: 12,
|
|
109
|
+
textAlign: 'left',
|
|
110
|
+
color: '#94a3b8',
|
|
111
|
+
};
|
|
112
|
+
// Button Generator (Reusable)
|
|
113
|
+
const getBtnStyle = (kind, hovering) => {
|
|
114
|
+
const base = {
|
|
115
|
+
display: 'flex',
|
|
116
|
+
alignItems: 'center',
|
|
117
|
+
gap: 8,
|
|
118
|
+
padding: '10px 20px',
|
|
119
|
+
borderRadius: 10,
|
|
120
|
+
fontSize: 13,
|
|
121
|
+
fontWeight: 600,
|
|
122
|
+
cursor: 'pointer',
|
|
123
|
+
transition: 'all 0.2s ease',
|
|
124
|
+
border: 'none',
|
|
125
|
+
outline: 'none',
|
|
126
|
+
textDecoration: 'none',
|
|
127
|
+
fontFamily: 'Inter, sans-serif',
|
|
128
|
+
};
|
|
129
|
+
if (kind === 'primary') {
|
|
130
|
+
return {
|
|
131
|
+
...base,
|
|
132
|
+
background: hovering ? 'rgba(34, 211, 238, 0.15)' : 'rgba(34, 211, 238, 0.1)',
|
|
133
|
+
color: '#22d3ee',
|
|
134
|
+
boxShadow: hovering ? '0 0 20px rgba(34, 211, 238, 0.25)' : 'inset 0 0 0 1px rgba(34, 211, 238, 0.2)',
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
...base,
|
|
139
|
+
background: hovering ? 'rgba(255, 255, 255, 0.08)' : 'rgba(255, 255, 255, 0.03)',
|
|
140
|
+
color: hovering ? '#fff' : 'rgba(255, 255, 255, 0.6)',
|
|
141
|
+
border: '1px solid transparent',
|
|
142
|
+
borderColor: hovering ? 'rgba(255, 255, 255, 0.1)' : 'transparent',
|
|
143
|
+
};
|
|
144
|
+
};
|
|
145
|
+
const brandStyle = {
|
|
146
|
+
marginTop: 32,
|
|
147
|
+
display: 'flex',
|
|
148
|
+
alignItems: 'center',
|
|
149
|
+
gap: 10,
|
|
150
|
+
opacity: 0.4,
|
|
151
|
+
transition: 'opacity 0.3s',
|
|
152
|
+
textDecoration: 'none',
|
|
153
|
+
color: '#fff',
|
|
154
|
+
pointerEvents: 'auto', // Re-enable clicks on brand link
|
|
155
|
+
};
|
|
156
|
+
return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("style", { dangerouslySetInnerHTML: { __html: globalStyles } }), (0, jsx_runtime_1.jsxs)("div", { style: containerStyle, children: [(0, jsx_runtime_1.jsxs)("div", { style: cardStyle, children: [(0, jsx_runtime_1.jsx)("div", { style: neonLine }), (0, jsx_runtime_1.jsxs)("div", { style: contentStyle, children: [(0, jsx_runtime_1.jsx)("div", { style: codeStyle, children: "404" }), (0, jsx_runtime_1.jsxs)("div", { style: terminalBoxStyle, children: [(0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', gap: 6, marginBottom: 8, opacity: 0.5 }, children: [(0, jsx_runtime_1.jsx)("div", { style: { width: 8, height: 8, borderRadius: '50%', background: '#f87171' } }), (0, jsx_runtime_1.jsx)("div", { style: { width: 8, height: 8, borderRadius: '50%', background: '#fbbf24' } }), (0, jsx_runtime_1.jsx)("div", { style: { width: 8, height: 8, borderRadius: '50%', background: '#4ade80' } })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("span", { style: { color: '#c084fc' }, children: "GET" }), ' ', (0, jsx_runtime_1.jsx)("span", { style: { color: '#22d3ee' }, children: path })] }), (0, jsx_runtime_1.jsx)("div", { style: { marginTop: 4, color: '#f87171' }, children: (0, jsx_runtime_1.jsx)("span", { children: "Error: Route not found" }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', gap: 12, width: '100%' }, children: [(0, jsx_runtime_1.jsxs)("a", { href: "/", style: { ...getBtnStyle('primary', false), flex: 1, justifyContent: 'center' }, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Home, { size: 16 }), "Back Home"] }), (0, jsx_runtime_1.jsxs)("button", { onClick: () => window.location.reload(), style: { ...getBtnStyle('secondary', false), flex: 1, justifyContent: 'center' }, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.RefreshCw, { size: 16 }), "Retry"] })] })] }), (0, jsx_runtime_1.jsxs)("div", { style: {
|
|
157
|
+
padding: '12px 32px',
|
|
158
|
+
background: 'rgba(0,0,0,0.3)',
|
|
159
|
+
borderTop: '1px solid rgba(255,255,255,0.03)',
|
|
160
|
+
display: 'flex',
|
|
161
|
+
justifyContent: 'space-between',
|
|
162
|
+
alignItems: 'center',
|
|
163
|
+
fontSize: 11,
|
|
164
|
+
color: 'rgba(255,255,255,0.2)'
|
|
165
|
+
}, children: [(0, jsx_runtime_1.jsx)("span", { children: "Nyte Server" }), (0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', alignItems: 'center', gap: 6 }, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.AlertTriangle, { size: 10, color: "#f87171" }), (0, jsx_runtime_1.jsx)("span", { style: { color: '#f87171' }, children: "Not Found" })] })] })] }), (0, jsx_runtime_1.jsxs)("a", { href: "https://npmjs.com/package/nyte", target: "_blank", rel: "noopener noreferrer", style: brandStyle, onMouseEnter: (e) => e.currentTarget.style.opacity = '1', onMouseLeave: (e) => e.currentTarget.style.opacity = '0.4', children: [(0, jsx_runtime_1.jsx)("img", { src: "https://i.imgur.com/zUTrtM5.png", alt: "Nyte Logo", style: { width: 20, height: 20 } }), (0, jsx_runtime_1.jsxs)("span", { style: { fontSize: 13, fontWeight: 600 }, children: ["Nyte", (0, jsx_runtime_1.jsx)("span", { style: { color: '#22d3ee' }, children: ".js" })] })] })] })] }));
|
|
160
166
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface NyteBuildError {
|
|
2
|
+
message?: string;
|
|
3
|
+
name?: string;
|
|
4
|
+
stack?: string;
|
|
5
|
+
frame?: string;
|
|
6
|
+
id?: string;
|
|
7
|
+
plugin?: string;
|
|
8
|
+
pluginCode?: string;
|
|
9
|
+
loc?: any;
|
|
10
|
+
watchFiles?: any;
|
|
11
|
+
cause?: any;
|
|
12
|
+
ts?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare function ErrorModal({ error, isOpen, onClose, onCopy, }: {
|
|
15
|
+
error: NyteBuildError | null;
|
|
16
|
+
isOpen: boolean;
|
|
17
|
+
onClose: () => void;
|
|
18
|
+
onCopy?: () => void;
|
|
19
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|