CLIO v1.0 — Scanner Inteligente com IA (MVP)

This commit is contained in:
Jarvis Deploy
2026-02-10 23:05:41 +00:00
commit 8e903d9222
41 changed files with 3190 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" viewBox="0 0 512 512">
<rect width="512" height="512" rx="80" fill="#0A0E17"/>
<rect x="20" y="20" width="472" height="472" rx="60" fill="none" stroke="#6C63FF" stroke-width="4" opacity="0.3"/>
<text x="256" y="280" font-size="200" text-anchor="middle" dominant-baseline="middle">📜</text>
<text x="256" y="420" font-family="Arial,sans-serif" font-size="72" font-weight="bold" fill="#6C63FF" text-anchor="middle">CLIO</text>
</svg>

After

Width:  |  Height:  |  Size: 506 B

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512">
<rect width="512" height="512" rx="80" fill="#0A0E17"/>
<rect x="20" y="20" width="472" height="472" rx="60" fill="none" stroke="#6C63FF" stroke-width="4" opacity="0.3"/>
<text x="256" y="280" font-size="200" text-anchor="middle" dominant-baseline="middle">📜</text>
<text x="256" y="420" font-family="Arial,sans-serif" font-size="72" font-weight="bold" fill="#6C63FF" text-anchor="middle">CLIO</text>
</svg>

After

Width:  |  Height:  |  Size: 506 B

View File

@@ -0,0 +1,14 @@
{
"name": "CLIO — Scanner Inteligente com IA",
"short_name": "CLIO",
"description": "Escaneie documentos com IA. OCR, categorização e extração automática.",
"start_url": "/",
"display": "standalone",
"background_color": "#0A0E17",
"theme_color": "#6C63FF",
"orientation": "portrait",
"icons": [
{ "src": "/icon-192.svg", "sizes": "192x192", "type": "image/svg+xml" },
{ "src": "/icon-512.svg", "sizes": "512x512", "type": "image/svg+xml" }
]
}

24
frontend/public/sw.js Normal file
View File

@@ -0,0 +1,24 @@
const CACHE_NAME = 'clio-v1';
const STATIC_ASSETS = ['/', '/manifest.json'];
self.addEventListener('install', e => {
e.waitUntil(caches.open(CACHE_NAME).then(c => c.addAll(STATIC_ASSETS)));
self.skipWaiting();
});
self.addEventListener('activate', e => {
e.waitUntil(caches.keys().then(keys => Promise.all(keys.filter(k => k !== CACHE_NAME).map(k => caches.delete(k)))));
self.clients.claim();
});
self.addEventListener('fetch', e => {
if (e.request.method !== 'GET') return;
if (e.request.url.includes('/api/')) return;
e.respondWith(
fetch(e.request).then(res => {
const clone = res.clone();
caches.open(CACHE_NAME).then(c => c.put(e.request, clone));
return res;
}).catch(() => caches.match(e.request))
);
});