|
23 | 23 | background-color: #111827; |
24 | 24 | } |
25 | 25 | </style> |
26 | | - |
| 26 | + |
27 | 27 | <!-- Apple Touch Icon --> |
28 | | - <link rel="apple-touch-icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🪷</text></svg>"> |
| 28 | + <link rel="apple-touch-icon" |
| 29 | + href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🪷</text></svg>"> |
29 | 30 |
|
30 | 31 | <!-- Optimization Hints --> |
31 | 32 | <link rel="preconnect" href="https://aistudiocdn.com" crossorigin> |
|
45 | 46 | <meta property="og:description" content="Đồng hành tâm linh với AI inspired by Thích Nhất Hạnh"> |
46 | 47 | <meta property="og:type" content="website"> |
47 | 48 |
|
| 49 | + <!-- Security Headers --> |
| 50 | + <meta http-equiv="Content-Security-Policy" content=" |
| 51 | + default-src 'self'; |
| 52 | + script-src 'self' 'unsafe-inline' 'wasm-unsafe-eval'; |
| 53 | + style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; |
| 54 | + font-src 'self' https://fonts.gstatic.com data:; |
| 55 | + img-src 'self' data: blob:; |
| 56 | + media-src 'self' blob:; |
| 57 | + connect-src 'self' https://generativelanguage.googleapis.com wss://generativelanguage.googleapis.com; |
| 58 | + worker-src 'self' blob:; |
| 59 | + base-uri 'self'; |
| 60 | + form-action 'self'; |
| 61 | + "> |
| 62 | + |
48 | 63 | <link rel="icon" |
49 | 64 | href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🪷</text></svg>"> |
50 | 65 |
|
|
132 | 147 |
|
133 | 148 | /* Enhanced animations */ |
134 | 149 | @keyframes glow { |
135 | | - 0%, 100% { |
| 150 | + |
| 151 | + 0%, |
| 152 | + 100% { |
136 | 153 | box-shadow: 0 0 20px rgba(0, 243, 255, 0.3); |
137 | 154 | } |
| 155 | + |
138 | 156 | 50% { |
139 | 157 | box-shadow: 0 0 40px rgba(0, 243, 255, 0.6); |
140 | 158 | } |
141 | 159 | } |
142 | 160 |
|
143 | 161 | @keyframes float { |
144 | | - 0%, 100% { |
| 162 | + |
| 163 | + 0%, |
| 164 | + 100% { |
145 | 165 | transform: translateY(0px); |
146 | 166 | } |
| 167 | + |
147 | 168 | 50% { |
148 | 169 | transform: translateY(-10px); |
149 | 170 | } |
|
153 | 174 | 0% { |
154 | 175 | background-position: -200% center; |
155 | 176 | } |
| 177 | + |
156 | 178 | 100% { |
157 | 179 | background-position: 200% center; |
158 | 180 | } |
159 | 181 | } |
160 | 182 |
|
161 | 183 | @keyframes pulse-slow { |
162 | | - 0%, 100% { |
| 184 | + |
| 185 | + 0%, |
| 186 | + 100% { |
163 | 187 | opacity: 0.8; |
164 | 188 | } |
| 189 | + |
165 | 190 | 50% { |
166 | 191 | opacity: 1; |
167 | 192 | } |
168 | 193 | } |
169 | 194 |
|
170 | 195 | @keyframes bounce-subtle { |
171 | | - 0%, 100% { |
| 196 | + |
| 197 | + 0%, |
| 198 | + 100% { |
172 | 199 | transform: translateY(0); |
173 | 200 | } |
| 201 | + |
174 | 202 | 50% { |
175 | 203 | transform: translateY(-2px); |
176 | 204 | } |
|
180 | 208 | from { |
181 | 209 | transform: rotate(0deg); |
182 | 210 | } |
| 211 | + |
183 | 212 | to { |
184 | 213 | transform: rotate(360deg); |
185 | 214 | } |
|
189 | 218 | 0% { |
190 | 219 | transform: translateX(-100%); |
191 | 220 | } |
| 221 | + |
192 | 222 | 100% { |
193 | 223 | transform: translateX(100%); |
194 | 224 | } |
|
231 | 261 |
|
232 | 262 | .no-scrollbar { |
233 | 263 | -ms-overflow-style: none; |
234 | | - /* scrollbar-width: none; */ /* Commented out for broader compatibility */ |
| 264 | + /* scrollbar-width: none; */ |
| 265 | + /* Commented out for broader compatibility */ |
235 | 266 | /* Fallback for browsers that don't support scrollbar-width */ |
236 | 267 | } |
237 | | - |
| 268 | + |
238 | 269 | /* Modern browsers that support scrollbar-width */ |
239 | 270 | @supports (scrollbar-width: none) { |
240 | 271 | .no-scrollbar { |
241 | 272 | scrollbar-width: none; |
242 | 273 | } |
243 | 274 | } |
244 | | - |
| 275 | + |
245 | 276 | /* Fallback for older browsers */ |
246 | 277 | @supports not (scrollbar-width: none) { |
247 | 278 | .no-scrollbar::-webkit-scrollbar { |
248 | 279 | display: none; |
249 | 280 | } |
| 281 | + |
250 | 282 | .no-scrollbar { |
251 | 283 | overflow: -moz-scrollbars-none; |
252 | 284 | } |
|
326 | 358 | } |
327 | 359 |
|
328 | 360 | /* Width utilities for progress bars */ |
329 | | - .w-0 { width: 0%; } |
330 | | - .w-10 { width: 10%; } |
331 | | - .w-20 { width: 20%; } |
332 | | - .w-30 { width: 30%; } |
333 | | - .w-40 { width: 40%; } |
334 | | - .w-50 { width: 50%; } |
335 | | - .w-60 { width: 60%; } |
336 | | - .w-70 { width: 70%; } |
337 | | - .w-80 { width: 80%; } |
338 | | - .w-90 { width: 90%; } |
339 | | - .w-100 { width: 100%; } |
| 361 | + .w-0 { |
| 362 | + width: 0%; |
| 363 | + } |
| 364 | + |
| 365 | + .w-10 { |
| 366 | + width: 10%; |
| 367 | + } |
| 368 | + |
| 369 | + .w-20 { |
| 370 | + width: 20%; |
| 371 | + } |
| 372 | + |
| 373 | + .w-30 { |
| 374 | + width: 30%; |
| 375 | + } |
| 376 | + |
| 377 | + .w-40 { |
| 378 | + width: 40%; |
| 379 | + } |
| 380 | + |
| 381 | + .w-50 { |
| 382 | + width: 50%; |
| 383 | + } |
| 384 | + |
| 385 | + .w-60 { |
| 386 | + width: 60%; |
| 387 | + } |
| 388 | + |
| 389 | + .w-70 { |
| 390 | + width: 70%; |
| 391 | + } |
| 392 | + |
| 393 | + .w-80 { |
| 394 | + width: 80%; |
| 395 | + } |
| 396 | + |
| 397 | + .w-90 { |
| 398 | + width: 90%; |
| 399 | + } |
| 400 | + |
| 401 | + .w-100 { |
| 402 | + width: 100%; |
| 403 | + } |
340 | 404 | </style> |
341 | | - <script type="importmap"> |
342 | | -{ |
343 | | - "imports": { |
344 | | - "react/": "https://aistudiocdn.com/react@^19.2.1/", |
345 | | - "react": "https://aistudiocdn.com/react@^19.2.1", |
346 | | - "react-dom/": "https://aistudiocdn.com/react-dom@^19.2.1/", |
347 | | - "react-dom": "https://aistudiocdn.com/react-dom@^19.2.1", |
348 | | - "react-dom/client": "https://aistudiocdn.com/react-dom@^19.2.1/client", |
349 | | - "scheduler": "https://aistudiocdn.com/scheduler@^0.23.2", |
350 | | - "scheduler/": "https://aistudiocdn.com/scheduler@^0.23.2/", |
351 | | - "@google/genai": "https://aistudiocdn.com/@google/genai@^1.32.0", |
352 | | - "lucide-react": "https://aistudiocdn.com/lucide-react@^0.559.0", |
353 | | - "three": "https://aistudiocdn.com/three@^0.170.0", |
354 | | - "@react-three/fiber": "https://aistudiocdn.com/@react-three/fiber@^9.0.0-rc.3", |
355 | | - "@react-three/drei": "https://aistudiocdn.com/@react-three/drei@^9.120.0", |
356 | | - "tone": "https://aistudiocdn.com/tone@^14.7.77", |
357 | | - "zustand": "https://esm.sh/zustand@^5.0.3?external=react", |
358 | | - "vite": "https://esm.sh/vite@^7.2.7", |
359 | | - "@vitejs/plugin-react": "https://esm.sh/@vitejs/plugin-react@^5.1.2", |
360 | | - "onnxruntime-web": "https://cdn.jsdelivr.net/npm/onnxruntime-web@1.17.1/dist/ort.es6.min.js" |
361 | | - } |
362 | | -} |
363 | | -</script> |
| 405 | + |
364 | 406 | </head> |
365 | 407 |
|
366 | 408 | <body class="bg-gray-900 text-gray-100 h-screen w-screen overflow-hidden"> |
|
0 commit comments