vatts 1.2.1 → 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.
Files changed (42) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +11 -7
  3. package/dist/api/console.js +1 -1
  4. package/dist/api/framework.js +16 -0
  5. package/dist/bin/vatts.js +1 -1
  6. package/dist/builder.d.ts +0 -12
  7. package/dist/builder.js +79 -265
  8. package/dist/client/clientRouter.js +1 -1
  9. package/dist/client/rpc.js +1 -1
  10. package/dist/env/env.js +16 -0
  11. package/dist/global/global.d.ts +1 -1
  12. package/dist/helpers.js +1 -1
  13. package/dist/hotReload.js +3 -2
  14. package/dist/index.js +1 -1
  15. package/dist/loaders.js +1 -1
  16. package/dist/react/BuildingPage.js +52 -31
  17. package/dist/react/DefaultNotFound.js +39 -33
  18. package/dist/react/DevIndicator.js +16 -0
  19. package/dist/react/ErrorModal.js +1 -1
  20. package/dist/react/Link.js +1 -1
  21. package/dist/react/client.js +1 -1
  22. package/dist/react/entry.client.js +1 -1
  23. package/dist/react/image/Image.js +16 -0
  24. package/dist/react/react.build.d.ts +24 -0
  25. package/dist/react/react.build.js +95 -0
  26. package/dist/react/renderer-react.js +1 -1
  27. package/dist/router.js +1 -1
  28. package/dist/rpc/server.js +1 -1
  29. package/dist/rpc/types.js +1 -1
  30. package/dist/tsconfigPaths.js +1 -1
  31. package/dist/vue/App.vue +56 -44
  32. package/dist/vue/BuildingPage.vue +46 -37
  33. package/dist/vue/DefaultNotFound.vue +60 -38
  34. package/dist/vue/DevIndicator.vue +16 -0
  35. package/dist/vue/ErrorModal.vue +16 -0
  36. package/dist/vue/Link.vue +16 -0
  37. package/dist/vue/client.js +1 -1
  38. package/dist/vue/entry.client.js +13 -2
  39. package/dist/vue/image/Image.vue +1 -1
  40. package/dist/vue/vue.build.d.ts +24 -0
  41. package/dist/vue/vue.build.js +160 -0
  42. package/package.json +1 -1
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.render = render;
7
7
  /*
8
8
  * This file is part of the Vatts.js Project.
9
- * Copyright (c) 2026 itsmuzin
9
+ * Copyright (c) 2026 mfraz
10
10
  *
11
11
  * Licensed under the Apache License, Version 2.0 (the "License");
12
12
  * you may not use this file except in compliance with the License.
package/dist/router.js CHANGED
@@ -19,7 +19,7 @@ exports.findMatchingWebSocketRoute = findMatchingWebSocketRoute;
19
19
  exports.setupWebSocketUpgrade = setupWebSocketUpgrade;
20
20
  /*
21
21
  * This file is part of the Vatts.js Project.
22
- * Copyright (c) 2026 itsmuzin
22
+ * Copyright (c) 2026 mfraz
23
23
  *
24
24
  * Licensed under the Apache License, Version 2.0 (the "License");
25
25
  * you may not use this file except in compliance with the License.
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /*
3
3
  * This file is part of the Vatts.js Project.
4
- * Copyright (c) 2026 itsmuzin
4
+ * Copyright (c) 2026 mfraz
5
5
  *
6
6
  * Licensed under the Apache License, Version 2.0 (the "License");
7
7
  * you may not use this file except in compliance with the License.
package/dist/rpc/types.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /*
3
3
  * This file is part of the Vatts.js Project.
4
- * Copyright (c) 2026 itsmuzin
4
+ * Copyright (c) 2026 mfraz
5
5
  *
6
6
  * Licensed under the Apache License, Version 2.0 (the "License");
7
7
  * you may not use this file except in compliance with the License.
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /*
3
3
  * This file is part of the Vatts.js Project.
4
- * Copyright (c) 2026 itsmuzin
4
+ * Copyright (c) 2026 mfraz
5
5
  *
6
6
  * Licensed under the Apache License, Version 2.0 (the "License");
7
7
  * you may not use this file except in compliance with the License.
package/dist/vue/App.vue CHANGED
@@ -1,27 +1,47 @@
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
+ -->
1
17
  <template>
2
- <div>
3
- <!-- Renderiza o Layout se existir, envolvendo o conteúdo -->
4
- <component :is="resolvedLayout" v-if="resolvedLayout">
5
- <component :is="resolvedContent" v-bind="contentProps" :key="`page-${hmrTimestamp}`" />
6
- </component>
7
-
8
- <!-- Se não tiver layout, renderiza o conteúdo direto -->
9
- <component v-else :is="resolvedContent" v-bind="contentProps" :key="`page-${hmrTimestamp}`" />
10
-
11
- <!-- Dev Tools / Indicadores -->
12
- <DevIndicator
13
- v-if="isDev"
14
- :has-build-error="!!buildError"
15
- @click-build-error="isErrorOpen = true"
18
+ <component :is="resolvedLayout" v-if="resolvedLayout">
19
+ <component
20
+ :is="resolvedContent"
21
+ v-bind="contentProps"
22
+ :key="`page-${hmrTimestamp}-${currentPathKey}`"
16
23
  />
17
-
18
- <ErrorModal
19
- :error="buildError"
20
- :is-open="isErrorOpen"
21
- @close="isErrorOpen = false"
22
- @copy="copyBuildError"
23
- />
24
- </div>
24
+ </component>
25
+
26
+ <component
27
+ v-else
28
+ :is="resolvedContent"
29
+ v-bind="contentProps"
30
+ :key="`page-${hmrTimestamp}-${currentPathKey}`"
31
+ />
32
+
33
+ <DevIndicator
34
+ v-if="isDev"
35
+ :has-build-error="!!buildError"
36
+ @click-build-error="isErrorOpen = true"
37
+ />
38
+
39
+ <ErrorModal
40
+ :error="buildError"
41
+ :is-open="isErrorOpen"
42
+ @close="isErrorOpen = false"
43
+ @copy="copyBuildError"
44
+ />
25
45
  </template>
26
46
 
27
47
  <script setup>
@@ -35,13 +55,14 @@ const props = defineProps({
35
55
  componentMap: Object,
36
56
  routes: Array,
37
57
  initialComponentPath: String,
38
- initialParams: null, // Aceita qualquer tipo
39
- layoutComponent: null // Aceita componente ou null
58
+ initialParams: null,
59
+ layoutComponent: null
40
60
  });
41
61
 
42
62
  // --- Estado ---
43
63
  const hmrTimestamp = ref(Date.now());
44
- // Removemos as tipagens e asserções "as any" diretas onde não são necessárias em JS
64
+ const currentPathKey = ref(window.location.pathname); // Mantendo a correção da rota anterior
65
+
45
66
  const buildError = ref(window.__VATTS_BUILD_ERROR__ || null);
46
67
  const isErrorOpen = ref(!!window.__VATTS_BUILD_ERROR__);
47
68
  const isDev = process.env.NODE_ENV !== 'production';
@@ -96,10 +117,14 @@ const params = ref({});
96
117
 
97
118
  const updateRoute = () => {
98
119
  const currentPath = window.location.pathname.replace("index.html", '');
99
- const match = findRouteForPath(currentPath);
100
120
 
121
+ // Atualiza a chave para garantir re-render na mesma rota com params diferentes
122
+ currentPathKey.value = currentPath;
123
+
124
+ const match = findRouteForPath(currentPath);
101
125
  if (match) {
102
126
  CurrentPageComponent.value = props.componentMap[match.componentPath];
127
+ console.log(props.componentMap[match.componentPath] || 'null')
103
128
  params.value = match.params;
104
129
 
105
130
  if (match.metadata?.title != null) {
@@ -111,14 +136,14 @@ const updateRoute = () => {
111
136
  }
112
137
  };
113
138
 
114
- // --- Computed para resolver o conteúdo final (404 vs Página) ---
139
+ // --- Computed ---
115
140
  const resolvedContent = computed(() => {
116
141
  if (!CurrentPageComponent.value || props.initialComponentPath === '__404__') {
117
142
  const NotFoundComponent = window.__VATTS_NOT_FOUND__;
118
143
  if (NotFoundComponent) return NotFoundComponent;
119
144
 
120
145
  const DefaultNotFound = window.__VATTS_DEFAULT_NOT_FOUND__;
121
- return DefaultNotFound || 'div'; // Fallback seguro
146
+ return DefaultNotFound || 'div';
122
147
  }
123
148
  return CurrentPageComponent.value;
124
149
  });
@@ -132,43 +157,30 @@ const resolvedLayout = computed(() => {
132
157
  return props.layoutComponent || null;
133
158
  });
134
159
 
135
- // --- Lifecycle & Listeners ---
160
+ // --- Lifecycle ---
136
161
  onMounted(() => {
137
- // Inicializa rota
138
162
  updateRoute();
139
163
 
140
- // Listeners de Build
141
164
  window.addEventListener('vatts:build-error', handleBuildError);
142
165
  window.addEventListener('vatts:build-ok', handleBuildOk);
143
-
144
- // Listeners de Rota
145
166
  window.addEventListener('popstate', updateRoute);
167
+
146
168
  const unsubscribeRouter = router.subscribe(updateRoute);
147
169
 
148
- // HMR Listener
149
170
  window.__HWEB_HMR__ = true;
150
171
  const handleHMRUpdate = (event) => {
151
172
  const { file, timestamp } = event.detail;
152
- const fileName = file ? file.split('/').pop()?.split('\\').pop() : 'unknown';
153
- console.log('🔥 HMR: Component Update Triggered', fileName);
154
-
155
173
  try {
156
174
  hmrTimestamp.value = timestamp;
157
175
  window.__HMR_SUCCESS__ = true;
158
- setTimeout(() => {
159
- window.__HMR_SUCCESS__ = false;
160
- }, 3000);
161
-
162
- // Força update da rota caso o componente tenha mudado
176
+ setTimeout(() => { window.__HMR_SUCCESS__ = false; }, 3000);
163
177
  updateRoute();
164
178
  } catch (error) {
165
179
  console.error('❌ HMR Error:', error);
166
- window.__HMR_SUCCESS__ = false;
167
180
  }
168
181
  };
169
182
  window.addEventListener('hmr:component-update', handleHMRUpdate);
170
183
 
171
- // Cleanup
172
184
  onUnmounted(() => {
173
185
  window.removeEventListener('vatts:build-error', handleBuildError);
174
186
  window.removeEventListener('vatts:build-ok', handleBuildOk);
@@ -8,15 +8,18 @@ try {
8
8
  } catch (e) {}
9
9
 
10
10
  // CSS extraído para evitar que o Vue escape caracteres como '>' ou aspas
11
+ // ATUALIZADO: Paleta de cores alterada para Vue.js Green
11
12
  const cssStyles = `
12
13
  :root {
13
14
  --bg-solid: #000000;
14
15
  --card-bg: #0a0a0a;
15
- /* 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) */
16
19
  --primary: #ffffff;
17
- --primary-glow: rgba(255, 255, 255, 0.1);
18
20
  --text-main: #ffffff;
19
- --text-muted: #64748b;
21
+ /* Mudei o texto mudo de cinza para um tom mais claro do verde */
22
+ --text-muted: #a7c4bc;
20
23
  }
21
24
 
22
25
  body {
@@ -49,8 +52,8 @@ const cssStyles = `
49
52
  width: 100%;
50
53
  max-width: 420px;
51
54
  background: var(--card-bg);
52
- /* Borda sutil em cinza escuro */
53
- 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);
54
57
  border-radius: 20px;
55
58
  overflow: hidden;
56
59
  display: flex;
@@ -62,9 +65,9 @@ const cssStyles = `
62
65
  .neon-line {
63
66
  height: 1px;
64
67
  width: 100%;
65
- /* Linha de luz branca/cinza */
66
- background: linear-gradient(90deg, transparent, #334155, #ffffff, #334155, transparent);
67
- 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);
68
71
  }
69
72
 
70
73
  .content {
@@ -87,8 +90,8 @@ const cssStyles = `
87
90
  object-fit: contain;
88
91
  position: relative;
89
92
  z-index: 2;
90
- /* Deixa a logo levemente dessaturada para combinar */
91
- filter: grayscale(0.5);
93
+ /* Removi o filtro grayscale para a logo do Vue brilhar na cor original */
94
+ filter: none;
92
95
  }
93
96
 
94
97
  .logo-glow {
@@ -98,9 +101,10 @@ const cssStyles = `
98
101
  transform: translate(-50%, -50%);
99
102
  width: 100%;
100
103
  height: 100%;
101
- background: #ffffff;
104
+ /* Mudei o brilho de fundo de branco para Verde Vue */
105
+ background: var(--vue-green);
102
106
  filter: blur(25px);
103
- opacity: 0.1;
107
+ opacity: 0.2; /* Aumentei um pouco a opacidade para destacar o verde */
104
108
  border-radius: 50%;
105
109
  animation: pulse 2s ease-in-out infinite;
106
110
  }
@@ -110,14 +114,16 @@ const cssStyles = `
110
114
  font-size: 2rem;
111
115
  font-weight: 800;
112
116
  letter-spacing: -0.03em;
113
- 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%);
114
119
  -webkit-background-clip: text;
115
120
  -webkit-text-fill-color: transparent;
116
121
  }
117
122
 
118
123
  h1 span {
119
- color: #475569;
120
- -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);
121
127
  }
122
128
 
123
129
  p {
@@ -129,14 +135,15 @@ const cssStyles = `
129
135
 
130
136
  .terminal-box {
131
137
  width: 100%;
132
- background: rgba(255, 255, 255, 0.02);
133
- 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 */
134
140
  border-radius: 12px;
135
141
  padding: 16px;
136
142
  text-align: left;
137
143
  font-family: 'JetBrains Mono', monospace;
138
144
  font-size: 0.75rem;
139
- color: #475569;
145
+ /* Cor do texto base do terminal alterada de cinza para um tom claro */
146
+ color: var(--text-muted);
140
147
  box-sizing: border-box;
141
148
  display: flex;
142
149
  flex-direction: column;
@@ -152,25 +159,31 @@ const cssStyles = `
152
159
  .term-spinner {
153
160
  width: 10px;
154
161
  height: 10px;
155
- border: 2px solid rgba(255, 255, 255, 0.1);
156
- 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 */
157
164
  border-radius: 50%;
158
165
  animation: spin 0.6s linear infinite;
159
166
  }
160
167
 
161
- .file-name { color: #94a3b8; }
162
- .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
+ }
163
176
 
164
177
  .card-footer {
165
178
  width: 100%;
166
179
  padding: 12px 32px;
167
- background: rgba(255,255,255,0.02);
168
- 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 */
169
182
  display: flex;
170
183
  justify-content: space-between;
171
184
  align-items: center;
172
185
  font-size: 11px;
173
- color: rgba(255,255,255,0.2);
186
+ color: rgba(255,255,255,0.4);
174
187
  box-sizing: border-box;
175
188
  }
176
189
 
@@ -178,7 +191,8 @@ const cssStyles = `
178
191
  display: flex;
179
192
  align-items: center;
180
193
  gap: 6px;
181
- color: #ffffff;
194
+ /* Texto de status e versão agora em Verde Vue */
195
+ color: var(--vue-green);
182
196
  font-weight: 600;
183
197
  text-transform: uppercase;
184
198
  letter-spacing: 0.05em;
@@ -187,14 +201,15 @@ const cssStyles = `
187
201
  .dot {
188
202
  width: 6px;
189
203
  height: 6px;
190
- background-color: #ffffff;
204
+ /* O ponto de status agora é Verde Vue com brilho verde */
205
+ background-color: var(--vue-green);
191
206
  border-radius: 50%;
192
- box-shadow: 0 0 8px rgba(255, 255, 255, 0.5);
207
+ box-shadow: 0 0 8px var(--vue-green);
193
208
  }
194
209
 
195
210
  @keyframes pulse {
196
- 0%, 100% { opacity: 0.1; transform: translate(-50%, -50%) scale(1); }
197
- 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); }
198
213
  }
199
214
 
200
215
  @keyframes spin {
@@ -220,15 +235,10 @@ const clientReloadScript = `
220
235
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
221
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" />
222
237
 
223
- <!-- v-html garante que o CSS seja renderizado sem escape (ex: '>' permanece '>') -->
224
238
  <style v-html="cssStyles"></style>
225
239
  </head>
226
240
  <body>
227
241
  <div class="building-screen-body">
228
- <link rel="preconnect" href="https://fonts.googleapis.com" />
229
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
230
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700;900&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
231
-
232
242
  <div class="container">
233
243
  <div class="build-card">
234
244
  <div class="neon-line"></div>
@@ -248,7 +258,7 @@ const clientReloadScript = `
248
258
  <span class="file-name">Compiling <span class="accent">src/vatts.ts</span>...</span>
249
259
  </div>
250
260
  <div class="term-line" style="opacity: 0.5">
251
- <span>✓</span>
261
+ <span style="color: var(--vue-green)">✓</span>
252
262
  <span class="file-name">Optimizing assets</span>
253
263
  </div>
254
264
  </div>
@@ -265,7 +275,6 @@ const clientReloadScript = `
265
275
  </div>
266
276
  </div>
267
277
 
268
- <!-- v-html para o script garante que a arrow function não quebre com '&gt;' -->
269
278
  <script v-html="clientReloadScript"></script>
270
279
  </body>
271
280
  </html>
@@ -1,3 +1,19 @@
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
+ -->
1
17
  <script setup>
2
18
  import { ref, onMounted } from 'vue';
3
19
 
@@ -16,7 +32,6 @@ const reload = () => {
16
32
 
17
33
  <template>
18
34
  <div class="error-page-wrapper">
19
- <!-- Fonts -->
20
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" />
21
36
 
22
37
  <div class="container">
@@ -87,20 +102,13 @@ const reload = () => {
87
102
  box-sizing: border-box;
88
103
  }
89
104
 
90
- /* Em componentes Vue, estilos 'scoped' aplicam-se apenas a este componente.
91
- Para garantir o fundo preto total, usamos :global(body) ou aplicamos ao container fixo.
92
- */
93
- :global(body) {
94
- margin: 0;
95
- padding: 0;
96
- background-color: #000000;
97
- color: #ffffff;
98
- overflow: hidden;
99
- height: 100vh;
100
- width: 100vw;
101
- }
102
-
105
+ /* Variáveis CSS locais para facilitar manutenção das cores Vue */
103
106
  .container {
107
+ --vue-green: #42b883;
108
+ --vue-dark: #35495e;
109
+ --bg-color: #000000;
110
+ --card-bg: #0a0a0a;
111
+
104
112
  position: fixed;
105
113
  top: 0;
106
114
  left: 0;
@@ -113,15 +121,20 @@ const reload = () => {
113
121
  justify-content: center;
114
122
  width: 100vw;
115
123
  height: 100vh;
116
- background: #000000;
124
+ background: var(--bg-color);
125
+ color: #ffffff;
126
+ overflow: hidden;
127
+ margin: 0;
128
+ padding: 0;
117
129
  }
118
130
 
119
131
  .card {
120
132
  width: min(90%, 500px);
121
133
  display: flex;
122
134
  flex-direction: column;
123
- background: #0a0a0a;
124
- 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);
125
138
  border-radius: 20px;
126
139
  overflow: hidden;
127
140
  position: relative;
@@ -130,8 +143,9 @@ const reload = () => {
130
143
  .neon-line {
131
144
  height: 1px;
132
145
  width: 100%;
133
- background: linear-gradient(90deg, transparent, #334155, #ffffff, #334155, transparent);
134
- 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);
135
149
  }
136
150
 
137
151
  .content {
@@ -148,26 +162,29 @@ const reload = () => {
148
162
  line-height: 1;
149
163
  letter-spacing: -0.04em;
150
164
  color: #fff;
151
- 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%);
152
167
  -webkit-background-clip: text;
153
168
  -webkit-text-fill-color: transparent;
154
169
  /* Fallback */
155
- color: #ffffff;
170
+ color: var(--vue-green);
156
171
  margin-bottom: 16px;
157
- 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));
158
173
  }
159
174
 
160
175
  .terminal-box {
161
176
  width: 100%;
162
- background: rgba(255, 255, 255, 0.02);
177
+ /* Fundo esverdeado muito sutil */
178
+ background: rgba(66, 184, 131, 0.03);
163
179
  border-radius: 12px;
164
180
  padding: 16px;
165
181
  margin-bottom: 24px;
166
- border: 1px solid rgba(255, 255, 255, 0.08);
182
+ /* Borda verde sutil */
183
+ border: 1px solid rgba(66, 184, 131, 0.1);
167
184
  font-family: "JetBrains Mono", monospace;
168
185
  font-size: 12px;
169
186
  text-align: left;
170
- color: #94a3b8;
187
+ color: #a7c4bc; /* Texto terminal mais claro */
171
188
  box-sizing: border-box;
172
189
  }
173
190
 
@@ -186,7 +203,7 @@ const reload = () => {
186
203
  }
187
204
 
188
205
  .method {
189
- color: #64748b;
206
+ color: var(--vue-green); /* GET em verde */
190
207
  margin-right: 4px;
191
208
  }
192
209
 
@@ -196,7 +213,7 @@ const reload = () => {
196
213
 
197
214
  .error-msg {
198
215
  margin-top: 4px;
199
- color: #475569;
216
+ color: #5f7e76; /* Verde acinzentado escuro */
200
217
  }
201
218
 
202
219
  .actions {
@@ -224,31 +241,32 @@ const reload = () => {
224
241
  }
225
242
 
226
243
  .btn-primary {
227
- background: #f8fafc;
244
+ /* Botão principal Verde Vue */
245
+ background: var(--vue-green);
228
246
  color: #000000;
229
247
  }
230
248
 
231
249
  .btn-primary:hover {
232
250
  background: #ffffff;
233
- box-shadow: 0 0 20px rgba(255, 255, 255, 0.2);
251
+ box-shadow: 0 0 20px rgba(66, 184, 131, 0.4);
234
252
  }
235
253
 
236
254
  .btn-secondary {
237
255
  background: transparent;
238
256
  color: rgba(255, 255, 255, 0.6);
239
- border: 1px solid rgba(255, 255, 255, 0.1);
257
+ border: 1px solid rgba(66, 184, 131, 0.2);
240
258
  }
241
259
 
242
260
  .btn-secondary:hover {
243
- background: rgba(255, 255, 255, 0.1);
261
+ background: rgba(66, 184, 131, 0.1);
244
262
  color: #fff;
245
- border-color: rgba(255, 255, 255, 0.3);
263
+ border-color: var(--vue-green);
246
264
  }
247
265
 
248
266
  .footer {
249
267
  padding: 12px 32px;
250
- background: rgba(255, 255, 255, 0.02);
251
- 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);
252
270
  display: flex;
253
271
  justify-content: space-between;
254
272
  align-items: center;
@@ -267,11 +285,13 @@ const reload = () => {
267
285
  width: 6px;
268
286
  height: 6px;
269
287
  border-radius: 50%;
270
- background: #475569;
288
+ /* Ponto de status Verde */
289
+ background: var(--vue-green);
290
+ box-shadow: 0 0 6px var(--vue-green);
271
291
  }
272
292
 
273
293
  .status-text {
274
- color: #94a3b8;
294
+ color: var(--vue-green);
275
295
  }
276
296
 
277
297
  .brand-link {
@@ -292,7 +312,8 @@ const reload = () => {
292
312
  .brand-logo {
293
313
  width: 20px;
294
314
  height: 20px;
295
- 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;
296
317
  }
297
318
 
298
319
  .brand-text {
@@ -302,6 +323,7 @@ const reload = () => {
302
323
  }
303
324
 
304
325
  .brand-highlight {
305
- color: #64748b;
326
+ /* .js em verde */
327
+ color: var(--vue-green);
306
328
  }
307
329
  </style>
@@ -1,3 +1,19 @@
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
+ -->
1
17
  <script setup>
2
18
  import { ref, computed, onMounted, onUnmounted } from 'vue';
3
19
 
@@ -1,3 +1,19 @@
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
+ -->
1
17
  <template>
2
18
  <Teleport to="body">
3
19
  <!-- Overlay -->