diff --git a/dental-server/public/app.js b/dental-server/public/app.js
index bad760b..5f15399 100644
--- a/dental-server/public/app.js
+++ b/dental-server/public/app.js
@@ -457,12 +457,11 @@ function patientCardHTML(p, index) {
const doctor = p.doctor || '—';
const remark = p.remark || '—';
- //
permite ao browser adiar miniaturas fora da viewport;
- // sem thumb, mantém o gradiente de fallback.
+ // SEMPRE exibir imagem ou placeholder — thumb em primeiro plano, cinza como fallback
+ // loading="lazy" adia o download de miniaturas fora da viewport
const preview = thumb
- ? `
`
- : '';
- const previewStyle = thumb ? '' : ' style="background: linear-gradient(135deg,#667eea22,#764ba222);"';
+ ? `
`
+ : `
`;
return `
diff --git a/dental-server/public/style.css b/dental-server/public/style.css
index f4604ff..4b3f979 100644
--- a/dental-server/public/style.css
+++ b/dental-server/public/style.css
@@ -171,7 +171,7 @@ body {
}
.sidebar-footer {
- padding: 12px 16px;
+ padding: 8px 12px;
border-top: 1px solid var(--border-color);
margin-top: auto;
flex-shrink: 0;
@@ -179,7 +179,7 @@ body {
.logout-btn {
width: 100%;
- padding: 10px;
+ padding: 8px;
background: transparent;
border: 1px solid var(--glass-border);
color: #a0aec0;
@@ -188,10 +188,10 @@ body {
display: flex;
align-items: center;
justify-content: center;
- gap: 8px;
+ gap: 6px;
font-family: 'Inter', sans-serif;
font-weight: 500;
- font-size: 0.92rem;
+ font-size: 0.85rem;
transition: all 0.3s;
}
@@ -438,6 +438,19 @@ body {
display: block;
}
+.preview-img-placeholder {
+ position: absolute;
+ inset: 0;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(135deg, #e2e8f0 0%, #cbd5e1 100%);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #94a3b8;
+ font-size: 40px;
+}
+
.image-card:hover .image-preview {
transform: scale(1.03);
}
diff --git a/dental-server/routes/images.js b/dental-server/routes/images.js
index 4980d85..fbe5028 100644
--- a/dental-server/routes/images.js
+++ b/dental-server/routes/images.js
@@ -44,7 +44,7 @@ router.post('/upload', async (req, res) => {
let thumbFilename = null;
try {
- const thumbBuffer = await imageProcessor.getThumbnail(imageBuffer, 400, 400);
+ const thumbBuffer = await imageProcessor.getThumbnail(imageBuffer, 500, 500);
thumbFilename = `thumb_${filename}`;
await storage.saveImage(thumbFilename, thumbBuffer, clientName, patientName, false);
} catch (e) {
diff --git a/dental-server/server.js b/dental-server/server.js
index 0f02b9e..e563cd1 100644
--- a/dental-server/server.js
+++ b/dental-server/server.js
@@ -906,10 +906,10 @@ io.on('connection', (socket) => {
const filename = `${timestamp}_${data.metadata.guid}.png`;
await storage.saveImage(filename, imageBuffer, clientName, patientName, false);
- // Gerar e salvar miniatura (Thumbnail)
+ // Gerar e salvar miniatura (Thumbnail) — 500x500, qualidade 80%
let thumbFilename = null;
try {
- const thumbBuffer = await imageProcessor.getThumbnail(imageBuffer, 400, 400);
+ const thumbBuffer = await imageProcessor.getThumbnail(imageBuffer, 500, 500);
thumbFilename = `thumb_${filename}`;
await storage.saveImage(thumbFilename, thumbBuffer, clientName, patientName, false);
} catch (thumbErr) {