vatts 1.2.2 → 1.2.3

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/hotReload.js CHANGED
@@ -291,7 +291,8 @@ class HotReloadManager {
291
291
  filePath.includes('not-found.tsx') ||
292
292
  filePath.endsWith('.tsx') ||
293
293
  filePath.endsWith(".ts") ||
294
- filePath.endsWith(".vue");
294
+ filePath.endsWith(".vue") ||
295
+ filePath.endsWith(".css");
295
296
  const isBackendFile = filePath.includes(path.join('src', 'backend')) && !isFrontendFile;
296
297
  (0, router_1.clearFileCache)(filePath);
297
298
  this.clearBackendCache(filePath);
@@ -31,11 +31,13 @@ function BuildingScreen() {
31
31
  :root {
32
32
  --bg-solid: #000000;
33
33
  --card-bg: #0a0a0a;
34
- /* PALETA: Monocromática estilo Next.js */
34
+ /* PALETA: React Theme */
35
+ --react-cyan: #61DAFB; /* O azul/ciano clássico do React */
36
+ --react-dark: #20232a; /* Fundo escuro azulado */
35
37
  --primary: #ffffff;
36
- --primary-glow: rgba(255, 255, 255, 0.1);
38
+ --primary-glow: rgba(97, 218, 251, 0.1);
37
39
  --text-main: #ffffff;
38
- --text-muted: #64748b;
40
+ --text-muted: #8ea9c7; /* Cinza azulado para combinar */
39
41
  }
40
42
 
41
43
  body {
@@ -68,8 +70,8 @@ function BuildingScreen() {
68
70
  width: 100%;
69
71
  max-width: 420px;
70
72
  background: var(--card-bg);
71
- /* Borda sutil em cinza escuro */
72
- box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.1), 0 40px 80px -20px rgba(0, 0, 0, 0.9);
73
+ /* Borda sutil com brilho React Cyan */
74
+ box-shadow: 0 0 0 1px rgba(97, 218, 251, 0.1), 0 40px 80px -20px rgba(0, 0, 0, 0.9);
73
75
  border-radius: 20px;
74
76
  overflow: hidden;
75
77
  display: flex;
@@ -81,9 +83,9 @@ function BuildingScreen() {
81
83
  .neon-line {
82
84
  height: 1px;
83
85
  width: 100%;
84
- /* Linha de luz branca/cinza */
85
- background: linear-gradient(90deg, transparent, #334155, #ffffff, #334155, transparent);
86
- box-shadow: 0 0 15px rgba(255, 255, 255, 0.05);
86
+ /* Linha de luz: Gradiente usando o Cyan */
87
+ background: linear-gradient(90deg, transparent, var(--react-dark), var(--react-cyan), var(--react-dark), transparent);
88
+ box-shadow: 0 0 15px rgba(97, 218, 251, 0.2);
87
89
  }
88
90
 
89
91
  .content {
@@ -106,8 +108,8 @@ function BuildingScreen() {
106
108
  object-fit: contain;
107
109
  position: relative;
108
110
  z-index: 2;
109
- /* Deixa a logo levemente dessaturada para combinar */
110
- filter: grayscale(0.5);
111
+ /* Removi o grayscale para a logo brilhar na cor natural se tiver cor, ou ficar nítida */
112
+ filter: none;
111
113
  }
112
114
 
113
115
  .logo-glow {
@@ -117,9 +119,10 @@ function BuildingScreen() {
117
119
  transform: translate(-50%, -50%);
118
120
  width: 100%;
119
121
  height: 100%;
120
- background: #ffffff;
122
+ /* Glow Cyan do React */
123
+ background: var(--react-cyan);
121
124
  filter: blur(25px);
122
- opacity: 0.1;
125
+ opacity: 0.2;
123
126
  border-radius: 50%;
124
127
  animation: pulse 2s ease-in-out infinite;
125
128
  }
@@ -129,14 +132,16 @@ function BuildingScreen() {
129
132
  font-size: 2rem;
130
133
  font-weight: 800;
131
134
  letter-spacing: -0.03em;
132
- background: linear-gradient(180deg, #ffffff 0%, #475569 100%);
135
+ /* Gradiente do texto: Branco para Cyan */
136
+ background: linear-gradient(180deg, #ffffff 0%, var(--react-cyan) 100%);
133
137
  -webkit-background-clip: text;
134
138
  -webkit-text-fill-color: transparent;
135
139
  }
136
140
 
137
141
  h1 span {
138
- color: #475569;
139
- -webkit-text-fill-color: #475569;
142
+ /* Span .js em Cyan Sólido */
143
+ color: var(--react-cyan);
144
+ -webkit-text-fill-color: var(--react-cyan);
140
145
  }
141
146
 
142
147
  p {
@@ -148,14 +153,14 @@ function BuildingScreen() {
148
153
 
149
154
  .terminal-box {
150
155
  width: 100%;
151
- background: rgba(255, 255, 255, 0.02);
152
- border: 1px solid rgba(255, 255, 255, 0.08);
156
+ background: rgba(97, 218, 251, 0.03); /* Fundo azulado bem sutil */
157
+ border: 1px solid rgba(97, 218, 251, 0.1); /* Borda ciano sutil */
153
158
  border-radius: 12px;
154
159
  padding: 16px;
155
160
  text-align: left;
156
161
  font-family: 'JetBrains Mono', monospace;
157
162
  font-size: 0.75rem;
158
- color: #475569;
163
+ color: var(--text-muted);
159
164
  box-sizing: border-box;
160
165
  display: flex;
161
166
  flex-direction: column;
@@ -171,25 +176,25 @@ function BuildingScreen() {
171
176
  .term-spinner {
172
177
  width: 10px;
173
178
  height: 10px;
174
- border: 2px solid rgba(255, 255, 255, 0.1);
175
- border-top-color: #ffffff;
179
+ border: 2px solid rgba(97, 218, 251, 0.1);
180
+ border-top-color: var(--react-cyan); /* Spinner Cyan */
176
181
  border-radius: 50%;
177
182
  animation: spin 0.6s linear infinite;
178
183
  }
179
184
 
180
- .file-name { color: #94a3b8; }
181
- .accent { color: #ffffff; }
185
+ .file-name { color: #8ea9c7; }
186
+ .accent { color: var(--react-cyan); }
182
187
 
183
188
  .card-footer {
184
189
  width: 100%;
185
190
  padding: 12px 32px;
186
- background: rgba(255,255,255,0.02);
187
- border-top: 1px solid rgba(255,255,255,0.05);
191
+ background: rgba(97, 218, 251, 0.02);
192
+ border-top: 1px solid rgba(97, 218, 251, 0.05);
188
193
  display: flex;
189
194
  justify-content: space-between;
190
195
  align-items: center;
191
196
  font-size: 11px;
192
- color: rgba(255,255,255,0.2);
197
+ color: rgba(255,255,255,0.3);
193
198
  box-sizing: border-box;
194
199
  }
195
200
 
@@ -197,7 +202,7 @@ function BuildingScreen() {
197
202
  display: flex;
198
203
  align-items: center;
199
204
  gap: 6px;
200
- color: #ffffff;
205
+ color: var(--react-cyan);
201
206
  font-weight: 600;
202
207
  text-transform: uppercase;
203
208
  letter-spacing: 0.05em;
@@ -206,14 +211,14 @@ function BuildingScreen() {
206
211
  .dot {
207
212
  width: 6px;
208
213
  height: 6px;
209
- background-color: #ffffff;
214
+ background-color: var(--react-cyan);
210
215
  border-radius: 50%;
211
- box-shadow: 0 0 8px rgba(255, 255, 255, 0.5);
216
+ box-shadow: 0 0 8px var(--react-cyan);
212
217
  }
213
218
 
214
219
  @keyframes pulse {
215
- 0%, 100% { opacity: 0.1; transform: translate(-50%, -50%) scale(1); }
216
- 50% { opacity: 0.15; transform: translate(-50%, -50%) scale(1.1); }
220
+ 0%, 100% { opacity: 0.15; transform: translate(-50%, -50%) scale(1); }
221
+ 50% { opacity: 0.25; transform: translate(-50%, -50%) scale(1.1); }
217
222
  }
218
223
 
219
224
  @keyframes spin {
@@ -249,7 +254,7 @@ function BuildingScreen() {
249
254
  react_1.default.createElement("span", { className: "accent" }, "src/vatts.ts"),
250
255
  "...")),
251
256
  react_1.default.createElement("div", { className: "term-line", style: { opacity: 0.5 } },
252
- react_1.default.createElement("span", null, "\u2713"),
257
+ react_1.default.createElement("span", { style: { color: "var(--react-cyan)" } }, "\u2713"),
253
258
  react_1.default.createElement("span", { className: "file-name" }, "Optimizing assets")))),
254
259
  react_1.default.createElement("div", { className: "card-footer" },
255
260
  react_1.default.createElement("span", null, "Building..."),
@@ -60,6 +60,14 @@ function ErrorPage() {
60
60
  setPath(window.location.pathname);
61
61
  }
62
62
  }, []);
63
+ // --- CORES DO TEMA REACT ---
64
+ const theme = {
65
+ cyan: '#61DAFB', // React Blue/Cyan
66
+ dark: '#20232a', // React Dark BG Accent
67
+ textMuted: '#8ea9c7', // Azul acinzentado
68
+ bg: '#000000',
69
+ cardBg: '#0a0a0a'
70
+ };
63
71
  // --- GLOBAL STYLES ---
64
72
  const globalStyles = `
65
73
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700;900&family=JetBrains+Mono:wght@400;500&display=swap');
@@ -67,7 +75,7 @@ function ErrorPage() {
67
75
  body {
68
76
  margin: 0;
69
77
  padding: 0;
70
- background-color: #000000;
78
+ background-color: ${theme.bg};
71
79
  color: #ffffff;
72
80
  font-family: 'Inter', system-ui, sans-serif;
73
81
  overflow: hidden;
@@ -78,10 +86,6 @@ function ErrorPage() {
78
86
  * { box-sizing: border-box; }
79
87
  `;
80
88
  // --- INLINE STYLES ---
81
- // Paleta Estilo Next.js (Preto, Branco, Cinza)
82
- const primaryColor = '#ffffff';
83
- const primaryColorDark = '#64748b';
84
- const primaryRgb = '255, 255, 255';
85
89
  const containerStyle = {
86
90
  position: 'fixed',
87
91
  top: 0,
@@ -95,15 +99,15 @@ function ErrorPage() {
95
99
  justifyContent: 'center',
96
100
  width: '100vw',
97
101
  height: '100vh',
98
- background: '#000000',
102
+ background: theme.bg,
99
103
  };
100
104
  const cardStyle = {
101
105
  width: 'min(90%, 500px)',
102
106
  display: 'flex',
103
107
  flexDirection: 'column',
104
- background: '#0a0a0a',
105
- // Borda sutil branca/cinza
106
- boxShadow: `0 0 0 1px rgba(255, 255, 255, 0.1), 0 40px 80px -20px rgba(0, 0, 0, 0.9)`,
108
+ background: theme.cardBg,
109
+ // Borda sutil com brilho Cyan
110
+ boxShadow: `0 0 0 1px rgba(97, 218, 251, 0.1), 0 40px 80px -20px rgba(0, 0, 0, 0.9)`,
107
111
  borderRadius: 20,
108
112
  overflow: 'hidden',
109
113
  position: 'relative',
@@ -111,10 +115,10 @@ function ErrorPage() {
111
115
  const neonLine = {
112
116
  height: '1px',
113
117
  width: '100%',
114
- // Gradiente monocromático
115
- background: `linear-gradient(90deg, transparent, #334155, #ffffff, #334155, transparent)`,
116
- // Brilho branco suave
117
- boxShadow: `0 0 15px rgba(255, 255, 255, 0.1)`,
118
+ // Gradiente usando o Cyan do React
119
+ background: `linear-gradient(90deg, transparent, ${theme.dark}, ${theme.cyan}, ${theme.dark}, transparent)`,
120
+ // Brilho Cyan suave
121
+ boxShadow: `0 0 15px rgba(97, 218, 251, 0.2)`,
118
122
  };
119
123
  const contentStyle = {
120
124
  padding: '32px',
@@ -129,23 +133,24 @@ function ErrorPage() {
129
133
  lineHeight: 1,
130
134
  letterSpacing: '-0.04em',
131
135
  color: '#fff',
132
- background: 'linear-gradient(180deg, #ffffff 0%, #475569 100%)',
136
+ // Gradiente Branco -> Cyan
137
+ background: `linear-gradient(180deg, #ffffff 0%, ${theme.cyan} 100%)`,
133
138
  WebkitBackgroundClip: 'text',
134
139
  WebkitTextFillColor: 'transparent',
135
140
  marginBottom: 16,
136
- filter: `drop-shadow(0 0 20px rgba(255, 255, 255, 0.05))`,
141
+ filter: `drop-shadow(0 0 20px rgba(97, 218, 251, 0.1))`,
137
142
  };
138
143
  const terminalBoxStyle = {
139
144
  width: '100%',
140
- background: 'rgba(255, 255, 255, 0.02)',
145
+ background: 'rgba(97, 218, 251, 0.03)', // Fundo azulado sutil
141
146
  borderRadius: 12,
142
147
  padding: '16px',
143
148
  marginBottom: 24,
144
- border: '1px solid rgba(255, 255, 255, 0.08)',
149
+ border: '1px solid rgba(97, 218, 251, 0.1)', // Borda cyan sutil
145
150
  fontFamily: '"JetBrains Mono", monospace',
146
151
  fontSize: 12,
147
152
  textAlign: 'left',
148
- color: '#94a3b8',
153
+ color: theme.textMuted,
149
154
  };
150
155
  const getBtnStyle = (kind, hovering) => {
151
156
  const base = {
@@ -166,17 +171,18 @@ function ErrorPage() {
166
171
  if (kind === 'primary') {
167
172
  return {
168
173
  ...base,
169
- background: hovering ? '#ffffff' : '#f8fafc',
174
+ // Botão Primário agora é o Cyan do React com texto escuro (contraste alto)
175
+ background: hovering ? '#ffffff' : theme.cyan,
170
176
  color: '#000000',
171
- boxShadow: hovering ? `0 0 20px rgba(255, 255, 255, 0.2)` : 'none',
177
+ boxShadow: hovering ? `0 0 20px rgba(97, 218, 251, 0.4)` : 'none',
172
178
  };
173
179
  }
174
180
  return {
175
181
  ...base,
176
- background: hovering ? 'rgba(255, 255, 255, 0.1)' : 'transparent',
177
- color: hovering ? '#fff' : 'rgba(255, 255, 255, 0.6)',
178
- border: '1px solid rgba(255, 255, 255, 0.1)',
179
- borderColor: hovering ? 'rgba(255, 255, 255, 0.3)' : 'rgba(255, 255, 255, 0.1)',
182
+ background: hovering ? 'rgba(97, 218, 251, 0.1)' : 'transparent',
183
+ color: hovering ? '#fff' : theme.textMuted,
184
+ border: '1px solid',
185
+ borderColor: hovering ? theme.cyan : 'rgba(255, 255, 255, 0.1)',
180
186
  };
181
187
  };
182
188
  const brandStyle = {
@@ -202,10 +208,10 @@ function ErrorPage() {
202
208
  react_1.default.createElement("div", { style: { width: 8, height: 8, borderRadius: '50%', background: '#fff' } }),
203
209
  react_1.default.createElement("div", { style: { width: 8, height: 8, borderRadius: '50%', background: '#fff' } })),
204
210
  react_1.default.createElement("div", null,
205
- react_1.default.createElement("span", { style: { color: '#64748b' } }, "GET"),
211
+ react_1.default.createElement("span", { style: { color: theme.cyan } }, "GET"),
206
212
  ' ',
207
213
  react_1.default.createElement("span", { style: { color: '#fff' } }, path)),
208
- react_1.default.createElement("div", { style: { marginTop: 4, color: '#475569' } },
214
+ react_1.default.createElement("div", { style: { marginTop: 4, color: theme.textMuted } },
209
215
  react_1.default.createElement("span", null, "Error: Route not found"))),
210
216
  react_1.default.createElement("div", { style: { display: 'flex', gap: 12, width: '100%' } },
211
217
  react_1.default.createElement("a", { href: "/", onMouseEnter: () => setHoverHome(true), onMouseLeave: () => setHoverHome(false), style: { ...getBtnStyle('primary', hoverHome), flex: 1, justifyContent: 'center' } },
@@ -222,8 +228,8 @@ function ErrorPage() {
222
228
  "Retry"))),
223
229
  react_1.default.createElement("div", { style: {
224
230
  padding: '12px 32px',
225
- background: 'rgba(255,255,255,0.02)',
226
- borderTop: '1px solid rgba(255,255,255,0.05)',
231
+ background: 'rgba(97, 218, 251, 0.02)',
232
+ borderTop: '1px solid rgba(97, 218, 251, 0.05)',
227
233
  display: 'flex',
228
234
  justifyContent: 'space-between',
229
235
  alignItems: 'center',
@@ -232,11 +238,11 @@ function ErrorPage() {
232
238
  } },
233
239
  react_1.default.createElement("span", null, "Vatts Server"),
234
240
  react_1.default.createElement("div", { style: { display: 'flex', alignItems: 'center', gap: 6 } },
235
- react_1.default.createElement("div", { style: { width: 6, height: 6, borderRadius: '50%', background: '#475569' } }),
236
- react_1.default.createElement("span", { style: { color: '#94a3b8' } }, "Not Found")))),
241
+ react_1.default.createElement("div", { style: { width: 6, height: 6, borderRadius: '50%', background: theme.cyan, boxShadow: `0 0 6px ${theme.cyan}` } }),
242
+ react_1.default.createElement("span", { style: { color: theme.cyan } }, "Not Found")))),
237
243
  react_1.default.createElement("a", { href: "https://npmjs.com/package/vatts", target: "_blank", rel: "noopener noreferrer", style: brandStyle, onMouseEnter: (e) => e.currentTarget.style.opacity = '1', onMouseLeave: (e) => e.currentTarget.style.opacity = '0.4' },
238
- react_1.default.createElement("img", { src: "https://raw.githubusercontent.com/mfrazlab/vatts.js/master/docs/public/logo.png", alt: "Vatts Logo", style: { width: 20, height: 20, filter: 'grayscale(1) brightness(2)' } }),
244
+ react_1.default.createElement("img", { src: "https://raw.githubusercontent.com/mfrazlab/vatts.js/master/docs/public/logo.png", alt: "Vatts Logo", style: { width: 20, height: 20 } }),
239
245
  react_1.default.createElement("span", { style: { fontSize: 13, fontWeight: 600, color: '#fff' } },
240
246
  "Vatts",
241
- react_1.default.createElement("span", { style: { color: "#64748b" } }, ".js"))))));
247
+ react_1.default.createElement("span", { style: { color: theme.cyan } }, ".js"))))));
242
248
  }
@@ -1,19 +1,3 @@
1
- <!--
2
- This file is part of the Vatts.js Project.
3
- Copyright (c) 2026 mfraz
4
-
5
- Licensed under the Apache License, Version 2.0 (the "License");
6
- you may not use this file except in compliance with the License.
7
- You may obtain a copy of the License at
8
-
9
- http://www.apache.org/licenses/LICENSE-2.0
10
-
11
- Unless required by applicable law or agreed to in writing, software
12
- distributed under the License is distributed on an "AS IS" BASIS,
13
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- See the License for the specific language governing permissions and
15
- limitations under the License.
16
- -->
17
1
  <script setup>
18
2
  import { onMounted, ref } from 'vue';
19
3
 
@@ -24,15 +8,18 @@ try {
24
8
  } catch (e) {}
25
9
 
26
10
  // CSS extraído para evitar que o Vue escape caracteres como '>' ou aspas
11
+ // ATUALIZADO: Paleta de cores alterada para Vue.js Green
27
12
  const cssStyles = `
28
13
  :root {
29
14
  --bg-solid: #000000;
30
15
  --card-bg: #0a0a0a;
31
- /* PALETA: Monocromática estilo Next.js */
16
+ /* PALETA: Vue.js Theme */
17
+ --vue-green: #42b883; /* O verde principal do Vue */
18
+ --vue-dark: #35495e; /* O azul escuro secundário do Vue (para substituir cinzas escuros) */
32
19
  --primary: #ffffff;
33
- --primary-glow: rgba(255, 255, 255, 0.1);
34
20
  --text-main: #ffffff;
35
- --text-muted: #64748b;
21
+ /* Mudei o texto mudo de cinza para um tom mais claro do verde */
22
+ --text-muted: #a7c4bc;
36
23
  }
37
24
 
38
25
  body {
@@ -65,8 +52,8 @@ const cssStyles = `
65
52
  width: 100%;
66
53
  max-width: 420px;
67
54
  background: var(--card-bg);
68
- /* Borda sutil em cinza escuro */
69
- box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.1), 0 40px 80px -20px rgba(0, 0, 0, 0.9);
55
+ /* Borda sutil, mudei o brilho para verde */
56
+ box-shadow: 0 0 0 1px rgba(66, 184, 131, 0.1), 0 40px 80px -20px rgba(0, 0, 0, 0.9);
70
57
  border-radius: 20px;
71
58
  overflow: hidden;
72
59
  display: flex;
@@ -78,9 +65,9 @@ const cssStyles = `
78
65
  .neon-line {
79
66
  height: 1px;
80
67
  width: 100%;
81
- /* Linha de luz branca/cinza */
82
- background: linear-gradient(90deg, transparent, #334155, #ffffff, #334155, transparent);
83
- box-shadow: 0 0 15px rgba(255, 255, 255, 0.05);
68
+ /* Linha de luz: Mudei do gradiente cinza/branco para o verde Vue */
69
+ background: linear-gradient(90deg, transparent, var(--vue-dark), var(--vue-green), var(--vue-dark), transparent);
70
+ box-shadow: 0 0 15px rgba(66, 184, 131, 0.2);
84
71
  }
85
72
 
86
73
  .content {
@@ -103,8 +90,8 @@ const cssStyles = `
103
90
  object-fit: contain;
104
91
  position: relative;
105
92
  z-index: 2;
106
- /* Deixa a logo levemente dessaturada para combinar */
107
- filter: grayscale(0.5);
93
+ /* Removi o filtro grayscale para a logo do Vue brilhar na cor original */
94
+ filter: none;
108
95
  }
109
96
 
110
97
  .logo-glow {
@@ -114,9 +101,10 @@ const cssStyles = `
114
101
  transform: translate(-50%, -50%);
115
102
  width: 100%;
116
103
  height: 100%;
117
- background: #ffffff;
104
+ /* Mudei o brilho de fundo de branco para Verde Vue */
105
+ background: var(--vue-green);
118
106
  filter: blur(25px);
119
- opacity: 0.1;
107
+ opacity: 0.2; /* Aumentei um pouco a opacidade para destacar o verde */
120
108
  border-radius: 50%;
121
109
  animation: pulse 2s ease-in-out infinite;
122
110
  }
@@ -126,14 +114,16 @@ const cssStyles = `
126
114
  font-size: 2rem;
127
115
  font-weight: 800;
128
116
  letter-spacing: -0.03em;
129
- background: linear-gradient(180deg, #ffffff 0%, #475569 100%);
117
+ /* Gradiente do texto: De branco para Verde Vue */
118
+ background: linear-gradient(180deg, #ffffff 0%, var(--vue-green) 100%);
130
119
  -webkit-background-clip: text;
131
120
  -webkit-text-fill-color: transparent;
132
121
  }
133
122
 
134
123
  h1 span {
135
- color: #475569;
136
- -webkit-text-fill-color: #475569;
124
+ /* O ".js" agora é verde sólido */
125
+ color: var(--vue-green);
126
+ -webkit-text-fill-color: var(--vue-green);
137
127
  }
138
128
 
139
129
  p {
@@ -145,14 +135,15 @@ const cssStyles = `
145
135
 
146
136
  .terminal-box {
147
137
  width: 100%;
148
- background: rgba(255, 255, 255, 0.02);
149
- border: 1px solid rgba(255, 255, 255, 0.08);
138
+ background: rgba(66, 184, 131, 0.03); /* Fundo sutilmente verde */
139
+ border: 1px solid rgba(66, 184, 131, 0.1); /* Borda verde sutil */
150
140
  border-radius: 12px;
151
141
  padding: 16px;
152
142
  text-align: left;
153
143
  font-family: 'JetBrains Mono', monospace;
154
144
  font-size: 0.75rem;
155
- color: #475569;
145
+ /* Cor do texto base do terminal alterada de cinza para um tom claro */
146
+ color: var(--text-muted);
156
147
  box-sizing: border-box;
157
148
  display: flex;
158
149
  flex-direction: column;
@@ -168,25 +159,31 @@ const cssStyles = `
168
159
  .term-spinner {
169
160
  width: 10px;
170
161
  height: 10px;
171
- border: 2px solid rgba(255, 255, 255, 0.1);
172
- border-top-color: #ffffff;
162
+ border: 2px solid rgba(66, 184, 131, 0.1); /* Borda inativa verde clara */
163
+ border-top-color: var(--vue-green); /* Spinner ativo verde vibrante */
173
164
  border-radius: 50%;
174
165
  animation: spin 0.6s linear infinite;
175
166
  }
176
167
 
177
- .file-name { color: #94a3b8; }
178
- .accent { color: #ffffff; }
168
+ .file-name {
169
+ /* Nomes de arquivo agora num tom azulado/esverdeado claro */
170
+ color: #8fa3b3;
171
+ }
172
+ .accent {
173
+ /* O destaque "src/vatts.ts" agora é Verde Vue */
174
+ color: var(--vue-green);
175
+ }
179
176
 
180
177
  .card-footer {
181
178
  width: 100%;
182
179
  padding: 12px 32px;
183
- background: rgba(255,255,255,0.02);
184
- border-top: 1px solid rgba(255,255,255,0.05);
180
+ background: rgba(66, 184, 131, 0.03); /* Fundo sutil verde */
181
+ border-top: 1px solid rgba(66, 184, 131, 0.05); /* Borda sutil verde */
185
182
  display: flex;
186
183
  justify-content: space-between;
187
184
  align-items: center;
188
185
  font-size: 11px;
189
- color: rgba(255,255,255,0.2);
186
+ color: rgba(255,255,255,0.4);
190
187
  box-sizing: border-box;
191
188
  }
192
189
 
@@ -194,7 +191,8 @@ const cssStyles = `
194
191
  display: flex;
195
192
  align-items: center;
196
193
  gap: 6px;
197
- color: #ffffff;
194
+ /* Texto de status e versão agora em Verde Vue */
195
+ color: var(--vue-green);
198
196
  font-weight: 600;
199
197
  text-transform: uppercase;
200
198
  letter-spacing: 0.05em;
@@ -203,14 +201,15 @@ const cssStyles = `
203
201
  .dot {
204
202
  width: 6px;
205
203
  height: 6px;
206
- background-color: #ffffff;
204
+ /* O ponto de status agora é Verde Vue com brilho verde */
205
+ background-color: var(--vue-green);
207
206
  border-radius: 50%;
208
- box-shadow: 0 0 8px rgba(255, 255, 255, 0.5);
207
+ box-shadow: 0 0 8px var(--vue-green);
209
208
  }
210
209
 
211
210
  @keyframes pulse {
212
- 0%, 100% { opacity: 0.1; transform: translate(-50%, -50%) scale(1); }
213
- 50% { opacity: 0.15; transform: translate(-50%, -50%) scale(1.1); }
211
+ 0%, 100% { opacity: 0.15; transform: translate(-50%, -50%) scale(1); }
212
+ 50% { opacity: 0.25; transform: translate(-50%, -50%) scale(1.1); }
214
213
  }
215
214
 
216
215
  @keyframes spin {
@@ -236,15 +235,10 @@ const clientReloadScript = `
236
235
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
237
236
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700;900&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
238
237
 
239
- <!-- v-html garante que o CSS seja renderizado sem escape (ex: '>' permanece '>') -->
240
238
  <style v-html="cssStyles"></style>
241
239
  </head>
242
240
  <body>
243
241
  <div class="building-screen-body">
244
- <link rel="preconnect" href="https://fonts.googleapis.com" />
245
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
246
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700;900&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
247
-
248
242
  <div class="container">
249
243
  <div class="build-card">
250
244
  <div class="neon-line"></div>
@@ -264,7 +258,7 @@ const clientReloadScript = `
264
258
  <span class="file-name">Compiling <span class="accent">src/vatts.ts</span>...</span>
265
259
  </div>
266
260
  <div class="term-line" style="opacity: 0.5">
267
- <span>✓</span>
261
+ <span style="color: var(--vue-green)">✓</span>
268
262
  <span class="file-name">Optimizing assets</span>
269
263
  </div>
270
264
  </div>
@@ -281,7 +275,6 @@ const clientReloadScript = `
281
275
  </div>
282
276
  </div>
283
277
 
284
- <!-- v-html para o script garante que a arrow function não quebre com '&gt;' -->
285
278
  <script v-html="clientReloadScript"></script>
286
279
  </body>
287
280
  </html>
@@ -32,7 +32,6 @@ const reload = () => {
32
32
 
33
33
  <template>
34
34
  <div class="error-page-wrapper">
35
- <!-- Fonts -->
36
35
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700;900&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
37
36
 
38
37
  <div class="container">
@@ -103,11 +102,13 @@ const reload = () => {
103
102
  box-sizing: border-box;
104
103
  }
105
104
 
106
- /* REMOVIDO :global(body).
107
- Os estilos globais foram movidos para .container para não afetar o resto do site.
108
- */
109
-
105
+ /* Variáveis CSS locais para facilitar manutenção das cores Vue */
110
106
  .container {
107
+ --vue-green: #42b883;
108
+ --vue-dark: #35495e;
109
+ --bg-color: #000000;
110
+ --card-bg: #0a0a0a;
111
+
111
112
  position: fixed;
112
113
  top: 0;
113
114
  left: 0;
@@ -120,8 +121,7 @@ const reload = () => {
120
121
  justify-content: center;
121
122
  width: 100vw;
122
123
  height: 100vh;
123
- /* Estilos que antes estavam no body: */
124
- background: #000000;
124
+ background: var(--bg-color);
125
125
  color: #ffffff;
126
126
  overflow: hidden;
127
127
  margin: 0;
@@ -132,8 +132,9 @@ const reload = () => {
132
132
  width: min(90%, 500px);
133
133
  display: flex;
134
134
  flex-direction: column;
135
- background: #0a0a0a;
136
- box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.1), 0 40px 80px -20px rgba(0, 0, 0, 0.9);
135
+ background: var(--card-bg);
136
+ /* Sombra com leve toque de verde */
137
+ box-shadow: 0 0 0 1px rgba(66, 184, 131, 0.1), 0 40px 80px -20px rgba(0, 0, 0, 0.9);
137
138
  border-radius: 20px;
138
139
  overflow: hidden;
139
140
  position: relative;
@@ -142,8 +143,9 @@ const reload = () => {
142
143
  .neon-line {
143
144
  height: 1px;
144
145
  width: 100%;
145
- background: linear-gradient(90deg, transparent, #334155, #ffffff, #334155, transparent);
146
- box-shadow: 0 0 15px rgba(255, 255, 255, 0.1);
146
+ /* Gradiente Verde Vue */
147
+ background: linear-gradient(90deg, transparent, var(--vue-dark), var(--vue-green), var(--vue-dark), transparent);
148
+ box-shadow: 0 0 15px rgba(66, 184, 131, 0.2);
147
149
  }
148
150
 
149
151
  .content {
@@ -160,26 +162,29 @@ const reload = () => {
160
162
  line-height: 1;
161
163
  letter-spacing: -0.04em;
162
164
  color: #fff;
163
- background: linear-gradient(180deg, #ffffff 0%, #475569 100%);
165
+ /* Gradiente Texto: Branco para Verde */
166
+ background: linear-gradient(180deg, #ffffff 0%, var(--vue-green) 100%);
164
167
  -webkit-background-clip: text;
165
168
  -webkit-text-fill-color: transparent;
166
169
  /* Fallback */
167
- color: #ffffff;
170
+ color: var(--vue-green);
168
171
  margin-bottom: 16px;
169
- filter: drop-shadow(0 0 20px rgba(255, 255, 255, 0.05));
172
+ filter: drop-shadow(0 0 20px rgba(66, 184, 131, 0.1));
170
173
  }
171
174
 
172
175
  .terminal-box {
173
176
  width: 100%;
174
- background: rgba(255, 255, 255, 0.02);
177
+ /* Fundo esverdeado muito sutil */
178
+ background: rgba(66, 184, 131, 0.03);
175
179
  border-radius: 12px;
176
180
  padding: 16px;
177
181
  margin-bottom: 24px;
178
- border: 1px solid rgba(255, 255, 255, 0.08);
182
+ /* Borda verde sutil */
183
+ border: 1px solid rgba(66, 184, 131, 0.1);
179
184
  font-family: "JetBrains Mono", monospace;
180
185
  font-size: 12px;
181
186
  text-align: left;
182
- color: #94a3b8;
187
+ color: #a7c4bc; /* Texto terminal mais claro */
183
188
  box-sizing: border-box;
184
189
  }
185
190
 
@@ -198,7 +203,7 @@ const reload = () => {
198
203
  }
199
204
 
200
205
  .method {
201
- color: #64748b;
206
+ color: var(--vue-green); /* GET em verde */
202
207
  margin-right: 4px;
203
208
  }
204
209
 
@@ -208,7 +213,7 @@ const reload = () => {
208
213
 
209
214
  .error-msg {
210
215
  margin-top: 4px;
211
- color: #475569;
216
+ color: #5f7e76; /* Verde acinzentado escuro */
212
217
  }
213
218
 
214
219
  .actions {
@@ -236,31 +241,32 @@ const reload = () => {
236
241
  }
237
242
 
238
243
  .btn-primary {
239
- background: #f8fafc;
244
+ /* Botão principal Verde Vue */
245
+ background: var(--vue-green);
240
246
  color: #000000;
241
247
  }
242
248
 
243
249
  .btn-primary:hover {
244
250
  background: #ffffff;
245
- box-shadow: 0 0 20px rgba(255, 255, 255, 0.2);
251
+ box-shadow: 0 0 20px rgba(66, 184, 131, 0.4);
246
252
  }
247
253
 
248
254
  .btn-secondary {
249
255
  background: transparent;
250
256
  color: rgba(255, 255, 255, 0.6);
251
- border: 1px solid rgba(255, 255, 255, 0.1);
257
+ border: 1px solid rgba(66, 184, 131, 0.2);
252
258
  }
253
259
 
254
260
  .btn-secondary:hover {
255
- background: rgba(255, 255, 255, 0.1);
261
+ background: rgba(66, 184, 131, 0.1);
256
262
  color: #fff;
257
- border-color: rgba(255, 255, 255, 0.3);
263
+ border-color: var(--vue-green);
258
264
  }
259
265
 
260
266
  .footer {
261
267
  padding: 12px 32px;
262
- background: rgba(255, 255, 255, 0.02);
263
- border-top: 1px solid rgba(255, 255, 255, 0.05);
268
+ background: rgba(66, 184, 131, 0.02);
269
+ border-top: 1px solid rgba(66, 184, 131, 0.05);
264
270
  display: flex;
265
271
  justify-content: space-between;
266
272
  align-items: center;
@@ -279,11 +285,13 @@ const reload = () => {
279
285
  width: 6px;
280
286
  height: 6px;
281
287
  border-radius: 50%;
282
- background: #475569;
288
+ /* Ponto de status Verde */
289
+ background: var(--vue-green);
290
+ box-shadow: 0 0 6px var(--vue-green);
283
291
  }
284
292
 
285
293
  .status-text {
286
- color: #94a3b8;
294
+ color: var(--vue-green);
287
295
  }
288
296
 
289
297
  .brand-link {
@@ -304,7 +312,8 @@ const reload = () => {
304
312
  .brand-logo {
305
313
  width: 20px;
306
314
  height: 20px;
307
- filter: grayscale(1) brightness(2);
315
+ /* Removi o grayscale para a logo brilhar normal, se preferir monocromático com verde, pode ajustar */
316
+ filter: none;
308
317
  }
309
318
 
310
319
  .brand-text {
@@ -314,6 +323,7 @@ const reload = () => {
314
323
  }
315
324
 
316
325
  .brand-highlight {
317
- color: #64748b;
326
+ /* .js em verde */
327
+ color: var(--vue-green);
318
328
  }
319
329
  </style>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vatts",
3
- "version": "1.2.2",
3
+ "version": "1.2.3",
4
4
  "description": "Vatts.js is a high-level framework for building web applications with ease and speed. It provides a robust set of tools and features to streamline development and enhance productivity.",
5
5
  "types": "dist/index.d.ts",
6
6
  "author": "mfraz",