vatts 2.2.5 → 2.3.0-canary
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/builder.js +54 -17
- package/dist/frameworks/FrontCore.d.ts +34 -0
- package/dist/frameworks/FrontCore.js +128 -0
- package/dist/{vue → frameworks/builds}/vue.build.js +1 -1
- package/dist/frameworks/react/client.d.ts +8 -0
- package/dist/{react → frameworks/react}/client.js +14 -14
- package/dist/{react → frameworks/react/components}/Link.js +2 -2
- package/dist/frameworks/react/entry.client.d.ts +14 -0
- package/dist/frameworks/react/entry.client.js +211 -0
- package/dist/frameworks/react/react-elements.d.ts +10 -0
- package/dist/{react → frameworks/renderers}/renderer-react.d.ts +2 -2
- package/dist/{react → frameworks/renderers}/renderer-react.js +34 -68
- package/dist/{vue → frameworks/renderers}/renderer.vue.d.ts +2 -2
- package/dist/frameworks/renderers/renderer.vue.js +193 -0
- package/dist/frameworks/themes/BuildingPage.d.ts +1 -0
- package/dist/frameworks/themes/BuildingPage.js +312 -0
- package/dist/frameworks/themes/DefaultNotFound.d.ts +1 -0
- package/dist/frameworks/themes/DefaultNotFound.js +330 -0
- package/dist/frameworks/themes/ErrorModal.d.ts +1 -0
- package/dist/frameworks/themes/ErrorModal.js +345 -0
- package/dist/frameworks/themes/ServerError.d.ts +1 -0
- package/dist/frameworks/themes/ServerError.js +401 -0
- package/dist/frameworks/themes/VattsDevBadge.d.ts +1 -0
- package/dist/frameworks/themes/VattsDevBadge.js +232 -0
- package/dist/frameworks/vue/App.vue +149 -0
- package/dist/frameworks/vue/client.d.ts +9 -0
- package/dist/{vue → frameworks/vue}/client.js +13 -11
- package/dist/{vue → frameworks/vue/components}/Link.vue +1 -1
- package/dist/frameworks/vue/entry.client.js +75 -0
- package/dist/global/global.d.ts +1 -2
- package/dist/index.js +12 -1
- package/dist/renderer.js +2 -2
- package/package.json +10 -26
- package/dist/react/BuildingPage.d.ts +0 -2
- package/dist/react/BuildingPage.js +0 -270
- package/dist/react/DefaultNotFound.d.ts +0 -2
- package/dist/react/DefaultNotFound.js +0 -248
- package/dist/react/DevIndicator.d.ts +0 -5
- package/dist/react/DevIndicator.js +0 -203
- package/dist/react/ErrorModal.d.ts +0 -20
- package/dist/react/ErrorModal.js +0 -266
- package/dist/react/client.d.ts +0 -8
- package/dist/react/entry.client.d.ts +0 -6
- package/dist/react/entry.client.js +0 -325
- package/dist/react/server-error.d.ts +0 -8
- package/dist/react/server-error.js +0 -346
- package/dist/vue/App.vue +0 -199
- package/dist/vue/BuildingPage.vue +0 -281
- package/dist/vue/DefaultNotFound.vue +0 -329
- package/dist/vue/DevIndicator.vue +0 -226
- package/dist/vue/ErrorModal.vue +0 -317
- package/dist/vue/client.d.ts +0 -9
- package/dist/vue/entry.client.js +0 -110
- package/dist/vue/renderer.vue.js +0 -387
- package/dist/vue/server-error.vue +0 -351
- /package/dist/{react → frameworks/builds}/react.build.d.ts +0 -0
- /package/dist/{react → frameworks/builds}/react.build.js +0 -0
- /package/dist/{vue → frameworks/builds}/vue.build.d.ts +0 -0
- /package/dist/{react → frameworks/react/components}/Link.d.ts +0 -0
- /package/dist/{react → frameworks/react/components}/image/Image.d.ts +0 -0
- /package/dist/{react → frameworks/react/components}/image/Image.js +0 -0
- /package/dist/{vue → frameworks/vue/components}/image/Image.vue +0 -0
- /package/dist/{vue → frameworks/vue}/entry.client.d.ts +0 -0
|
@@ -1,329 +0,0 @@
|
|
|
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
|
-
<script setup>
|
|
18
|
-
import { ref, onMounted } from 'vue';
|
|
19
|
-
|
|
20
|
-
const path = ref('/');
|
|
21
|
-
|
|
22
|
-
onMounted(() => {
|
|
23
|
-
if (typeof window !== 'undefined') {
|
|
24
|
-
path.value = window.location.pathname;
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
const reload = () => {
|
|
29
|
-
window.location.reload();
|
|
30
|
-
};
|
|
31
|
-
</script>
|
|
32
|
-
|
|
33
|
-
<template>
|
|
34
|
-
<div class="error-page-wrapper">
|
|
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" />
|
|
36
|
-
|
|
37
|
-
<div class="container">
|
|
38
|
-
<div class="card">
|
|
39
|
-
<div class="neon-line"></div>
|
|
40
|
-
|
|
41
|
-
<div class="content">
|
|
42
|
-
<div class="code">404</div>
|
|
43
|
-
|
|
44
|
-
<div class="terminal-box">
|
|
45
|
-
<div class="terminal-dots">
|
|
46
|
-
<div class="dot"></div>
|
|
47
|
-
<div class="dot"></div>
|
|
48
|
-
<div class="dot"></div>
|
|
49
|
-
</div>
|
|
50
|
-
<div>
|
|
51
|
-
<span class="method">GET</span>
|
|
52
|
-
<span class="path">{{ path }}</span>
|
|
53
|
-
</div>
|
|
54
|
-
<div class="error-msg">
|
|
55
|
-
<span>Error: Route not found</span>
|
|
56
|
-
</div>
|
|
57
|
-
</div>
|
|
58
|
-
|
|
59
|
-
<div class="actions">
|
|
60
|
-
<a href="/" class="btn btn-primary">
|
|
61
|
-
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
62
|
-
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
|
|
63
|
-
<polyline points="9 22 9 12 15 12 15 22" />
|
|
64
|
-
</svg>
|
|
65
|
-
Back Home
|
|
66
|
-
</a>
|
|
67
|
-
<button @click="reload" class="btn btn-secondary">
|
|
68
|
-
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
69
|
-
<path d="M21 2v6h-6"></path>
|
|
70
|
-
<path d="M3 12a9 9 0 0 1 15-6.7L21 8"></path>
|
|
71
|
-
<path d="M3 22v-6h6"></path>
|
|
72
|
-
<path d="M21 12a9 9 0 0 1-15 6.7L3 16"></path>
|
|
73
|
-
</svg>
|
|
74
|
-
Retry
|
|
75
|
-
</button>
|
|
76
|
-
</div>
|
|
77
|
-
</div>
|
|
78
|
-
|
|
79
|
-
<div class="footer">
|
|
80
|
-
<span>Vatts Server</span>
|
|
81
|
-
<div class="status">
|
|
82
|
-
<div class="status-dot"></div>
|
|
83
|
-
<span class="status-text">Not Found</span>
|
|
84
|
-
</div>
|
|
85
|
-
</div>
|
|
86
|
-
</div>
|
|
87
|
-
|
|
88
|
-
<a href="https://npmjs.com/package/vatts" target="_blank" rel="noopener noreferrer" class="brand-link">
|
|
89
|
-
<img src="https://raw.githubusercontent.com/mfrazlab/vatts-docs/master/public/logo.png" alt="Vatts Logo" class="brand-logo" />
|
|
90
|
-
<span class="brand-text">
|
|
91
|
-
Vatts<span class="brand-highlight">.js</span>
|
|
92
|
-
</span>
|
|
93
|
-
</a>
|
|
94
|
-
</div>
|
|
95
|
-
</div>
|
|
96
|
-
</template>
|
|
97
|
-
|
|
98
|
-
<style scoped>
|
|
99
|
-
/* Reset global local e variáveis */
|
|
100
|
-
.error-page-wrapper {
|
|
101
|
-
font-family: 'Inter', system-ui, sans-serif;
|
|
102
|
-
box-sizing: border-box;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/* Variáveis CSS locais para facilitar manutenção das cores Vue */
|
|
106
|
-
.container {
|
|
107
|
-
--vue-green: #42b883;
|
|
108
|
-
--vue-dark: #35495e;
|
|
109
|
-
--bg-color: #000000;
|
|
110
|
-
--card-bg: #0a0a0a;
|
|
111
|
-
|
|
112
|
-
position: fixed;
|
|
113
|
-
top: 0;
|
|
114
|
-
left: 0;
|
|
115
|
-
right: 0;
|
|
116
|
-
bottom: 0;
|
|
117
|
-
z-index: 9999;
|
|
118
|
-
display: flex;
|
|
119
|
-
flex-direction: column;
|
|
120
|
-
align-items: center;
|
|
121
|
-
justify-content: center;
|
|
122
|
-
width: 100vw;
|
|
123
|
-
height: 100vh;
|
|
124
|
-
background: var(--bg-color);
|
|
125
|
-
color: #ffffff;
|
|
126
|
-
overflow: hidden;
|
|
127
|
-
margin: 0;
|
|
128
|
-
padding: 0;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
.card {
|
|
132
|
-
width: min(90%, 500px);
|
|
133
|
-
display: flex;
|
|
134
|
-
flex-direction: column;
|
|
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);
|
|
138
|
-
border-radius: 20px;
|
|
139
|
-
overflow: hidden;
|
|
140
|
-
position: relative;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
.neon-line {
|
|
144
|
-
height: 1px;
|
|
145
|
-
width: 100%;
|
|
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);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
.content {
|
|
152
|
-
padding: 32px;
|
|
153
|
-
display: flex;
|
|
154
|
-
flex-direction: column;
|
|
155
|
-
align-items: center;
|
|
156
|
-
text-align: center;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
.code {
|
|
160
|
-
font-size: 80px;
|
|
161
|
-
font-weight: 900;
|
|
162
|
-
line-height: 1;
|
|
163
|
-
letter-spacing: -0.04em;
|
|
164
|
-
color: #fff;
|
|
165
|
-
/* Gradiente Texto: Branco para Verde */
|
|
166
|
-
background: linear-gradient(180deg, #ffffff 0%, var(--vue-green) 100%);
|
|
167
|
-
-webkit-background-clip: text;
|
|
168
|
-
-webkit-text-fill-color: transparent;
|
|
169
|
-
/* Fallback */
|
|
170
|
-
color: var(--vue-green);
|
|
171
|
-
margin-bottom: 16px;
|
|
172
|
-
filter: drop-shadow(0 0 20px rgba(66, 184, 131, 0.1));
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
.terminal-box {
|
|
176
|
-
width: 100%;
|
|
177
|
-
/* Fundo esverdeado muito sutil */
|
|
178
|
-
background: rgba(66, 184, 131, 0.03);
|
|
179
|
-
border-radius: 12px;
|
|
180
|
-
padding: 16px;
|
|
181
|
-
margin-bottom: 24px;
|
|
182
|
-
/* Borda verde sutil */
|
|
183
|
-
border: 1px solid rgba(66, 184, 131, 0.1);
|
|
184
|
-
font-family: "JetBrains Mono", monospace;
|
|
185
|
-
font-size: 12px;
|
|
186
|
-
text-align: left;
|
|
187
|
-
color: #a7c4bc; /* Texto terminal mais claro */
|
|
188
|
-
box-sizing: border-box;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
.terminal-dots {
|
|
192
|
-
display: flex;
|
|
193
|
-
gap: 6px;
|
|
194
|
-
margin-bottom: 8px;
|
|
195
|
-
opacity: 0.3;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
.dot {
|
|
199
|
-
width: 8px;
|
|
200
|
-
height: 8px;
|
|
201
|
-
border-radius: 50%;
|
|
202
|
-
background: #fff;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
.method {
|
|
206
|
-
color: var(--vue-green); /* GET em verde */
|
|
207
|
-
margin-right: 4px;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
.path {
|
|
211
|
-
color: #fff;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
.error-msg {
|
|
215
|
-
margin-top: 4px;
|
|
216
|
-
color: #5f7e76; /* Verde acinzentado escuro */
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
.actions {
|
|
220
|
-
display: flex;
|
|
221
|
-
gap: 12px;
|
|
222
|
-
width: 100%;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
.btn {
|
|
226
|
-
display: flex;
|
|
227
|
-
align-items: center;
|
|
228
|
-
gap: 8px;
|
|
229
|
-
padding: 10px 20px;
|
|
230
|
-
border-radius: 10px;
|
|
231
|
-
font-size: 13px;
|
|
232
|
-
font-weight: 600;
|
|
233
|
-
cursor: pointer;
|
|
234
|
-
transition: all 0.2s ease;
|
|
235
|
-
border: none;
|
|
236
|
-
outline: none;
|
|
237
|
-
text-decoration: none;
|
|
238
|
-
font-family: 'Inter', sans-serif;
|
|
239
|
-
flex: 1;
|
|
240
|
-
justify-content: center;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
.btn-primary {
|
|
244
|
-
/* Botão principal Verde Vue */
|
|
245
|
-
background: var(--vue-green);
|
|
246
|
-
color: #000000;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
.btn-primary:hover {
|
|
250
|
-
background: #ffffff;
|
|
251
|
-
box-shadow: 0 0 20px rgba(66, 184, 131, 0.4);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
.btn-secondary {
|
|
255
|
-
background: transparent;
|
|
256
|
-
color: rgba(255, 255, 255, 0.6);
|
|
257
|
-
border: 1px solid rgba(66, 184, 131, 0.2);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
.btn-secondary:hover {
|
|
261
|
-
background: rgba(66, 184, 131, 0.1);
|
|
262
|
-
color: #fff;
|
|
263
|
-
border-color: var(--vue-green);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
.footer {
|
|
267
|
-
padding: 12px 32px;
|
|
268
|
-
background: rgba(66, 184, 131, 0.02);
|
|
269
|
-
border-top: 1px solid rgba(66, 184, 131, 0.05);
|
|
270
|
-
display: flex;
|
|
271
|
-
justify-content: space-between;
|
|
272
|
-
align-items: center;
|
|
273
|
-
font-size: 11px;
|
|
274
|
-
color: rgba(255, 255, 255, 0.3);
|
|
275
|
-
box-sizing: border-box;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
.status {
|
|
279
|
-
display: flex;
|
|
280
|
-
align-items: center;
|
|
281
|
-
gap: 6px;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
.status-dot {
|
|
285
|
-
width: 6px;
|
|
286
|
-
height: 6px;
|
|
287
|
-
border-radius: 50%;
|
|
288
|
-
/* Ponto de status Verde */
|
|
289
|
-
background: var(--vue-green);
|
|
290
|
-
box-shadow: 0 0 6px var(--vue-green);
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
.status-text {
|
|
294
|
-
color: var(--vue-green);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
.brand-link {
|
|
298
|
-
margin-top: 32px;
|
|
299
|
-
display: flex;
|
|
300
|
-
align-items: center;
|
|
301
|
-
gap: 10px;
|
|
302
|
-
opacity: 0.4;
|
|
303
|
-
transition: opacity 0.3s;
|
|
304
|
-
text-decoration: none;
|
|
305
|
-
color: #fff;
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
.brand-link:hover {
|
|
309
|
-
opacity: 1;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
.brand-logo {
|
|
313
|
-
width: 20px;
|
|
314
|
-
height: 20px;
|
|
315
|
-
/* Removi o grayscale para a logo brilhar normal, se preferir monocromático com verde, pode ajustar */
|
|
316
|
-
filter: none;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
.brand-text {
|
|
320
|
-
font-size: 13px;
|
|
321
|
-
font-weight: 600;
|
|
322
|
-
color: #fff;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
.brand-highlight {
|
|
326
|
-
/* .js em verde */
|
|
327
|
-
color: var(--vue-green);
|
|
328
|
-
}
|
|
329
|
-
</style>
|
|
@@ -1,226 +0,0 @@
|
|
|
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
|
-
<script setup>
|
|
18
|
-
import { ref, computed, onMounted, onUnmounted } from 'vue';
|
|
19
|
-
|
|
20
|
-
// Definição das props
|
|
21
|
-
const props = defineProps({
|
|
22
|
-
hasBuildError: {
|
|
23
|
-
type: Boolean,
|
|
24
|
-
default: false
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
// Eventos
|
|
29
|
-
// Em vez de passar uma função callback como prop (React), emitimos um evento no Vue.
|
|
30
|
-
const emit = defineEmits(['click-build-error']);
|
|
31
|
-
|
|
32
|
-
const isVisible = ref(true);
|
|
33
|
-
const hotState = ref('idle');
|
|
34
|
-
const mounted = ref(false);
|
|
35
|
-
|
|
36
|
-
const isReloading = computed(() => hotState.value === 'reloading');
|
|
37
|
-
const isError = computed(() => !!props.hasBuildError);
|
|
38
|
-
|
|
39
|
-
const handleBadgeClick = () => {
|
|
40
|
-
if (isError.value) {
|
|
41
|
-
emit('click-build-error');
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
onMounted(() => {
|
|
46
|
-
mounted.value = true;
|
|
47
|
-
|
|
48
|
-
const handler = (ev) => {
|
|
49
|
-
const detail = ev?.detail;
|
|
50
|
-
if (!detail || !detail.state) return;
|
|
51
|
-
|
|
52
|
-
if (detail.state === 'reloading' || detail.state === 'full-reload') {
|
|
53
|
-
hotState.value = 'reloading';
|
|
54
|
-
}
|
|
55
|
-
if (detail.state === 'idle') {
|
|
56
|
-
hotState.value = 'idle';
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
if (typeof window !== 'undefined') {
|
|
61
|
-
window.addEventListener('vatts:hotreload', handler);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
onUnmounted(() => {
|
|
65
|
-
if (typeof window !== 'undefined') {
|
|
66
|
-
window.removeEventListener('vatts:hotreload', handler);
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
</script>
|
|
71
|
-
|
|
72
|
-
<template>
|
|
73
|
-
<Teleport to="body">
|
|
74
|
-
<div
|
|
75
|
-
v-if="isVisible && mounted"
|
|
76
|
-
class="vatts-dev-badge"
|
|
77
|
-
:class="{ 'clickable': isError }"
|
|
78
|
-
@click="handleBadgeClick"
|
|
79
|
-
>
|
|
80
|
-
<!-- Loading Spinner ou Status Dot -->
|
|
81
|
-
<div v-if="isReloading" class="vatts-spinner"></div>
|
|
82
|
-
<div
|
|
83
|
-
v-else
|
|
84
|
-
class="vatts-status-dot"
|
|
85
|
-
:class="{ 'reloading': isReloading, 'error': isError }"
|
|
86
|
-
></div>
|
|
87
|
-
|
|
88
|
-
<!-- Logo & Texto -->
|
|
89
|
-
<div class="vatts-logo">
|
|
90
|
-
VATTS<span>.JS</span>
|
|
91
|
-
<span v-if="isError" class="vatts-error-pill">ERROR</span>
|
|
92
|
-
</div>
|
|
93
|
-
|
|
94
|
-
<!-- Botão Fechar -->
|
|
95
|
-
<button
|
|
96
|
-
class="close-btn"
|
|
97
|
-
@click.stop="isVisible = false"
|
|
98
|
-
aria-label="Close badge"
|
|
99
|
-
>
|
|
100
|
-
×
|
|
101
|
-
</button>
|
|
102
|
-
</div>
|
|
103
|
-
</Teleport>
|
|
104
|
-
</template>
|
|
105
|
-
|
|
106
|
-
<style scoped>
|
|
107
|
-
/* Importando fonte (opcional se já existir globalmente, mas mantendo consistência com o original) */
|
|
108
|
-
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;800;900&display=swap');
|
|
109
|
-
|
|
110
|
-
@keyframes vatts-pulse {
|
|
111
|
-
0% { opacity: 0.4; }
|
|
112
|
-
50% { opacity: 1; }
|
|
113
|
-
100% { opacity: 0.4; }
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
@keyframes vatts-spin {
|
|
117
|
-
0% { transform: rotate(0deg); }
|
|
118
|
-
100% { transform: rotate(360deg); }
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
.vatts-dev-badge {
|
|
122
|
-
position: fixed;
|
|
123
|
-
bottom: 20px;
|
|
124
|
-
right: 20px;
|
|
125
|
-
/* Z-index alto para ficar acima de tudo */
|
|
126
|
-
z-index: 2147483647;
|
|
127
|
-
|
|
128
|
-
display: flex;
|
|
129
|
-
align-items: center;
|
|
130
|
-
gap: 12px;
|
|
131
|
-
padding: 8px 14px;
|
|
132
|
-
background: rgba(0, 0, 0, 0.85);
|
|
133
|
-
backdrop-filter: blur(12px);
|
|
134
|
-
-webkit-backdrop-filter: blur(12px);
|
|
135
|
-
|
|
136
|
-
border-radius: 10px;
|
|
137
|
-
color: #fff;
|
|
138
|
-
font-family: 'Inter', system-ui, sans-serif;
|
|
139
|
-
font-size: 11px;
|
|
140
|
-
font-weight: 600;
|
|
141
|
-
letter-spacing: 0.05em;
|
|
142
|
-
|
|
143
|
-
/* Estilo Monocromático Next.js */
|
|
144
|
-
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
145
|
-
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.6);
|
|
146
|
-
transition: all 0.2s ease;
|
|
147
|
-
cursor: default;
|
|
148
|
-
user-select: none;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
.vatts-dev-badge.clickable {
|
|
152
|
-
cursor: pointer;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
.vatts-dev-badge:hover {
|
|
156
|
-
border-color: rgba(255, 255, 255, 0.3);
|
|
157
|
-
transform: translateY(-2px);
|
|
158
|
-
background: rgba(10, 10, 10, 0.95);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
.vatts-status-dot {
|
|
162
|
-
width: 7px;
|
|
163
|
-
height: 7px;
|
|
164
|
-
background: #ffffff; /* Branco para status OK */
|
|
165
|
-
border-radius: 50%;
|
|
166
|
-
box-shadow: 0 0 8px rgba(255, 255, 255, 0.3);
|
|
167
|
-
animation: vatts-pulse 2.5s infinite ease-in-out;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
.vatts-status-dot.reloading {
|
|
171
|
-
background: #64748b; /* Slate */
|
|
172
|
-
box-shadow: none;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
.vatts-status-dot.error {
|
|
176
|
-
background: #ef4444; /* Vermelho para erro */
|
|
177
|
-
box-shadow: 0 0 10px #ef4444;
|
|
178
|
-
animation: vatts-pulse 1s infinite ease-in-out;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
.vatts-spinner {
|
|
182
|
-
width: 10px;
|
|
183
|
-
height: 10px;
|
|
184
|
-
border-radius: 50%;
|
|
185
|
-
border: 2px solid rgba(255,255,255,0.1);
|
|
186
|
-
border-top-color: #ffffff;
|
|
187
|
-
animation: vatts-spin 0.8s linear infinite;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
.vatts-logo {
|
|
191
|
-
color: #ffffff;
|
|
192
|
-
font-weight: 800;
|
|
193
|
-
display: flex;
|
|
194
|
-
align-items: center;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
.vatts-logo span {
|
|
198
|
-
color: #64748b;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
.vatts-error-pill {
|
|
202
|
-
margin-left: 8px;
|
|
203
|
-
padding: 2px 6px;
|
|
204
|
-
border-radius: 4px;
|
|
205
|
-
background: #ffffff;
|
|
206
|
-
color: #000000;
|
|
207
|
-
font-size: 9px;
|
|
208
|
-
font-weight: 900;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
.close-btn {
|
|
212
|
-
background: none;
|
|
213
|
-
border: none;
|
|
214
|
-
color: rgba(255,255,255,0.2);
|
|
215
|
-
cursor: pointer;
|
|
216
|
-
font-size: 16px;
|
|
217
|
-
padding: 0 0 0 4px;
|
|
218
|
-
margin-left: 4px;
|
|
219
|
-
display: flex;
|
|
220
|
-
align-items: center;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
.close-btn:hover {
|
|
224
|
-
color: rgba(255,255,255,0.6);
|
|
225
|
-
}
|
|
226
|
-
</style>
|