Versão 0.6.0: saúde do disco no estilo do CrystalDiskInfo e nova logo
Release / Cria a release (push) Canceled after 0s
Release / CLI (linux-aarch64) (push) Canceled after 0s
Release / CLI (linux-x86_64) (push) Canceled after 0s
Release / CLI (macos-aarch64) (push) Canceled after 0s
Release / CLI (macos-x86_64) (push) Canceled after 0s
Release / CLI (windows-x86_64) (push) Canceled after 0s
Release / App desktop (linux-x86_64) (push) Canceled after 0s
Release / App desktop (macos-aarch64) (push) Canceled after 0s
Release / App desktop (macos-x86_64) (push) Canceled after 0s
Release / App desktop (windows-x86_64) (push) Canceled after 0s
Release / Publica a release (push) Canceled after 0s
SMART completo (estado com % de vida útil, temperatura, horas e vezes ligado, total lido/gravado, ficha do dispositivo e tabela de atributos ATA e NVMe), leitura pelo disco que contém a partição e comando `guara health`. Nova logo: a cabeça do guará recortada das trilhas de um disco, nas cores do app. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No files matched your search
@@ -3,7 +3,7 @@
|
||||
[package]
|
||||
name = "guara-gui"
|
||||
description = "Guará: interface gráfica de recuperação de arquivos"
|
||||
version = "0.5.0"
|
||||
version = "0.6.0"
|
||||
edition = "2021"
|
||||
license = "MIT OR Apache-2.0"
|
||||
repository = "https://github.com/lucasrguerra/guara"
|
||||
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 455 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 455 KiB After Width: | Height: | Size: 66 KiB |
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://schema.tauri.app/config/2",
|
||||
"productName": "Guara",
|
||||
"version": "0.5.0",
|
||||
"version": "0.6.0",
|
||||
"identifier": "dev.guara.app",
|
||||
"build": {
|
||||
"frontendDist": "../ui"
|
||||
|
||||
@@ -494,3 +494,25 @@ dialog.lightbox[open] { display: grid; }
|
||||
.xp-tiles { display: grid; grid-template-columns: repeat(3, 1fr); width: 100%; height: 100%; }
|
||||
.xp-tiles img { width: 100%; height: 100%; display: block; }
|
||||
.xp-pin { position: absolute; width: 14px; height: 14px; margin: -7px 0 0 -7px; border-radius: 50%; background: #0f8f8f; border: 3px solid #fff; box-shadow: 0 1px 4px rgba(0,0,0,.4); }
|
||||
|
||||
/* saúde do disco (SMART) */
|
||||
.h-tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); gap: 10px; }
|
||||
.h-tile { background: var(--surface); border-radius: 14px; box-shadow: var(--shadow); padding: 12px 14px; display: flex; flex-direction: column; gap: 2px; }
|
||||
.h-tile small { color: var(--text-3); font-size: 12px; }
|
||||
.h-tile b { font-size: 18px; font-variant-numeric: tabular-nums; }
|
||||
.h-tile.warning b { color: var(--warn); } .h-tile.failing b { color: var(--bad); }
|
||||
.h-status.ok { background: var(--ok-soft); } .h-status.ok b { color: var(--ok); }
|
||||
.h-status.warning { background: var(--warn-soft); } .h-status.failing { background: var(--bad-soft); }
|
||||
.h-status b span { font-weight: 500; opacity: .8; }
|
||||
.h-info { margin-top: 14px; background: var(--surface); border-radius: 14px; box-shadow: var(--shadow); padding: 14px 16px; }
|
||||
.h-scroll { overflow-x: auto; background: var(--surface); border-radius: 14px; box-shadow: var(--shadow); }
|
||||
.h-table { width: 100%; border-collapse: collapse; font-size: 13px; font-variant-numeric: tabular-nums; }
|
||||
.h-table th { text-align: left; color: var(--text-3); font-weight: 500; padding: 8px 10px; border-bottom: 1px solid var(--line, rgba(127,127,127,.2)); white-space: nowrap; }
|
||||
.h-table td { padding: 6px 10px; border-bottom: 1px solid var(--line, rgba(127,127,127,.12)); white-space: nowrap; }
|
||||
.h-table tr:last-child td { border-bottom: 0; }
|
||||
.h-table .dim { color: var(--text-3); }
|
||||
.h-dot { display: inline-block; width: 9px; height: 9px; border-radius: 50%; background: var(--ok); }
|
||||
.h-dot.warning { background: var(--warn); } .h-dot.failing { background: var(--bad); }
|
||||
|
||||
/* logo inline: segue o tema escolhido no app, não o do sistema */
|
||||
.logo .a { stroke: var(--accent); } .logo .b { stroke: var(--accent-2); } .logo .t { fill: var(--text); }
|
||||
@@ -287,15 +287,46 @@ async function openDevice(d) {
|
||||
rpc('health', { path: d.path }).then((h) => { if (S.device === d) { S.health = h; paintHealth(); } }).catch(() => {});
|
||||
}
|
||||
|
||||
const HEALTH_WORD = { ok: 'Bom', warning: 'Atenção', failing: 'Ruim' };
|
||||
|
||||
function paintHealth() {
|
||||
const el = $('#healthArea');
|
||||
const h = S.health;
|
||||
if (!el || !h || !h.available) { if (el) el.innerHTML = ''; return; }
|
||||
if (!el || !h) { if (el) el.innerHTML = ''; return; }
|
||||
if (!h.available) {
|
||||
el.innerHTML = `<div class="section"><h2>Saúde do disco</h2><p class="sub">${esc(h.summary)}</p></div>`;
|
||||
return;
|
||||
}
|
||||
const bad = h.status === 'failing' || h.status === 'warning';
|
||||
const rows = (h.details || []).filter(([k]) => bad || ['Modelo', 'Horas ligado', 'Temperatura'].includes(k)).map(([k, v]) => `<dt>${esc(k)}</dt><dd>${esc(v)}</dd>`).join('');
|
||||
el.innerHTML = `<div class="notice ${h.status === 'failing' ? 'bad' : h.status === 'warning' ? '' : 'info'}">${warnSvg}<div><b>${esc(h.summary)}</b>
|
||||
${rows ? `<dl class="kv" style="margin-top:6px">${rows}</dl>` : ''}${(h.advice || []).map((a) => `<div style="margin-top:6px">${esc(a)}</div>`).join('')}
|
||||
${bad ? '<div class="row" style="margin-top:8px"><button class="btn sm primary" id="healthImg">Criar a imagem primeiro</button></div>' : ''}</div></div>`;
|
||||
const fmtN = (n) => Number(n).toLocaleString(LOC());
|
||||
const tile = (label, value, cls = '') => value == null ? '' : `<div class="h-tile ${cls}"><small>${label}</small><b>${value}</b></div>`;
|
||||
const temp = h.temperature_c;
|
||||
const tiles = [
|
||||
`<div class="h-tile h-status ${esc(h.status)}"><small>Estado</small><b>${HEALTH_WORD[h.status] || '?'}${h.health_pct != null ? ` <span>${h.health_pct}%</span>` : ''}</b></div>`,
|
||||
tile('Temperatura', temp == null ? null : `${temp} °C`, temp >= 60 ? 'failing' : temp >= 50 ? 'warning' : ''),
|
||||
tile('Horas ligado', h.power_on_hours == null ? null : `${fmtN(h.power_on_hours)} h`),
|
||||
tile('Vezes ligado', h.power_cycles == null ? null : fmtN(h.power_cycles)),
|
||||
tile('Total lido', h.host_reads == null ? null : human(h.host_reads)),
|
||||
tile('Total gravado', h.host_writes == null ? null : human(h.host_writes)),
|
||||
].join('');
|
||||
const info = (h.info || []).map(([k, v]) => `<dt>${esc(k)}</dt><dd>${esc(v)}</dd>`).join('');
|
||||
const dash = (x) => x == null ? '<span class="dim">–</span>' : x;
|
||||
const attrs = h.attributes || [];
|
||||
const table = attrs.length ? `<details class="adv h-attrs"${bad ? ' open' : ''}><summary>Atributos SMART (${attrs.length})</summary>
|
||||
<div class="h-scroll"><table class="h-table"><thead><tr><th></th><th>ID</th><th>Atributo</th><th>Atual</th><th>Pior</th><th>Limite</th><th>Bruto</th></tr></thead><tbody>
|
||||
${attrs.map((a) => `<tr><td><span class="h-dot ${esc(a.status)}" title="${HEALTH_WORD[a.status] || ''}"></span></td><td class="mono">${esc(a.id)}</td><td class="mono">${esc(a.name)}</td><td>${dash(a.value)}</td><td>${dash(a.worst)}</td><td>${dash(a.thresh)}</td><td class="mono">${esc(a.raw)}</td></tr>`).join('')}
|
||||
</tbody></table></div></details>` : '';
|
||||
const scope = h.partition ? `<p class="sub">O SMART é do disco inteiro: os dados abaixo são de <span class="mono">${esc(h.disk)}</span>, que contém <span class="mono">${esc(h.partition)}</span>.</p>` : '';
|
||||
// o que motivou o alerta (os campos da ficha já aparecem abaixo)
|
||||
const known = new Set(['Modelo', 'Nº de série', 'Horas ligado', 'Temperatura', 'Autoavaliação SMART', 'Vida útil usada']);
|
||||
const why = (h.details || []).filter(([k]) => !known.has(k)).map(([k, v]) => `<dt>${esc(k)}</dt><dd>${esc(v)}</dd>`).join('');
|
||||
el.innerHTML = `${bad ? `<div class="notice ${h.status === 'failing' ? 'bad' : ''}">${warnSvg}<div><b>${esc(h.summary)}</b>
|
||||
${why ? `<dl class="kv" style="margin-top:6px">${why}</dl>` : ''}
|
||||
${(h.advice || []).map((a) => `<div style="margin-top:6px">${esc(a)}</div>`).join('')}
|
||||
<div class="row" style="margin-top:8px"><button class="btn sm primary" id="healthImg">Criar a imagem primeiro</button></div></div></div>` : ''}
|
||||
<div class="section"><h2>Saúde do disco</h2>${scope}
|
||||
<div class="h-tiles">${tiles}</div>
|
||||
${info ? `<dl class="kv h-info">${info}</dl>` : ''}${table}</div>`;
|
||||
$('#healthImg')?.addEventListener('click', startImage);
|
||||
}
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 100" role="img" aria-label="Guará"><polygon points="146.58,7.00 144.87,10.85 147.43,12.13" fill="#38d3c1" stroke="#38d3c1" stroke-width="0.25" stroke-linejoin="round"/><polygon points="131.94,67.89 135.88,72.47 135.24,69.04" fill="#0a424e" stroke="#0a424e" stroke-width="0.25" stroke-linejoin="round"/><polygon points="112.13,68.19 116.20,66.47 107.81,62.69" fill="#23b8aa" stroke="#23b8aa" stroke-width="0.25" stroke-linejoin="round"/><polygon points="143.15,8.71 144.87,10.85 146.58,7.00" fill="#38d3c0" stroke="#38d3c0" stroke-width="0.25" stroke-linejoin="round"/><polygon points="101.86,14.48 105.07,14.27 104.21,11.27" fill="#2dc5b5" stroke="#2dc5b5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="108.92,6.14 112.34,8.28 111.92,4.43" fill="#2dc5b5" stroke="#2dc5b5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="37.51,61.88 38.06,58.55 35.26,59.42" fill="#16a69b" stroke="#16a69b" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.44" stroke-opacity="0.44"/><polygon points="51.64,65.75 54.46,64.96 52.55,62.38" fill="#16a79b" stroke="#16a79b" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.66" stroke-opacity="0.66"/><polygon points="46.20,62.56 49.71,66.06 50.53,62.99" fill="#1baea1" stroke="#1baea1" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.58" stroke-opacity="0.58"/><polygon points="48.26,63.58 45.03,60.36 44.41,64.13" fill="#12a298" stroke="#12a298" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.52" stroke-opacity="0.52"/><polygon points="61.85,68.19 62.92,72.99 65.81,67.07" fill="#13a398" stroke="#13a398" stroke-width="0.25" stroke-linejoin="round"/><polygon points="62.92,72.99 61.85,68.19 55.42,69.11" fill="#19ab9f" stroke="#19ab9f" stroke-width="0.25" stroke-linejoin="round"/><polygon points="38.33,89.93 36.63,88.22 36.63,89.93" fill="#0f9e94" stroke="#0f9e94" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.39" stroke-opacity="0.39"/><polygon points="98.42,72.35 97.37,66.47 91.80,72.47" fill="#a9f2e5" stroke="#a9f2e5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="92.66,77.17 98.42,72.35 91.80,72.47" fill="#a6f2e5" stroke="#a6f2e5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="98.42,72.35 92.66,77.17 100.36,80.17" fill="#aff3e7" stroke="#aff3e7" stroke-width="0.25" stroke-linejoin="round"/><polygon points="85.59,79.64 92.66,77.17 91.80,72.47" fill="#17a89c" stroke="#17a89c" stroke-width="0.25" stroke-linejoin="round"/><polygon points="92.66,77.17 99.65,82.45 100.36,80.17" fill="#1fb2a5" stroke="#1fb2a5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="99.65,82.45 92.66,77.17 96.80,84.95" fill="#1db0a3" stroke="#1db0a3" stroke-width="0.25" stroke-linejoin="round"/><polygon points="133.31,53.64 131.39,55.35 133.74,59.63" fill="#109087" stroke="#109087" stroke-width="0.25" stroke-linejoin="round"/><polygon points="121.41,64.97 128.18,59.63 123.90,58.77" fill="#093f4a" stroke="#093f4a" stroke-width="0.25" stroke-linejoin="round"/><polygon points="108.07,68.61 112.13,68.19 107.81,62.69" fill="#1aaca0" stroke="#1aaca0" stroke-width="0.25" stroke-linejoin="round"/><polygon points="127.98,73.39 135.88,72.47 131.94,67.89" fill="#093c48" stroke="#093c48" stroke-width="0.25" stroke-linejoin="round"/><polygon points="127.98,73.39 124.18,72.59 121.76,80.81" fill="#093e49" stroke="#093e49" stroke-width="0.25" stroke-linejoin="round"/><polygon points="124.18,72.59 118.91,75.14 121.76,80.81" fill="#093f4b" stroke="#093f4b" stroke-width="0.25" stroke-linejoin="round"/><polygon points="143.15,8.71 140.16,10.63 144.87,10.85" fill="#33cdbb" stroke="#33cdbb" stroke-width="0.25" stroke-linejoin="round"/><polygon points="144.01,27.53 139.52,28.60 142.08,31.60" fill="#2cc3b3" stroke="#2cc3b3" stroke-width="0.25" stroke-linejoin="round"/><polygon points="128.18,59.63 134.60,61.77 133.74,59.63" fill="#0a414d" stroke="#0a414d" stroke-width="0.25" stroke-linejoin="round"/><polygon points="134.60,61.77 128.18,59.63 131.94,67.89" fill="#0a424e" stroke="#0a424e" stroke-width="0.25" stroke-linejoin="round"/><polygon points="109.35,9.56 108.92,6.14 106.57,8.71" fill="#30c9b8" stroke="#30c9b8" stroke-width="0.25" stroke-linejoin="round"/><polygon points="109.35,9.56 112.34,8.28 108.92,6.14" fill="#31cab9" stroke="#31cab9" stroke-width="0.25" stroke-linejoin="round"/><polygon points="104.21,11.27 109.35,9.56 106.57,8.71" fill="#31cab9" stroke="#31cab9" stroke-width="0.25" stroke-linejoin="round"/><polygon points="105.07,14.27 109.35,9.56 104.21,11.27" fill="#2fc7b6" stroke="#2fc7b6" stroke-width="0.25" stroke-linejoin="round"/><polygon points="112.34,8.28 114.48,8.28 111.92,4.43" fill="#2bc2b2" stroke="#2bc2b2" stroke-width="0.25" stroke-linejoin="round"/><polygon points="116.20,66.47 116.20,60.06 107.81,62.69" fill="#25baab" stroke="#25baab" stroke-width="0.25" stroke-linejoin="round"/><polygon points="106.78,53.75 110.63,53.64 108.92,46.79" fill=Line truncated
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" role="img" aria-label="Guará"><style>.a{stroke:#0f766e}.b{stroke:#14b8a6}.t{fill:#1d1d1f}@media (prefers-color-scheme:dark){.a{stroke:#2dd4bf}.b{stroke:#5eead4}.t{fill:#f5f5f7}}</style><defs><clipPath id="g-head"><path d="M50 95 C46 88 43 80 40 74 C33 70 25 64 22 56 L14 6 L36 30 C40 28 45 27 50 27 C55 27 60 28 64 30 L86 6 L78 56 C75 64 67 70 60 74 C57 80 54 88 50 95 Z"/></clipPath></defs><g clip-path="url(#g-head)" fill="none" stroke-width="4.2"><path class="a" d="M50 93A7 7 0 0 1 50 107"/><path class="b" d="M50 93A7 7 0 0 0 50 107" stroke-dasharray="3 3" stroke-dashoffset="0"/><path class="a" d="M50 86A14 14 0 0 1 50 114"/><path class="b" d="M50 86A14 14 0 0 0 50 114" stroke-dasharray="6 4" stroke-dashoffset="3"/><path class="a" d="M50 79A21 21 0 0 1 50 121"/><path class="b" d="M50 79A21 21 0 0 0 50 121" stroke-dasharray="9 5" stroke-dashoffset="6"/><path class="a" d="M50 72A28 28 0 0 1 50 128"/><path class="b" d="M50 72A28 28 0 0 0 50 128" stroke-dasharray="3 6" stroke-dashoffset="9"/><path class="a" d="M50 65A35 35 0 0 1 50 135"/><path class="b" d="M50 65A35 35 0 0 0 50 135" stroke-dasharray="6 3" stroke-dashoffset="12"/><path class="a" d="M50 58A42 42 0 0 1 50 142"/><path class="b" d="M50 58A42 42 0 0 0 50 142" stroke-dasharray="9 4" stroke-dashoffset="15"/><path class="a" d="M50 51A49 49 0 0 1 50 149"/><path class="b" d="M50 51A49 49 0 0 0 50 149" stroke-dasharray="3 5" stroke-dashoffset="18"/><path class="a" d="M50 44A56 56 0 0 1 50 156"/><path class="b" d="M50 44A56 56 0 0 0 50 156" stroke-dasharray="6 6" stroke-dashoffset="21"/><path class="a" d="M50 37A63 63 0 0 1 50 163"/><path class="b" d="M50 37A63 63 0 0 0 50 163" stroke-dasharray="9 3" stroke-dashoffset="24"/><path class="a" d="M50 30A70 70 0 0 1 50 170"/><path class="b" d="M50 30A70 70 0 0 0 50 170" stroke-dasharray="3 4" stroke-dashoffset="27"/><path class="a" d="M50 23A77 77 0 0 1 50 177"/><path class="b" d="M50 23A77 77 0 0 0 50 177" stroke-dasharray="6 5" stroke-dashoffset="30"/><path class="a" d="M50 16A84 84 0 0 1 50 184"/><path class="b" d="M50 16A84 84 0 0 0 50 184" stroke-dasharray="9 6" stroke-dashoffset="33"/><path class="a" d="M50 9A91 91 0 0 1 50 191"/><path class="b" d="M50 9A91 91 0 0 0 50 191" stroke-dasharray="3 3" stroke-dashoffset="36"/><path class="a" d="M50 2A98 98 0 0 1 50 198"/><path class="b" d="M50 2A98 98 0 0 0 50 198" stroke-dasharray="6 4" stroke-dashoffset="39"/><rect class="t" stroke="none" x="0" y="74" width="100" height="30"/></g><path class="t" d="M37 50Q42 47 46 52Q41 53 37 50ZM63 50Q58 47 54 52Q59 53 63 50Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 2.6 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-label="Guará"><defs><linearGradient id="bg" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#0f3d44"/><stop offset="1" stop-color="#062a31"/></linearGradient><clipPath id="ic"><rect width="128" height="128" rx="29"/></clipPath></defs><rect width="128" height="128" rx="29" fill="url(#bg)"/><g clip-path="url(#ic)"><g transform="translate(-48 20) scale(1.06)"><polygon points="146.58,7.00 144.87,10.85 147.43,12.13" fill="#38d3c1" stroke="#38d3c1" stroke-width="0.25" stroke-linejoin="round"/><polygon points="131.94,67.89 135.88,72.47 135.24,69.04" fill="#0a424e" stroke="#0a424e" stroke-width="0.25" stroke-linejoin="round"/><polygon points="112.13,68.19 116.20,66.47 107.81,62.69" fill="#23b8aa" stroke="#23b8aa" stroke-width="0.25" stroke-linejoin="round"/><polygon points="143.15,8.71 144.87,10.85 146.58,7.00" fill="#38d3c0" stroke="#38d3c0" stroke-width="0.25" stroke-linejoin="round"/><polygon points="101.86,14.48 105.07,14.27 104.21,11.27" fill="#2dc5b5" stroke="#2dc5b5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="108.92,6.14 112.34,8.28 111.92,4.43" fill="#2dc5b5" stroke="#2dc5b5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="37.51,61.88 38.06,58.55 35.26,59.42" fill="#16a69b" stroke="#16a69b" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.44" stroke-opacity="0.44"/><polygon points="51.64,65.75 54.46,64.96 52.55,62.38" fill="#16a79b" stroke="#16a79b" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.66" stroke-opacity="0.66"/><polygon points="46.20,62.56 49.71,66.06 50.53,62.99" fill="#1baea1" stroke="#1baea1" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.58" stroke-opacity="0.58"/><polygon points="48.26,63.58 45.03,60.36 44.41,64.13" fill="#12a298" stroke="#12a298" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.52" stroke-opacity="0.52"/><polygon points="61.85,68.19 62.92,72.99 65.81,67.07" fill="#13a398" stroke="#13a398" stroke-width="0.25" stroke-linejoin="round"/><polygon points="62.92,72.99 61.85,68.19 55.42,69.11" fill="#19ab9f" stroke="#19ab9f" stroke-width="0.25" stroke-linejoin="round"/><polygon points="38.33,89.93 36.63,88.22 36.63,89.93" fill="#0f9e94" stroke="#0f9e94" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.39" stroke-opacity="0.39"/><polygon points="98.42,72.35 97.37,66.47 91.80,72.47" fill="#a9f2e5" stroke="#a9f2e5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="92.66,77.17 98.42,72.35 91.80,72.47" fill="#a6f2e5" stroke="#a6f2e5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="98.42,72.35 92.66,77.17 100.36,80.17" fill="#aff3e7" stroke="#aff3e7" stroke-width="0.25" stroke-linejoin="round"/><polygon points="85.59,79.64 92.66,77.17 91.80,72.47" fill="#17a89c" stroke="#17a89c" stroke-width="0.25" stroke-linejoin="round"/><polygon points="92.66,77.17 99.65,82.45 100.36,80.17" fill="#1fb2a5" stroke="#1fb2a5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="99.65,82.45 92.66,77.17 96.80,84.95" fill="#1db0a3" stroke="#1db0a3" stroke-width="0.25" stroke-linejoin="round"/><polygon points="133.31,53.64 131.39,55.35 133.74,59.63" fill="#109087" stroke="#109087" stroke-width="0.25" stroke-linejoin="round"/><polygon points="121.41,64.97 128.18,59.63 123.90,58.77" fill="#093f4a" stroke="#093f4a" stroke-width="0.25" stroke-linejoin="round"/><polygon points="108.07,68.61 112.13,68.19 107.81,62.69" fill="#1aaca0" stroke="#1aaca0" stroke-width="0.25" stroke-linejoin="round"/><polygon points="127.98,73.39 135.88,72.47 131.94,67.89" fill="#093c48" stroke="#093c48" stroke-width="0.25" stroke-linejoin="round"/><polygon points="127.98,73.39 124.18,72.59 121.76,80.81" fill="#093e49" stroke="#093e49" stroke-width="0.25" stroke-linejoin="round"/><polygon points="124.18,72.59 118.91,75.14 121.76,80.81" fill="#093f4b" stroke="#093f4b" stroke-width="0.25" stroke-linejoin="round"/><polygon points="143.15,8.71 140.16,10.63 144.87,10.85" fill="#33cdbb" stroke="#33cdbb" stroke-width="0.25" stroke-linejoin="round"/><polygon points="144.01,27.53 139.52,28.60 142.08,31.60" fill="#2cc3b3" stroke="#2cc3b3" stroke-width="0.25" stroke-linejoin="round"/><polygon points="128.18,59.63 134.60,61.77 133.74,59.63" fill="#0a414d" stroke="#0a414d" stroke-width="0.25" stroke-linejoin="round"/><polygon points="134.60,61.77 128.18,59.63 131.94,67.89" fill="#0a424e" stroke="#0a424e" stroke-width="0.25" stroke-linejoin="round"/><polygon points="109.35,9.56 108.92,6.14 106.57,8.71" fill="#30c9b8" stroke="#30c9b8" stroke-width="0.25" stroke-linejoin="round"/><polygon points="109.35,9.56 112.34,8.28 108.92,6.14" fill="#31cab9" stroke="#31cab9" stroke-width="0.25" stroke-linejoin="round"/><polygon points="104.21,11.27 109.35,9.56 106.57,8.71" fill="#31cab9" stroke="#31cab9" stroke-width="0.25" stroke-linejoin="round"/><polygon points="105.07,14.27 109.35,9.56 104.21,11.27" fill="#2fc7b6" stroke="#2fc7b6" stroke-width="0.25Line truncated
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" role="img" aria-label="Guará"><style>.a{stroke:#0f766e}.b{stroke:#14b8a6}.t{fill:#1d1d1f}@media (prefers-color-scheme:dark){.a{stroke:#2dd4bf}.b{stroke:#5eead4}.t{fill:#f5f5f7}}</style><defs><clipPath id="g-head"><path d="M50 95 C46 88 43 80 40 74 C33 70 25 64 22 56 L14 6 L36 30 C40 28 45 27 50 27 C55 27 60 28 64 30 L86 6 L78 56 C75 64 67 70 60 74 C57 80 54 88 50 95 Z"/></clipPath></defs><g clip-path="url(#g-head)" fill="none" stroke-width="4.2"><path class="a" d="M50 93A7 7 0 0 1 50 107"/><path class="b" d="M50 93A7 7 0 0 0 50 107" stroke-dasharray="3 3" stroke-dashoffset="0"/><path class="a" d="M50 86A14 14 0 0 1 50 114"/><path class="b" d="M50 86A14 14 0 0 0 50 114" stroke-dasharray="6 4" stroke-dashoffset="3"/><path class="a" d="M50 79A21 21 0 0 1 50 121"/><path class="b" d="M50 79A21 21 0 0 0 50 121" stroke-dasharray="9 5" stroke-dashoffset="6"/><path class="a" d="M50 72A28 28 0 0 1 50 128"/><path class="b" d="M50 72A28 28 0 0 0 50 128" stroke-dasharray="3 6" stroke-dashoffset="9"/><path class="a" d="M50 65A35 35 0 0 1 50 135"/><path class="b" d="M50 65A35 35 0 0 0 50 135" stroke-dasharray="6 3" stroke-dashoffset="12"/><path class="a" d="M50 58A42 42 0 0 1 50 142"/><path class="b" d="M50 58A42 42 0 0 0 50 142" stroke-dasharray="9 4" stroke-dashoffset="15"/><path class="a" d="M50 51A49 49 0 0 1 50 149"/><path class="b" d="M50 51A49 49 0 0 0 50 149" stroke-dasharray="3 5" stroke-dashoffset="18"/><path class="a" d="M50 44A56 56 0 0 1 50 156"/><path class="b" d="M50 44A56 56 0 0 0 50 156" stroke-dasharray="6 6" stroke-dashoffset="21"/><path class="a" d="M50 37A63 63 0 0 1 50 163"/><path class="b" d="M50 37A63 63 0 0 0 50 163" stroke-dasharray="9 3" stroke-dashoffset="24"/><path class="a" d="M50 30A70 70 0 0 1 50 170"/><path class="b" d="M50 30A70 70 0 0 0 50 170" stroke-dasharray="3 4" stroke-dashoffset="27"/><path class="a" d="M50 23A77 77 0 0 1 50 177"/><path class="b" d="M50 23A77 77 0 0 0 50 177" stroke-dasharray="6 5" stroke-dashoffset="30"/><path class="a" d="M50 16A84 84 0 0 1 50 184"/><path class="b" d="M50 16A84 84 0 0 0 50 184" stroke-dasharray="9 6" stroke-dashoffset="33"/><path class="a" d="M50 9A91 91 0 0 1 50 191"/><path class="b" d="M50 9A91 91 0 0 0 50 191" stroke-dasharray="3 3" stroke-dashoffset="36"/><path class="a" d="M50 2A98 98 0 0 1 50 198"/><path class="b" d="M50 2A98 98 0 0 0 50 198" stroke-dasharray="6 4" stroke-dashoffset="39"/><rect class="t" stroke="none" x="0" y="74" width="100" height="30"/></g><path class="t" d="M37 50Q42 47 46 52Q41 53 37 50ZM63 50Q58 47 54 52Q59 53 63 50Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 2.6 KiB |
@@ -1,5 +1,48 @@
|
||||
// Dicionário português -> inglês da interface. {n} marca um valor variável.
|
||||
export const EN = {
|
||||
// saúde do disco (SMART)
|
||||
'Saúde do disco': 'Disk health',
|
||||
'O SMART não pôde ser lido. Instale o pacote smartmontools (comando smartctl) e rode como administrador para ver a saúde do disco.': 'SMART could not be read. Install the smartmontools package (smartctl command) and run as administrator to see the disk health.',
|
||||
'Setores realocados': 'Reallocated sectors',
|
||||
'Setores pendentes de realocação': 'Pending sectors',
|
||||
'Setores incorrigíveis offline': 'Offline uncorrectable sectors',
|
||||
'Erros incorrigíveis reportados': 'Reported uncorrectable errors',
|
||||
'Erros de CRC na interface (cabo ou porta)': 'Interface CRC errors (cable or port)',
|
||||
'Erros registrados no log do disco': 'Errors in the disk log',
|
||||
'Aviso crítico NVMe': 'NVMe critical warning',
|
||||
'Erros de mídia': 'Media errors',
|
||||
'Reserva de blocos abaixo do limite': 'Spare blocks below threshold',
|
||||
'Erros de leitura/gravação vistos pelo sistema': 'Read/write errors seen by the system',
|
||||
'O sistema já registrou erros de E/S neste disco.': 'The system has already logged I/O errors on this disk.',
|
||||
'Estado': 'Status',
|
||||
'Bom': 'Good',
|
||||
'Atenção': 'Caution',
|
||||
'Ruim': 'Bad',
|
||||
'Temperatura': 'Temperature',
|
||||
'Horas ligado': 'Power on hours',
|
||||
'Vezes ligado': 'Power on count',
|
||||
'Total lido': 'Host reads',
|
||||
'Total gravado': 'Host writes',
|
||||
'Atributos SMART ({n})': 'SMART attributes ({n})',
|
||||
'Atributo': 'Attribute',
|
||||
'Atual': 'Current',
|
||||
'Pior': 'Worst',
|
||||
'Limite': 'Threshold',
|
||||
'Bruto': 'Raw',
|
||||
'Modelo': 'Model',
|
||||
'Nº de série': 'Serial number',
|
||||
'Família': 'Family',
|
||||
'Modo de transferência': 'Transfer mode',
|
||||
'Capacidade': 'Capacity',
|
||||
'Rotação': 'Rotation rate',
|
||||
'Formato': 'Form factor',
|
||||
'Recursos': 'Features',
|
||||
'O SMART é do disco inteiro: os dados abaixo são de': 'SMART belongs to the whole disk: the data below is for',
|
||||
', que contém': ', which contains',
|
||||
'Imagem de disco: não há SMART para avaliar.': 'Disk image: there is no SMART to check.',
|
||||
'Nenhum sinal de defeito encontrado pelo SMART.': 'SMART found no signs of failure.',
|
||||
'Este disco mostra sinais sérios de defeito.': 'This disk shows serious signs of failure.',
|
||||
'Este disco mostra sinais de desgaste ou erros.': 'This disk shows signs of wear or errors.',
|
||||
// barra lateral e estrutura
|
||||
'Recuperação de arquivos': 'File recovery',
|
||||
'Dispositivos': 'Devices',
|
||||
|
||||
@@ -14,10 +14,10 @@
|
||||
<button class="icon-btn" id="menuBtn" aria-label="Abrir menu" aria-expanded="false">
|
||||
<svg viewBox="0 0 24 24" width="22" height="22"><path d="M4 7h16M4 12h16M4 17h16" stroke="currentColor" stroke-width="2" stroke-linecap="round" fill="none"/></svg>
|
||||
</button>
|
||||
<img src="guara.svg" alt="" width="24" height="24"><strong>Guará</strong>
|
||||
<svg class="logo" width="24" height="24" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><defs><clipPath id="g-head-top"><path d="M50 95 C46 88 43 80 40 74 C33 70 25 64 22 56 L14 6 L36 30 C40 28 45 27 50 27 C55 27 60 28 64 30 L86 6 L78 56 C75 64 67 70 60 74 C57 80 54 88 50 95 Z"/></clipPath></defs><g clip-path="url(#g-head-top)" fill="none" stroke-width="4.2"><path class="a" d="M50 93A7 7 0 0 1 50 107"/><path class="b" d="M50 93A7 7 0 0 0 50 107" stroke-dasharray="3 3" stroke-dashoffset="0"/><path class="a" d="M50 86A14 14 0 0 1 50 114"/><path class="b" d="M50 86A14 14 0 0 0 50 114" stroke-dasharray="6 4" stroke-dashoffset="3"/><path class="a" d="M50 79A21 21 0 0 1 50 121"/><path class="b" d="M50 79A21 21 0 0 0 50 121" stroke-dasharray="9 5" stroke-dashoffset="6"/><path class="a" d="M50 72A28 28 0 0 1 50 128"/><path class="b" d="M50 72A28 28 0 0 0 50 128" stroke-dasharray="3 6" stroke-dashoffset="9"/><path class="a" d="M50 65A35 35 0 0 1 50 135"/><path class="b" d="M50 65A35 35 0 0 0 50 135" stroke-dasharray="6 3" stroke-dashoffset="12"/><path class="a" d="M50 58A42 42 0 0 1 50 142"/><path class="b" d="M50 58A42 42 0 0 0 50 142" stroke-dasharray="9 4" stroke-dashoffset="15"/><path class="a" d="M50 51A49 49 0 0 1 50 149"/><path class="b" d="M50 51A49 49 0 0 0 50 149" stroke-dasharray="3 5" stroke-dashoffset="18"/><path class="a" d="M50 44A56 56 0 0 1 50 156"/><path class="b" d="M50 44A56 56 0 0 0 50 156" stroke-dasharray="6 6" stroke-dashoffset="21"/><path class="a" d="M50 37A63 63 0 0 1 50 163"/><path class="b" d="M50 37A63 63 0 0 0 50 163" stroke-dasharray="9 3" stroke-dashoffset="24"/><path class="a" d="M50 30A70 70 0 0 1 50 170"/><path class="b" d="M50 30A70 70 0 0 0 50 170" stroke-dasharray="3 4" stroke-dashoffset="27"/><path class="a" d="M50 23A77 77 0 0 1 50 177"/><path class="b" d="M50 23A77 77 0 0 0 50 177" stroke-dasharray="6 5" stroke-dashoffset="30"/><path class="a" d="M50 16A84 84 0 0 1 50 184"/><path class="b" d="M50 16A84 84 0 0 0 50 184" stroke-dasharray="9 6" stroke-dashoffset="33"/><path class="a" d="M50 9A91 91 0 0 1 50 191"/><path class="b" d="M50 9A91 91 0 0 0 50 191" stroke-dasharray="3 3" stroke-dashoffset="36"/><path class="a" d="M50 2A98 98 0 0 1 50 198"/><path class="b" d="M50 2A98 98 0 0 0 50 198" stroke-dasharray="6 4" stroke-dashoffset="39"/><rect class="t" stroke="none" x="0" y="74" width="100" height="30"/></g><path class="t" d="M37 50Q42 47 46 52Q41 53 37 50ZM63 50Q58 47 54 52Q59 53 63 50Z"/></svg><strong>Guará</strong>
|
||||
</header>
|
||||
<aside class="sidebar" id="sidebar" aria-label="Dispositivos e sessões">
|
||||
<div class="brand"><img src="guara.svg" alt="" width="30" height="30"><div><strong>Guará</strong><small>Recuperação de arquivos</small></div></div>
|
||||
<div class="brand"><svg class="logo" width="30" height="30" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><defs><clipPath id="g-head-side"><path d="M50 95 C46 88 43 80 40 74 C33 70 25 64 22 56 L14 6 L36 30 C40 28 45 27 50 27 C55 27 60 28 64 30 L86 6 L78 56 C75 64 67 70 60 74 C57 80 54 88 50 95 Z"/></clipPath></defs><g clip-path="url(#g-head-side)" fill="none" stroke-width="4.2"><path class="a" d="M50 93A7 7 0 0 1 50 107"/><path class="b" d="M50 93A7 7 0 0 0 50 107" stroke-dasharray="3 3" stroke-dashoffset="0"/><path class="a" d="M50 86A14 14 0 0 1 50 114"/><path class="b" d="M50 86A14 14 0 0 0 50 114" stroke-dasharray="6 4" stroke-dashoffset="3"/><path class="a" d="M50 79A21 21 0 0 1 50 121"/><path class="b" d="M50 79A21 21 0 0 0 50 121" stroke-dasharray="9 5" stroke-dashoffset="6"/><path class="a" d="M50 72A28 28 0 0 1 50 128"/><path class="b" d="M50 72A28 28 0 0 0 50 128" stroke-dasharray="3 6" stroke-dashoffset="9"/><path class="a" d="M50 65A35 35 0 0 1 50 135"/><path class="b" d="M50 65A35 35 0 0 0 50 135" stroke-dasharray="6 3" stroke-dashoffset="12"/><path class="a" d="M50 58A42 42 0 0 1 50 142"/><path class="b" d="M50 58A42 42 0 0 0 50 142" stroke-dasharray="9 4" stroke-dashoffset="15"/><path class="a" d="M50 51A49 49 0 0 1 50 149"/><path class="b" d="M50 51A49 49 0 0 0 50 149" stroke-dasharray="3 5" stroke-dashoffset="18"/><path class="a" d="M50 44A56 56 0 0 1 50 156"/><path class="b" d="M50 44A56 56 0 0 0 50 156" stroke-dasharray="6 6" stroke-dashoffset="21"/><path class="a" d="M50 37A63 63 0 0 1 50 163"/><path class="b" d="M50 37A63 63 0 0 0 50 163" stroke-dasharray="9 3" stroke-dashoffset="24"/><path class="a" d="M50 30A70 70 0 0 1 50 170"/><path class="b" d="M50 30A70 70 0 0 0 50 170" stroke-dasharray="3 4" stroke-dashoffset="27"/><path class="a" d="M50 23A77 77 0 0 1 50 177"/><path class="b" d="M50 23A77 77 0 0 0 50 177" stroke-dasharray="6 5" stroke-dashoffset="30"/><path class="a" d="M50 16A84 84 0 0 1 50 184"/><path class="b" d="M50 16A84 84 0 0 0 50 184" stroke-dasharray="9 6" stroke-dashoffset="33"/><path class="a" d="M50 9A91 91 0 0 1 50 191"/><path class="b" d="M50 9A91 91 0 0 0 50 191" stroke-dasharray="3 3" stroke-dashoffset="36"/><path class="a" d="M50 2A98 98 0 0 1 50 198"/><path class="b" d="M50 2A98 98 0 0 0 50 198" stroke-dasharray="6 4" stroke-dashoffset="39"/><rect class="t" stroke="none" x="0" y="74" width="100" height="30"/></g><path class="t" d="M37 50Q42 47 46 52Q41 53 37 50ZM63 50Q58 47 54 52Q59 53 63 50Z"/></svg><div><strong>Guará</strong><small>Recuperação de arquivos</small></div></div>
|
||||
<nav>
|
||||
<div class="side-title">Dispositivos <button class="icon-btn small" id="refreshBtn" title="Atualizar lista" aria-label="Atualizar lista"><svg viewBox="0 0 24 24" width="16" height="16"><path d="M20 12a8 8 0 1 1-2.5-5.8M20 4v5h-5" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg></button></div>
|
||||
<ul id="deviceList" class="list"></ul>
|
||||
|
||||