Studio Lite after Wave A (f84883c): thread-caching allocator, compiled-code cache, own tab, Fast draft, accessibility; engine fixes (EXIF/ICC, bounded work, small shapes)
Browse files- README.md +8 -5
- index.html +106 -14
- studio/assets/engine.worker-D2MRJiuD.js +1 -0
- studio/assets/engine.worker-wbMABDxy.js +0 -1
- studio/assets/main-BwYpaGSz.css +0 -1
- studio/assets/main-CdmTdoOg.css +1 -0
- studio/assets/main-DydoLkFD.js +0 -0
- studio/assets/main-v2TpNvwt.js +0 -0
- studio/guide/batch.html +3 -3
- studio/guide/export.html +7 -4
- studio/guide/fabricate.html +3 -3
- studio/guide/getting-started.html +22 -4
- studio/guide/guide.css +23 -8
- studio/guide/index.html +17 -5
- studio/guide/install.html +3 -3
- studio/guide/minify.html +3 -3
- studio/guide/palette.html +3 -3
- studio/guide/result.html +3 -3
- studio/guide/settings.html +3 -3
- studio/guide/shortcuts.html +56 -7
- studio/guide/troubleshooting.html +19 -6
- studio/guide/tune.html +4 -4
- studio/guide/tutorials/favicon-asset-pack.html +3 -3
- studio/guide/tutorials/jpeg-logo.html +3 -3
- studio/guide/tutorials/laser.html +3 -3
- studio/guide/tutorials/vinyl-htv.html +3 -3
- studio/guide/viewer.html +35 -9
- studio/index.html +2 -2
- studio/pkg-threads/inkvec_studio_wasm.js +1 -1
- studio/pkg-threads/inkvec_studio_wasm_bg.wasm +2 -2
- studio/pkg-threads/snippets/wasm-bindgen-rayon-38edf6e439f6d70d/src/workerHelpers.js +1 -1
- studio/pkg/inkvec_studio_wasm_bg.wasm +2 -2
README.md
CHANGED
|
@@ -29,7 +29,7 @@ own processor.
|
|
| 29 |
It is the desktop app's interface and the desktop app's code, not a demo of them:
|
| 30 |
|
| 31 |
- **Vectorize** with a live draft while you move a control and the full trace once you stop,
|
| 32 |
-
|
| 33 |
groups, snapping to a brand palette, and export (SVG, minified SVG, PNG sizes, a favicon set,
|
| 34 |
an asset pack) as a download.
|
| 35 |
- **Minify SVG**: rewrite an SVG you already have in fewer bytes, with the difference measured.
|
|
@@ -38,10 +38,13 @@ It is the desktop app's interface and the desktop app's code, not a demo of them
|
|
| 38 |
into your browser, in the background as the Studio opens (not when your browser asks to save
|
| 39 |
data), and run on your GPU where there is one (ONNX Runtime Web).
|
| 40 |
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
|
|
|
|
|
|
|
|
|
| 45 |
|
| 46 |
The desktop app, **Inkvec Studio** (Windows, macOS, Linux), is the same interface plus what a
|
| 47 |
browser cannot do: folders of images in one batch, the `inkvec` command line, the right-click
|
|
|
|
| 29 |
It is the desktop app's interface and the desktop app's code, not a demo of them:
|
| 30 |
|
| 31 |
- **Vectorize** with a live draft while you move a control and the full trace once you stop,
|
| 32 |
+
ten presets, the Custom wizard, the measured colour difference, the palette with colour
|
| 33 |
groups, snapping to a brand palette, and export (SVG, minified SVG, PNG sizes, a favicon set,
|
| 34 |
an asset pack) as a download.
|
| 35 |
- **Minify SVG**: rewrite an SVG you already have in fewer bytes, with the difference measured.
|
|
|
|
| 38 |
into your browser, in the background as the Studio opens (not when your browser asks to save
|
| 39 |
data), and run on your GPU where there is one (ONNX Runtime Web).
|
| 40 |
|
| 41 |
+
Hugging Face shows this Space inside a frame on its own page, and a browser will not give a
|
| 42 |
+
framed page the threads the engine needs (cross-origin isolation needs every page above it to
|
| 43 |
+
ask for it). So the front page opens the Studio in **a tab of its own**, where it runs on every
|
| 44 |
+
core and can use the denoiser; a logo dropped on the front page goes with it, handed over
|
| 45 |
+
inside your browser. Its own address:
|
| 46 |
+
<https://logolabs-inkvec.static.hf.space/studio/index.html>. It is built for a laptop or
|
| 47 |
+
desktop screen; **Full screen** is in its top bar.
|
| 48 |
|
| 49 |
The desktop app, **Inkvec Studio** (Windows, macOS, Linux), is the same interface plus what a
|
| 50 |
browser cannot do: folders of images in one batch, the `inkvec` command line, the right-click
|
index.html
CHANGED
|
@@ -17,6 +17,11 @@
|
|
| 17 |
--ink:#faf8f5;--dim:rgba(250,248,245,.75);--faint:rgba(250,248,245,.55);--muted:rgba(250,248,245,.4);
|
| 18 |
--rule:rgba(250,248,245,.08);--rule2:#2a2724;
|
| 19 |
--accent:#c9754a;--accent-hover:#d4896a;--accent-ink:#1a1816;--accent-soft:rgba(201,117,74,.12);--accent-subtle:rgba(201,117,74,.08);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
--gold:#b8976c;
|
| 21 |
--good:#34d399;--goodbg:rgba(52,211,153,.15);--bad:#f87171;--check:#2a2724;
|
| 22 |
--anchor:#f87171;--handle:#b8976c;--wire:#faf8f5;
|
|
@@ -28,13 +33,16 @@
|
|
| 28 |
*{box-sizing:border-box}
|
| 29 |
body{margin:0;background:var(--paper);color:var(--ink);font:15px/1.5 var(--font-body);-webkit-font-smoothing:antialiased}
|
| 30 |
a{color:var(--accent);text-decoration:none}a:hover{color:var(--accent-hover);text-decoration:underline}
|
|
|
|
|
|
|
|
|
|
| 31 |
button,.btn{font:600 13.5px/1 var(--font-body);color:var(--ink);background:var(--card);border:1px solid var(--rule);border-radius:var(--radius-sm);padding:10px 14px;cursor:pointer;transition:border-color .15s,background .15s,transform .1s,box-shadow .15s;display:inline-flex;align-items:center;gap:8px;text-decoration:none}
|
| 32 |
button:hover,.btn:hover{border-color:rgba(250,248,245,.18);text-decoration:none;color:var(--ink)}button:active,.btn:active{transform:translateY(1px) scale(.98)}
|
| 33 |
.btn.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-ink);padding:15px 28px;font-size:16px;border-radius:var(--radius-full)}
|
| 34 |
.btn.primary:hover{background:var(--accent-hover);border-color:var(--accent-hover);box-shadow:var(--glow);transform:translateY(-1px);color:var(--accent-ink)}
|
| 35 |
.btn.big{padding:15px 24px;font-size:15px;border-radius:var(--radius-full)}
|
| 36 |
.btn svg{width:18px;height:18px}
|
| 37 |
-
button[aria-pressed="true"]{background:var(--accent-soft);border-color:var(--accent);color:var(--accent)}
|
| 38 |
.mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}
|
| 39 |
code{font-family:var(--font-mono);font-size:.92em}
|
| 40 |
h1,h2,h3{font-family:var(--font-display)}
|
|
@@ -70,6 +78,11 @@ h1{font-size:clamp(32px,4.6vw,52px);line-height:1.06;letter-spacing:-.025em;font
|
|
| 70 |
.samples a{display:inline-flex;align-items:center;gap:7px;padding:5px 10px 5px 5px;border:1px solid var(--rule);border-radius:999px;color:var(--dim);font-size:12.5px;font-weight:600;background:var(--stage)}
|
| 71 |
.samples a:hover{border-color:var(--accent);color:var(--ink);text-decoration:none}
|
| 72 |
.samples img{width:22px;height:22px;border-radius:50%;background:#fff;object-fit:contain}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
/* what's new */
|
| 74 |
.newgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin-top:18px}
|
| 75 |
.new{background:var(--card);border:1px solid var(--rule);border-radius:var(--radius);padding:16px 18px;box-shadow:var(--shadow)}
|
|
@@ -108,7 +121,7 @@ h1{font-size:clamp(32px,4.6vw,52px);line-height:1.06;letter-spacing:-.025em;font
|
|
| 108 |
.tools .legend i{display:inline-block;width:10px;height:10px;border-radius:50%;vertical-align:-1px;margin-right:5px}
|
| 109 |
.seg{display:inline-flex;background:var(--card);border:1px solid var(--rule);border-radius:var(--radius-full);padding:3px;gap:2px;flex-wrap:wrap}
|
| 110 |
.seg button{border:0;background:transparent;border-radius:var(--radius-full);padding:7px 10px;font-size:12.5px;color:var(--dim)}
|
| 111 |
-
.seg button[aria-pressed="true"]{background:var(--accent-soft);color:var(--accent)}
|
| 112 |
/* gallery */
|
| 113 |
.gal{display:grid;grid-template-columns:300px 1fr;gap:16px;margin-top:18px;align-items:start}
|
| 114 |
@media (max-width:820px){.gal{grid-template-columns:1fr}}
|
|
@@ -123,7 +136,7 @@ h1{font-size:clamp(32px,4.6vw,52px);line-height:1.06;letter-spacing:-.025em;font
|
|
| 123 |
.case .th img{width:100%;height:100%;object-fit:contain}
|
| 124 |
.case .nm{width:100%;font-size:11px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--dim)}
|
| 125 |
.case[aria-pressed="true"]{border-color:var(--accent);background:var(--accent-soft)}
|
| 126 |
-
.case[aria-pressed="true"] .nm{color:var(--accent)}
|
| 127 |
.caption{margin:8px 0 0;font-size:13px;color:var(--dim)}
|
| 128 |
.caption b{color:var(--ink)}
|
| 129 |
@media (max-width:820px){
|
|
@@ -248,36 +261,115 @@ const el = (tag, cls, html) => { const e = document.createElement(tag); if (cls)
|
|
| 248 |
const esc = s => String(s).replace(/[&<>"]/g, c => ({"&":"&","<":"<",">":">",'"':"""}[c]));
|
| 249 |
|
| 250 |
// ---------------------------------------------------------------- the way into the Studio
|
| 251 |
-
//
|
| 252 |
-
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 253 |
const framed = (() => { try { return window.self !== window.top; } catch { return true; } })() ||
|
| 254 |
[...(location.ancestorOrigins || [])].some(o => /(^|\.)huggingface\.co(:\d+)?$/.test(o.replace(/^[a-z]+:\/\//, '')));
|
|
|
|
| 255 |
document.documentElement.classList.toggle('framed', framed);
|
| 256 |
-
if (
|
| 257 |
-
$("ctanote").innerHTML = `Best on a laptop or desktop screen.
|
|
|
|
| 258 |
}
|
| 259 |
-
|
| 260 |
-
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 261 |
const HANDOFF_DB = "inkvec-handoff";
|
| 262 |
-
|
|
|
|
|
|
|
|
|
|
| 263 |
const req = indexedDB.open(HANDOFF_DB, 1);
|
| 264 |
req.onupgradeneeded = () => req.result.createObjectStore("files");
|
| 265 |
-
req.onsuccess =
|
| 266 |
-
const bytes = new Uint8Array(await file.arrayBuffer());
|
| 267 |
const tx = req.result.transaction("files", "readwrite");
|
| 268 |
-
tx.objectStore("files").put({ name
|
| 269 |
tx.oncomplete = () => { location.href = "studio/index.html?open=handoff"; };
|
| 270 |
};
|
| 271 |
req.onerror = () => { location.href = "studio/index.html"; };
|
| 272 |
}
|
| 273 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 274 |
const drop = $("drop");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 275 |
drop.addEventListener("dragover", e => { e.preventDefault(); drop.classList.add("over"); });
|
| 276 |
drop.addEventListener("dragleave", () => drop.classList.remove("over"));
|
| 277 |
drop.addEventListener("drop", e => { e.preventDefault(); drop.classList.remove("over"); const f = e.dataTransfer.files[0]; if (f) handOff(f); });
|
| 278 |
document.addEventListener("paste", e => { const f = [...(e.clipboardData?.files || [])][0]; if (f) handOff(f); });
|
| 279 |
for (const [file, label] of [["flat-logo.png", "Flat logo"], ["crest-filigree.png", "Crest"], ["signature-bw.png", "Signature"]]){
|
| 280 |
const a = el("a"); a.href = `studio/index.html?sample=${file}`; a.innerHTML = `<img src="studio/samples/${file}" alt="">${label}`;
|
|
|
|
| 281 |
a.addEventListener("click", e => e.stopPropagation());
|
| 282 |
$("samples").appendChild(a);
|
| 283 |
}
|
|
|
|
| 17 |
--ink:#faf8f5;--dim:rgba(250,248,245,.75);--faint:rgba(250,248,245,.55);--muted:rgba(250,248,245,.4);
|
| 18 |
--rule:rgba(250,248,245,.08);--rule2:#2a2724;
|
| 19 |
--accent:#c9754a;--accent-hover:#d4896a;--accent-ink:#1a1816;--accent-soft:rgba(201,117,74,.12);--accent-subtle:rgba(201,117,74,.08);
|
| 20 |
+
/* Copper as text on a copper-tinted ground (a pressed toggle, the chosen gallery case):
|
| 21 |
+
--accent-soft over --card composites to #352922, where --accent is 4.1:1 and fails WCAG 2.2
|
| 22 |
+
SC 1.4.3 (4.5:1 below 24 px; r2-product's axe run). The lighter copper is 5.1:1 there and
|
| 23 |
+
5.9:1 on --card. */
|
| 24 |
+
--accent-text:#d4896a;
|
| 25 |
--gold:#b8976c;
|
| 26 |
--good:#34d399;--goodbg:rgba(52,211,153,.15);--bad:#f87171;--check:#2a2724;
|
| 27 |
--anchor:#f87171;--handle:#b8976c;--wire:#faf8f5;
|
|
|
|
| 33 |
*{box-sizing:border-box}
|
| 34 |
body{margin:0;background:var(--paper);color:var(--ink);font:15px/1.5 var(--font-body);-webkit-font-smoothing:antialiased}
|
| 35 |
a{color:var(--accent);text-decoration:none}a:hover{color:var(--accent-hover);text-decoration:underline}
|
| 36 |
+
/* A link inside a sentence is underlined, not told apart by its colour alone (WCAG 2.2 SC
|
| 37 |
+
1.4.1); navigation, buttons and tiles keep their own shapes. */
|
| 38 |
+
.note a,.lede a,.cta-note a,.caption a,.how a,footer a{text-decoration:underline;text-underline-offset:2px}
|
| 39 |
button,.btn{font:600 13.5px/1 var(--font-body);color:var(--ink);background:var(--card);border:1px solid var(--rule);border-radius:var(--radius-sm);padding:10px 14px;cursor:pointer;transition:border-color .15s,background .15s,transform .1s,box-shadow .15s;display:inline-flex;align-items:center;gap:8px;text-decoration:none}
|
| 40 |
button:hover,.btn:hover{border-color:rgba(250,248,245,.18);text-decoration:none;color:var(--ink)}button:active,.btn:active{transform:translateY(1px) scale(.98)}
|
| 41 |
.btn.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-ink);padding:15px 28px;font-size:16px;border-radius:var(--radius-full)}
|
| 42 |
.btn.primary:hover{background:var(--accent-hover);border-color:var(--accent-hover);box-shadow:var(--glow);transform:translateY(-1px);color:var(--accent-ink)}
|
| 43 |
.btn.big{padding:15px 24px;font-size:15px;border-radius:var(--radius-full)}
|
| 44 |
.btn svg{width:18px;height:18px}
|
| 45 |
+
button[aria-pressed="true"]{background:var(--accent-soft);border-color:var(--accent);color:var(--accent-text)}
|
| 46 |
.mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}
|
| 47 |
code{font-family:var(--font-mono);font-size:.92em}
|
| 48 |
h1,h2,h3{font-family:var(--font-display)}
|
|
|
|
| 78 |
.samples a{display:inline-flex;align-items:center;gap:7px;padding:5px 10px 5px 5px;border:1px solid var(--rule);border-radius:999px;color:var(--dim);font-size:12.5px;font-weight:600;background:var(--stage)}
|
| 79 |
.samples a:hover{border-color:var(--accent);color:var(--ink);text-decoration:none}
|
| 80 |
.samples img{width:22px;height:22px;border-radius:50%;background:#fff;object-fit:contain}
|
| 81 |
+
.drop.holding{cursor:default}
|
| 82 |
+
.drop.holding > :not(.handoff):not(input){display:none}
|
| 83 |
+
.handoff{display:flex;flex-direction:column;align-items:center;gap:8px}
|
| 84 |
+
.handoff .acts{display:flex;gap:8px;flex-wrap:wrap;justify-content:center;margin-top:6px}
|
| 85 |
+
.handoff .btn.primary{padding:12px 22px;font-size:15px}
|
| 86 |
/* what's new */
|
| 87 |
.newgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin-top:18px}
|
| 88 |
.new{background:var(--card);border:1px solid var(--rule);border-radius:var(--radius);padding:16px 18px;box-shadow:var(--shadow)}
|
|
|
|
| 121 |
.tools .legend i{display:inline-block;width:10px;height:10px;border-radius:50%;vertical-align:-1px;margin-right:5px}
|
| 122 |
.seg{display:inline-flex;background:var(--card);border:1px solid var(--rule);border-radius:var(--radius-full);padding:3px;gap:2px;flex-wrap:wrap}
|
| 123 |
.seg button{border:0;background:transparent;border-radius:var(--radius-full);padding:7px 10px;font-size:12.5px;color:var(--dim)}
|
| 124 |
+
.seg button[aria-pressed="true"]{background:var(--accent-soft);color:var(--accent-text)}
|
| 125 |
/* gallery */
|
| 126 |
.gal{display:grid;grid-template-columns:300px 1fr;gap:16px;margin-top:18px;align-items:start}
|
| 127 |
@media (max-width:820px){.gal{grid-template-columns:1fr}}
|
|
|
|
| 136 |
.case .th img{width:100%;height:100%;object-fit:contain}
|
| 137 |
.case .nm{width:100%;font-size:11px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--dim)}
|
| 138 |
.case[aria-pressed="true"]{border-color:var(--accent);background:var(--accent-soft)}
|
| 139 |
+
.case[aria-pressed="true"] .nm{color:var(--accent-text)}
|
| 140 |
.caption{margin:8px 0 0;font-size:13px;color:var(--dim)}
|
| 141 |
.caption b{color:var(--ink)}
|
| 142 |
@media (max-width:820px){
|
|
|
|
| 261 |
const esc = s => String(s).replace(/[&<>"]/g, c => ({"&":"&","<":"<",">":">",'"':"""}[c]));
|
| 262 |
|
| 263 |
// ---------------------------------------------------------------- the way into the Studio
|
| 264 |
+
// Hugging Face shows this page inside an iframe on huggingface.co, which sends no isolation
|
| 265 |
+
// headers, and a frame is cross-origin isolated only if every page above it is (web.dev,
|
| 266 |
+
// "Making your website cross-origin isolated using COOP and COEP"; MDN, crossOriginIsolated).
|
| 267 |
+
// A Studio opened inside the frame therefore runs on one core and without the denoiser,
|
| 268 |
+
// while the same address in a tab of its own is isolated, since the static host sends the
|
| 269 |
+
// headers itself: 2048 px Quality traces 1.7-3.5x faster there (r2-product, measured). So
|
| 270 |
+
// inside the frame every way into the Studio opens it in a tab of its own. At the static
|
| 271 |
+
// host's own address the page is isolated and the Studio opens in this tab, as before.
|
| 272 |
const framed = (() => { try { return window.self !== window.top; } catch { return true; } })() ||
|
| 273 |
[...(location.ancestorOrigins || [])].some(o => /(^|\.)huggingface\.co(:\d+)?$/.test(o.replace(/^[a-z]+:\/\//, '')));
|
| 274 |
+
const ownTab = framed && !self.crossOriginIsolated;
|
| 275 |
document.documentElement.classList.toggle('framed', framed);
|
| 276 |
+
if (ownTab) {
|
| 277 |
+
$("ctanote").innerHTML = `Best on a laptop or desktop screen. The Studio opens in a tab of its own, where it runs on every core and can use the denoiser.`;
|
| 278 |
+
for (const a of document.querySelectorAll('a[href^="studio/index.html"]')) a.target = "_blank";
|
| 279 |
}
|
| 280 |
+
|
| 281 |
+
// A dropped, chosen or pasted file never leaves the machine. At the static host's own
|
| 282 |
+
// address it is handed over through this origin's IndexedDB and the Studio opens in this
|
| 283 |
+
// tab. Inside Hugging Face's frame neither storage nor messages reach the Studio's own tab:
|
| 284 |
+
// the frame's storage is partitioned under huggingface.co (the tab cannot read it), and the
|
| 285 |
+
// Studio's isolation (COOP same-origin) puts its tab in another browsing context group, which
|
| 286 |
+
// cuts it off from this frame. Measured in a framed stand-in: the window.open handle reads
|
| 287 |
+
// closed once the Studio loads, a postMessage to it is dropped, the tab's window.opener is
|
| 288 |
+
// null, and BroadcastChannel is partitioned too. What does cross is the address, so the file
|
| 289 |
+
// rides in the URL fragment, which is never sent to any server (RFC 3986, section 3.5).
|
| 290 |
+
// Not from the literature: the fragment as a hand-off between a partitioned frame and an
|
| 291 |
+
// isolated tab; see also: WHATWG HTML, "Cross-origin opener policies" (browsing context
|
| 292 |
+
// group switches), and Chromium's storage partitioning (third-party storage keyed by the
|
| 293 |
+
// top-level site).
|
| 294 |
const HANDOFF_DB = "inkvec-handoff";
|
| 295 |
+
// The largest file that fits: base64 makes 1.5 MB into 2,000,000 characters, inside
|
| 296 |
+
// Chromium's 2 MiB limit on a URL (url::kMaxURLChars); a longer one opens as about:blank.
|
| 297 |
+
const HANDOFF_MAX = 1_500_000;
|
| 298 |
+
function handOffHere(name, bytes){
|
| 299 |
const req = indexedDB.open(HANDOFF_DB, 1);
|
| 300 |
req.onupgradeneeded = () => req.result.createObjectStore("files");
|
| 301 |
+
req.onsuccess = () => {
|
|
|
|
| 302 |
const tx = req.result.transaction("files", "readwrite");
|
| 303 |
+
tx.objectStore("files").put({ name, bytes }, "open");
|
| 304 |
tx.oncomplete = () => { location.href = "studio/index.html?open=handoff"; };
|
| 305 |
};
|
| 306 |
req.onerror = () => { location.href = "studio/index.html"; };
|
| 307 |
}
|
| 308 |
+
// base64url (RFC 4648, section 5), in slices so a large file never builds one huge argument list.
|
| 309 |
+
function base64url(bytes){
|
| 310 |
+
let s = "";
|
| 311 |
+
for (let i = 0; i < bytes.length; i += 0x8000) s += String.fromCharCode.apply(null, bytes.subarray(i, i + 0x8000));
|
| 312 |
+
return btoa(s).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
| 313 |
+
}
|
| 314 |
+
function handOffUrl(name, bytes){
|
| 315 |
+
return bytes.length <= HANDOFF_MAX ? `studio/index.html#open=${base64url(bytes)}&name=${encodeURIComponent(name)}` : null;
|
| 316 |
+
}
|
| 317 |
const drop = $("drop");
|
| 318 |
+
function release(){
|
| 319 |
+
drop.classList.remove("holding");
|
| 320 |
+
$("handoff")?.remove();
|
| 321 |
+
}
|
| 322 |
+
// Inside the frame: the file goes to a tab of its own. A browser lets a page open a tab only
|
| 323 |
+
// just after a click or a key press (transient user activation); choosing a file or pressing
|
| 324 |
+
// Ctrl+V leaves one, a file dropped from another application does not. Without one, the
|
| 325 |
+
// drop zone holds the file and offers the tab as a button, whose click is the activation.
|
| 326 |
+
function holdForTab(name, bytes, url){
|
| 327 |
+
release();
|
| 328 |
+
const mb = (bytes.length / 1e6).toFixed(1);
|
| 329 |
+
const card = el("div", "handoff");
|
| 330 |
+
card.id = "handoff";
|
| 331 |
+
card.setAttribute("role", "group");
|
| 332 |
+
card.setAttribute("aria-label", "Open the file in the Studio");
|
| 333 |
+
card.append(el("div", "big", url ? `${esc(name)} is ready to open` : `${esc(name)} is ${mb} MB`));
|
| 334 |
+
card.append(el("div", "small", url
|
| 335 |
+
? "It opens in a tab of its own, where the Studio runs on every core and can use the denoiser."
|
| 336 |
+
: `From inside Hugging Face's page, a file can reach a tab of its own only inside the page address, which holds up to ${(HANDOFF_MAX / 1e6).toFixed(1)} MB. Open the Studio in its own tab and drop the file there, or open it here, on one core.`));
|
| 337 |
+
const acts = el("div", "acts");
|
| 338 |
+
const tab = el("button", "btn primary", url ? "Open in its own tab" : "Open the Studio in its own tab");
|
| 339 |
+
tab.type = "button";
|
| 340 |
+
tab.dataset.act = "tab";
|
| 341 |
+
tab.addEventListener("click", e => { e.preventDefault(); e.stopPropagation(); window.open(url || "studio/index.html", "_blank"); release(); });
|
| 342 |
+
const here = el("button", "btn", "Open here, on one core");
|
| 343 |
+
here.type = "button";
|
| 344 |
+
here.dataset.act = "here";
|
| 345 |
+
here.addEventListener("click", e => { e.preventDefault(); e.stopPropagation(); handOffHere(name, bytes); });
|
| 346 |
+
const other = el("button", "btn", "Another file");
|
| 347 |
+
other.type = "button";
|
| 348 |
+
other.dataset.act = "cancel";
|
| 349 |
+
other.addEventListener("click", e => { e.preventDefault(); e.stopPropagation(); release(); });
|
| 350 |
+
acts.append(tab, here, other);
|
| 351 |
+
card.append(acts);
|
| 352 |
+
drop.classList.add("holding");
|
| 353 |
+
drop.append(card);
|
| 354 |
+
tab.focus();
|
| 355 |
+
}
|
| 356 |
+
async function handOff(file){
|
| 357 |
+
const name = file.name || "pasted image";
|
| 358 |
+
const bytes = new Uint8Array(await file.arrayBuffer());
|
| 359 |
+
if (!ownTab) return handOffHere(name, bytes);
|
| 360 |
+
const url = handOffUrl(name, bytes);
|
| 361 |
+
if (url && navigator.userActivation?.isActive && window.open(url, "_blank")) return;
|
| 362 |
+
holdForTab(name, bytes, url);
|
| 363 |
+
}
|
| 364 |
+
$("file").addEventListener("change", e => { const f = e.target.files[0]; e.target.value = ""; if (f) handOff(f); });
|
| 365 |
+
drop.addEventListener("click", e => { if (drop.classList.contains("holding")) e.preventDefault(); });
|
| 366 |
drop.addEventListener("dragover", e => { e.preventDefault(); drop.classList.add("over"); });
|
| 367 |
drop.addEventListener("dragleave", () => drop.classList.remove("over"));
|
| 368 |
drop.addEventListener("drop", e => { e.preventDefault(); drop.classList.remove("over"); const f = e.dataTransfer.files[0]; if (f) handOff(f); });
|
| 369 |
document.addEventListener("paste", e => { const f = [...(e.clipboardData?.files || [])][0]; if (f) handOff(f); });
|
| 370 |
for (const [file, label] of [["flat-logo.png", "Flat logo"], ["crest-filigree.png", "Crest"], ["signature-bw.png", "Signature"]]){
|
| 371 |
const a = el("a"); a.href = `studio/index.html?sample=${file}`; a.innerHTML = `<img src="studio/samples/${file}" alt="">${label}`;
|
| 372 |
+
if (ownTab) a.target = "_blank";
|
| 373 |
a.addEventListener("click", e => e.stopPropagation());
|
| 374 |
$("samples").appendChild(a);
|
| 375 |
}
|
studio/assets/engine.worker-D2MRJiuD.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
const a=self;let n=null,m=null,g=null,u=null,p=null;async function y(e,t){if(!e.ok||!e.body)return;const r=t||Number(e.headers.get("content-length"))||0;let s=0,o=0;const i=e.body.getReader();try{for(;;){const{done:l,value:d}=await i.read();if(l)break;s+=d.byteLength;const c=performance.now();c-o>40&&(o=c,a.postMessage({type:"loading",got:s,total:r}))}a.postMessage({type:"loading",got:s,total:Math.max(r,s),done:!0})}catch{}}const w=new Set(["capabilities","default_prefs","sanitise_prefs","reset_prefs","trace_bands","match_palette","close"]);let h=Promise.resolve();function _(e,t){const r=performance.now();return e(t).then(()=>a.postMessage({type:"pool",threads:t+1,poolError:null,ms:performance.now()-r}),s=>a.postMessage({type:"pool",threads:1,poolError:String(s?.message??s),ms:performance.now()-r}))}async function S(e){const t=typeof crossOriginIsolated<"u"&&crossOriginIsolated,r=t?"pkg-threads":"pkg",s=e.token?`?v=${e.token}`:"",o=new URL(`${r}/inkvec_studio_wasm.js${s}`,e.base).href,i=fetch(new URL(`${r}/inkvec_studio_wasm_bg.wasm${s}`,e.base));i.catch(()=>{}),n=await import(o);const l=await i;y(l.clone(),e.wasmBytes?.[r]),m=(await n.default({module_or_path:l})).memory??null,a.postMessage({type:"instantiated",denoiserUrl:n.denoiser_model_url(),denoiserSha256:n.denoiser_model_sha256()}),u=e.generations?new Int32Array(e.generations):null,p=e.denoiserPort,p&&t&&(v(p),n.enable_denoiser()),g=new n.Studio;const c=t&&!!n.initThreadPool;c&&n.initThreadPool&&(h=_(n.initThreadPool,Math.max(1,Math.min(navigator.hardwareConcurrency||4,16)-1))),a.postMessage({type:"ready",threads:1,pool:c?"starting":"none",poolError:null,isolated:t,version:n.version(),denoiserUrl:n.denoiser_model_url(),denoiserSha256:n.denoiser_model_sha256(),denoiserRepo:n.denoiser_model_repo()})}function v(e){a.inkvecDenoiseSync=(t,r,s)=>{const o=t.length,i=new SharedArrayBuffer(8+Math.max(o*4,4096)),l=new Int32Array(i,0,2);if(e.postMessage({type:"run",input:t.slice(),width:r,height:s,shared:i}),Atomics.wait(l,0,0,6e5)==="timed-out")throw new Error("the denoiser did not answer in ten minutes");if(Atomics.load(l,0)!==1){const c=new TextDecoder().decode(new Uint8Array(i,8,Atomics.load(l,1)).slice());throw new Error(c||"the denoiser failed")}return new Float32Array(i,8,o).slice()}}function M(e){return u?Atomics.load(u,0)===e:!0}function k(e){const t=g;if(!t)throw new Error("the engine is not loaded");switch(e.op){case"capabilities":return JSON.parse(t.capabilities(!!e.supported,!!e.installed,e.bytes??void 0));case"open_bytes":return JSON.parse(t.open_bytes(e.bytes,e.name??void 0));case"trace":{const r=e.generation,s=t.trace(JSON.stringify(e.request),e.draftPx,e.draftSeconds,r,o=>a.postMessage({type:"progress",generation:r,json:o}),M);return s===void 0?null:JSON.parse(s)}case"preview":return JSON.parse(t.preview(JSON.stringify(e.request),e.draftPx,e.draftSeconds));case"export":return t.export_files(JSON.stringify({request:e.request}),!!e.zip).map(s=>({name:s.name,data:s.data}));case"close":return t.close(),null;default:return JSON.parse(t.call(e.op,JSON.stringify(e.args??{})))}}function O(e){return e instanceof WebAssembly.RuntimeError||e instanceof RangeError&&/memory|allocation/i.test(e.message)||/unreachable|out of memory|memory access out of bounds/i.test(String(e?.message??e))}let f=Promise.resolve();a.onmessage=e=>{const t=e.data;f=f.then(async()=>{if(t.type==="init"){try{await S(t)}catch(s){a.postMessage({type:"loadfail",error:String(s?.stack??s)})}return}w.has(t.op)||await h;const r=performance.now();try{const s=k(t),o=[];if(t.op==="export")for(const i of s)o.push(i.data.buffer);a.postMessage({type:"reply",id:t.id,ok:!0,value:s,ms:performance.now()-r,mem:m?.buffer.byteLength??null},o)}catch(s){const o=String(s?.message??s);a.postMessage({type:"reply",id:t.id,ok:!1,error:o,crashed:O(s)})}})};
|
studio/assets/engine.worker-wbMABDxy.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
const i=self;let o=null,y=null,h=null,p=null,u=null;function w(e,t){if(!e.ok||!e.body||typeof TransformStream>"u")return e;const s=t||Number(e.headers.get("content-length"))||0;let n=0,r=0;const a=e.body.pipeThrough(new TransformStream({transform(l,d){n+=l.byteLength;const c=performance.now();c-r>40&&(r=c,i.postMessage({type:"loading",got:n,total:s})),d.enqueue(l)},flush(){i.postMessage({type:"loading",got:n,total:Math.max(s,n),done:!0})}}));return new Response(a,{status:e.status,headers:{"content-type":"application/wasm"}})}async function S(e){const t=typeof crossOriginIsolated<"u"&&crossOriginIsolated,s=t?"pkg-threads":"pkg",n=e.token?`?v=${e.token}`:"",r=new URL(`${s}/inkvec_studio_wasm.js${n}`,e.base).href,a=fetch(new URL(`${s}/inkvec_studio_wasm_bg.wasm${n}`,e.base));a.catch(()=>{}),o=await import(r),y=(await o.default({module_or_path:w(await a,e.wasmBytes?.[s])})).memory??null,i.postMessage({type:"instantiated",denoiserUrl:o.denoiser_model_url(),denoiserSha256:o.denoiser_model_sha256()});let d=1,c=null;if(t&&o.initThreadPool){const f=Math.max(1,Math.min(navigator.hardwareConcurrency||4,16)-1);try{await o.initThreadPool(f),d=f+1}catch(m){c=String(m?.message??m)}}p=e.generations?new Int32Array(e.generations):null,u=e.denoiserPort,u&&t&&(_(u),o.enable_denoiser()),h=new o.Studio,i.postMessage({type:"ready",threads:d,poolError:c,isolated:t,version:o.version(),denoiserUrl:o.denoiser_model_url(),denoiserSha256:o.denoiser_model_sha256(),denoiserRepo:o.denoiser_model_repo()})}function _(e){i.inkvecDenoiseSync=(t,s,n)=>{const r=t.length,a=new SharedArrayBuffer(8+Math.max(r*4,4096)),l=new Int32Array(a,0,2);if(e.postMessage({type:"run",input:t.slice(),width:s,height:n,shared:a}),Atomics.wait(l,0,0,6e5)==="timed-out")throw new Error("the denoiser did not answer in ten minutes");if(Atomics.load(l,0)!==1){const c=new TextDecoder().decode(new Uint8Array(a,8,Atomics.load(l,1)).slice());throw new Error(c||"the denoiser failed")}return new Float32Array(a,8,r).slice()}}function v(e){return p?Atomics.load(p,0)===e:!0}function M(e){const t=h;if(!t)throw new Error("the engine is not loaded");switch(e.op){case"capabilities":return JSON.parse(t.capabilities(!!e.supported,!!e.installed,e.bytes??void 0));case"open_bytes":return JSON.parse(t.open_bytes(e.bytes,e.name??void 0));case"trace":{const s=e.generation,n=t.trace(JSON.stringify(e.request),e.draftPx,e.draftSeconds,s,r=>i.postMessage({type:"progress",generation:s,json:r}),v);return n===void 0?null:JSON.parse(n)}case"preview":return JSON.parse(t.preview(JSON.stringify(e.request),e.draftPx,e.draftSeconds));case"export":return t.export_files(JSON.stringify({request:e.request}),!!e.zip).map(n=>({name:n.name,data:n.data}));case"close":return t.close(),null;default:return JSON.parse(t.call(e.op,JSON.stringify(e.args??{})))}}function k(e){return e instanceof WebAssembly.RuntimeError||e instanceof RangeError&&/memory|allocation/i.test(e.message)||/unreachable|out of memory|memory access out of bounds/i.test(String(e?.message??e))}let g=Promise.resolve();i.onmessage=e=>{const t=e.data;g=g.then(async()=>{if(t.type==="init"){try{await S(t)}catch(n){i.postMessage({type:"loadfail",error:String(n?.stack??n)})}return}const s=performance.now();try{const n=M(t),r=[];if(t.op==="export")for(const a of n)r.push(a.data.buffer);i.postMessage({type:"reply",id:t.id,ok:!0,value:n,ms:performance.now()-s,mem:y?.buffer.byteLength??null},r)}catch(n){const r=String(n?.message??n);i.postMessage({type:"reply",id:t.id,ok:!1,error:r,crashed:k(n)})}})};
|
|
|
|
|
|
studio/assets/main-BwYpaGSz.css
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
@font-face{font-family:Inter Studio;src:url(../fonts/inter-latin.woff2) format("woff2");font-weight:100 900;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Playfair Studio;src:url(../fonts/playfair-latin.woff2) format("woff2");font-weight:400 900;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root,:root[data-theme=dark]{color-scheme:dark;--void: #0c0a09;--stage: #141210;--paper: #1a1816;--card: #211f1c;--surface: #2a2724;--highlight: #35322e;--ink: #faf8f5;--dim: rgba(250, 248, 245, .75);--faint: rgba(250, 248, 245, .55);--muted: rgba(250, 248, 245, .4);--rule: rgba(250, 248, 245, .08);--rule2: #2a2724;--accent: #c9754a;--accent-text: #d4896a;--accent-hover: #d4896a;--accent-ink: #1a1816;--accent-soft: rgba(201, 117, 74, .12);--accent-subtle: rgba(201, 117, 74, .08);--gold: #b8976c;--gold-soft: rgba(184, 151, 108, .15);--good: #34d399;--goodbg: rgba(52, 211, 153, .15);--bad: #f87171;--badbg: rgba(248, 113, 113, .15);--anchor: #f87171;--handle: #b8976c;--wire: #faf8f5;--vt: #9a938c;--checker-a: #191715;--checker-b: #141210;--focus: rgba(201, 117, 74, .35);--focus-line: #c9754a;--state-draft: #b8976c;--state-final: #34d399;--state-stale: #c9754a;--shadow-sm: 0 4px 12px -2px rgba(12, 10, 9, .4);--shadow: 0 8px 24px -4px rgba(12, 10, 9, .5);--shadow-lg: 0 20px 50px -12px rgba(12, 10, 9, .6);--shadow-xl: 0 30px 70px -20px rgba(12, 10, 9, .7);--glow: 0 6px 20px rgba(201, 117, 74, .25)}:root[data-theme=light]{color-scheme:light;--void: #e6e1d9;--stage: #f0ece6;--paper: #faf8f5;--card: #ffffff;--surface: #eae5dd;--highlight: #ded8ce;--ink: #1a1816;--dim: rgba(26, 24, 22, .75);--faint: rgba(26, 24, 22, .58);--muted: rgba(26, 24, 22, .46);--rule: rgba(26, 24, 22, .1);--rule2: #d8d2c8;--accent: #c9754a;--accent-text: #9c5730;--accent-hover: #b3603a;--accent-ink: #faf8f5;--accent-soft: rgba(201, 117, 74, .14);--accent-subtle: rgba(201, 117, 74, .08);--gold: #8a6a3f;--gold-soft: rgba(138, 106, 63, .14);--good: #1c7a55;--goodbg: rgba(28, 122, 85, .14);--bad: #b83232;--badbg: rgba(184, 50, 50, .13);--anchor: #b83232;--handle: #8a6a3f;--wire: #1a1816;--vt: #6f6862;--checker-a: #ffffff;--checker-b: #e8e3db;--focus: rgba(201, 117, 74, .45);--focus-line: #9c5730;--state-draft: #8a6a3f;--state-final: #1c7a55;--state-stale: #9c5730;--shadow-sm: 0 4px 12px -2px rgba(90, 76, 60, .12);--shadow: 0 8px 24px -4px rgba(90, 76, 60, .16);--shadow-lg: 0 20px 50px -12px rgba(90, 76, 60, .2);--shadow-xl: 0 30px 70px -20px rgba(90, 76, 60, .24);--glow: 0 6px 20px rgba(201, 117, 74, .28)}:root{--font-display: "Playfair Studio", "Playfair Display", Georgia, serif;--font-body: "Inter Studio", Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;--font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--h-compact: 28px;--h-control: 32px;--h-pill: 36px;--h-appbar: 46px;--h-status: 26px;--h-row: 30px;--t-chrome: 12.5px;--t-panel: 13px;--t-label: 11.5px;--t-eyebrow: 10px;--s1: 4px;--s2: 8px;--s3: 12px;--s4: 16px;--s5: 24px;--s6: 32px;--rail-pad: 14px;--rail-w: 352px;--radius-sm: 6px;--radius: 8px;--radius-lg: 12px;--radius-xl: 16px;--radius-full: 9999px;--ease-out-expo: cubic-bezier(.16, 1, .3, 1);--ease-smooth: cubic-bezier(.4, 0, .2, 1);--d-micro: .15s;--d-fast: .2s;--d-normal: .4s}@media(prefers-reduced-motion:reduce){:root{--d-micro: 0ms;--d-fast: 0ms;--d-normal: 0ms}}*,*:before,*:after{box-sizing:border-box}html,body{height:100%;margin:0;overflow:hidden}body{background:var(--paper);color:var(--ink);font:400 var(--t-panel) / 1.5 var(--font-body);-webkit-font-smoothing:antialiased;user-select:none;cursor:default}#app{height:100%;display:flex;flex-direction:column}:focus{outline:none}:focus-visible{outline:2px solid var(--focus-line);outline-offset:2px;border-radius:var(--radius-sm)}a{color:var(--accent-text);text-decoration:none}a:hover{text-decoration:underline}button{font:inherit;color:inherit;background:none;border:none;padding:0;cursor:pointer}.num{font-variant-numeric:tabular-nums}.mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}.serif{font-family:var(--font-display);letter-spacing:-.03em}.eyebrow{font-size:var(--t-eyebrow);letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}.dim{color:var(--dim)}.faint{color:var(--faint)}.muted{color:var(--muted)}.sep{width:1px;height:18px;background:var(--rule2);flex:none}.spacer{flex:1}kbd{font:500 10.5px var(--font-mono);border:1px solid var(--highlight);border-radius:4px;padding:1px 5px;color:var(--faint)}.btn{height:var(--h-control);padding:0 16px;border-radius:var(--radius-full);border:1px solid var(--rule2);background:transparent;color:var(--dim);font-weight:500;font-size:var(--t-chrome);display:inline-flex;align-items:center;justify-content:center;gap:7px;white-space:nowrap;transition:transform var(--d-micro) var(--ease-smooth),background var(--d-micro),border-color var(--d-micro),box-shadow var(--d-micro)}.btn:hover:not(:disabled){border-color:var(--highlight);color:var(--ink)}.btn:active:not(:disabled){transform:scale(.98)}.btn:disabled{opacity:.45;cursor:default}.btn.primary{height:var(--h-pill);border-color:var(--accent);background:var(--accent);color:var(--accent-ink);font-weight:600;font-size:var(--t-panel);box-shadow:var(--glow)}.btn.primary:hover:not(:disabled){background:var(--accent-hover);border-color:var(--accent-hover);color:var(--accent-ink);transform:translateY(-2px)}.btn.ghost{border-color:transparent}.btn.ghost:hover:not(:disabled){background:var(--surface)}.btn.compact{height:var(--h-compact);padding:0 11px;border-radius:var(--radius);font-size:var(--t-chrome)}.btn.icon{width:var(--h-control);padding:0}.btn.icon.compact{width:var(--h-compact)}.btn.danger{color:var(--bad)}.seg{display:inline-flex;gap:2px;padding:2px;background:var(--card);border:1px solid var(--rule2);border-radius:7px}.seg>button{font-size:var(--t-label);padding:4px 11px;border-radius:5px;color:var(--faint);white-space:nowrap;transition:background var(--d-micro),color var(--d-micro)}.seg>button:hover{color:var(--dim)}.seg>button[aria-pressed=true]{background:var(--highlight);color:var(--ink);font-weight:500}.seg>button:disabled{color:var(--muted);cursor:default}.toggle{font-size:var(--t-label);padding:3px 9px;border-radius:var(--radius-sm);border:1px solid transparent;color:var(--faint)}.toggle:hover{color:var(--dim)}.toggle[aria-pressed=true]{border-color:var(--highlight);background:var(--rule2);color:var(--ink)}.switch{width:32px;height:18px;flex:none;border-radius:var(--radius-full);background:var(--highlight);position:relative;transition:background var(--d-micro)}.switch:after{content:"";position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:var(--faint);transition:transform var(--d-micro) var(--ease-smooth),background var(--d-micro)}.switch[aria-checked=true]{background:var(--accent)}.switch[aria-checked=true]:after{transform:translate(14px);background:var(--accent-ink)}.checkbox{width:15px;height:15px;flex:none;border-radius:4px;border:1px solid var(--highlight);display:grid;place-items:center;color:var(--accent-ink)}.checkbox[aria-checked=true]{background:var(--accent);border-color:var(--accent)}.checkbox:not([aria-checked=true])>svg{visibility:hidden}.appbar{height:var(--h-appbar);flex:none;display:flex;align-items:center;gap:12px;padding:0 12px;background:var(--stage);border-bottom:1px solid var(--rule2);-webkit-app-region:drag}.appbar button,.appbar .seg,.appbar .filechip,.appbar .nodrag{-webkit-app-region:no-drag}.brand{display:flex;align-items:center;gap:8px;font-size:var(--t-chrome);font-weight:600;letter-spacing:-.01em;padding-right:4px}.brand>svg{color:var(--accent)}.filechip{display:flex;align-items:center;gap:8px;height:var(--h-compact);padding:0 10px;background:var(--card);border:1px solid var(--rule2);border-radius:var(--radius-sm);font-size:var(--t-chrome);max-width:340px}.filechip .name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wincontrols{display:flex;gap:2px;margin-left:4px}.wincontrols button{width:30px;height:26px;display:grid;place-items:center;border-radius:var(--radius-sm);color:var(--faint)}.wincontrols button:hover{background:var(--surface);color:var(--ink)}.wincontrols button.close:hover{background:var(--bad);color:#fff}.wincontrols i{display:block;background:currentColor}.wincontrols .min i{width:10px;height:1px}.wincontrols .max i{width:9px;height:9px;background:none;border:1px solid currentColor;border-radius:2px}.body{flex:1;min-height:0;display:flex}.stage{flex:1;min-width:0;display:flex;flex-direction:column;background:var(--stage);position:relative}.viewertools{min-height:38px;flex:none;display:flex;align-items:center;flex-wrap:wrap;gap:8px 12px;padding:5px 12px;border-bottom:1px solid var(--rule2);background:color-mix(in srgb,var(--stage) 92%,transparent)}.legend{display:flex;align-items:center;gap:10px;font-size:11px;color:var(--faint)}.legend span{display:flex;align-items:center;gap:5px}.legend i{display:block}.legend .anchor{width:7px;height:7px;border-radius:50%;background:var(--anchor)}.legend .handle{width:7px;height:7px;background:var(--handle);transform:rotate(45deg)}.legend .band{width:12px;height:6px;border-radius:2px}.legend .band.sure,.overlay .certainty .sure{--band: #30a46c}.legend .band.soft,.overlay .certainty .soft{--band: #f5a524}.legend .band.unsure,.overlay .certainty .unsure{--band: #e5484d}.legend .band{background:var(--band)}.overlay .certainty path{fill:var(--band);fill-rule:evenodd;fill-opacity:.45;stroke:var(--band);stroke-width:1;vector-effect:non-scaling-stroke}.legend .wire{width:12px;height:2px;background:var(--wire)}.panes{flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.pane{flex:1;min-width:0;position:relative;overflow:hidden;display:grid;place-items:center;background-color:var(--stage);background-image:repeating-conic-gradient(var(--checker-a) 0% 25%,var(--checker-b) 0% 50%);background-size:16px 16px;cursor:grab;touch-action:none}.pane:active{cursor:grabbing}.pane.hidden{display:none}.panes.stacked .pane{position:absolute;inset:0}.panelabel{position:absolute;top:10px;left:12px;z-index:3;pointer-events:none}.chip{position:absolute;top:8px;right:12px;z-index:3;display:inline-flex;align-items:center;gap:6px;height:24px;padding:0 10px;border-radius:var(--radius-full);font-size:var(--t-label);border:1px solid;pointer-events:none}.chip i{width:6px;height:6px;border-radius:50%;background:currentColor;display:block}.chip.draft{color:var(--state-draft);border-color:color-mix(in srgb,var(--state-draft) 45%,transparent);background:color-mix(in srgb,var(--state-draft) 15%,transparent)}.chip.final{color:var(--state-final);border-color:color-mix(in srgb,var(--state-final) 40%,transparent);background:color-mix(in srgb,var(--state-final) 15%,transparent)}.chip.stale{color:var(--state-stale);border-color:color-mix(in srgb,var(--state-stale) 45%,transparent);background:color-mix(in srgb,var(--state-stale) 15%,transparent)}.chip.swapped:after{content:"";position:absolute;left:10px;right:10px;bottom:-3px;height:1.5px;background:var(--accent);border-radius:1px;transform-origin:left;animation:sweep var(--d-normal) var(--ease-out-expo)}@keyframes sweep{0%{transform:scaleX(0)}to{transform:scaleX(1)}}.art{position:absolute;left:0;top:0;transform-origin:0 0;will-change:transform;pointer-events:none}.art img{display:block;image-rendering:pixelated}.art svg{display:block;overflow:visible}.art.swapping{animation:crossfade var(--d-normal) var(--ease-out-expo)}@keyframes crossfade{0%{opacity:.25}to{opacity:1}}.art.centred{position:static;place-self:stretch;min-width:0;min-height:0;padding:44px 32px 32px}.panes.onlight{--stage: #f3f0ea;--checker-a: #ffffff;--checker-b: #ebe7df}.panes.ondark{--stage: #1a1816;--checker-a: #26231f;--checker-b: #211f1c}.overlay{position:absolute;left:0;top:0;overflow:visible;pointer-events:none}.overlay .wireframe path{fill:none;stroke:var(--wire);stroke-width:1px;vector-effect:non-scaling-stroke}.overlay .handles path{fill:none;stroke:var(--handle);vector-effect:non-scaling-stroke}.overlay .handles .lines{stroke-width:.8px}.overlay .handles .knobs{stroke-width:2.4px;stroke-linecap:square}.pane>canvas.anchors{position:absolute;left:0;top:0;pointer-events:none}.wipehandle{position:absolute;top:0;bottom:0;width:2px;background:var(--ink);z-index:4;cursor:ew-resize;opacity:.7}.wipehandle:after{content:"";position:absolute;left:50%;top:50%;width:26px;height:26px;margin:-13px 0 0 -13px;border-radius:50%;border:2px solid var(--ink);background:var(--stage)}.detailpane{position:absolute;inset:0;z-index:5;background:var(--stage);display:flex;flex-direction:column}.detailhead{flex:none;display:flex;align-items:center;gap:10px;padding:8px 12px;border-bottom:1px solid var(--rule2);font-size:var(--t-label);color:var(--dim)}.detailbody{flex:1;min-height:0;position:relative;overflow:hidden;display:grid;place-items:center}.detailfoot{flex:none;padding:8px 12px;border-top:1px solid var(--rule2);font-size:var(--t-label);color:var(--faint)}.pixelgrid{position:absolute;inset:0;background-image:linear-gradient(to right,rgba(250,248,245,.07) 1px,transparent 1px),linear-gradient(to bottom,rgba(250,248,245,.07) 1px,transparent 1px);pointer-events:none}:root[data-theme=light] .pixelgrid{background-image:linear-gradient(to right,rgba(26,24,22,.1) 1px,transparent 1px),linear-gradient(to bottom,rgba(26,24,22,.1) 1px,transparent 1px)}.stagestate{position:absolute;inset:0;z-index:6;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:11px;padding:32px;text-align:center;background:var(--stage)}.stagestate .title{font-size:16px;font-weight:500}.stagestate .body{display:block;font-size:var(--t-chrome);line-height:1.6;color:var(--faint);max-width:46ch}.stagestate .action{font-size:var(--t-chrome);color:var(--accent-text);margin-top:2px}.statusstrip{height:var(--h-status);flex:none;display:flex;align-items:center;gap:10px;padding:0 12px;border-top:1px solid var(--rule2);background:var(--stage);font-size:var(--t-label);color:var(--faint);font-variant-numeric:tabular-nums}.statusstrip .lead{color:var(--dim)}.statusstrip .privacy{margin-left:auto}.statusstrip .updatechip{display:inline-flex;align-items:center;gap:6px;color:var(--gold)}.statusstrip .updatechip i{width:6px;height:6px;border-radius:50%;background:currentColor;display:block}.statusstrip .fetchchip{display:inline-flex;align-items:center;gap:8px;margin-left:12px;color:var(--faint);white-space:nowrap}.statusstrip .fetchchip.bad{color:var(--bad)}.fetchbar{width:64px;flex:none}.fetchnote{display:flex;flex-direction:column;gap:6px;font-size:11.5px;line-height:1.45;color:var(--faint)}.fetchnote .fetchbar{width:100%}.fetchnote .fetchline{color:var(--dim);font-variant-numeric:tabular-nums}.rail{width:var(--rail-w);flex:none;border-left:1px solid var(--rule2);background:var(--paper);display:flex;flex-direction:column;position:relative}.railscroll{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;padding:var(--rail-pad);display:flex;flex-direction:column;gap:var(--rail-pad)}.railscroll::-webkit-scrollbar{width:10px}.railscroll::-webkit-scrollbar-thumb{background:var(--rule2);border-radius:5px;border:3px solid var(--paper)}.railscroll::-webkit-scrollbar-thumb:hover{background:var(--highlight)}.card{border:1px solid var(--rule2);background:var(--card);border-radius:var(--radius-lg);padding:13px;display:flex;flex-direction:column;gap:10px}.cardhead{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.railfoot{flex:none;border-top:1px solid var(--rule2);background:var(--stage);padding:12px var(--rail-pad);display:flex;flex-direction:column;gap:8px}.railfoot .row{display:flex;gap:8px}.railfoot .note{display:flex;justify-content:space-between;font-size:var(--t-label);color:var(--muted)}.presets{display:flex;flex-wrap:wrap;gap:5px}.preset{display:inline-flex;align-items:center;padding:5px 10px;border-radius:999px;border:1px solid var(--rule2);background:var(--card);font-size:var(--t-chrome);color:var(--dim);transition:border-color var(--d-micro),background var(--d-micro),color var(--d-micro)}.preset:hover{border-color:var(--highlight);color:var(--ink)}.preset[aria-pressed=true]{border-color:var(--accent);background:var(--accent-soft);color:var(--ink);font-weight:500}.preset.saved{padding-right:22px}.preset{position:relative}.preset .forget{position:absolute;top:50%;margin-top:-8px;right:4px;width:16px;height:16px;border-radius:5px;opacity:0;transition:opacity var(--d-micro),background var(--d-micro)}.preset .forget:before,.preset .forget:after{content:"";position:absolute;left:4px;top:7.5px;width:8px;height:1.5px;border-radius:1px;background:var(--muted)}.preset .forget:before{transform:rotate(45deg)}.preset .forget:after{transform:rotate(-45deg)}.preset:hover .forget,.preset .forget:focus-visible{opacity:1}.preset .forget:hover{background:var(--highlight)}.preset .forget:hover:before,.preset .forget:hover:after{background:var(--bad)}.traybar{display:flex;align-items:baseline;justify-content:space-between;gap:8px;font-size:11px}.railmodes{flex:none;display:flex;flex-direction:column;gap:8px;padding:10px var(--rail-pad) 0}.railmodes-row{display:grid;grid-template-columns:1.75fr 1fr;gap:8px}.mode.mode-engine{background:var(--paper);border-color:var(--rule)}.mode{min-width:0;display:flex;flex-direction:column;gap:8px;padding:10px 11px 11px;border:1px solid var(--rule2);border-radius:var(--radius-lg);background:var(--card)}.modehead{display:flex;align-items:baseline;justify-content:space-between;gap:8px;min-height:16px}.modetitle{font-size:12.5px;font-weight:600;color:var(--ink)}.modestate{font-size:10.5px;color:var(--muted);white-space:nowrap}.seg.big{display:flex;width:100%;padding:3px}.seg.big>button{flex:1;padding:7px 0;font-size:12.5px;text-align:center}.seg.big>button[aria-pressed=true]{background:var(--accent);color:var(--accent-ink);font-weight:600}.bigswitch{display:flex;align-items:center;gap:8px;height:34px;padding:0 4px;border:1px solid var(--rule2);border-radius:999px;background:var(--paper);color:var(--dim);font-size:12.5px;font-weight:600;transition:background var(--d-micro),border-color var(--d-micro),color var(--d-micro)}.bigswitch .knob{flex:none;width:24px;height:24px;border-radius:50%;background:var(--highlight);transition:background var(--d-micro)}.bigswitch .state{flex:1;text-align:center;padding-right:4px}.bigswitch[aria-checked=true]{background:var(--accent);border-color:var(--accent);color:var(--accent-ink)}.bigswitch[aria-checked=true]{flex-direction:row-reverse}.bigswitch[aria-checked=true] .knob{background:var(--accent-ink)}.bigswitch[aria-checked=true] .state{padding-right:0;padding-left:4px}.railtabs{flex:none;background:var(--stage);border-bottom:1px solid var(--rule2)}.railseg{display:flex;width:100%}.railseg>button{position:relative;flex:1;display:flex;align-items:baseline;justify-content:center;gap:8px;height:46px;padding:14px 12px 0;color:var(--muted);transition:color var(--d-micro),background var(--d-micro)}.railseg>button:hover:not([aria-selected=true]){color:var(--dim);background:color-mix(in srgb,var(--ink) 4%,transparent)}.railseg>button[aria-selected=true]{color:var(--ink);background:var(--paper)}.railseg>button:after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;background:transparent;transition:background var(--d-micro)}.railseg>button[aria-selected=true]:after{background:var(--accent)}.railseg .tablabel{font-size:14px;font-weight:600;letter-spacing:-.005em}.railseg .tabnote{font-size:11px;font-weight:500;font-variant-numeric:tabular-nums;color:var(--faint)}.railseg .tabnote:empty{display:none}.railseg>button[aria-selected=true] .tabnote{color:var(--accent-text)}.tabcaption{margin:0;padding:7px var(--rail-pad) 9px;background:var(--paper);font-size:11.5px;color:var(--muted)}.presetblock{display:flex;flex-direction:column;gap:8px}.presetblock .traybar .faint{min-width:0}.rail section.group{gap:0;border:1px solid var(--rule2);background:var(--card);border-radius:var(--radius-lg)}.rail section.group .grouphead{align-items:center;padding-right:13px}.groupbtn{flex:1;display:flex;align-items:center;gap:7px;padding:11px 9px 11px 13px;color:var(--muted);text-align:left;border-radius:var(--radius-lg)}.groupbtn:hover{color:var(--dim)}.groupbtn .changed{font-size:10.5px;color:var(--accent-text)}.groupbody{display:flex;flex-direction:column;gap:13px;padding:2px 13px 14px}.control.changed .controlhead .label:before{content:"";display:inline-block;width:5px;height:5px;margin-right:6px;border-radius:50%;background:var(--accent);vertical-align:1px}.emptycard p{margin:0;font-size:var(--t-chrome);line-height:1.55;color:var(--dim)}.structure .srow{display:grid;grid-template-columns:1fr auto;column-gap:8px;row-gap:5px;align-items:baseline}.structure .srow .k{font-size:var(--t-chrome);color:var(--dim)}.structure .srow .v{font-size:var(--t-panel);font-variant-numeric:tabular-nums}.structure .srow .v .of{margin-left:6px;font-size:10.5px;color:var(--muted)}.sbar{grid-column:1 / -1;position:relative;height:4px;margin-bottom:4px;border-radius:2px;background:var(--highlight)}.sbar i{position:absolute;inset:0 auto 0 0;border-radius:2px;background:var(--accent);transition:width var(--d-normal) var(--ease-out-expo)}.sbar b{position:absolute;top:-3px;bottom:-3px;width:2px;margin-left:-1px;border-radius:1px;background:var(--dim)}.readout{display:flex;flex-direction:column;min-height:54px;background:var(--rule2);border:1px solid var(--rule2);border-radius:var(--radius);overflow:hidden}.readout-badge-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:4px 10px;background:var(--card);border-bottom:1px solid var(--rule2)}.engine-pill{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;border-radius:999px;font-size:11px;font-weight:600;border:1px solid transparent;cursor:pointer;transition:all var(--d-micro);line-height:1.4;font-family:inherit}.engine-pill.fast{background:color-mix(in srgb,var(--accent) 15%,var(--paper));border-color:color-mix(in srgb,var(--accent) 40%,transparent);color:var(--accent)}.engine-pill.quality{background:color-mix(in srgb,var(--accent) 10%,var(--paper));border-color:color-mix(in srgb,var(--accent) 25%,transparent);color:var(--ink)}.engine-pill:hover{filter:brightness(1.08);border-color:var(--accent)}.time-pill{font-size:11px;font-weight:500;color:var(--muted);font-variant-numeric:tabular-nums}.readout-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1px}.readout .cell{min-width:0;display:flex;flex-direction:column;gap:1px;padding:6px 10px;background:var(--paper)}.readout .v{font-size:15px;font-weight:500;line-height:1.25}.readout .k{font-size:10px;color:var(--muted)}.delta{font-size:10.5px;font-variant-numeric:tabular-nums;color:var(--muted)}.delta.better{color:var(--good)}.delta.worse{color:var(--gold)}.readout.busy,.readout.idle{display:flex;align-items:center;gap:8px;padding:0 12px;background:var(--paper);font-size:var(--t-chrome)}.readout .stage{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--state-stale)}.pulse{flex:none;width:7px;height:7px;border-radius:50%;background:var(--state-stale);animation:pulse 1s ease-in-out infinite}@keyframes pulse{50%{opacity:.3}}.headline{display:flex;align-items:flex-end;gap:12px}.headline .figure{font-family:var(--font-display);font-size:52px;line-height:.85;letter-spacing:-.03em}.headline .of{display:flex;flex-direction:column;gap:2px;padding-bottom:4px}.meter{position:relative;height:6px;border-radius:3px;background:linear-gradient(90deg,var(--good),var(--gold) 55%,var(--bad))}.meter .threshold{position:absolute;top:-3px;bottom:-3px;width:1px;background:var(--dim)}.meter .needle{position:absolute;top:-4px;width:2px;height:14px;background:var(--ink);border-radius:1px;transition:left var(--d-normal) var(--ease-out-expo)}.meterscale{display:flex;justify-content:space-between;font-size:10.5px;color:var(--muted)}.stats{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--rule2);border:1px solid var(--rule2);border-radius:var(--radius);overflow:hidden;font-variant-numeric:tabular-nums}.stats>div{background:var(--paper);padding:8px 10px;display:flex;flex-direction:column;gap:2px}.stats .k{font-size:10.5px;color:var(--muted)}.stats .v{font-size:var(--t-panel)}.benchmark{display:flex;gap:8px;padding:8px 10px;border:1px dashed var(--highlight);border-radius:var(--radius);background:color-mix(in srgb,var(--ink) 2%,transparent)}.benchmark .label{flex:none;padding-top:1px}.benchmark p{margin:0;font-size:var(--t-label);line-height:1.45;color:var(--faint)}.loss{display:flex;gap:9px;padding-bottom:9px;border-bottom:1px solid var(--rule2)}.loss:last-of-type{border-bottom:none;padding-bottom:0}.loss .glyph{flex:none;padding-top:2px;color:var(--gold)}.loss .text{font-size:var(--t-chrome);line-height:1.45;color:var(--dim)}.loss .meta{font-size:var(--t-label);color:var(--muted);display:flex;gap:6px;flex-wrap:wrap}.loss .why{font-size:var(--t-label);line-height:1.5;color:var(--faint);margin-top:4px;padding-left:9px;border-left:1px solid var(--rule2)}.loss .expand{color:var(--muted)}.loss .expand:hover{color:var(--dim)}.nothinglost{display:flex;gap:9px;align-items:center;font-size:var(--t-chrome);color:var(--faint)}.nothinglost .glyph{color:var(--good);flex:none;display:flex}.ink{display:flex;align-items:center;gap:9px;padding:2px 0;border-radius:var(--radius-sm);width:100%;text-align:left}.ink:hover{background:var(--surface)}.swatch{width:22px;height:22px;flex:none;border-radius:5px;border:1px solid color-mix(in srgb,var(--ink) 12%,transparent);background-image:repeating-conic-gradient(var(--checker-a) 0% 25%,var(--checker-b) 0% 50%);background-size:8px 8px;position:relative;overflow:hidden}.swatch i{position:absolute;inset:0;display:block}.swatch.snapped{border:2px solid var(--accent)}.ink .hex{font-size:var(--t-chrome);font-variant-numeric:tabular-nums;color:var(--dim);width:72px}.ink .share{font-size:var(--t-label);color:var(--muted);font-variant-numeric:tabular-nums;width:44px}.ink .snap{margin-left:auto;font-size:var(--t-label);color:var(--muted)}.ink .snap.on{color:var(--accent-text)}.ink{gap:6px;touch-action:none}.ink.grouped .hex{color:var(--accent-text)}.inkpick{width:16px;height:16px;flex:none;border-radius:4px;border:1px solid var(--highlight);display:grid;place-items:center;color:var(--accent-ink)}.inkpick[aria-checked=true]{background:var(--accent);border-color:var(--accent)}.inkmain{display:flex;align-items:center;gap:9px;flex:1;min-width:0;text-align:left}.inkmain[aria-disabled=true]{cursor:grab}.swatch.mini{width:16px;height:16px;border-radius:4px}.swatch.mini.ramp{width:26px}.inklist{display:flex;flex-direction:column;gap:1px;border-radius:var(--radius-sm)}.inklist,.cgroup{transition:box-shadow var(--d-fast),background var(--d-fast)}.mergebar{display:flex;align-items:center;gap:10px;font-size:var(--t-label)}.cgroups{display:flex;flex-direction:column;gap:7px}.cgroupshead{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.cgroup{border:1px solid var(--rule2);border-radius:var(--radius);background:var(--paper);padding:8px;display:flex;flex-direction:column;gap:7px}.cgroup.suggested{border-style:dashed;background:transparent}.cchips{display:flex;flex-wrap:wrap;gap:4px}.cchip{display:inline-flex;align-items:center;border:1px solid var(--highlight);border-radius:999px;background:var(--card);touch-action:none;font-size:var(--t-label);color:var(--dim)}.cchip.target{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent) inset}.cchip.unmatched{border-color:var(--gold);border-style:dashed}.cchipmain{display:inline-flex;align-items:center;gap:5px;padding:2px 4px 2px 3px;border-radius:999px}.cchipmain .swatch.mini{border-radius:999px}.cchipx{display:grid;place-items:center;width:18px;height:18px;margin-right:2px;border-radius:999px;color:var(--muted)}.cchipx:hover{color:var(--ink);background:var(--surface)}.cresult{display:flex;align-items:center;gap:6px;font-size:var(--t-label)}.cresult>span{white-space:nowrap}.cresult .arrow{color:var(--muted)}.cresultchip{display:inline-flex;align-items:center;gap:5px;color:var(--dim)}.cactions{display:flex;align-items:center;gap:6px}.creport{font-size:11px;line-height:1.4;display:inline-flex;align-items:center;gap:5px;min-width:0}.creport.warn{color:var(--gold)}.creport.warn svg{flex:none}.simplifyrow{display:flex;align-items:center;gap:5px;font-size:var(--t-label)}.numberfield.simplify{min-width:0;width:40px;text-align:center}.dragghost{position:fixed;z-index:60;pointer-events:none;filter:drop-shadow(0 2px 6px rgba(0,0,0,.45))}body.dragging-ink,body.dragging-ink *{cursor:grabbing!important}body.dragging-ink [data-drop=list]{box-shadow:0 0 0 1px var(--rule2)}.dropping{box-shadow:0 0 0 2px var(--accent)!important;background:var(--accent-subtle)!important}.control{display:flex;flex-direction:column;gap:5px}.controlhead{display:flex;align-items:baseline;gap:8px}.controlhead .label{flex:1;font-size:var(--t-chrome);color:var(--dim)}.controlhead .unit{font-size:var(--t-label);color:var(--muted)}.numberfield{height:24px;min-width:58px;padding:0 6px;border:1px solid var(--highlight);border-radius:var(--radius-sm);background:var(--paper);color:var(--ink);font:400 var(--t-chrome) var(--font-body);font-variant-numeric:tabular-nums;text-align:center}.numberfield:focus-visible{border-color:var(--accent)}.slider{appearance:none;-webkit-appearance:none;width:100%;height:14px;background:none;margin:2px 0 0;cursor:pointer}.slider::-webkit-slider-runnable-track{height:3px;border-radius:2px;background:var(--highlight)}.slider::-webkit-slider-thumb{-webkit-appearance:none;width:11px;height:11px;margin-top:-4px;border-radius:50%;background:var(--ink);border:none}.slider::-moz-range-track{height:3px;border-radius:2px;background:var(--highlight)}.slider::-moz-range-thumb{width:11px;height:11px;border:none;border-radius:50%;background:var(--ink)}.stops{display:flex;justify-content:space-between;gap:8px;font-size:10px;color:var(--muted);white-space:nowrap}.group{display:flex;flex-direction:column;gap:9px}.grouphead{display:flex;align-items:baseline;justify-content:space-between}.reset{font-size:var(--t-label);color:var(--accent-text)}.reset:disabled{color:var(--muted);cursor:default}.stagelist{display:flex;flex-direction:column;gap:5px;font-variant-numeric:tabular-nums}.stagerow{display:flex;align-items:baseline;gap:8px;font-size:var(--t-label);color:var(--muted)}.stagerow.done{color:var(--dim)}.stagerow .mark{width:10px;text-align:center;color:var(--muted)}.stagerow.done .mark{color:var(--good)}.stagerow .name{flex:1}.sweep{height:2px;background:var(--rule2);border-radius:2px;overflow:hidden}.sweep i{display:block;width:30%;height:100%;background:var(--accent);animation:sweepacross 1.6s var(--ease-out-expo) infinite}@keyframes sweepacross{0%{transform:translate(-100%)}to{transform:translate(340%)}}@media(prefers-reduced-motion:reduce){.sweep i{animation:none;width:100%;opacity:.4}.chip.swapped:after,.art.swapping,.callout,.pulse{animation:none}.dragging .drop{transition:none}}.firstrun{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:34px;background:var(--stage);padding:24px}.drop{width:min(620px,80%);padding:44px 24px;min-height:220px;justify-content:center;border:1.5px dashed var(--highlight);border-radius:var(--radius-xl);display:flex;flex-direction:column;align-items:center;gap:16px;background:color-mix(in srgb,var(--ink) 1.5%,transparent);text-align:center;transition:border-color var(--d-fast),background var(--d-fast)}.drop .glyph{color:var(--muted)}[hidden]{display:none!important}.drop.solid{background:var(--paper);border-style:solid;border-color:var(--rule2)}.panehint{max-width:34ch;text-align:center;font-size:12.5px;line-height:1.55}.drop .headline{font-family:var(--font-display);font-size:26px;letter-spacing:-.02em;display:block}.drop .release,.dragging .drop .resting{display:none}.dragging .drop .release{display:block}.dragging .drop{width:min(640px,90%);min-height:320px;transition:width var(--d-fast) var(--ease-out-expo),min-height var(--d-fast) var(--ease-out-expo),border-color var(--d-fast),background var(--d-fast)}.samples{display:flex;flex-direction:column;align-items:center;gap:12px}.samplerow{display:flex;gap:12px}.sample{width:112px;display:flex;flex-direction:column;gap:7px;align-items:center}.sample .thumb{width:112px;height:88px;border:1px solid var(--rule2);border-radius:10px;background-color:var(--card);background-image:repeating-conic-gradient(var(--checker-a) 0% 25%,var(--checker-b) 0% 50%);background-size:12px 12px;display:grid;place-items:center;overflow:hidden;transition:border-color var(--d-micro),transform var(--d-micro)}.sample:hover .thumb{border-color:var(--accent);transform:translateY(-2px)}.sample img{max-width:76px;max-height:68px}.sample .label{font-size:var(--t-label);color:var(--faint)}.dragging .drop{border-color:var(--accent);background:var(--accent-soft)}.dragging .drop .glyph{color:var(--accent)}.dragging:after{content:"";position:fixed;inset:0;border:2px solid var(--accent);pointer-events:none;z-index:60}.dragging .stage>*:not(.stagestate){opacity:.6}.callout{position:absolute;left:20px;bottom:20px;z-index:8;max-width:320px;display:flex;flex-direction:column;gap:5px;padding:10px 13px;border-radius:var(--radius-lg);border:1px solid var(--rule2);background:color-mix(in srgb,var(--card) 92%,transparent);backdrop-filter:blur(8px);font-size:11.5px;line-height:1.5;color:var(--dim);animation:rise var(--d-fast) var(--ease-out-expo)}.callout .head{display:flex;align-items:baseline;justify-content:space-between;gap:12px}#overlays:empty{display:none}.scrim{position:fixed;inset:0;z-index:40;background:color-mix(in srgb,var(--void) 62%,transparent);display:grid;place-items:center;padding:24px}.modal{width:min(460px,100%);max-height:86vh;overflow-y:auto;background:var(--card);border:1px solid var(--highlight);border-radius:var(--radius-xl);padding:22px;display:flex;flex-direction:column;gap:13px;box-shadow:var(--shadow-xl)}.modal h2{margin:0;font-family:var(--font-display);font-size:22px;font-weight:500;letter-spacing:-.02em}.modal p{margin:0;font-size:var(--t-panel);line-height:1.7;color:var(--dim)}.modal .actions{display:flex;gap:8px;justify-content:flex-end}.modal.composer{width:min(1040px,100%);max-height:92vh;padding:0;gap:0;overflow:hidden}.composerhead{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:18px 22px 15px;border-bottom:1px solid var(--rule2)}.composerhead p{margin-top:3px;font-size:var(--t-chrome)}.composerbody{display:grid;grid-template-columns:minmax(0,1fr) 312px;min-height:0;overflow-y:auto}.composerpreview{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:22px;min-width:0;background:var(--stage)}.cardstage{--ar: 1.7778;position:relative;width:min(100%,calc(58vh * var(--ar)));aspect-ratio:var(--ar);border-radius:var(--radius);overflow:hidden;background:var(--paper);box-shadow:var(--shadow-lg)}.cardstage img{display:block;width:100%;height:100%;object-fit:contain}.cardbusy{position:absolute;inset:0;display:grid;place-items:center;opacity:0;pointer-events:none;background:color-mix(in srgb,var(--paper) 45%,transparent);transition:opacity var(--d-micro)}.cardstage.busy .cardbusy{opacity:1;transition-delay:.26s}.cardspin{width:20px;height:20px;border-radius:50%;border:2px solid var(--highlight);border-top-color:var(--accent);animation:cardspin .8s linear infinite}@keyframes cardspin{to{transform:rotate(360deg)}}.composerside{display:flex;flex-direction:column;gap:18px;padding:20px 22px;border-left:1px solid var(--rule2)}.optgroup{display:flex;flex-direction:column;gap:8px}.cardseg{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:2px;padding:2px;border:1px solid var(--rule2);border-radius:var(--radius);background:var(--paper)}.cardseg button{display:flex;flex-direction:column;align-items:center;gap:1px;padding:6px 8px;border-radius:calc(var(--radius) - 2px);font-size:var(--t-chrome);color:var(--faint)}.cardseg button small{font-size:10px;color:var(--muted);font-variant-numeric:tabular-nums}.cardseg button:hover:not([aria-checked=true]){color:var(--ink)}.cardseg button[aria-checked=true]{color:var(--ink);background:var(--accent-soft);box-shadow:inset 0 0 0 1px var(--accent)}.optlist{display:flex;flex-direction:column;border:1px solid var(--rule2);border-radius:var(--radius);background:var(--paper)}.optlist>*+*{border-top:1px solid var(--rule2)}.optrow{display:flex;align-items:center;gap:12px;width:100%;padding:9px 11px;text-align:left}.optrow:hover{background:var(--rule2)}.optext{display:flex;flex:1;flex-direction:column;gap:1px;min-width:0}.optlabel{font-size:12.5px;color:var(--ink)}.optnote{font-size:11px;line-height:1.4;color:var(--muted)}.optslider{display:flex;flex-direction:column;gap:4px;padding:9px 11px 8px;transition:opacity var(--d-micro)}.optslider.off{opacity:.4}.optslider.off .slider{cursor:default}.optsliderhead{display:flex;justify-content:space-between;font-size:12px;color:var(--dim)}.composeractions{display:flex;flex-direction:column;gap:8px;margin-top:auto}.composeractions .btn{justify-content:center;gap:7px}@media(max-width:860px){.composerbody{grid-template-columns:minmax(0,1fr)}.composerside{border-left:0;border-top:1px solid var(--rule2)}}.popover{position:fixed;z-index:45;background:var(--card);border:1px solid var(--highlight);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);overflow:hidden}.menu{padding:6px;min-width:260px}.menu .item{display:flex;align-items:center;gap:9px;padding:7px 9px;border-radius:var(--radius);width:100%;text-align:left;font-size:var(--t-chrome);color:var(--dim)}.menu .item:hover{background:var(--surface);color:var(--ink)}.menu .item .when{margin-left:auto;font-size:var(--t-label);color:var(--muted)}.menu .rule{height:1px;background:var(--rule2);margin:5px 0}.sheet{position:absolute;inset:0;z-index:20;background:color-mix(in srgb,var(--void) 55%,transparent);display:flex;align-items:flex-end}.sheetbody{width:100%;max-height:100%;overflow-y:auto;background:var(--card);border-top:1px solid var(--highlight);border-radius:var(--radius-xl) var(--radius-xl) 0 0;padding:14px;display:flex;flex-direction:column;gap:11px;box-shadow:0 -20px 50px color-mix(in srgb,var(--void) 60%,transparent);animation:rise var(--d-fast) var(--ease-out-expo)}@keyframes rise{0%{transform:translateY(12px);opacity:0}}.format{display:flex;align-items:center;gap:9px;padding:7px 9px;border:1px solid var(--rule2);border-radius:var(--radius);background:var(--paper);width:100%;text-align:left;font-size:var(--t-chrome);color:var(--dim)}.format:hover{border-color:var(--highlight)}.format .size{margin-left:auto;font-size:var(--t-label);color:var(--muted);font-variant-numeric:tabular-nums}.tooltip{position:fixed;z-index:70;max-width:300px;background:var(--highlight);border:1px solid color-mix(in srgb,var(--ink) 10%,transparent);border-radius:var(--radius);padding:10px 12px;font-size:var(--t-chrome);line-height:1.6;color:var(--dim);box-shadow:var(--shadow);pointer-events:none}#toasts{position:fixed;left:50%;bottom:40px;transform:translate(-50%);z-index:80;display:flex;flex-direction:column;gap:8px;align-items:center}.toast{width:min(460px,90vw);background:var(--highlight);border:1px solid color-mix(in srgb,var(--ink) 10%,transparent);border-radius:10px;padding:11px 13px;display:flex;align-items:center;gap:11px;box-shadow:var(--shadow-lg);animation:risein var(--d-fast) var(--ease-out-expo)}@keyframes risein{0%{transform:translateY(8px);opacity:0}}.toast .text{flex:1;font-size:var(--t-chrome);color:var(--dim)}.toast .glyph{display:flex}.toast .glyph.good{color:var(--good)}.toast .glyph.bad{color:var(--bad)}.screen{position:absolute;inset:0;z-index:30;background:var(--paper);display:flex;flex-direction:column}.screenbar{height:var(--h-appbar);flex:none;display:flex;align-items:center;gap:12px;padding:0 12px;background:var(--stage);border-bottom:1px solid var(--rule2);-webkit-app-region:drag}.screenbar button{-webkit-app-region:no-drag}.screenbody{flex:1;min-height:0;overflow-y:auto;background:var(--stage)}.settingsgrid{width:min(1128px,100%);margin:0 auto;padding:24px;display:grid;grid-template-columns:repeat(auto-fit,minmax(420px,1fr));gap:16px;align-content:start}.settinggroup{border:1px solid var(--rule2);background:var(--card);border-radius:var(--radius-lg);overflow:hidden;align-self:start}.settinggroup>.head{padding:11px 14px;border-bottom:1px solid var(--rule2)}.settingrow{display:flex;align-items:center;gap:16px;padding:11px 14px;border-bottom:1px solid color-mix(in srgb,var(--ink) 5%,transparent)}.settingrow:last-child{border-bottom:none}.settingrow .about{flex:1;display:flex;flex-direction:column;gap:3px;min-width:0}.settingrow .label{font-size:var(--t-panel);color:var(--dim)}.settingrow .help{font-size:var(--t-label);line-height:1.5;color:var(--muted)}.settingrow .control{flex:none}.settingrow select,.settingrow input[type=text],.settingrow input[type=number]{height:var(--h-compact);padding:0 8px;border:1px solid var(--rule2);border-radius:7px;background:var(--paper);color:var(--ink);font:400 var(--t-chrome) var(--font-body);font-variant-numeric:tabular-nums;max-width:220px}.privacycard{border:1px solid var(--rule2);background:var(--card);border-radius:var(--radius-lg);padding:14px;display:flex;flex-direction:column;gap:8px;align-self:start}.privacycard .line{font-family:var(--font-display);font-size:19px;letter-spacing:-.02em}.about{display:flex;min-height:100%}.aboutleft{width:520px;flex:none;background:var(--stage);border-right:1px solid var(--rule2);display:flex;flex-direction:column;justify-content:center;gap:22px;padding:56px}.aboutleft .mark{color:var(--accent)}.aboutright{flex:1;padding:56px;display:flex;flex-direction:column;gap:20px;justify-content:center;background:var(--paper)}.credit{border:1px solid var(--highlight);border-radius:var(--radius-lg);padding:20px;display:flex;flex-direction:column;gap:10px;background:var(--gold-soft)}.notices{border:1px solid var(--rule2);border-radius:var(--radius-lg);overflow:hidden}.notices .head{padding:11px 14px;border-bottom:1px solid var(--rule2);font-size:var(--t-chrome);color:var(--dim);display:flex;justify-content:space-between}.notices pre{margin:0;height:220px;overflow:auto;padding:12px 14px;font:11.5px / 1.75 var(--font-mono);color:var(--muted);background:var(--stage);white-space:pre-wrap;user-select:text}.minifyrail{width:400px;flex:none;border-left:1px solid var(--rule2);background:var(--paper);display:flex;flex-direction:column}.minifyresult{display:flex;flex-direction:column;gap:5px}.minifyresult .figure{font-family:var(--font-display);font-size:66px;line-height:.85;letter-spacing:-.04em;color:var(--accent-text)}.sentence{font-size:var(--t-panel);line-height:2;color:var(--dim)}.sentence .inlinefield{display:inline-flex;align-items:center;height:24px;padding:0 4px;border:1px solid var(--rule2);border-radius:var(--radius-sm);background:var(--paper);color:var(--ink);font:400 var(--t-chrome) var(--font-body);font-variant-numeric:tabular-nums;width:58px;text-align:center}.sentence .inlinefield.accent{border-color:var(--accent);background:var(--accent-soft)}.batchbar{height:44px;flex:none;display:flex;align-items:center;gap:8px;padding:0 14px;border-bottom:1px solid var(--rule2);background:var(--stage)}.batchhead,.batchrow{display:grid;grid-template-columns:24px minmax(0,1.4fr) 120px 104px 84px 104px 96px minmax(0,1.2fr);align-items:center;gap:12px;padding:0 14px}.batchhead{height:34px;flex:none;border-bottom:1px solid var(--rule2)}.batchrow{height:var(--h-row);border-bottom:1px solid color-mix(in srgb,var(--ink) 4%,transparent);font-size:var(--t-chrome);font-variant-numeric:tabular-nums}.batchrow.failed{background:color-mix(in srgb,var(--bad) 8%,transparent)}.batchrow.running{background:var(--accent-subtle)}.batchrow .trunc,.batchhead .trunc{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.batchrow .right,.batchhead .right{text-align:right}.batchrow .state{display:flex;align-items:center;gap:6px}.batchrow .state i{width:6px;height:6px;border-radius:50%;background:currentColor;display:block;flex:none}.state.queued,.state.skipped{color:var(--muted)}.state.running{color:var(--accent-text)}.state.done{color:var(--good)}.state.failed{color:var(--bad)}.batchviewport{flex:1;min-height:0;overflow-y:auto;position:relative}.batchfoot{height:52px;flex:none;display:flex;align-items:center;gap:18px;padding:0 14px;border-top:1px solid var(--rule2);background:var(--stage);font-size:var(--t-chrome);font-variant-numeric:tabular-nums}.progress{height:3px;border-radius:2px;background:var(--highlight);overflow:hidden}.progress i{display:block;height:100%;background:var(--accent);transition:width var(--d-fast) var(--ease-smooth)}@media(max-width:1400px){:root{--rail-w: 330px}}@media(max-width:1180px){:root{--rail-w: 310px}.legend{display:none}}.chooser{position:absolute;left:50%;bottom:16px;transform:translate(-50%);z-index:8;width:min(560px,calc(100% - 32px));max-height:calc(100% - 70px);overflow-y:auto;display:flex;flex-direction:column;gap:9px;padding:10px 12px 11px;background:var(--card);border:1px solid var(--highlight);border-radius:var(--radius-xl);box-shadow:var(--shadow-lg);animation:rise var(--d-fast) var(--ease-out-expo)}.choosehead{display:flex;align-items:center;justify-content:space-between;gap:10px;min-width:0}.choosehead .eyebrow{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chooseintro{font-size:var(--t-label);line-height:1.5;color:var(--dim);padding:7px 10px;border-radius:var(--radius);background:var(--accent-subtle);border:1px solid var(--accent-soft)}.choices{display:flex;flex-direction:column;gap:6px}.choice{display:grid;grid-template-columns:92px 1fr auto;align-items:center;gap:12px;padding:8px 8px 8px 12px;border:1px solid var(--rule2);border-radius:var(--radius-lg);background:var(--paper);min-width:0}.choice .btn{min-width:104px}.choicename{display:flex;align-items:center;gap:7px;font-family:var(--font-display);font-size:17px;letter-spacing:-.02em;color:var(--ink)}.choicename svg{color:var(--accent-text)}.choicebody{font-size:var(--t-chrome);line-height:1.5;color:var(--faint)}.choosenews{display:flex;flex-direction:column;gap:6px;padding-top:9px;border-top:1px solid var(--rule2)}.remember{display:flex;align-items:center;gap:7px;font-size:var(--t-label);color:var(--faint);cursor:pointer;align-self:flex-start}.remember input{accent-color:var(--accent);margin:0}.autochose{display:flex;flex-direction:column;gap:7px;font-size:var(--t-chrome)}.autolead{color:var(--dim);line-height:1.5}.autorow{display:flex;align-items:center;gap:10px;justify-content:space-between}.autorow.moved{padding-top:7px;border-top:1px dashed var(--rule2)}.autotext{display:flex;flex-direction:column;gap:2px;min-width:0}.autotitle{color:var(--ink)}.autotext .muted{font-size:var(--t-label)}.autobtns{display:flex;align-items:center;gap:10px;flex:none}.autorow .btn{flex:none}.autotaken{font-size:var(--t-label);color:var(--state-final);flex:none}.card.autocard{border-color:var(--accent-soft);background:color-mix(in srgb,var(--accent) 4%,var(--card))}.guideline{display:flex;align-items:baseline;justify-content:space-between;gap:10px;font-size:var(--t-label)}.rail.wizarding{width:max(var(--rail-w),400px)}.sheet.wizsheet{align-items:stretch;background:var(--paper)}.sheetbody.wizbody{height:100%;border-radius:0;border-top:none;box-shadow:none;padding:0;gap:0;overflow:hidden;background:var(--paper)}.wizhead{flex:none;display:flex;flex-direction:column;gap:9px;padding:14px 16px 12px;border-bottom:1px solid var(--rule2)}.wiztitle{font-size:24px;font-weight:500;line-height:1.1;color:var(--ink)}.wizdots{display:flex;gap:6px}.wizdots button{flex:1;height:4px;border-radius:2px;background:var(--highlight);transition:background var(--d-micro)}.wizdots button.done{background:color-mix(in srgb,var(--accent) 45%,var(--highlight))}.wizdots button[aria-selected=true]{background:var(--accent)}.wizdots button:hover{background:var(--accent-hover)}.wizcompare{display:flex;align-items:center;gap:8px;font-size:var(--t-label)}.wizcompare .seg>button{padding:3px 9px}.wizscroll{flex:1;min-height:0;overflow-y:auto;padding:14px 16px 18px;display:flex;flex-direction:column;gap:14px}.wizlead{font-size:var(--t-panel);line-height:1.55;color:var(--dim)}.wizguide{display:flex;flex-direction:column;gap:8px;padding-top:12px;border-top:1px solid var(--rule2)}.wizexplain{display:grid;grid-template-columns:auto 1fr;gap:5px 12px;margin:0;font-size:var(--t-chrome);line-height:1.5}.wizexplain dt{font-size:var(--t-eyebrow);letter-spacing:.12em;text-transform:uppercase;color:var(--muted);padding-top:3px;white-space:nowrap}.wizexplain dd{margin:0;color:var(--dim)}.wizlearn{font-size:var(--t-label);color:var(--accent-text);align-self:flex-start;text-decoration:none}.wizlearn:hover{text-decoration:underline}.wizcontrols{display:flex;flex-direction:column;gap:12px;padding:12px;border:1px solid var(--rule2);border-radius:var(--radius-lg);background:var(--card)}.wizlive{display:flex;flex-direction:column;gap:12px}.wizrow{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:var(--t-chrome)}.wizsmall{font-size:var(--t-label);line-height:1.5}.wizwhy{font-size:var(--t-chrome);line-height:1.5;color:var(--dim)}.wizchoices{display:grid;grid-template-columns:1fr 1fr;gap:8px}.wizchoice{display:flex;flex-direction:column;align-items:flex-start;gap:4px;padding:10px 11px;text-align:left;border:1px solid var(--rule2);border-radius:var(--radius);background:var(--paper);font-size:var(--t-label);line-height:1.45}.wizchoice .name{font-size:13px;font-weight:600;color:var(--ink)}.wizchoice:hover{border-color:var(--highlight)}.wizchoice[aria-pressed=true]{border-color:var(--accent);background:var(--accent-subtle)}.wiznote{display:flex;flex-direction:column;align-items:flex-start;gap:8px;padding:10px 11px;border-radius:var(--radius);background:var(--accent-subtle);font-size:var(--t-label);line-height:1.5;color:var(--dim)}.wiznav{flex:none;display:flex;align-items:center;gap:12px;padding:12px 16px;border-top:1px solid var(--rule2);background:var(--paper)}.kinds{display:grid;grid-template-columns:1fr 1fr;gap:9px}.kind{display:flex;flex-direction:column;align-items:stretch;gap:4px;padding:7px 7px 9px;text-align:left;border:1px solid var(--rule2);border-radius:var(--radius-lg);background:var(--card);min-width:0;transition:border-color var(--d-micro),background var(--d-micro)}.kind:hover{border-color:var(--highlight)}.kind[aria-checked=true]{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 7%,var(--card));box-shadow:0 0 0 1px var(--accent)}.kthumb{position:relative;height:104px;border-radius:var(--radius);background-color:var(--stage);background-image:repeating-conic-gradient(var(--checker-a) 0% 25%,var(--checker-b) 0% 50%);background-size:10px 10px;display:grid;place-items:center;overflow:hidden;margin-bottom:3px}.kthumb img{max-width:92%;max-height:92%;object-fit:contain;image-rendering:auto}.kspin{position:absolute;inset:auto 0 0;height:2px;overflow:hidden;display:none}.kind.busy .kspin{display:block}.kspin:after{content:"";position:absolute;top:0;bottom:0;left:0;width:30%;background:var(--accent);animation:sweepacross 1.6s var(--ease-out-expo) infinite}@media(prefers-reduced-motion:reduce){.kspin:after{animation:none;width:100%;opacity:.5}}.kname{display:flex;align-items:baseline;justify-content:space-between;gap:6px;font-size:12.5px;font-weight:600;color:var(--ink);padding:0 2px}.ksugg{font-size:9.5px;font-weight:500;letter-spacing:.08em;text-transform:uppercase;color:var(--accent-text)}.kwhy,.knote,.kstat{font-size:11px;line-height:1.4;padding:0 2px}.kwhy{color:var(--faint)}.knote{color:var(--muted);font-style:italic}.kstat{color:var(--muted);margin-top:2px}.wizreadout table{width:100%;border-collapse:collapse;font-size:var(--t-chrome)}.wizreadout th,.wizreadout td{padding:4px 0;text-align:right;font-weight:400}.wizreadout thead th{font-size:var(--t-eyebrow);letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}.wizreadout tbody th{text-align:left;color:var(--faint)}.wizreadout td{color:var(--ink);padding-left:10px}.wizreadout td.delta{width:70px}.wizreadout td.delta.same{color:var(--muted)}.wizchanges .wizchange{display:flex;justify-content:space-between;gap:10px;font-size:var(--t-chrome);color:var(--faint)}.wizchanges .wizchange .num{color:var(--ink)}.pane.source.comparing .panelabel{color:var(--accent-text)}.intro{width:min(620px,80%);display:flex;flex-direction:column;gap:12px;padding:16px 18px;border:1px solid var(--accent-soft);border-radius:var(--radius-xl);background:color-mix(in srgb,var(--accent) 5%,var(--paper))}.intro ol{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:9px}.intro li{display:flex;gap:11px;align-items:baseline;font-size:var(--t-chrome);line-height:1.5}.intro li>div{display:flex;flex-direction:column}.introstep{width:20px;height:20px;flex:none;border-radius:50%;display:grid;place-items:center;font-size:11px;font-weight:600;background:var(--accent);color:var(--accent-ink)}.introtitle{color:var(--ink);font-weight:500}.introfoot{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:var(--t-label)}html.framed:not(.fullscreen) body{padding-top:6px;background:var(--void)}html.framed:not(.fullscreen) #app{position:relative;border-top:1px solid rgba(201,117,74,.35)}.desktopnote{margin:14px 0 0;font-size:12.5px;text-align:center}.webcontrols{display:flex;gap:2px;margin-left:4px}.webcontrols .btn{gap:6px}.phonenote{position:fixed;inset:0;z-index:60;display:grid;place-items:center;padding:16px;background:color-mix(in srgb,var(--void) 82%,transparent)}.phonecard{max-width:420px;display:flex;flex-direction:column;gap:12px;padding:22px;border-radius:var(--radius-lg, 12px);background:var(--card);box-shadow:var(--shadow-lg)}.phonecard p{margin:0;font-size:13.5px;line-height:1.65;color:var(--dim)}.sc-loading{padding:40px;text-align:center}.sc-page{width:min(1320px,100%);margin:0 auto;padding:24px;display:flex;flex-direction:column;gap:18px}.sc-head h1{margin:0 0 6px;font-size:28px;font-weight:600}.sc-head p,.sc-results>p{margin:0;max-width:96ch;font-size:13px;line-height:1.6}.sc-main{display:grid;grid-template-columns:300px 1fr;gap:16px;min-height:0;align-items:start}.sc-list{height:560px;overflow-y:auto;overscroll-behavior:contain;padding:0 10px 10px;border:1px solid var(--rule2);border-radius:var(--radius-lg);background:var(--card);scrollbar-width:thin}.sc-sethead{position:sticky;top:0;z-index:1;display:flex;justify-content:space-between;padding:10px 2px 8px;background:var(--card);font-size:11px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--dim)}.sc-sethead span{color:var(--faint);font-weight:600}.sc-tiles{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;margin-bottom:6px}.sc-case{display:flex;flex-direction:column;align-items:stretch;gap:4px;min-width:0;overflow:hidden;padding:5px;border:1px solid var(--rule2);border-radius:var(--radius-sm);background:var(--stage);color:var(--dim);cursor:pointer;text-align:left}.sc-case[aria-pressed=true]{border-color:var(--accent);background:var(--accent-subtle);color:var(--accent)}.sc-thumb{aspect-ratio:1;width:100%;border-radius:5px;background:#fff;display:grid;place-items:center;overflow:hidden}.sc-thumb img{width:100%;height:100%;object-fit:contain}.sc-name{width:100%;font-size:11px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sc-caption{margin:0;font-size:12.5px;color:var(--dim)}.sc-stagecol{display:flex;flex-direction:column;gap:10px;min-width:0}.sc-tools{display:flex;align-items:center;gap:8px;flex-wrap:nowrap;white-space:nowrap}.sc-tools .eyebrow{margin-left:6px}.sc-legend{margin-right:4px;display:inline-flex;align-items:center;gap:6px;font-size:11.5px}.sc-dot{display:inline-block;width:8px;height:8px;border-radius:50%}.sc-dot.a{background:var(--anchor)}.sc-dot.hd{background:var(--handle);margin-left:6px}.sc-viewer{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.sc-pane{position:relative;aspect-ratio:1;overflow:hidden;border:1px solid var(--rule2);border-radius:var(--radius-sm);background-color:var(--stage);background-image:repeating-conic-gradient(var(--checker-a) 0% 25%,var(--checker-b) 0% 50%);background-size:16px 16px;cursor:grab;touch-action:none;user-select:none}.sc-pane:active{cursor:grabbing}.sc-cam{position:absolute;left:0;top:0;width:100%;height:100%;transform-origin:0 0}.sc-cam>img,.sc-layer,.sc-layer>svg{position:absolute;inset:0;width:100%;height:100%;display:block}.sc-cam>img{object-fit:contain}.sc-tag{position:absolute;top:8px;left:8px;padding:4px 7px;border-radius:6px;font-size:11px;font-weight:600;background:color-mix(in srgb,var(--paper) 85%,transparent);color:var(--ink);pointer-events:none}.sc-wire path,.sc-wire circle,.sc-wire ellipse,.sc-wire rect,.sc-wire polygon{fill:none!important;stroke:var(--wire);stroke-width:1px;vector-effect:non-scaling-stroke;stroke-opacity:.9}.sc-ov{pointer-events:none}.sc-ov .h{stroke:var(--handle);stroke-width:1px;vector-effect:non-scaling-stroke;fill:none;stroke-opacity:.85}.sc-ov .hd{stroke:var(--handle);stroke-width:3.5px;vector-effect:non-scaling-stroke;stroke-linecap:round;fill:none}.sc-ov .a{stroke:var(--anchor);stroke-width:5px;vector-effect:non-scaling-stroke;stroke-linecap:round;fill:none}.sc-chips{display:flex;flex-wrap:wrap;gap:6px}.sc-chip{font-size:12px;padding:4px 9px;border-radius:999px;border:1px solid var(--rule2);color:var(--dim);font-variant-numeric:tabular-nums}.sc-chip.win{border-color:transparent;background:var(--goodbg);color:var(--good)}.sc-results{display:flex;flex-direction:column;gap:12px;padding-top:8px;border-top:1px solid var(--rule2)}.sc-results h2{margin:8px 0 0;font-size:22px;font-weight:600}.sc-bignums{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.sc-bignum{display:flex;flex-direction:column;gap:4px;padding:12px 14px;border:1px solid var(--rule2);border-radius:var(--radius-lg);background:var(--card);font-size:12px}.sc-bignum .v{font-size:28px;color:var(--accent);line-height:1.1}.sc-table{width:100%;border-collapse:collapse;font-size:12.5px;background:var(--card);border:1px solid var(--rule2);border-radius:var(--radius-lg);overflow:hidden}.sc-table th,.sc-table td{padding:8px 12px;text-align:right;border-bottom:1px solid var(--rule2);white-space:nowrap}.sc-table th:first-child,.sc-table td:first-child{text-align:left}.sc-table th{font-size:11px;font-weight:600;color:var(--faint);text-transform:uppercase;letter-spacing:.04em}.sc-table td.num{font-variant-numeric:tabular-nums;color:var(--dim)}.sc-table tr.win td{color:var(--ink)}.sc-table tr.win td:first-child{color:var(--accent);font-weight:600}.sc-note{font-size:12px!important}.sc-table caption{text-align:left;padding:10px 12px 4px;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--faint)}.stagerow.running{color:var(--ink)}.stagerow.running .mark{color:var(--accent)}.stagerow .sub{margin-left:6px;color:var(--faint)}.activity{position:absolute;right:12px;bottom:12px;z-index:6;width:min(360px,calc(100% - 24px));display:flex;flex-direction:column;background:var(--card);border:1px solid var(--rule2);border-radius:var(--radius);box-shadow:var(--shadow-sm);font-family:var(--font-body);font-size:var(--t-label);font-variant-numeric:tabular-nums;color:var(--dim);overflow:hidden}.activity[hidden]{display:none}.activityhead{display:flex;align-items:center;gap:8px;padding:6px 10px;background:none;border:0;color:var(--dim);font:inherit;cursor:pointer;text-align:left}.activityhead .title{flex:1;font-weight:500;color:var(--ink)}.activityhead .chev{color:var(--accent-text)}.activitybody{max-height:180px;overflow-y:auto;padding:0 10px 8px;border-top:1px solid var(--rule)}.activity:not(.open) .activitybody{display:none}.activityline{display:flex;gap:8px;padding-top:3px;line-height:1.35}.activityline .t{flex:none;width:38px;text-align:right;color:var(--muted)}.activityline .w{flex:1;min-width:0}.activityline .r{flex:none;color:var(--muted)}.activityline.running .w,.activityline.running .r{color:var(--accent-text)}.activityline.note .w{color:var(--faint);padding-left:10px}
|
|
|
|
|
|
studio/assets/main-CdmTdoOg.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
@font-face{font-family:Inter Studio;src:url(../fonts/inter-latin.woff2) format("woff2");font-weight:100 900;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Playfair Studio;src:url(../fonts/playfair-latin.woff2) format("woff2");font-weight:400 900;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root,:root[data-theme=dark]{color-scheme:dark;--void: #0c0a09;--stage: #141210;--paper: #1a1816;--card: #211f1c;--surface: #2a2724;--highlight: #35322e;--ink: #faf8f5;--dim: rgba(250, 248, 245, .75);--faint: rgba(250, 248, 245, .55);--muted: rgba(250, 248, 245, .5);--rule: rgba(250, 248, 245, .08);--rule2: #2a2724;--accent: #c9754a;--accent-text: #d4896a;--accent-hover: #d4896a;--accent-ink: #1a1816;--accent-soft: rgba(201, 117, 74, .12);--accent-subtle: rgba(201, 117, 74, .08);--gold: #b8976c;--gold-soft: rgba(184, 151, 108, .15);--good: #34d399;--goodbg: rgba(52, 211, 153, .15);--bad: #f87171;--badbg: rgba(248, 113, 113, .15);--anchor: #f87171;--handle: #b8976c;--wire: #faf8f5;--vt: #9a938c;--checker-a: #191715;--checker-b: #141210;--focus: rgba(201, 117, 74, .35);--focus-line: #c9754a;--state-draft: #b8976c;--state-final: #34d399;--state-stale: #c9754a;--shadow-sm: 0 4px 12px -2px rgba(12, 10, 9, .4);--shadow: 0 8px 24px -4px rgba(12, 10, 9, .5);--shadow-lg: 0 20px 50px -12px rgba(12, 10, 9, .6);--shadow-xl: 0 30px 70px -20px rgba(12, 10, 9, .7);--glow: 0 6px 20px rgba(201, 117, 74, .25)}:root[data-theme=light]{color-scheme:light;--void: #e6e1d9;--stage: #f0ece6;--paper: #faf8f5;--card: #ffffff;--surface: #eae5dd;--highlight: #ded8ce;--ink: #1a1816;--dim: rgba(26, 24, 22, .75);--faint: rgba(26, 24, 22, .7);--muted: rgba(26, 24, 22, .64);--rule: rgba(26, 24, 22, .1);--rule2: #d8d2c8;--accent: #c9754a;--accent-text: #9c5730;--accent-hover: #d4896a;--accent-ink: #1a1816;--accent-soft: rgba(201, 117, 74, .14);--accent-subtle: rgba(201, 117, 74, .08);--gold: #8a6a3f;--gold-soft: rgba(138, 106, 63, .14);--good: #1c7a55;--goodbg: rgba(28, 122, 85, .14);--bad: #b83232;--badbg: rgba(184, 50, 50, .13);--anchor: #b83232;--handle: #8a6a3f;--wire: #1a1816;--vt: #6f6862;--checker-a: #ffffff;--checker-b: #e8e3db;--focus: rgba(201, 117, 74, .45);--focus-line: #9c5730;--state-draft: #8a6a3f;--state-final: #1c7a55;--state-stale: #9c5730;--shadow-sm: 0 4px 12px -2px rgba(90, 76, 60, .12);--shadow: 0 8px 24px -4px rgba(90, 76, 60, .16);--shadow-lg: 0 20px 50px -12px rgba(90, 76, 60, .2);--shadow-xl: 0 30px 70px -20px rgba(90, 76, 60, .24);--glow: 0 6px 20px rgba(201, 117, 74, .28)}:root{--font-display: "Playfair Studio", "Playfair Display", Georgia, serif;--font-body: "Inter Studio", Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;--font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--h-compact: 28px;--h-control: 32px;--h-pill: 36px;--h-appbar: 46px;--h-status: 26px;--h-row: 30px;--t-chrome: 12.5px;--t-panel: 13px;--t-label: 11.5px;--t-eyebrow: 10px;--s1: 4px;--s2: 8px;--s3: 12px;--s4: 16px;--s5: 24px;--s6: 32px;--rail-pad: 14px;--rail-w: 352px;--radius-sm: 6px;--radius: 8px;--radius-lg: 12px;--radius-xl: 16px;--radius-full: 9999px;--ease-out-expo: cubic-bezier(.16, 1, .3, 1);--ease-smooth: cubic-bezier(.4, 0, .2, 1);--d-micro: .15s;--d-fast: .2s;--d-normal: .4s}@media(prefers-reduced-motion:reduce){:root{--d-micro: 0ms;--d-fast: 0ms;--d-normal: 0ms}}*,*:before,*:after{box-sizing:border-box}html,body{height:100%;margin:0;overflow:hidden}body{background:var(--paper);color:var(--ink);font:400 var(--t-panel) / 1.5 var(--font-body);-webkit-font-smoothing:antialiased;user-select:none;cursor:default}#app{height:100%;display:flex;flex-direction:column}:focus{outline:none}:focus-visible{outline:2px solid var(--focus-line);outline-offset:2px;border-radius:var(--radius-sm)}a{color:var(--accent-text);text-decoration:none}a:hover{text-decoration:underline}p a,.stagestate .body a{text-decoration:underline;text-underline-offset:2px}button{font:inherit;color:inherit;background:none;border:none;padding:0;cursor:pointer}.num{font-variant-numeric:tabular-nums}.mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}.serif{font-family:var(--font-display);letter-spacing:-.03em}.eyebrow{font-size:var(--t-eyebrow);letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}.dim{color:var(--dim)}.faint{color:var(--faint)}.muted{color:var(--muted)}.sep{width:1px;height:18px;background:var(--rule2);flex:none}.spacer{flex:1}kbd{font:500 10.5px var(--font-mono);border:1px solid var(--highlight);border-radius:4px;padding:1px 5px;color:var(--faint)}.btn{height:var(--h-control);padding:0 16px;border-radius:var(--radius-full);border:1px solid var(--rule2);background:transparent;color:var(--dim);font-weight:500;font-size:var(--t-chrome);display:inline-flex;align-items:center;justify-content:center;gap:7px;white-space:nowrap;transition:transform var(--d-micro) var(--ease-smooth),background var(--d-micro),border-color var(--d-micro),box-shadow var(--d-micro)}.btn:hover:not(:disabled){border-color:var(--highlight);color:var(--ink)}.btn:active:not(:disabled){transform:scale(.98)}.btn:disabled{opacity:.45;cursor:default}.btn.primary{height:var(--h-pill);border-color:var(--accent);background:var(--accent);color:var(--accent-ink);font-weight:600;font-size:var(--t-panel);box-shadow:var(--glow)}.btn.primary:hover:not(:disabled){background:var(--accent-hover);border-color:var(--accent-hover);color:var(--accent-ink);transform:translateY(-2px)}.btn.ghost{border-color:transparent}.btn.ghost:hover:not(:disabled){background:var(--surface)}.btn.compact{height:var(--h-compact);padding:0 11px;border-radius:var(--radius);font-size:var(--t-chrome)}.btn.icon{width:var(--h-control);padding:0}.btn.icon.compact{width:var(--h-compact)}.btn.danger{color:var(--bad)}.seg{display:inline-flex;gap:2px;padding:2px;background:var(--card);border:1px solid var(--rule2);border-radius:7px}.seg>button{font-size:var(--t-label);padding:4px 11px;border-radius:5px;color:var(--faint);white-space:nowrap;transition:background var(--d-micro),color var(--d-micro)}.seg>button:hover{color:var(--dim)}.seg>button[aria-pressed=true]{background:var(--highlight);color:var(--ink);font-weight:500}.seg>button:disabled{color:var(--muted);cursor:default}.toggle{font-size:var(--t-label);padding:3px 9px;border-radius:var(--radius-sm);border:1px solid transparent;color:var(--faint)}.toggle:hover{color:var(--dim)}.toggle[aria-pressed=true]{border-color:var(--highlight);background:var(--rule2);color:var(--ink)}.switch{width:32px;height:18px;flex:none;border-radius:var(--radius-full);background:var(--highlight);position:relative;transition:background var(--d-micro)}.switch:after{content:"";position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:var(--faint);transition:transform var(--d-micro) var(--ease-smooth),background var(--d-micro)}.switch[aria-checked=true],[aria-checked=true]>.switch{background:var(--accent)}.switch[aria-checked=true]:after,[aria-checked=true]>.switch:after{transform:translate(14px);background:var(--accent-ink)}.checkbox{width:15px;height:15px;flex:none;border-radius:4px;border:1px solid var(--highlight);display:grid;place-items:center;color:var(--accent-ink)}[aria-checked=true]>.checkbox{background:var(--accent);border-color:var(--accent)}.checkbox>svg{visibility:hidden}[aria-checked=true]>.checkbox>svg{visibility:visible}.appbar{height:var(--h-appbar);flex:none;display:flex;align-items:center;gap:12px;padding:0 12px;background:var(--stage);border-bottom:1px solid var(--rule2);-webkit-app-region:drag}.appbar button,.appbar .seg,.appbar .filechip,.appbar .nodrag{-webkit-app-region:no-drag}.apptabs{margin-left:auto}.appactions{margin-left:auto;display:flex;align-items:center;gap:2px}.brand{margin:0;display:flex;align-items:center;gap:8px;font-size:var(--t-chrome);font-weight:600;letter-spacing:-.01em;padding-right:4px}.brand>svg{color:var(--accent)}.filechip{display:flex;align-items:center;gap:8px;height:var(--h-compact);padding:0 10px;background:var(--card);border:1px solid var(--rule2);border-radius:var(--radius-sm);font-size:var(--t-chrome);max-width:340px}.filechip .name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wincontrols{display:flex;gap:2px;margin-left:4px}.wincontrols button{width:30px;height:26px;display:grid;place-items:center;border-radius:var(--radius-sm);color:var(--faint)}.wincontrols button:hover{background:var(--surface);color:var(--ink)}.wincontrols button.close:hover{background:var(--bad);color:#fff}.wincontrols i{display:block;background:currentColor}.wincontrols .min i{width:10px;height:1px}.wincontrols .max i{width:9px;height:9px;background:none;border:1px solid currentColor;border-radius:2px}.body{flex:1;min-height:0;display:flex}.stage{flex:1;min-width:0;display:flex;flex-direction:column;background:var(--stage);position:relative}.viewertools{min-height:38px;flex:none;display:flex;align-items:center;flex-wrap:wrap;gap:8px 12px;padding:5px 12px;border-bottom:1px solid var(--rule2);background:color-mix(in srgb,var(--stage) 92%,transparent)}.legend{display:flex;align-items:center;gap:10px;font-size:11px;color:var(--faint)}.legend span{display:flex;align-items:center;gap:5px}.legend i{display:block}.legend .anchor{width:7px;height:7px;border-radius:50%;background:var(--anchor)}.legend .handle{width:7px;height:7px;background:var(--handle);transform:rotate(45deg)}.legend .band{width:12px;height:6px;border-radius:2px}.legend .band.sure,.overlay .certainty .sure{--band: #30a46c}.legend .band.soft,.overlay .certainty .soft{--band: #f5a524}.legend .band.unsure,.overlay .certainty .unsure{--band: #e5484d}.legend .band{background:var(--band)}.overlay .certainty path{fill:var(--band);fill-rule:evenodd;fill-opacity:.45;stroke:var(--band);stroke-width:1;vector-effect:non-scaling-stroke}.legend .wire{width:12px;height:2px;background:var(--wire)}.panes{flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.pane{flex:1;min-width:0;position:relative;overflow:hidden;display:grid;place-items:center;background-color:var(--stage);background-image:repeating-conic-gradient(var(--checker-a) 0% 25%,var(--checker-b) 0% 50%);background-size:16px 16px;cursor:grab;touch-action:none}.pane:active{cursor:grabbing}.pane.hidden{display:none}.panes.stacked .pane{position:absolute;inset:0}.panelabel{position:absolute;top:10px;left:12px;z-index:3;pointer-events:none}.chip{position:absolute;top:8px;right:12px;z-index:3;display:inline-flex;align-items:center;gap:6px;height:24px;padding:0 10px;border-radius:var(--radius-full);font-size:var(--t-label);border:1px solid;pointer-events:none}.chip i{width:6px;height:6px;border-radius:50%;background:currentColor;display:block}.chip.draft{color:var(--state-draft);border-color:color-mix(in srgb,var(--state-draft) 45%,transparent);background:color-mix(in srgb,var(--state-draft) 15%,transparent)}.chip.final{color:var(--state-final);border-color:color-mix(in srgb,var(--state-final) 40%,transparent);background:color-mix(in srgb,var(--state-final) 15%,transparent)}.chip.stale{color:var(--state-stale);border-color:color-mix(in srgb,var(--state-stale) 45%,transparent);background:color-mix(in srgb,var(--state-stale) 15%,transparent)}.chip.swapped:after{content:"";position:absolute;left:10px;right:10px;bottom:-3px;height:1.5px;background:var(--accent);border-radius:1px;transform-origin:left;animation:sweep var(--d-normal) var(--ease-out-expo)}@keyframes sweep{0%{transform:scaleX(0)}to{transform:scaleX(1)}}.art{position:absolute;left:0;top:0;transform-origin:0 0;will-change:transform;pointer-events:none}.art img{display:block;image-rendering:pixelated}.art svg{display:block;overflow:visible}.art.swapping{animation:crossfade var(--d-normal) var(--ease-out-expo)}@keyframes crossfade{0%{opacity:.25}to{opacity:1}}.art.centred{position:static;place-self:stretch;min-width:0;min-height:0;padding:44px 32px 32px}.panes.onlight{--stage: #f3f0ea;--checker-a: #ffffff;--checker-b: #ebe7df}.panes.ondark{--stage: #1a1816;--checker-a: #26231f;--checker-b: #211f1c}.overlay{position:absolute;left:0;top:0;overflow:visible;pointer-events:none}.overlay .wireframe path{fill:none;stroke:var(--wire);stroke-width:1px;vector-effect:non-scaling-stroke}.overlay .handles path{fill:none;stroke:var(--handle);vector-effect:non-scaling-stroke}.overlay .handles .lines{stroke-width:.8px}.overlay .handles .knobs{stroke-width:2.4px;stroke-linecap:square}.pane>canvas.anchors{position:absolute;left:0;top:0;pointer-events:none}.wipehandle{position:absolute;top:0;bottom:0;width:24px;margin-left:-12px;z-index:4;cursor:ew-resize;opacity:.7;touch-action:none}.wipehandle:before{content:"";position:absolute;top:0;bottom:0;left:11px;width:2px;background:var(--ink)}.wipehandle:focus-visible{opacity:1;outline-offset:-2px}.panes:focus-visible{outline-offset:-3px;border-radius:0}.panpad>button.pan{display:grid;place-items:center;min-width:26px;min-height:24px;padding:4px 6px;color:var(--dim)}.panpad>button.left>svg,.panpad>button.up>svg{transform:rotate(180deg)}.vh{position:absolute!important;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.wipehandle:after{content:"";position:absolute;left:50%;top:50%;width:26px;height:26px;margin:-13px 0 0 -13px;border-radius:50%;border:2px solid var(--ink);background:var(--stage)}.detailpane{position:absolute;inset:0;z-index:5;background:var(--stage);display:flex;flex-direction:column}.detailhead{flex:none;display:flex;align-items:center;gap:10px;padding:8px 12px;border-bottom:1px solid var(--rule2);font-size:var(--t-label);color:var(--dim)}.detailbody{flex:1;min-height:0;position:relative;overflow:hidden;display:grid;place-items:center}.detailfoot{flex:none;padding:8px 12px;border-top:1px solid var(--rule2);font-size:var(--t-label);color:var(--faint)}.pixelgrid{position:absolute;inset:0;background-image:linear-gradient(to right,rgba(250,248,245,.07) 1px,transparent 1px),linear-gradient(to bottom,rgba(250,248,245,.07) 1px,transparent 1px);pointer-events:none}:root[data-theme=light] .pixelgrid{background-image:linear-gradient(to right,rgba(26,24,22,.1) 1px,transparent 1px),linear-gradient(to bottom,rgba(26,24,22,.1) 1px,transparent 1px)}.stagestate{position:absolute;inset:0;z-index:6;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:11px;padding:32px;text-align:center;background:var(--stage)}.stagestate .title{font-size:16px;font-weight:500}.stagestate .body{display:block;font-size:var(--t-chrome);line-height:1.6;color:var(--faint);max-width:46ch}.stagestate .action{font-size:var(--t-chrome);color:var(--accent-text);margin-top:2px}.statusstrip{height:var(--h-status);flex:none;display:flex;align-items:center;gap:10px;padding:0 12px;border-top:1px solid var(--rule2);background:var(--stage);font-size:var(--t-label);color:var(--faint);font-variant-numeric:tabular-nums}.statusstrip .lead{color:var(--dim)}.statusstrip .privacy{margin-left:auto}.statusstrip .updatechip{display:inline-flex;align-items:center;gap:6px;color:var(--gold)}.statusstrip .updatechip i{width:6px;height:6px;border-radius:50%;background:currentColor;display:block}.statusstrip .fetchchip{display:inline-flex;align-items:center;gap:8px;margin-left:12px;color:var(--faint);white-space:nowrap}.statusstrip .fetchchip.bad{color:var(--bad)}.fetchbar{width:64px;flex:none}.fetchnote{display:flex;flex-direction:column;gap:6px;font-size:11.5px;line-height:1.45;color:var(--faint)}.fetchnote .fetchbar{width:100%}.fetchnote .fetchline{color:var(--dim);font-variant-numeric:tabular-nums}.rail{width:var(--rail-w);flex:none;border-left:1px solid var(--rule2);background:var(--paper);display:flex;flex-direction:column;position:relative}.railscroll{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;padding:var(--rail-pad);display:flex;flex-direction:column;gap:var(--rail-pad)}.railscroll::-webkit-scrollbar{width:10px}.railscroll::-webkit-scrollbar-thumb{background:var(--rule2);border-radius:5px;border:3px solid var(--paper)}.railscroll::-webkit-scrollbar-thumb:hover{background:var(--highlight)}.card{border:1px solid var(--rule2);background:var(--card);border-radius:var(--radius-lg);padding:13px;display:flex;flex-direction:column;gap:10px}.cardhead{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.railfoot{flex:none;border-top:1px solid var(--rule2);background:var(--stage);padding:12px var(--rail-pad);display:flex;flex-direction:column;gap:8px}.railfoot .row{display:flex;gap:8px}.railfoot .note{display:flex;justify-content:space-between;font-size:var(--t-label);color:var(--muted)}.presets{display:flex;flex-wrap:wrap;gap:5px}.preset{display:inline-flex;align-items:center;padding:5px 10px;border-radius:999px;border:1px solid var(--rule2);background:var(--card);font-size:var(--t-chrome);color:var(--dim);transition:border-color var(--d-micro),background var(--d-micro),color var(--d-micro)}.preset:hover{border-color:var(--highlight);color:var(--ink)}.preset[aria-pressed=true]{border-color:var(--accent);background:var(--accent-soft);color:var(--ink);font-weight:500}.preset.saved{padding-right:22px}.preset{position:relative}.preset .forget{position:absolute;top:50%;margin-top:-8px;right:4px;width:16px;height:16px;border-radius:5px;opacity:0;transition:opacity var(--d-micro),background var(--d-micro)}.preset .forget:before,.preset .forget:after{content:"";position:absolute;left:4px;top:7.5px;width:8px;height:1.5px;border-radius:1px;background:var(--muted)}.preset .forget:before{transform:rotate(45deg)}.preset .forget:after{transform:rotate(-45deg)}.preset:hover .forget,.preset .forget:focus-visible{opacity:1}.preset .forget:hover{background:var(--highlight)}.preset .forget:hover:before,.preset .forget:hover:after{background:var(--bad)}.traybar{display:flex;align-items:baseline;justify-content:space-between;gap:8px;font-size:11px}.railmodes{flex:none;display:flex;flex-direction:column;gap:8px;padding:10px var(--rail-pad) 0}.railmodes-row{display:grid;grid-template-columns:1.75fr 1fr;gap:8px}.mode.mode-engine{background:var(--paper);border-color:var(--rule)}.mode{min-width:0;display:flex;flex-direction:column;gap:8px;padding:10px 11px 11px;border:1px solid var(--rule2);border-radius:var(--radius-lg);background:var(--card)}.modehead{display:flex;align-items:baseline;justify-content:space-between;gap:8px;min-height:16px}.modetitle{font-size:12.5px;font-weight:600;color:var(--ink)}.modestate{font-size:10.5px;color:var(--muted);white-space:nowrap}.seg.big{display:flex;width:100%;padding:3px}.seg.big>button{flex:1;padding:7px 0;font-size:12.5px;text-align:center}.seg.big>button[aria-pressed=true]{background:var(--accent);color:var(--accent-ink);font-weight:600}.bigswitch{display:flex;align-items:center;gap:8px;height:34px;padding:0 4px;border:1px solid var(--rule2);border-radius:999px;background:var(--paper);color:var(--dim);font-size:12.5px;font-weight:600;transition:background var(--d-micro),border-color var(--d-micro),color var(--d-micro)}.bigswitch .knob{flex:none;width:24px;height:24px;border-radius:50%;background:var(--highlight);transition:background var(--d-micro)}.bigswitch .state{flex:1;text-align:center;padding-right:4px}.bigswitch[aria-checked=true]{background:var(--accent);border-color:var(--accent);color:var(--accent-ink)}.bigswitch[aria-checked=true]{flex-direction:row-reverse}.bigswitch[aria-checked=true] .knob{background:var(--accent-ink)}.bigswitch[aria-checked=true] .state{padding-right:0;padding-left:4px}.railtabs{flex:none;background:var(--stage);border-bottom:1px solid var(--rule2)}.railseg{display:flex;width:100%}.railseg>button{position:relative;flex:1;display:flex;align-items:baseline;justify-content:center;gap:8px;height:46px;padding:14px 12px 0;color:var(--muted);transition:color var(--d-micro),background var(--d-micro)}.railseg>button:hover:not([aria-selected=true]){color:var(--dim);background:color-mix(in srgb,var(--ink) 4%,transparent)}.railseg>button[aria-selected=true]{color:var(--ink);background:var(--paper)}.railseg>button:after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;background:transparent;transition:background var(--d-micro)}.railseg>button[aria-selected=true]:after{background:var(--accent)}.railseg .tablabel{font-size:14px;font-weight:600;letter-spacing:-.005em}.railseg .tabnote{font-size:11px;font-weight:500;font-variant-numeric:tabular-nums;color:var(--faint)}.railseg .tabnote:empty{display:none}.railseg>button[aria-selected=true] .tabnote{color:var(--accent-text)}.tabcaption{margin:0;padding:7px var(--rail-pad) 9px;background:var(--paper);font-size:11.5px;color:var(--muted)}.presetblock{display:flex;flex-direction:column;gap:8px}.presetblock .traybar .faint{min-width:0}.rail section.group{gap:0;border:1px solid var(--rule2);background:var(--card);border-radius:var(--radius-lg)}.rail section.group .grouphead{align-items:center;padding-right:13px}.groupbtn{flex:1;display:flex;align-items:center;gap:7px;padding:11px 9px 11px 13px;color:var(--muted);text-align:left;border-radius:var(--radius-lg)}.groupbtn:hover{color:var(--dim)}.groupbtn .changed{font-size:10.5px;color:var(--accent-text)}.groupbody{display:flex;flex-direction:column;gap:13px;padding:2px 13px 14px}.control.changed .controlhead .label:before{content:"";display:inline-block;width:5px;height:5px;margin-right:6px;border-radius:50%;background:var(--accent);vertical-align:1px}.emptycard p{margin:0;font-size:var(--t-chrome);line-height:1.55;color:var(--dim)}.structure .srow{display:grid;grid-template-columns:1fr auto;column-gap:8px;row-gap:5px;align-items:baseline}.structure .srow .k{font-size:var(--t-chrome);color:var(--dim)}.structure .srow .v{font-size:var(--t-panel);font-variant-numeric:tabular-nums}.structure .srow .v .of{margin-left:6px;font-size:10.5px;color:var(--muted)}.sbar{grid-column:1 / -1;position:relative;height:4px;margin-bottom:4px;border-radius:2px;background:var(--highlight)}.sbar i{position:absolute;inset:0 auto 0 0;border-radius:2px;background:var(--accent);transition:width var(--d-normal) var(--ease-out-expo)}.sbar b{position:absolute;top:-3px;bottom:-3px;width:2px;margin-left:-1px;border-radius:1px;background:var(--dim)}.readout{display:flex;flex-direction:column;min-height:54px;background:var(--rule2);border:1px solid var(--rule2);border-radius:var(--radius);overflow:hidden}.readout-badge-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:4px 10px;background:var(--card);border-bottom:1px solid var(--rule2)}.engine-pill{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;border-radius:999px;font-size:11px;font-weight:600;border:1px solid transparent;cursor:pointer;transition:all var(--d-micro);line-height:1.4;font-family:inherit}.engine-pill.fast{background:color-mix(in srgb,var(--accent) 15%,var(--paper));border-color:color-mix(in srgb,var(--accent) 40%,transparent);color:var(--accent)}.engine-pill.quality{background:color-mix(in srgb,var(--accent) 10%,var(--paper));border-color:color-mix(in srgb,var(--accent) 25%,transparent);color:var(--ink)}.engine-pill:hover{filter:brightness(1.08);border-color:var(--accent)}.time-pill{font-size:11px;font-weight:500;color:var(--muted);font-variant-numeric:tabular-nums}.readout-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1px}.readout .cell{min-width:0;display:flex;flex-direction:column;gap:1px;padding:6px 10px;background:var(--paper)}.readout .v{font-size:15px;font-weight:500;line-height:1.25}.readout .k{font-size:10px;color:var(--muted)}.delta{font-size:10.5px;font-variant-numeric:tabular-nums;color:var(--muted)}.delta.better{color:var(--good)}.delta.worse{color:var(--gold)}.readout.busy,.readout.idle{display:flex;align-items:center;gap:8px;padding:0 12px;background:var(--paper);font-size:var(--t-chrome)}.readout .stage{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--state-stale)}.pulse{flex:none;width:7px;height:7px;border-radius:50%;background:var(--state-stale);animation:pulse 1s ease-in-out infinite}@keyframes pulse{50%{opacity:.3}}.headline{display:flex;align-items:flex-end;gap:12px}.headline .figure{font-family:var(--font-display);font-size:52px;line-height:.85;letter-spacing:-.03em}.headline .of{display:flex;flex-direction:column;gap:2px;padding-bottom:4px}.meter{position:relative;height:6px;border-radius:3px;background:linear-gradient(90deg,var(--good),var(--gold) 55%,var(--bad))}.meter .threshold{position:absolute;top:-3px;bottom:-3px;width:1px;background:var(--dim)}.meter .needle{position:absolute;top:-4px;width:2px;height:14px;background:var(--ink);border-radius:1px;transition:left var(--d-normal) var(--ease-out-expo)}.meterscale{display:flex;justify-content:space-between;font-size:10.5px;color:var(--muted)}.stats{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--rule2);border:1px solid var(--rule2);border-radius:var(--radius);overflow:hidden;font-variant-numeric:tabular-nums}.stats>div{background:var(--paper);padding:8px 10px;display:flex;flex-direction:column;gap:2px}.stats .k{font-size:10.5px;color:var(--muted)}.stats .v{font-size:var(--t-panel)}.benchmark{display:flex;gap:8px;padding:8px 10px;border:1px dashed var(--highlight);border-radius:var(--radius);background:color-mix(in srgb,var(--ink) 2%,transparent)}.benchmark .label{flex:none;padding-top:1px}.benchmark p{margin:0;font-size:var(--t-label);line-height:1.45;color:var(--faint)}.loss{display:flex;gap:9px;padding-bottom:9px;border-bottom:1px solid var(--rule2)}.loss:last-of-type{border-bottom:none;padding-bottom:0}.loss .glyph{flex:none;padding-top:2px;color:var(--gold)}.loss .text{font-size:var(--t-chrome);line-height:1.45;color:var(--dim)}.loss .meta{font-size:var(--t-label);color:var(--muted);display:flex;gap:6px;flex-wrap:wrap}.loss .why{font-size:var(--t-label);line-height:1.5;color:var(--faint);margin-top:4px;padding-left:9px;border-left:1px solid var(--rule2)}.loss .expand{color:var(--muted)}.loss .expand:hover{color:var(--dim)}.nothinglost{display:flex;gap:9px;align-items:center;font-size:var(--t-chrome);color:var(--faint)}.nothinglost .glyph{color:var(--good);flex:none;display:flex}.ink{display:flex;align-items:center;gap:9px;padding:2px 0;border-radius:var(--radius-sm);width:100%;text-align:left}.ink:hover{background:var(--surface)}.swatch{width:22px;height:22px;flex:none;border-radius:5px;border:1px solid color-mix(in srgb,var(--ink) 12%,transparent);background-image:repeating-conic-gradient(var(--checker-a) 0% 25%,var(--checker-b) 0% 50%);background-size:8px 8px;position:relative;overflow:hidden}.swatch i{position:absolute;inset:0;display:block}.swatch.snapped{border:2px solid var(--accent)}.ink .hex{font-size:var(--t-chrome);font-variant-numeric:tabular-nums;color:var(--dim);width:72px}.ink .share{font-size:var(--t-label);color:var(--muted);font-variant-numeric:tabular-nums;width:44px}.ink .snap{margin-left:auto;font-size:var(--t-label);color:var(--muted)}.ink .snap.on{color:var(--accent-text)}.ink{gap:6px;touch-action:none}.ink.grouped .hex{color:var(--accent-text)}.inkpick{width:16px;height:16px;flex:none;border-radius:4px;border:1px solid var(--highlight);display:grid;place-items:center;color:var(--accent-ink)}.inkpick[aria-checked=true]{background:var(--accent);border-color:var(--accent)}.inkmain{display:flex;align-items:center;gap:9px;flex:1;min-width:0;text-align:left}.inkmain[aria-disabled=true]{cursor:grab}.swatch.mini{width:16px;height:16px;border-radius:4px}.swatch.mini.ramp{width:26px}.inklist{display:flex;flex-direction:column;gap:1px;border-radius:var(--radius-sm)}.inklist,.cgroup{transition:box-shadow var(--d-fast),background var(--d-fast)}.mergebar{display:flex;align-items:center;gap:10px;font-size:var(--t-label)}.cgroups{display:flex;flex-direction:column;gap:7px}.cgroupshead{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.cgroup{border:1px solid var(--rule2);border-radius:var(--radius);background:var(--paper);padding:8px;display:flex;flex-direction:column;gap:7px}.cgroup.suggested{border-style:dashed;background:transparent}.cchips{display:flex;flex-wrap:wrap;gap:4px}.cchip{display:inline-flex;align-items:center;border:1px solid var(--highlight);border-radius:999px;background:var(--card);touch-action:none;font-size:var(--t-label);color:var(--dim)}.cchip.target{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent) inset}.cchip.unmatched{border-color:var(--gold);border-style:dashed}.cchipmain{display:inline-flex;align-items:center;gap:5px;min-height:24px;padding:2px 4px 2px 3px;border-radius:999px}.cchipmain .swatch.mini{border-radius:999px}.cchipx{display:grid;place-items:center;width:24px;height:24px;margin-right:1px;border-radius:999px;color:var(--muted)}.cchipx:hover{color:var(--ink);background:var(--surface)}.cresult{display:flex;align-items:center;gap:6px;font-size:var(--t-label)}.cresult>span{white-space:nowrap}.cresult .arrow{color:var(--muted)}.cresultchip{display:inline-flex;align-items:center;gap:5px;color:var(--dim)}.cactions{display:flex;align-items:center;gap:6px}.creport{font-size:11px;line-height:1.4;display:inline-flex;align-items:center;gap:5px;min-width:0}.creport.warn{color:var(--gold)}.creport.warn svg{flex:none}.simplifyrow{display:flex;align-items:center;gap:5px;font-size:var(--t-label)}.numberfield.simplify{min-width:0;width:40px;text-align:center}.dragghost{position:fixed;z-index:60;pointer-events:none;filter:drop-shadow(0 2px 6px rgba(0,0,0,.45))}body.dragging-ink,body.dragging-ink *{cursor:grabbing!important}body.dragging-ink [data-drop=list]{box-shadow:0 0 0 1px var(--rule2)}.dropping{box-shadow:0 0 0 2px var(--accent)!important;background:var(--accent-subtle)!important}.control{display:flex;flex-direction:column;gap:5px}.controlhead{display:flex;align-items:baseline;gap:8px}.controlhead .label{flex:1;font-size:var(--t-chrome);color:var(--dim)}.controlhead .unit{font-size:var(--t-label);color:var(--muted)}.numberfield{height:24px;min-width:58px;padding:0 6px;border:1px solid var(--highlight);border-radius:var(--radius-sm);background:var(--paper);color:var(--ink);font:400 var(--t-chrome) var(--font-body);font-variant-numeric:tabular-nums;text-align:center}.numberfield:focus-visible{border-color:var(--accent)}.slider{appearance:none;-webkit-appearance:none;width:100%;height:14px;background:none;margin:2px 0 0;cursor:pointer}.slider::-webkit-slider-runnable-track{height:3px;border-radius:2px;background:var(--highlight)}.slider::-webkit-slider-thumb{-webkit-appearance:none;width:11px;height:11px;margin-top:-4px;border-radius:50%;background:var(--ink);border:none}.slider::-moz-range-track{height:3px;border-radius:2px;background:var(--highlight)}.slider::-moz-range-thumb{width:11px;height:11px;border:none;border-radius:50%;background:var(--ink)}.stops{display:flex;justify-content:space-between;gap:8px;font-size:10px;color:var(--muted);white-space:nowrap}.group{display:flex;flex-direction:column;gap:9px}.grouphead{display:flex;align-items:baseline;justify-content:space-between}.reset{font-size:var(--t-label);color:var(--accent-text)}.reset:disabled{color:var(--muted);cursor:default}.stagelist{display:flex;flex-direction:column;gap:5px;font-variant-numeric:tabular-nums}.stagerow{display:flex;align-items:baseline;gap:8px;font-size:var(--t-label);color:var(--muted)}.stagerow.done{color:var(--dim)}.stagerow .mark{width:10px;text-align:center;color:var(--muted)}.stagerow.done .mark{color:var(--good)}.stagerow .name{flex:1}.sweep{height:2px;background:var(--rule2);border-radius:2px;overflow:hidden}.sweep i{display:block;width:30%;height:100%;background:var(--accent);animation:sweepacross 1.6s var(--ease-out-expo) infinite}@keyframes sweepacross{0%{transform:translate(-100%)}to{transform:translate(340%)}}@media(prefers-reduced-motion:reduce){.sweep i{animation:none;width:100%;opacity:.4}.chip.swapped:after,.art.swapping,.callout,.pulse{animation:none}.dragging .drop{transition:none}}.firstrun{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:34px;background:var(--stage);padding:24px}.firstfail{width:min(620px,80%);display:flex;gap:12px;align-items:flex-start;padding:14px 16px;border:1px solid color-mix(in srgb,var(--bad) 45%,transparent);border-radius:var(--radius-lg);background:var(--badbg);user-select:text}.firstfail .glyph{color:var(--bad);display:flex;padding-top:1px}.firstfail>div{display:flex;flex-direction:column;gap:5px;min-width:0}.firstfail .title{font-size:15px;font-weight:500}.firstfail .body{font-size:var(--t-chrome);line-height:1.55;color:var(--dim);overflow-wrap:anywhere}.firstfail .body.faint{color:var(--faint)}.drop{width:min(620px,80%);padding:44px 24px;min-height:220px;justify-content:center;border:1.5px dashed var(--highlight);border-radius:var(--radius-xl);display:flex;flex-direction:column;align-items:center;gap:16px;background:color-mix(in srgb,var(--ink) 1.5%,transparent);text-align:center;transition:border-color var(--d-fast),background var(--d-fast)}.drop .glyph{color:var(--muted)}[hidden]{display:none!important}.drop.solid{background:var(--paper);border-style:solid;border-color:var(--rule2)}.panehint{max-width:34ch;text-align:center;font-size:12.5px;line-height:1.55}.drop .headline{font-family:var(--font-display);font-size:26px;letter-spacing:-.02em;display:block}.drop .release,.dragging .drop .resting{display:none}.dragging .drop .release{display:block}.dragging .drop{width:min(640px,90%);min-height:320px;transition:width var(--d-fast) var(--ease-out-expo),min-height var(--d-fast) var(--ease-out-expo),border-color var(--d-fast),background var(--d-fast)}.samples{display:flex;flex-direction:column;align-items:center;gap:12px}.samplerow{display:flex;gap:12px}.sample{width:112px;display:flex;flex-direction:column;gap:7px;align-items:center}.sample .thumb{width:112px;height:88px;border:1px solid var(--rule2);border-radius:10px;background-color:var(--card);background-image:repeating-conic-gradient(var(--checker-a) 0% 25%,var(--checker-b) 0% 50%);background-size:12px 12px;display:grid;place-items:center;overflow:hidden;transition:border-color var(--d-micro),transform var(--d-micro)}.sample:hover .thumb{border-color:var(--accent);transform:translateY(-2px)}.sample img{max-width:76px;max-height:68px}.sample .label{font-size:var(--t-label);color:var(--faint)}.dragging .drop{border-color:var(--accent);background:var(--accent-soft)}.dragging .drop .glyph{color:var(--accent)}.dragging:after{content:"";position:fixed;inset:0;border:2px solid var(--accent);pointer-events:none;z-index:60}.dragging .stage>*:not(.stagestate){opacity:.6}.callout{position:absolute;left:20px;bottom:20px;z-index:8;max-width:320px;display:flex;flex-direction:column;gap:5px;padding:10px 13px;border-radius:var(--radius-lg);border:1px solid var(--rule2);background:color-mix(in srgb,var(--card) 92%,transparent);backdrop-filter:blur(8px);font-size:11.5px;line-height:1.5;color:var(--dim);animation:rise var(--d-fast) var(--ease-out-expo)}.callout .head{display:flex;align-items:baseline;justify-content:space-between;gap:12px}#overlays:empty{display:none}.scrim{position:fixed;inset:0;z-index:40;background:color-mix(in srgb,var(--void) 62%,transparent);display:grid;place-items:center;padding:24px}.modal{width:min(460px,100%);max-height:86vh;overflow-y:auto;background:var(--card);border:1px solid var(--highlight);border-radius:var(--radius-xl);padding:22px;display:flex;flex-direction:column;gap:13px;box-shadow:var(--shadow-xl)}.modal h2{margin:0;font-family:var(--font-display);font-size:22px;font-weight:500;letter-spacing:-.02em}.modal p{margin:0;font-size:var(--t-panel);line-height:1.7;color:var(--dim)}.modal .actions{display:flex;gap:8px;justify-content:flex-end}.modal.composer{width:min(1040px,100%);max-height:92vh;padding:0;gap:0;overflow:hidden}.composerhead{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:18px 22px 15px;border-bottom:1px solid var(--rule2)}.composerhead p{margin-top:3px;font-size:var(--t-chrome)}.composerbody{display:grid;grid-template-columns:minmax(0,1fr) 312px;min-height:0;overflow-y:auto}.composerpreview{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:22px;min-width:0;background:var(--stage)}.cardstage{--ar: 1.7778;position:relative;width:min(100%,calc(58vh * var(--ar)));aspect-ratio:var(--ar);border-radius:var(--radius);overflow:hidden;background:var(--paper);box-shadow:var(--shadow-lg)}.cardstage img{display:block;width:100%;height:100%;object-fit:contain}.cardbusy{position:absolute;inset:0;display:grid;place-items:center;opacity:0;pointer-events:none;background:color-mix(in srgb,var(--paper) 45%,transparent);transition:opacity var(--d-micro)}.cardstage.busy .cardbusy{opacity:1;transition-delay:.26s}.cardspin{width:20px;height:20px;border-radius:50%;border:2px solid var(--highlight);border-top-color:var(--accent);animation:cardspin .8s linear infinite}@keyframes cardspin{to{transform:rotate(360deg)}}.composerside{display:flex;flex-direction:column;gap:18px;padding:20px 22px;border-left:1px solid var(--rule2)}.optgroup{display:flex;flex-direction:column;gap:8px}.cardseg{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:2px;padding:2px;border:1px solid var(--rule2);border-radius:var(--radius);background:var(--paper)}.cardseg button{display:flex;flex-direction:column;align-items:center;gap:1px;padding:6px 8px;border-radius:calc(var(--radius) - 2px);font-size:var(--t-chrome);color:var(--faint)}.cardseg button small{font-size:10px;color:var(--muted);font-variant-numeric:tabular-nums}.cardseg button:hover:not([aria-checked=true]){color:var(--ink)}.cardseg button[aria-checked=true]{color:var(--ink);background:var(--accent-soft);box-shadow:inset 0 0 0 1px var(--accent)}.optlist{display:flex;flex-direction:column;border:1px solid var(--rule2);border-radius:var(--radius);background:var(--paper)}.optlist>*+*{border-top:1px solid var(--rule2)}.optrow{display:flex;align-items:center;gap:12px;width:100%;padding:9px 11px;text-align:left}.optrow:hover{background:var(--rule2)}.optext{display:flex;flex:1;flex-direction:column;gap:1px;min-width:0}.optlabel{font-size:12.5px;color:var(--ink)}.optnote{font-size:11px;line-height:1.4;color:var(--muted)}.optslider{display:flex;flex-direction:column;gap:4px;padding:9px 11px 8px;transition:opacity var(--d-micro)}.optslider.off{opacity:.4}.optslider.off .slider{cursor:default}.optsliderhead{display:flex;justify-content:space-between;font-size:12px;color:var(--dim)}.composeractions{display:flex;flex-direction:column;gap:8px;margin-top:auto}.composeractions .btn{justify-content:center;gap:7px}@media(max-width:860px){.composerbody{grid-template-columns:minmax(0,1fr)}.composerside{border-left:0;border-top:1px solid var(--rule2)}}.popover{position:fixed;z-index:45;background:var(--card);border:1px solid var(--highlight);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);overflow:hidden}.menu{padding:6px;min-width:260px}.menu .item{display:flex;align-items:center;gap:9px;padding:7px 9px;border-radius:var(--radius);width:100%;text-align:left;font-size:var(--t-chrome);color:var(--dim)}.menu .item:hover{background:var(--surface);color:var(--ink)}.menu .item .when{margin-left:auto;font-size:var(--t-label);color:var(--muted)}.menu .rule{height:1px;background:var(--rule2);margin:5px 0}.sheet{position:absolute;inset:0;z-index:20;background:color-mix(in srgb,var(--void) 55%,transparent);display:flex;align-items:flex-end}.sheetbody{width:100%;max-height:100%;overflow-y:auto;background:var(--card);border-top:1px solid var(--highlight);border-radius:var(--radius-xl) var(--radius-xl) 0 0;padding:14px;display:flex;flex-direction:column;gap:11px;box-shadow:0 -20px 50px color-mix(in srgb,var(--void) 60%,transparent);animation:rise var(--d-fast) var(--ease-out-expo)}@keyframes rise{0%{transform:translateY(12px);opacity:0}}.format{display:flex;align-items:center;gap:9px;padding:7px 9px;border:1px solid var(--rule2);border-radius:var(--radius);background:var(--paper);width:100%;text-align:left;font-size:var(--t-chrome);color:var(--dim)}.format:hover{border-color:var(--highlight)}.format .size{margin-left:auto;font-size:var(--t-label);color:var(--muted);font-variant-numeric:tabular-nums}.tooltip{position:fixed;z-index:70;max-width:300px;background:var(--highlight);border:1px solid color-mix(in srgb,var(--ink) 10%,transparent);border-radius:var(--radius);padding:10px 12px;font-size:var(--t-chrome);line-height:1.6;color:var(--dim);box-shadow:var(--shadow);pointer-events:none}#toasts{position:fixed;left:50%;bottom:40px;transform:translate(-50%);z-index:80;display:flex;flex-direction:column;gap:8px;align-items:center}.toast{width:min(460px,90vw);background:var(--highlight);border:1px solid color-mix(in srgb,var(--ink) 10%,transparent);border-radius:10px;padding:11px 13px;display:flex;align-items:center;gap:11px;box-shadow:var(--shadow-lg);animation:risein var(--d-fast) var(--ease-out-expo)}@keyframes risein{0%{transform:translateY(8px);opacity:0}}.toast .text{flex:1;font-size:var(--t-chrome);color:var(--dim)}.toast .glyph{display:flex}.toast .glyph.good{color:var(--good)}.toast .glyph.bad{color:var(--bad)}.screen{position:absolute;inset:0;z-index:30;background:var(--paper);display:flex;flex-direction:column}.screenbar{height:var(--h-appbar);flex:none;display:flex;align-items:center;gap:12px;padding:0 12px;background:var(--stage);border-bottom:1px solid var(--rule2);-webkit-app-region:drag}.screenbar button{-webkit-app-region:no-drag}.screenbody{flex:1;min-height:0;overflow-y:auto;background:var(--stage)}.settingsgrid{width:min(1128px,100%);margin:0 auto;padding:24px;display:grid;grid-template-columns:repeat(auto-fit,minmax(420px,1fr));gap:16px;align-content:start}.settinggroup{border:1px solid var(--rule2);background:var(--card);border-radius:var(--radius-lg);overflow:hidden;align-self:start}.settinggroup>.head{padding:11px 14px;border-bottom:1px solid var(--rule2)}.settingrow{display:flex;align-items:center;gap:16px;padding:11px 14px;border-bottom:1px solid color-mix(in srgb,var(--ink) 5%,transparent)}.settingrow:last-child{border-bottom:none}.settingrow .about{flex:1;display:flex;flex-direction:column;gap:3px;min-width:0}.settingrow .label{font-size:var(--t-panel);color:var(--dim)}.settingrow .help{font-size:var(--t-label);line-height:1.5;color:var(--muted)}.settingrow .control{flex:none}.settingrow select,.settingrow input[type=text],.settingrow input[type=number]{height:var(--h-compact);padding:0 8px;border:1px solid var(--rule2);border-radius:7px;background:var(--paper);color:var(--ink);font:400 var(--t-chrome) var(--font-body);font-variant-numeric:tabular-nums;max-width:220px}.privacycard{border:1px solid var(--rule2);background:var(--card);border-radius:var(--radius-lg);padding:14px;display:flex;flex-direction:column;gap:8px;align-self:start}.privacycard .line{font-family:var(--font-display);font-size:19px;letter-spacing:-.02em}.about{display:flex;min-height:100%}.aboutleft{width:520px;flex:none;background:var(--stage);border-right:1px solid var(--rule2);display:flex;flex-direction:column;justify-content:center;gap:22px;padding:56px}.aboutleft .mark{color:var(--accent)}.aboutright{flex:1;padding:56px;display:flex;flex-direction:column;gap:20px;justify-content:center;background:var(--paper)}.credit{border:1px solid var(--highlight);border-radius:var(--radius-lg);padding:20px;display:flex;flex-direction:column;gap:10px;background:var(--gold-soft)}.notices{border:1px solid var(--rule2);border-radius:var(--radius-lg);overflow:hidden}.notices .head{padding:11px 14px;border-bottom:1px solid var(--rule2);font-size:var(--t-chrome);color:var(--dim);display:flex;justify-content:space-between}.notices pre{margin:0;height:220px;overflow:auto;padding:12px 14px;font:11.5px / 1.75 var(--font-mono);color:var(--muted);background:var(--stage);white-space:pre-wrap;user-select:text}.minifyrail{width:400px;flex:none;border-left:1px solid var(--rule2);background:var(--paper);display:flex;flex-direction:column}.minifyresult{display:flex;flex-direction:column;gap:5px}.minifyresult .figure{font-family:var(--font-display);font-size:66px;line-height:.85;letter-spacing:-.04em;color:var(--accent-text)}.sentence{font-size:var(--t-panel);line-height:2;color:var(--dim)}.sentence .inlinefield{display:inline-flex;align-items:center;height:24px;padding:0 4px;border:1px solid var(--rule2);border-radius:var(--radius-sm);background:var(--paper);color:var(--ink);font:400 var(--t-chrome) var(--font-body);font-variant-numeric:tabular-nums;width:58px;text-align:center}.sentence .inlinefield.accent{border-color:var(--accent);background:var(--accent-soft)}.batchbar{height:44px;flex:none;display:flex;align-items:center;gap:8px;padding:0 14px;border-bottom:1px solid var(--rule2);background:var(--stage)}.batchhead,.batchrow{display:grid;grid-template-columns:24px minmax(0,1.4fr) 120px 104px 84px 104px 96px minmax(0,1.2fr);align-items:center;gap:12px;padding:0 14px}.batchhead{height:34px;flex:none;border-bottom:1px solid var(--rule2)}.batchrow{height:var(--h-row);border-bottom:1px solid color-mix(in srgb,var(--ink) 4%,transparent);font-size:var(--t-chrome);font-variant-numeric:tabular-nums}.batchrow.failed{background:color-mix(in srgb,var(--bad) 8%,transparent)}.batchrow.running{background:var(--accent-subtle)}.batchrow .trunc,.batchhead .trunc{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.batchrow .right,.batchhead .right{text-align:right}.batchrow .state{display:flex;align-items:center;gap:6px}.batchrow .state i{width:6px;height:6px;border-radius:50%;background:currentColor;display:block;flex:none}.state.queued,.state.skipped{color:var(--muted)}.state.running{color:var(--accent-text)}.state.done{color:var(--good)}.state.failed{color:var(--bad)}.batchviewport{flex:1;min-height:0;overflow-y:auto;position:relative}.batchfoot{height:52px;flex:none;display:flex;align-items:center;gap:18px;padding:0 14px;border-top:1px solid var(--rule2);background:var(--stage);font-size:var(--t-chrome);font-variant-numeric:tabular-nums}.progress{height:3px;border-radius:2px;background:var(--highlight);overflow:hidden}.progress i{display:block;height:100%;background:var(--accent);transition:width var(--d-fast) var(--ease-smooth)}@media(max-width:1400px){:root{--rail-w: 330px}}@media(max-width:1180px){:root{--rail-w: 310px}.legend{display:none}}.chooser{position:absolute;left:50%;bottom:16px;transform:translate(-50%);z-index:8;width:min(560px,calc(100% - 32px));max-height:calc(100% - 70px);overflow-y:auto;display:flex;flex-direction:column;gap:9px;padding:10px 12px 11px;background:var(--card);border:1px solid var(--highlight);border-radius:var(--radius-xl);box-shadow:var(--shadow-lg);animation:rise var(--d-fast) var(--ease-out-expo)}.choosehead{display:flex;align-items:center;justify-content:space-between;gap:10px;min-width:0}.choosehead .eyebrow{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chooseintro{font-size:var(--t-label);line-height:1.5;color:var(--dim);padding:7px 10px;border-radius:var(--radius);background:var(--accent-subtle);border:1px solid var(--accent-soft)}.choices{display:flex;flex-direction:column;gap:6px}.choice{display:grid;grid-template-columns:92px 1fr auto;align-items:center;gap:12px;padding:8px 8px 8px 12px;border:1px solid var(--rule2);border-radius:var(--radius-lg);background:var(--paper);min-width:0}.choice .btn{min-width:104px}.choicename{display:flex;align-items:center;gap:7px;font-family:var(--font-display);font-size:17px;letter-spacing:-.02em;color:var(--ink)}.choicename svg{color:var(--accent-text)}.choicebody{font-size:var(--t-chrome);line-height:1.5;color:var(--faint)}.choosenews{display:flex;flex-direction:column;gap:6px;padding-top:9px;border-top:1px solid var(--rule2)}.remember{display:flex;align-items:center;gap:7px;font-size:var(--t-label);color:var(--faint);cursor:pointer;align-self:flex-start}.remember input{accent-color:var(--accent);margin:0}.autochose{display:flex;flex-direction:column;gap:7px;font-size:var(--t-chrome)}.autolead{color:var(--dim);line-height:1.5}.autorow{display:flex;align-items:center;gap:10px;justify-content:space-between}.autorow.moved{padding-top:7px;border-top:1px dashed var(--rule2)}.autotext{display:flex;flex-direction:column;gap:2px;min-width:0}.autotitle{color:var(--ink)}.autotext .muted{font-size:var(--t-label)}.autobtns{display:flex;align-items:center;gap:10px;flex:none}.autorow .btn{flex:none}.autotaken{font-size:var(--t-label);color:var(--state-final);flex:none}.card.autocard{border-color:var(--accent-soft);background:color-mix(in srgb,var(--accent) 4%,var(--card))}.guideline{display:flex;align-items:baseline;justify-content:space-between;gap:10px;font-size:var(--t-label)}.rail.wizarding{width:max(var(--rail-w),400px)}.sheet.wizsheet{align-items:stretch;background:var(--paper)}.sheetbody.wizbody{height:100%;border-radius:0;border-top:none;box-shadow:none;padding:0;gap:0;overflow:hidden;background:var(--paper)}.wizhead{flex:none;display:flex;flex-direction:column;gap:9px;padding:14px 16px 12px;border-bottom:1px solid var(--rule2)}.wiztitle{font-size:24px;font-weight:500;line-height:1.1;color:var(--ink)}.wizdots{display:flex;gap:6px}.wizdots button{flex:1;height:4px;border-radius:2px;background:var(--highlight);transition:background var(--d-micro)}.wizdots button.done{background:color-mix(in srgb,var(--accent) 45%,var(--highlight))}.wizdots button[aria-selected=true]{background:var(--accent)}.wizdots button:hover{background:var(--accent-hover)}.wizcompare{display:flex;align-items:center;gap:8px;font-size:var(--t-label)}.wizcompare .seg>button{padding:3px 9px}.wizscroll{flex:1;min-height:0;overflow-y:auto;padding:14px 16px 18px;display:flex;flex-direction:column;gap:14px}.wizlead{font-size:var(--t-panel);line-height:1.55;color:var(--dim)}.wizguide{display:flex;flex-direction:column;gap:8px;padding-top:12px;border-top:1px solid var(--rule2)}.wizexplain{display:grid;grid-template-columns:auto 1fr;gap:5px 12px;margin:0;font-size:var(--t-chrome);line-height:1.5}.wizexplain dt{font-size:var(--t-eyebrow);letter-spacing:.12em;text-transform:uppercase;color:var(--muted);padding-top:3px;white-space:nowrap}.wizexplain dd{margin:0;color:var(--dim)}.wizlearn{font-size:var(--t-label);color:var(--accent-text);align-self:flex-start;text-decoration:none}.wizlearn:hover{text-decoration:underline}.wizcontrols{display:flex;flex-direction:column;gap:12px;padding:12px;border:1px solid var(--rule2);border-radius:var(--radius-lg);background:var(--card)}.wizlive{display:flex;flex-direction:column;gap:12px}.wizrow{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:var(--t-chrome)}.wizsmall{font-size:var(--t-label);line-height:1.5}.wizwhy{font-size:var(--t-chrome);line-height:1.5;color:var(--dim)}.wizchoices{display:grid;grid-template-columns:1fr 1fr;gap:8px}.wizchoice{display:flex;flex-direction:column;align-items:flex-start;gap:4px;padding:10px 11px;text-align:left;border:1px solid var(--rule2);border-radius:var(--radius);background:var(--paper);font-size:var(--t-label);line-height:1.45}.wizchoice .name{font-size:13px;font-weight:600;color:var(--ink)}.wizchoice:hover{border-color:var(--highlight)}.wizchoice[aria-pressed=true]{border-color:var(--accent);background:var(--accent-subtle)}.wiznote{display:flex;flex-direction:column;align-items:flex-start;gap:8px;padding:10px 11px;border-radius:var(--radius);background:var(--accent-subtle);font-size:var(--t-label);line-height:1.5;color:var(--dim)}.wiznav{flex:none;display:flex;align-items:center;gap:12px;padding:12px 16px;border-top:1px solid var(--rule2);background:var(--paper)}.kinds{display:grid;grid-template-columns:1fr 1fr;gap:9px}.kind{display:flex;flex-direction:column;align-items:stretch;gap:4px;padding:7px 7px 9px;text-align:left;border:1px solid var(--rule2);border-radius:var(--radius-lg);background:var(--card);min-width:0;transition:border-color var(--d-micro),background var(--d-micro)}.kind:hover{border-color:var(--highlight)}.kind[aria-checked=true]{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 7%,var(--card));box-shadow:0 0 0 1px var(--accent)}.kthumb{position:relative;height:104px;border-radius:var(--radius);background-color:var(--stage);background-image:repeating-conic-gradient(var(--checker-a) 0% 25%,var(--checker-b) 0% 50%);background-size:10px 10px;display:grid;place-items:center;overflow:hidden;margin-bottom:3px}.kthumb img{max-width:92%;max-height:92%;object-fit:contain;image-rendering:auto}.kspin{position:absolute;inset:auto 0 0;height:2px;overflow:hidden;display:none}.kind.busy .kspin{display:block}.kspin:after{content:"";position:absolute;top:0;bottom:0;left:0;width:30%;background:var(--accent);animation:sweepacross 1.6s var(--ease-out-expo) infinite}@media(prefers-reduced-motion:reduce){.kspin:after{animation:none;width:100%;opacity:.5}}.kname{display:flex;align-items:baseline;justify-content:space-between;gap:6px;font-size:12.5px;font-weight:600;color:var(--ink);padding:0 2px}.ksugg{font-size:9.5px;font-weight:500;letter-spacing:.08em;text-transform:uppercase;color:var(--accent-text)}.kwhy,.knote,.kstat{font-size:11px;line-height:1.4;padding:0 2px}.kwhy{color:var(--faint)}.knote{color:var(--muted);font-style:italic}.kstat{color:var(--muted);margin-top:2px}.wizreadout table{width:100%;border-collapse:collapse;font-size:var(--t-chrome)}.wizreadout th,.wizreadout td{padding:4px 0;text-align:right;font-weight:400}.wizreadout thead th{font-size:var(--t-eyebrow);letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}.wizreadout tbody th{text-align:left;color:var(--faint)}.wizreadout td{color:var(--ink);padding-left:10px}.wizreadout td.delta{width:70px}.wizreadout td.delta.same{color:var(--muted)}.wizchanges .wizchange{display:flex;justify-content:space-between;gap:10px;font-size:var(--t-chrome);color:var(--faint)}.wizchanges .wizchange .num{color:var(--ink)}.pane.source.comparing .panelabel{color:var(--accent-text)}.intro{width:min(620px,80%);display:flex;flex-direction:column;gap:12px;padding:16px 18px;border:1px solid var(--accent-soft);border-radius:var(--radius-xl);background:color-mix(in srgb,var(--accent) 5%,var(--paper))}.intro ol{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:9px}.intro li{display:flex;gap:11px;align-items:baseline;font-size:var(--t-chrome);line-height:1.5}.intro li>div{display:flex;flex-direction:column}.introstep{width:20px;height:20px;flex:none;border-radius:50%;display:grid;place-items:center;font-size:11px;font-weight:600;background:var(--accent);color:var(--accent-ink)}.introtitle{color:var(--ink);font-weight:500}.introfoot{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:var(--t-label)}html.framed:not(.fullscreen) body{padding-top:6px;background:var(--void)}html.framed:not(.fullscreen) #app{position:relative;border-top:1px solid rgba(201,117,74,.35)}.desktopnote{margin:14px 0 0;font-size:12.5px;text-align:center}.webcontrols{display:flex;gap:2px;margin-left:4px}.webcontrols .btn{gap:6px}.sc-loading{padding:40px;text-align:center}.sc-page{width:min(1320px,100%);margin:0 auto;padding:24px;display:flex;flex-direction:column;gap:18px}.sc-head h1{margin:0 0 6px;font-size:28px;font-weight:600}.sc-head p,.sc-results>p{margin:0;max-width:96ch;font-size:13px;line-height:1.6}.sc-main{display:grid;grid-template-columns:300px 1fr;gap:16px;min-height:0;align-items:start}.sc-list{height:560px;overflow-y:auto;overscroll-behavior:contain;padding:0 10px 10px;border:1px solid var(--rule2);border-radius:var(--radius-lg);background:var(--card);scrollbar-width:thin}.sc-sethead{position:sticky;top:0;z-index:1;display:flex;justify-content:space-between;padding:10px 2px 8px;background:var(--card);font-size:11px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--dim)}.sc-sethead span{color:var(--faint);font-weight:600}.sc-tiles{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;margin-bottom:6px}.sc-case{display:flex;flex-direction:column;align-items:stretch;gap:4px;min-width:0;overflow:hidden;padding:5px;border:1px solid var(--rule2);border-radius:var(--radius-sm);background:var(--stage);color:var(--dim);cursor:pointer;text-align:left}.sc-case[aria-pressed=true]{border-color:var(--accent);background:var(--accent-subtle);color:var(--accent-text)}.sc-thumb{aspect-ratio:1;width:100%;border-radius:5px;background:#fff;display:grid;place-items:center;overflow:hidden}.sc-thumb img{width:100%;height:100%;object-fit:contain}.sc-name{width:100%;font-size:11px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sc-caption{margin:0;font-size:12.5px;color:var(--dim)}.sc-stagecol{display:flex;flex-direction:column;gap:10px;min-width:0}.sc-tools{display:flex;align-items:center;gap:8px;flex-wrap:nowrap;white-space:nowrap}.sc-tools .eyebrow{margin-left:6px}.sc-legend{margin-right:4px;display:inline-flex;align-items:center;gap:6px;font-size:11.5px}.sc-dot{display:inline-block;width:8px;height:8px;border-radius:50%}.sc-dot.a{background:var(--anchor)}.sc-dot.hd{background:var(--handle);margin-left:6px}.sc-viewer{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.sc-pane{position:relative;aspect-ratio:1;overflow:hidden;border:1px solid var(--rule2);border-radius:var(--radius-sm);background-color:var(--stage);background-image:repeating-conic-gradient(var(--checker-a) 0% 25%,var(--checker-b) 0% 50%);background-size:16px 16px;cursor:grab;touch-action:none;user-select:none}.sc-pane:active{cursor:grabbing}.sc-cam{position:absolute;left:0;top:0;width:100%;height:100%;transform-origin:0 0}.sc-cam>img,.sc-layer,.sc-layer>svg{position:absolute;inset:0;width:100%;height:100%;display:block}.sc-cam>img{object-fit:contain}.sc-tag{position:absolute;top:8px;left:8px;padding:4px 7px;border-radius:6px;font-size:11px;font-weight:600;background:color-mix(in srgb,var(--paper) 85%,transparent);color:var(--ink);pointer-events:none}.sc-wire path,.sc-wire circle,.sc-wire ellipse,.sc-wire rect,.sc-wire polygon{fill:none!important;stroke:var(--wire);stroke-width:1px;vector-effect:non-scaling-stroke;stroke-opacity:.9}.sc-ov{pointer-events:none}.sc-ov .h{stroke:var(--handle);stroke-width:1px;vector-effect:non-scaling-stroke;fill:none;stroke-opacity:.85}.sc-ov .hd{stroke:var(--handle);stroke-width:3.5px;vector-effect:non-scaling-stroke;stroke-linecap:round;fill:none}.sc-ov .a{stroke:var(--anchor);stroke-width:5px;vector-effect:non-scaling-stroke;stroke-linecap:round;fill:none}.sc-chips{display:flex;flex-wrap:wrap;gap:6px}.sc-chip{font-size:12px;padding:4px 9px;border-radius:999px;border:1px solid var(--rule2);color:var(--dim);font-variant-numeric:tabular-nums}.sc-chip.win{border-color:transparent;background:var(--goodbg);color:var(--good)}.sc-results{display:flex;flex-direction:column;gap:12px;padding-top:8px;border-top:1px solid var(--rule2)}.sc-results h2{margin:8px 0 0;font-size:22px;font-weight:600}.sc-bignums{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.sc-bignum{display:flex;flex-direction:column;gap:4px;padding:12px 14px;border:1px solid var(--rule2);border-radius:var(--radius-lg);background:var(--card);font-size:12px}.sc-bignum .v{font-size:28px;color:var(--accent);line-height:1.1}.sc-table{width:100%;border-collapse:collapse;font-size:12.5px;background:var(--card);border:1px solid var(--rule2);border-radius:var(--radius-lg);overflow:hidden}.sc-table th,.sc-table td{padding:8px 12px;text-align:right;border-bottom:1px solid var(--rule2);white-space:nowrap}.sc-table th:first-child,.sc-table td:first-child{text-align:left}.sc-table th{font-size:11px;font-weight:600;color:var(--faint);text-transform:uppercase;letter-spacing:.04em}.sc-table td.num{font-variant-numeric:tabular-nums;color:var(--dim)}.sc-table tr.win td{color:var(--ink)}.sc-table tr.win td:first-child{color:var(--accent);font-weight:600}.sc-note{font-size:12px!important}.sc-table caption{text-align:left;padding:10px 12px 4px;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--faint)}.stagerow.running{color:var(--ink)}.stagerow.running .mark{color:var(--accent)}.stagerow .sub{margin-left:6px;color:var(--faint)}.activity{position:absolute;right:12px;bottom:12px;z-index:6;width:min(360px,calc(100% - 24px));display:flex;flex-direction:column;background:var(--card);border:1px solid var(--rule2);border-radius:var(--radius);box-shadow:var(--shadow-sm);font-family:var(--font-body);font-size:var(--t-label);font-variant-numeric:tabular-nums;color:var(--dim);overflow:hidden}.activity[hidden]{display:none}.activityhead{display:flex;align-items:center;gap:8px;padding:6px 10px;background:none;border:0;color:var(--dim);font:inherit;cursor:pointer;text-align:left}.activityhead .title{flex:1;font-weight:500;color:var(--ink)}.activityhead .chev{color:var(--accent-text)}.activitybody{max-height:180px;overflow-y:auto;padding:0 10px 8px;border-top:1px solid var(--rule)}.activity:not(.open) .activitybody{display:none}.activityline{display:flex;gap:8px;padding-top:3px;line-height:1.35}.activityline .t{flex:none;width:38px;text-align:right;color:var(--muted)}.activityline .w{flex:1;min-width:0}.activityline .r{flex:none;color:var(--muted)}.activityline.running .w,.activityline.running .r{color:var(--accent-text)}.activityline.note .w{color:var(--faint);padding-left:10px}@media(max-width:760px),(max-height:500px){.appbar{height:auto;min-height:var(--h-appbar);flex-wrap:wrap;row-gap:4px;padding:6px 10px}.appbar .filechip .muted{display:none}.appactions{flex:1 1 0;min-width:0;overflow-x:auto;scrollbar-width:none}.appactions::-webkit-scrollbar{display:none}.appactions>*{flex:none}.webcontrols .btn{position:relative}.webcontrols .btn>span{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.viewertools{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none}.viewertools::-webkit-scrollbar{display:none}.viewertools>*,.viewertools>div>*{flex:none}.viewertools .flickhint,.viewertools .legend{display:none}.chooser{flex-direction:row;align-items:center;bottom:8px;width:auto;max-width:calc(100% - 16px);padding:6px;gap:6px}.choosehead{order:2}.choosehead .eyebrow,.chooseintro,.choicename,.choicebody,.choosenews,.remember{display:none}.choices{flex-direction:row}.choice{display:contents}.choice .btn{min-width:0}.activity{width:min(300px,calc(100% - 16px));right:8px;bottom:8px}.stage:has(.chooser:not([hidden])) .activity{display:none}.activitybody{max-height:30vh}.statusstrip{overflow:hidden;white-space:nowrap}.statusstrip .privacy{display:none}.sheet{position:fixed;z-index:40}.screen{position:fixed}.settingsgrid{grid-template-columns:minmax(0,1fr);padding:12px}.settingrow{flex-wrap:wrap}.about{flex-direction:column}.aboutleft{width:auto;border-right:0;border-bottom:1px solid var(--rule2)}.aboutright{padding:24px 16px}}@media(pointer:coarse){.drop .kbdhint{display:none}}@media(max-height:500px){.rail{overflow-y:auto}.railscroll{flex:none;overflow:visible}.railfoot{position:sticky;bottom:var(--phonetip-h, 0px);z-index:5}.railfoot .readout:not(.busy),.railfoot .note{display:none}.sheet.wizsheet{inset:0 0 0 auto;width:max(var(--rail-w),400px)}}@media(max-width:760px)and (min-height:501px){.appactions{order:3;flex:none;width:100%;margin-left:0}html{height:auto;overflow-x:hidden;overflow-y:auto}body{height:auto;min-height:100%;overflow:visible}#app{height:auto;min-height:100vh;min-height:100svh;padding-bottom:var(--phonetip-h, 0px)}.body{flex:none;flex-direction:column}.stage{flex:none;height:62vh;height:62svh;min-height:340px}.stage:has(.firstrun){height:auto}.panes:not(.stacked){flex-direction:column}.rail,.rail.wizarding,.minifyrail{width:auto;border-left:0;border-top:1px solid var(--rule2)}.railscroll{flex:none;overflow:visible}.railfoot{position:sticky;bottom:var(--phonetip-h, 0px);z-index:5}.sheetbody{max-height:85vh;max-height:85svh}.sheet.wizsheet{inset:auto 0 0;width:auto;height:58vh;height:58svh;border-top:1px solid var(--highlight);box-shadow:var(--shadow-xl)}.firstrun{gap:18px;padding:16px;justify-content:flex-start}.drop,.intro,.firstfail{width:100%}.drop{min-height:0;padding:22px 16px}.drop .headline{font-size:22px}.samplerow{flex-wrap:wrap;justify-content:center}.sample,.sample .thumb{width:80px}.sample .thumb{height:66px}.sample img{max-width:56px;max-height:52px}.body>div:not(.stage){flex-direction:column}}
|
studio/assets/main-DydoLkFD.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
studio/assets/main-v2TpNvwt.js
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
studio/guide/batch.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html" aria-current="page">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/batch.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="batch">Batch</h1>
|
| 14 |
<p>The <strong>Batch</strong> tab traces every image in a folder and writes one SVG for each. It is for a set of
|
| 15 |
icons, a folder of partner logos, or a brand library.</p>
|
|
@@ -92,8 +92,8 @@ folder. Choose the folder they are in.</p>
|
|
| 92 |
<h2 id="studio-lite">Studio Lite</h2>
|
| 93 |
<p>The Batch tab needs to read and write folders on disk, so it is not in Studio Lite. Trace the
|
| 94 |
images one at a time in Vectorize, or use the <code>inkvec</code> command line in a shell loop, one
|
| 95 |
-
<code>inkvec logo.png -o svg/logo.svg</code> per file.</p><nav class="pagenav"><a class="prev" href="fabricate.html"><span class="dir">Previous</span><span class="lbl">Fabricate</span></a><a class="next" href="settings.html"><span class="dir">Next</span><span class="lbl">Settings</span></a></nav></article></main>
|
| 96 |
-
<aside class="rail"><
|
| 97 |
</div>
|
| 98 |
</body>
|
| 99 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html" aria-current="page">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/batch.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="batch">Batch</h1>
|
| 14 |
<p>The <strong>Batch</strong> tab traces every image in a folder and writes one SVG for each. It is for a set of
|
| 15 |
icons, a folder of partner logos, or a brand library.</p>
|
|
|
|
| 92 |
<h2 id="studio-lite">Studio Lite</h2>
|
| 93 |
<p>The Batch tab needs to read and write folders on disk, so it is not in Studio Lite. Trace the
|
| 94 |
images one at a time in Vectorize, or use the <code>inkvec</code> command line in a shell loop, one
|
| 95 |
+
<code>inkvec logo.png -o svg/logo.svg</code> per file.</p><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="fabricate.html"><span class="dir">Previous</span><span class="lbl">Fabricate</span></a><a class="next" href="settings.html"><span class="dir">Next</span><span class="lbl">Settings</span></a></nav></article></main>
|
| 96 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#running-a-batch">Running a batch</a></li><li class="l2"><a href="#what-each-row-says">What each row says</a></li><li class="l2"><a href="#which-settings-a-batch-uses">Which settings a batch uses</a></li><li class="l2"><a href="#dropping-files">Dropping files</a></li><li class="l2"><a href="#studio-lite">Studio Lite</a></li></ul></aside>
|
| 97 |
</div>
|
| 98 |
</body>
|
| 99 |
</html>
|
studio/guide/export.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html" aria-current="page">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/export.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="export">Export</h1>
|
| 14 |
<p>When the drawing is right, three buttons at the foot of the rail take it out of the app:
|
| 15 |
<strong>Export</strong> (files in a folder), <strong>Copy SVG</strong> (the clipboard) and the comparison card.</p>
|
|
@@ -59,7 +59,10 @@ it will write: the app builds them all in memory first and reports what it built
|
|
| 59 |
estimate. The button at the bottom says how many files and how many bytes in total.</p>
|
| 60 |
<p><strong>To</strong> is the destination folder. It starts at the <em>Default output folder</em> from
|
| 61 |
<a href="settings.html#general">Settings</a> if you set one; <strong>Choose</strong> or <strong>Change</strong> picks another. With none
|
| 62 |
-
chosen, Export asks for one. <strong>Close</strong>, or a click outside the sheet
|
|
|
|
|
|
|
|
|
|
| 63 |
<p><strong>Export</strong> always runs a <strong>fresh full trace</strong> first, then writes the files. What is on screen may be
|
| 64 |
a draft, and a draft should never be shipped by accident. When the files are written, a note says
|
| 65 |
where, with <strong>Show in folder</strong>.</p>
|
|
@@ -110,8 +113,8 @@ the source's pixels.</p>
|
|
| 110 |
<p><strong>Save PNG</strong> writes it (as <code>name-card.png</code>, by default); <strong>Copy image</strong> puts it on the clipboard.</p>
|
| 111 |
<h2 id="studio-lite">Studio Lite</h2>
|
| 112 |
<p>In Studio Lite there is no destination folder: Export and Save PNG download the files through your
|
| 113 |
-
browser, into its downloads folder.</p><nav class="pagenav"><a class="prev" href="palette.html"><span class="dir">Previous</span><span class="lbl">Palette and colour groups</span></a><a class="next" href="minify.html"><span class="dir">Next</span><span class="lbl">Minify SVG</span></a></nav></article></main>
|
| 114 |
-
<aside class="rail"><
|
| 115 |
</div>
|
| 116 |
</body>
|
| 117 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html" aria-current="page">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/export.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="export">Export</h1>
|
| 14 |
<p>When the drawing is right, three buttons at the foot of the rail take it out of the app:
|
| 15 |
<strong>Export</strong> (files in a folder), <strong>Copy SVG</strong> (the clipboard) and the comparison card.</p>
|
|
|
|
| 59 |
estimate. The button at the bottom says how many files and how many bytes in total.</p>
|
| 60 |
<p><strong>To</strong> is the destination folder. It starts at the <em>Default output folder</em> from
|
| 61 |
<a href="settings.html#general">Settings</a> if you set one; <strong>Choose</strong> or <strong>Change</strong> picks another. With none
|
| 62 |
+
chosen, Export asks for one. <strong>Close</strong>, <kbd>Esc</kbd>, or a click outside the sheet closes it.</p>
|
| 63 |
+
<p>From the keyboard the sheet works like any dialog: it takes the focus when it opens (on the first
|
| 64 |
+
format), <kbd>Tab</kbd> and <kbd>Shift</kbd>+<kbd>Tab</kbd> move between its rows without leaving it,
|
| 65 |
+
<kbd>Space</kbd> ticks or unticks a row, and when it closes the focus goes back to where it was.</p>
|
| 66 |
<p><strong>Export</strong> always runs a <strong>fresh full trace</strong> first, then writes the files. What is on screen may be
|
| 67 |
a draft, and a draft should never be shipped by accident. When the files are written, a note says
|
| 68 |
where, with <strong>Show in folder</strong>.</p>
|
|
|
|
| 113 |
<p><strong>Save PNG</strong> writes it (as <code>name-card.png</code>, by default); <strong>Copy image</strong> puts it on the clipboard.</p>
|
| 114 |
<h2 id="studio-lite">Studio Lite</h2>
|
| 115 |
<p>In Studio Lite there is no destination folder: Export and Save PNG download the files through your
|
| 116 |
+
browser, into its downloads folder.</p><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="palette.html"><span class="dir">Previous</span><span class="lbl">Palette and colour groups</span></a><a class="next" href="minify.html"><span class="dir">Next</span><span class="lbl">Minify SVG</span></a></nav></article></main>
|
| 117 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#the-export-sheet">The export sheet</a><ul><li class="l3"><a href="#the-asset-pack">The asset pack</a></li><li class="l3"><a href="#things-to-know">Things to know</a></li></ul></li><li class="l2"><a href="#copy-svg">Copy SVG</a></li><li class="l2"><a href="#the-comparison-card">The comparison card</a></li><li class="l2"><a href="#studio-lite">Studio Lite</a></li></ul></aside>
|
| 118 |
</div>
|
| 119 |
</body>
|
| 120 |
</html>
|
studio/guide/fabricate.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html" aria-current="page">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/fabricate.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="fabricate">Fabricate</h1>
|
| 14 |
<p>The <strong>Fabricate</strong> tab turns a drawing into files a cutting machine can use: adhesive vinyl in one
|
| 15 |
colour or several, iron-on (heat-transfer) vinyl, print-then-cut stickers, stencils, pen and
|
|
@@ -321,8 +321,8 @@ Design Space, Silhouette Studio or LightBurn. The foot of the rail repeats the r
|
|
| 321 |
<p>The <a href="tutorials/vinyl-htv.html">layered vinyl tutorial</a> and the <a href="tutorials/laser.html">laser tutorial</a>
|
| 322 |
take a drawing through this tab from start to finish.</p>
|
| 323 |
<h2 id="studio-lite">Studio Lite</h2>
|
| 324 |
-
<p><strong>Save</strong> downloads the files instead of writing them to a folder.</p><nav class="pagenav"><a class="prev" href="minify.html"><span class="dir">Previous</span><span class="lbl">Minify SVG</span></a><a class="next" href="batch.html"><span class="dir">Next</span><span class="lbl">Batch</span></a></nav></article></main>
|
| 325 |
-
<aside class="rail"><
|
| 326 |
</div>
|
| 327 |
</body>
|
| 328 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html" aria-current="page">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/fabricate.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="fabricate">Fabricate</h1>
|
| 14 |
<p>The <strong>Fabricate</strong> tab turns a drawing into files a cutting machine can use: adhesive vinyl in one
|
| 15 |
colour or several, iron-on (heat-transfer) vinyl, print-then-cut stickers, stencils, pen and
|
|
|
|
| 321 |
<p>The <a href="tutorials/vinyl-htv.html">layered vinyl tutorial</a> and the <a href="tutorials/laser.html">laser tutorial</a>
|
| 322 |
take a drawing through this tab from start to finish.</p>
|
| 323 |
<h2 id="studio-lite">Studio Lite</h2>
|
| 324 |
+
<p><strong>Save</strong> downloads the files instead of writing them to a folder.</p><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="minify.html"><span class="dir">Previous</span><span class="lbl">Minify SVG</span></a><a class="next" href="batch.html"><span class="dir">Next</span><span class="lbl">Batch</span></a></nav></article></main>
|
| 325 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#bringing-a-drawing-in">Bringing a drawing in</a></li><li class="l2"><a href="#material">Material</a></li><li class="l2"><a href="#making">Making</a></li><li class="l2"><a href="#size">Size</a></li><li class="l2"><a href="#colours">Colours</a></li><li class="l2"><a href="#cutting">Cutting</a><ul><li class="l3"><a href="#g-code">G-code</a></li></ul></li><li class="l2"><a href="#before-you-cut">Before you cut</a></li><li class="l2"><a href="#the-stage">The stage</a></li><li class="l2"><a href="#saving">Saving</a></li><li class="l2"><a href="#studio-lite">Studio Lite</a></li></ul></aside>
|
| 326 |
</div>
|
| 327 |
</body>
|
| 328 |
</html>
|
studio/guide/getting-started.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html" aria-current="page">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/getting-started.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="getting-started">Getting started</h1>
|
| 14 |
<p>This page opens an image, explains the choice the app offers when it does, and walks through the
|
| 15 |
Custom wizard. The fastest way to follow along is with one of the samples on the empty stage.</p>
|
|
@@ -19,6 +19,9 @@ Custom wizard. The fastest way to follow along is with one of the samples on the
|
|
| 19 |
<li><strong>Open…</strong> in the app bar, <strong>Open an image</strong> on the empty stage, or <kbd>Ctrl</kbd>+<kbd>O</kbd>
|
| 20 |
(<kbd>⌘</kbd>+<kbd>O</kbd> on a Mac).</li>
|
| 21 |
<li><strong>Drag a file onto the window.</strong> The whole window takes the drop, not only the dashed box.</li>
|
|
|
|
|
|
|
|
|
|
| 22 |
<li><strong>Recent</strong> in the app bar: the last eight files you opened.</li>
|
| 23 |
<li><strong>A sample</strong> from the row under the drop area, on the empty stage: <em>Flat logo</em>, <em>Icon, 64 px</em>,
|
| 24 |
<em>Crest, filigree</em> and <em>Signature, B&W</em>.</li>
|
|
@@ -30,6 +33,9 @@ Custom wizard. The fastest way to follow along is with one of the samples on the
|
|
| 30 |
1024 px on its longer side and traced from that picture, which is how a messy drawing comes back
|
| 31 |
as clean shapes. To make an SVG smaller <em>without</em> re-drawing it, use <a href="minify.html">Minify SVG</a>
|
| 32 |
instead.</p>
|
|
|
|
|
|
|
|
|
|
| 33 |
<p>What a dropped file does depends on what it is:</p>
|
| 34 |
<table>
|
| 35 |
<thead>
|
|
@@ -62,11 +68,20 @@ instead.</p>
|
|
| 62 |
</tbody>
|
| 63 |
</table>
|
| 64 |
<p>The app bar shows the open file's name, its size in pixels and its format.</p>
|
| 65 |
-
<p><strong>Studio Lite:</strong> there is no right-click entry, and a dropped or chosen file is read by the browser
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
<h2 id="auto-traces-at-once">Auto traces at once</h2>
|
| 67 |
<p>The moment an image opens, <strong>Auto</strong> traces it. It uses the controls exactly as you left them the
|
| 68 |
last time (the first time, the <strong>Logo</strong> preset, which is the default). Nothing has to be chosen
|
| 69 |
first, and the trace is already on its way when the next thing appears.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 70 |
<h2 id="the-choice-card-keep-auto-or-customise">The choice card: Keep Auto or Customise</h2>
|
| 71 |
<p>Over the stage, a small card appears while Auto traces.</p>
|
| 72 |
<p><img alt="The card that appears when an image opens, with Auto's result and the Custom option" src="img/chooser.webp"></p>
|
|
@@ -75,6 +90,9 @@ first, and the trace is already on its way when the next thing appears.</p>
|
|
| 75 |
and file size. <strong>Keep Auto</strong> closes the card.</li>
|
| 76 |
<li><strong>Custom</strong> opens the wizard (next section), which changes the settings a step at a time with
|
| 77 |
your result shown beside Auto's.</li>
|
|
|
|
|
|
|
|
|
|
| 78 |
<li><strong>Auto chose</strong> says what Auto used, and anything its own report suggests. There are at most
|
| 79 |
two suggestions, and each is a one-click preset change:</li>
|
| 80 |
</ul>
|
|
@@ -169,8 +187,8 @@ tab, or <strong>Customise</strong> on the <em>Auto chose</em> note.</p>
|
|
| 169 |
<li>Read the numbers: <a href="result.html">Result</a> explains the quality report.</li>
|
| 170 |
<li>Change something: <a href="tune.html">Tune</a> lists every control.</li>
|
| 171 |
<li>Save it: <a href="export.html">Export</a>.</li>
|
| 172 |
-
</ul><nav class="pagenav"><a class="prev" href="install.html"><span class="dir">Previous</span><span class="lbl">Install and first launch</span></a><a class="next" href="viewer.html"><span class="dir">Next</span><span class="lbl">The viewer</span></a></nav></article></main>
|
| 173 |
-
<aside class="rail"><
|
| 174 |
</div>
|
| 175 |
</body>
|
| 176 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html" aria-current="page">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/getting-started.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="getting-started">Getting started</h1>
|
| 14 |
<p>This page opens an image, explains the choice the app offers when it does, and walks through the
|
| 15 |
Custom wizard. The fastest way to follow along is with one of the samples on the empty stage.</p>
|
|
|
|
| 19 |
<li><strong>Open…</strong> in the app bar, <strong>Open an image</strong> on the empty stage, or <kbd>Ctrl</kbd>+<kbd>O</kbd>
|
| 20 |
(<kbd>⌘</kbd>+<kbd>O</kbd> on a Mac).</li>
|
| 21 |
<li><strong>Drag a file onto the window.</strong> The whole window takes the drop, not only the dashed box.</li>
|
| 22 |
+
<li><strong>Paste an image</strong>: <kbd>Ctrl</kbd>+<kbd>V</kbd> (<kbd>⌘</kbd>+<kbd>V</kbd>) anywhere outside a
|
| 23 |
+
text field opens a picture on the clipboard, such as a screenshot or an image copied from a web
|
| 24 |
+
page with <em>Copy image</em>.</li>
|
| 25 |
<li><strong>Recent</strong> in the app bar: the last eight files you opened.</li>
|
| 26 |
<li><strong>A sample</strong> from the row under the drop area, on the empty stage: <em>Flat logo</em>, <em>Icon, 64 px</em>,
|
| 27 |
<em>Crest, filigree</em> and <em>Signature, B&W</em>.</li>
|
|
|
|
| 33 |
1024 px on its longer side and traced from that picture, which is how a messy drawing comes back
|
| 34 |
as clean shapes. To make an SVG smaller <em>without</em> re-drawing it, use <a href="minify.html">Minify SVG</a>
|
| 35 |
instead.</p>
|
| 36 |
+
<p>It does not read a PDF, or the HEIC and AVIF photos phones take: save those as PNG or JPEG first.
|
| 37 |
+
A file that does not open says so on the stage, with what the app found in it and the formats it
|
| 38 |
+
reads, and the samples stay there to carry on with.</p>
|
| 39 |
<p>What a dropped file does depends on what it is:</p>
|
| 40 |
<table>
|
| 41 |
<thead>
|
|
|
|
| 68 |
</tbody>
|
| 69 |
</table>
|
| 70 |
<p>The app bar shows the open file's name, its size in pixels and its format.</p>
|
| 71 |
+
<p><strong>Studio Lite:</strong> there is no right-click entry, and a dropped or chosen file is read by the browser;
|
| 72 |
+
it never leaves your computer. On the Hugging Face Space, the front page opens the Studio in a tab
|
| 73 |
+
of its own, where it runs on every core: a file you choose, paste or drop there goes with it,
|
| 74 |
+
carried inside the page address, up to 1.5 MB. A larger file can be opened on the front page
|
| 75 |
+
itself, on one core, or dropped again in the new tab. Inside the Space's frame, <strong>Open in its own
|
| 76 |
+
tab</strong> in the app bar takes the open image along the same way.</p>
|
| 77 |
<h2 id="auto-traces-at-once">Auto traces at once</h2>
|
| 78 |
<p>The moment an image opens, <strong>Auto</strong> traces it. It uses the controls exactly as you left them the
|
| 79 |
last time (the first time, the <strong>Logo</strong> preset, which is the default). Nothing has to be chosen
|
| 80 |
first, and the trace is already on its way when the next thing appears.</p>
|
| 81 |
+
<p><strong>Studio Lite:</strong> a full trace of a large image takes several seconds in a browser tab, so an image
|
| 82 |
+
larger than the draft size is first drawn by the Fast engine at the draft size, in well under a
|
| 83 |
+
second, and the full trace starts the moment that draft is on screen. The status strip says
|
| 84 |
+
<strong>Fast draft</strong> until the full trace lands; see <a href="viewer.html#draft-and-full-traces">Draft and full traces</a>.</p>
|
| 85 |
<h2 id="the-choice-card-keep-auto-or-customise">The choice card: Keep Auto or Customise</h2>
|
| 86 |
<p>Over the stage, a small card appears while Auto traces.</p>
|
| 87 |
<p><img alt="The card that appears when an image opens, with Auto's result and the Custom option" src="img/chooser.webp"></p>
|
|
|
|
| 90 |
and file size. <strong>Keep Auto</strong> closes the card.</li>
|
| 91 |
<li><strong>Custom</strong> opens the wizard (next section), which changes the settings a step at a time with
|
| 92 |
your result shown beside Auto's.</li>
|
| 93 |
+
<li>On a phone the card is only its two buttons, <strong>Keep Auto</strong> and <strong>Customise…</strong>, and its close,
|
| 94 |
+
so it covers as little of the drawing as it can. What Auto chose appears in the rail's Result
|
| 95 |
+
half once the card is closed.</li>
|
| 96 |
<li><strong>Auto chose</strong> says what Auto used, and anything its own report suggests. There are at most
|
| 97 |
two suggestions, and each is a one-click preset change:</li>
|
| 98 |
</ul>
|
|
|
|
| 187 |
<li>Read the numbers: <a href="result.html">Result</a> explains the quality report.</li>
|
| 188 |
<li>Change something: <a href="tune.html">Tune</a> lists every control.</li>
|
| 189 |
<li>Save it: <a href="export.html">Export</a>.</li>
|
| 190 |
+
</ul><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="install.html"><span class="dir">Previous</span><span class="lbl">Install and first launch</span></a><a class="next" href="viewer.html"><span class="dir">Next</span><span class="lbl">The viewer</span></a></nav></article></main>
|
| 191 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#opening-an-image">Opening an image</a></li><li class="l2"><a href="#auto-traces-at-once">Auto traces at once</a></li><li class="l2"><a href="#the-choice-card-keep-auto-or-customise">The choice card: Keep Auto or Customise</a></li><li class="l2"><a href="#the-custom-wizard">The Custom wizard</a></li><li class="l2"><a href="#what-to-do-next">What to do next</a></li></ul></aside>
|
| 192 |
</div>
|
| 193 |
</body>
|
| 194 |
</html>
|
studio/guide/guide.css
CHANGED
|
@@ -1,10 +1,13 @@
|
|
| 1 |
/* LogoLabs design system: warm charcoal ramp, one copper accent, Playfair Display +
|
| 2 |
-
* Inter + IBM Plex Mono. Tokens match web/index.html and the design-system zip.
|
|
|
|
|
|
|
|
|
|
| 3 |
:root{
|
| 4 |
--paper:#1a1816;--card:#211f1c;--stage:#141210;--void:#0c0a09;--surface:#2a2724;--highlight:#35322e;
|
| 5 |
-
--ink:#faf8f5;--dim:rgba(250,248,245,.75);--faint:rgba(250,248,245,.55);--muted:rgba(250,248,245,.
|
| 6 |
--rule:rgba(250,248,245,.08);--rule2:#2a2724;
|
| 7 |
-
--accent:#c9754a;--accent-hover:#d4896a;--accent-ink:#1a1816;--accent-soft:rgba(201,117,74,.12);
|
| 8 |
--gold:#b8976c;--good:#34d399;--bad:#f87171;
|
| 9 |
--font-display:"Playfair Display",Georgia,serif;--font-body:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;
|
| 10 |
--font-mono:"IBM Plex Mono",ui-monospace,SFMono-Regular,Consolas,monospace;
|
|
@@ -36,9 +39,9 @@ a:hover{color:var(--accent-hover)}
|
|
| 36 |
color:var(--muted)}
|
| 37 |
.side a{display:block;padding:4px 8px;margin:1px -8px;border-radius:6px;font-size:13.5px;color:var(--faint)}
|
| 38 |
.side a:hover{color:var(--ink);background:var(--card)}
|
| 39 |
-
.side a[aria-current]{color:var(--accent);background:var(--accent-soft)}
|
| 40 |
.side a .n{font:500 10.5px/1 var(--font-mono);color:var(--muted);margin-right:7px}
|
| 41 |
-
.side a[aria-current] .n{color:var(--accent)}
|
| 42 |
|
| 43 |
main{padding:44px 48px 90px;min-width:0}
|
| 44 |
article{max-width:46rem}
|
|
@@ -60,9 +63,19 @@ kbd{font-family:var(--font-mono);font-size:.8em;background:var(--surface);color:
|
|
| 60 |
border:1px solid var(--highlight);border-bottom-width:2px;border-radius:5px;padding:.05em .4em;white-space:nowrap}
|
| 61 |
code{font-family:var(--font-mono);font-size:.86em;background:var(--surface);
|
| 62 |
border:1px solid var(--rule);border-radius:5px;padding:.1em .35em;color:var(--ink)}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 63 |
.codehilite{background:var(--stage)!important;border:1px solid var(--rule);border-radius:10px;
|
| 64 |
padding:14px 16px;overflow-x:auto;margin:0 0 1.2em}
|
| 65 |
-
.codehilite pre{margin:0;background:transparent!important}
|
|
|
|
|
|
|
| 66 |
.codehilite code{background:transparent;border:0;padding:0;font-size:13px;line-height:1.6}
|
| 67 |
|
| 68 |
table{border-collapse:collapse;width:100%;margin:0 0 1.2em;font-size:14px;display:block;overflow-x:auto}
|
|
@@ -74,6 +87,7 @@ table code{white-space:nowrap}
|
|
| 74 |
blockquote{margin:0 0 1.2em;padding:10px 16px;border-left:3px solid var(--accent);
|
| 75 |
background:var(--accent-soft);border-radius:0 8px 8px 0}
|
| 76 |
blockquote p{margin:0 0 .5em;color:var(--ink)}
|
|
|
|
| 77 |
blockquote p:last-child{margin:0}
|
| 78 |
|
| 79 |
.math{overflow-x:auto;overflow-y:hidden;padding:6px 2px;margin:0 0 1.2em}
|
|
@@ -82,7 +96,7 @@ blockquote p:last-child{margin:0}
|
|
| 82 |
|
| 83 |
/* per-page toc rail */
|
| 84 |
.rail{padding:52px 20px 60px 0;position:sticky;top:56px;height:calc(100vh - 56px);overflow-y:auto}
|
| 85 |
-
.rail
|
| 86 |
color:var(--muted)}
|
| 87 |
.rail ul{list-style:none;margin:0;padding:0}
|
| 88 |
.rail ul ul{padding-left:12px}
|
|
@@ -126,7 +140,8 @@ blockquote p:last-child{margin:0}
|
|
| 126 |
|
| 127 |
footer{border-top:1px solid var(--rule);padding:26px 24px;display:flex;justify-content:space-between;
|
| 128 |
gap:16px;flex-wrap:wrap;font-size:13px;color:var(--muted)}
|
| 129 |
-
footer a{color:var(--dim)
|
|
|
|
| 130 |
footer a:hover{color:var(--accent)}
|
| 131 |
|
| 132 |
@media (max-width:1150px){.rail{display:none}.shell{grid-template-columns:220px minmax(0,1fr)}}
|
|
|
|
| 1 |
/* LogoLabs design system: warm charcoal ramp, one copper accent, Playfair Display +
|
| 2 |
+
* Inter + IBM Plex Mono. Tokens match web/index.html and the design-system zip.
|
| 3 |
+
* Text contrast (WCAG 2.2 SC 1.4.3, 4.5:1 for text under 18 px): --muted is .5, not .4
|
| 4 |
+
* (5.0:1 on --paper, 4.9:1 on --card; .4 was 3.7:1), as in the Studio's own tokens, and
|
| 5 |
+
* copper text on the tinted --accent-soft uses --accent-text (5.5:1; --accent is 4.4:1). */
|
| 6 |
:root{
|
| 7 |
--paper:#1a1816;--card:#211f1c;--stage:#141210;--void:#0c0a09;--surface:#2a2724;--highlight:#35322e;
|
| 8 |
+
--ink:#faf8f5;--dim:rgba(250,248,245,.75);--faint:rgba(250,248,245,.55);--muted:rgba(250,248,245,.5);
|
| 9 |
--rule:rgba(250,248,245,.08);--rule2:#2a2724;
|
| 10 |
+
--accent:#c9754a;--accent-text:#d4896a;--accent-hover:#d4896a;--accent-ink:#1a1816;--accent-soft:rgba(201,117,74,.12);
|
| 11 |
--gold:#b8976c;--good:#34d399;--bad:#f87171;
|
| 12 |
--font-display:"Playfair Display",Georgia,serif;--font-body:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;
|
| 13 |
--font-mono:"IBM Plex Mono",ui-monospace,SFMono-Regular,Consolas,monospace;
|
|
|
|
| 39 |
color:var(--muted)}
|
| 40 |
.side a{display:block;padding:4px 8px;margin:1px -8px;border-radius:6px;font-size:13.5px;color:var(--faint)}
|
| 41 |
.side a:hover{color:var(--ink);background:var(--card)}
|
| 42 |
+
.side a[aria-current]{color:var(--accent-text);background:var(--accent-soft)}
|
| 43 |
.side a .n{font:500 10.5px/1 var(--font-mono);color:var(--muted);margin-right:7px}
|
| 44 |
+
.side a[aria-current] .n{color:var(--accent-text)}
|
| 45 |
|
| 46 |
main{padding:44px 48px 90px;min-width:0}
|
| 47 |
article{max-width:46rem}
|
|
|
|
| 63 |
border:1px solid var(--highlight);border-bottom-width:2px;border-radius:5px;padding:.05em .4em;white-space:nowrap}
|
| 64 |
code{font-family:var(--font-mono);font-size:.86em;background:var(--surface);
|
| 65 |
border:1px solid var(--rule);border-radius:5px;padding:.1em .35em;color:var(--ink)}
|
| 66 |
+
/* A long identifier, path, hash or URL in running text breaks where it must rather than
|
| 67 |
+
pushing the page wider than a phone (390 px: index 526, 14-fast-mode 478, pipeline
|
| 68 |
+
1,157, design 470). */
|
| 69 |
+
article{overflow-wrap:break-word}
|
| 70 |
+
article :not(pre)>code{overflow-wrap:anywhere}
|
| 71 |
+
/* A fenced block the highlighter does not handle (the pipeline page's mermaid source,
|
| 72 |
+
1,157 px wide) scrolls inside itself like every other code block. */
|
| 73 |
+
article pre{overflow-x:auto;max-width:100%}
|
| 74 |
.codehilite{background:var(--stage)!important;border:1px solid var(--rule);border-radius:10px;
|
| 75 |
padding:14px 16px;overflow-x:auto;margin:0 0 1.2em}
|
| 76 |
+
.codehilite pre{margin:0;background:transparent!important;overflow:visible}
|
| 77 |
+
/* A region that scrolls sideways gets a tab stop (the script in PAGE_SHELL), and shows it. */
|
| 78 |
+
[data-scroll-stop]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
|
| 79 |
.codehilite code{background:transparent;border:0;padding:0;font-size:13px;line-height:1.6}
|
| 80 |
|
| 81 |
table{border-collapse:collapse;width:100%;margin:0 0 1.2em;font-size:14px;display:block;overflow-x:auto}
|
|
|
|
| 87 |
blockquote{margin:0 0 1.2em;padding:10px 16px;border-left:3px solid var(--accent);
|
| 88 |
background:var(--accent-soft);border-radius:0 8px 8px 0}
|
| 89 |
blockquote p{margin:0 0 .5em;color:var(--ink)}
|
| 90 |
+
blockquote a{color:var(--accent-text)}
|
| 91 |
blockquote p:last-child{margin:0}
|
| 92 |
|
| 93 |
.math{overflow-x:auto;overflow-y:hidden;padding:6px 2px;margin:0 0 1.2em}
|
|
|
|
| 96 |
|
| 97 |
/* per-page toc rail */
|
| 98 |
.rail{padding:52px 20px 60px 0;position:sticky;top:56px;height:calc(100vh - 56px);overflow-y:auto}
|
| 99 |
+
.rail .railh{margin:0 0 10px;font:500 10.5px/1 var(--font-mono);letter-spacing:.14em;text-transform:uppercase;
|
| 100 |
color:var(--muted)}
|
| 101 |
.rail ul{list-style:none;margin:0;padding:0}
|
| 102 |
.rail ul ul{padding-left:12px}
|
|
|
|
| 140 |
|
| 141 |
footer{border-top:1px solid var(--rule);padding:26px 24px;display:flex;justify-content:space-between;
|
| 142 |
gap:16px;flex-wrap:wrap;font-size:13px;color:var(--muted)}
|
| 143 |
+
footer a{color:var(--dim);text-decoration:underline;text-decoration-color:rgba(250,248,245,.35);
|
| 144 |
+
text-underline-offset:3px}
|
| 145 |
footer a:hover{color:var(--accent)}
|
| 146 |
|
| 147 |
@media (max-width:1150px){.rail{display:none}.shell{grid-template-columns:220px minmax(0,1fr)}}
|
studio/guide/index.html
CHANGED
|
@@ -9,13 +9,13 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html" aria-current="page">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/index.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="inkvec-studio">Inkvec Studio</h1>
|
| 14 |
<p>Inkvec Studio is the desktop app for Inkvec. It turns a raster logo, icon or emoji into an SVG,
|
| 15 |
shows you how close the SVG is to the image it came from, and prepares the result for the web,
|
| 16 |
for print or for a cutting machine. It runs on Windows, macOS and Linux, and everything it does
|
| 17 |
happens on your own computer: your image is never uploaded.</p>
|
| 18 |
-
<p>This guide describes the app as it is in version 0.2.
|
| 19 |
four tutorials that each take one job from start to finish.</p>
|
| 20 |
<p><img alt="The Vectorize tab: the source on the left, the SVG on the right, the quality report in the rail" src="img/workspace.webp"></p>
|
| 21 |
<h2 id="what-is-where">What is where</h2>
|
|
@@ -51,7 +51,11 @@ four tutorials that each take one job from start to finish.</p>
|
|
| 51 |
</tr>
|
| 52 |
</tbody>
|
| 53 |
</table>
|
| 54 |
-
<p>On the right of the app bar are <strong>Open…</strong>, <strong>Recent</strong>, <strong>Settings</strong>, <strong>About</strong>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
Help (or <kbd>F1</kbd>) opens this guide inside the app, at the page about what is on screen. The
|
| 56 |
guide is bundled with the app, so it works without a network; <strong>Open in browser</strong> shows the same
|
| 57 |
page on the web.</p>
|
|
@@ -83,6 +87,14 @@ in a few places:</p>
|
|
| 83 |
<li>The denoiser downloads by itself, in the background, the first time Studio Lite opens, and is
|
| 84 |
kept in the browser for later visits (see <a href="settings.html#denoiser">the denoiser</a>).</li>
|
| 85 |
<li>Preferences and the choices you leave the app with are kept in the browser, not in a file.</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
</ul>
|
| 87 |
<p>Where a page describes something Studio Lite does differently, it says so.</p>
|
| 88 |
<h2 id="contents">Contents</h2>
|
|
@@ -112,8 +124,8 @@ in a few places:</p>
|
|
| 112 |
<p>How the tracing itself works, stage by stage, is in <a href="https://logolabs.github.io/inkvec/algorithm/index.html">How Inkvec works</a>.
|
| 113 |
What it cannot do is in <a href="https://logolabs.github.io/inkvec/limitations.html">Limitations</a>.</p>
|
| 114 |
<p><em>The screenshots in this guide were taken from a development build with sample images. The
|
| 115 |
-
numbers in them belong to those samples.</em></p><nav class="pagenav"><span></span><a class="next" href="install.html"><span class="dir">Next</span><span class="lbl">Install and first launch</span></a></nav></article></main>
|
| 116 |
-
<aside class="rail"><
|
| 117 |
</div>
|
| 118 |
</body>
|
| 119 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html" aria-current="page">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/index.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="inkvec-studio">Inkvec Studio</h1>
|
| 14 |
<p>Inkvec Studio is the desktop app for Inkvec. It turns a raster logo, icon or emoji into an SVG,
|
| 15 |
shows you how close the SVG is to the image it came from, and prepares the result for the web,
|
| 16 |
for print or for a cutting machine. It runs on Windows, macOS and Linux, and everything it does
|
| 17 |
happens on your own computer: your image is never uploaded.</p>
|
| 18 |
+
<p>This guide describes the app as it is in version 0.2.4. It covers every screen, and ends with
|
| 19 |
four tutorials that each take one job from start to finish.</p>
|
| 20 |
<p><img alt="The Vectorize tab: the source on the left, the SVG on the right, the quality report in the rail" src="img/workspace.webp"></p>
|
| 21 |
<h2 id="what-is-where">What is where</h2>
|
|
|
|
| 51 |
</tr>
|
| 52 |
</tbody>
|
| 53 |
</table>
|
| 54 |
+
<p>On the right of the app bar are <strong>Open…</strong>, <strong>Recent</strong>, <strong>Settings</strong>, <strong>About</strong>, <strong>Showcase</strong> and
|
| 55 |
+
<strong>Help</strong>. <strong>Showcase</strong> is before and after on real logos: twenty brand logos and the benchmark's
|
| 56 |
+
logos, icons and emoji, each traced by Inkvec and by other tracers, side by side with the source
|
| 57 |
+
on one shared zoom (fill, wireframe, anchors and handles), above the summary tables of that run.
|
| 58 |
+
It is bundled with the app, so it works offline.
|
| 59 |
Help (or <kbd>F1</kbd>) opens this guide inside the app, at the page about what is on screen. The
|
| 60 |
guide is bundled with the app, so it works without a network; <strong>Open in browser</strong> shows the same
|
| 61 |
page on the web.</p>
|
|
|
|
| 87 |
<li>The denoiser downloads by itself, in the background, the first time Studio Lite opens, and is
|
| 88 |
kept in the browser for later visits (see <a href="settings.html#denoiser">the denoiser</a>).</li>
|
| 89 |
<li>Preferences and the choices you leave the app with are kept in the browser, not in a file.</li>
|
| 90 |
+
<li>In place of the window's own buttons, the app bar has <strong>Full screen</strong> (the page fills the
|
| 91 |
+
screen; <kbd>Esc</kbd> leaves it) and, inside the Hugging Face page, <strong>Open in its own tab</strong>,
|
| 92 |
+
which takes the open image along (up to 1.5 MB). In its own tab the engine uses every core and
|
| 93 |
+
the denoiser can run; inside the Hugging Face frame it runs on one core.</li>
|
| 94 |
+
<li>It works on a phone. Held upright, the app is one column that scrolls: the drawing first, then
|
| 95 |
+
the rail, with <strong>Export</strong> kept at the bottom of the screen. On its side, the drawing and the
|
| 96 |
+
rail stay side by side with the toolbars thinned to one row. Large images trace faster on a
|
| 97 |
+
laptop.</li>
|
| 98 |
</ul>
|
| 99 |
<p>Where a page describes something Studio Lite does differently, it says so.</p>
|
| 100 |
<h2 id="contents">Contents</h2>
|
|
|
|
| 124 |
<p>How the tracing itself works, stage by stage, is in <a href="https://logolabs.github.io/inkvec/algorithm/index.html">How Inkvec works</a>.
|
| 125 |
What it cannot do is in <a href="https://logolabs.github.io/inkvec/limitations.html">Limitations</a>.</p>
|
| 126 |
<p><em>The screenshots in this guide were taken from a development build with sample images. The
|
| 127 |
+
numbers in them belong to those samples.</em></p><nav class="pagenav" aria-label="Previous and next page"><span></span><a class="next" href="install.html"><span class="dir">Next</span><span class="lbl">Install and first launch</span></a></nav></article></main>
|
| 128 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#what-is-where">What is where</a></li><li class="l2"><a href="#how-a-trace-happens">How a trace happens</a></li><li class="l2"><a href="#inkvec-studio-and-inkvec-studio-lite">Inkvec Studio and Inkvec Studio Lite</a></li><li class="l2"><a href="#contents">Contents</a></li></ul></aside>
|
| 129 |
</div>
|
| 130 |
</body>
|
| 131 |
</html>
|
studio/guide/install.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html" aria-current="page">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/install.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="install-and-first-launch">Install and first launch</h1>
|
| 14 |
<p>Inkvec Studio is published on the project's
|
| 15 |
<a href="https://github.com/logolabs/inkvec/releases">GitHub releases page</a>. Each release has one
|
|
@@ -93,8 +93,8 @@ preferences file (your settings, recent files and saved presets) and, if you dow
|
|
| 93 |
denoiser model. Their locations are listed in <a href="settings.html#where-things-are-kept">Settings</a>.</p>
|
| 94 |
<h2 id="studio-lite">Studio Lite</h2>
|
| 95 |
<p>Inkvec Studio Lite needs no installation: it runs in a current desktop browser. Everything on this
|
| 96 |
-
page about installers, signing and uninstalling applies only to the desktop app.</p><nav class="pagenav"><a class="prev" href="index.html"><span class="dir">Previous</span><span class="lbl">Overview</span></a><a class="next" href="getting-started.html"><span class="dir">Next</span><span class="lbl">Getting started</span></a></nav></article></main>
|
| 97 |
-
<aside class="rail"><
|
| 98 |
</div>
|
| 99 |
</body>
|
| 100 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html" aria-current="page">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/install.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="install-and-first-launch">Install and first launch</h1>
|
| 14 |
<p>Inkvec Studio is published on the project's
|
| 15 |
<a href="https://github.com/logolabs/inkvec/releases">GitHub releases page</a>. Each release has one
|
|
|
|
| 93 |
denoiser model. Their locations are listed in <a href="settings.html#where-things-are-kept">Settings</a>.</p>
|
| 94 |
<h2 id="studio-lite">Studio Lite</h2>
|
| 95 |
<p>Inkvec Studio Lite needs no installation: it runs in a current desktop browser. Everything on this
|
| 96 |
+
page about installers, signing and uninstalling applies only to the desktop app.</p><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="index.html"><span class="dir">Previous</span><span class="lbl">Overview</span></a><a class="next" href="getting-started.html"><span class="dir">Next</span><span class="lbl">Getting started</span></a></nav></article></main>
|
| 97 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#opening-the-app-the-first-time">Opening the app the first time</a></li><li class="l2"><a href="#what-the-app-sends-over-the-network">What the app sends over the network</a></li><li class="l2"><a href="#updates">Updates</a></li><li class="l2"><a href="#uninstalling">Uninstalling</a></li><li class="l2"><a href="#studio-lite">Studio Lite</a></li></ul></aside>
|
| 98 |
</div>
|
| 99 |
</body>
|
| 100 |
</html>
|
studio/guide/minify.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html" aria-current="page">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/minify.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="minify-svg">Minify SVG</h1>
|
| 14 |
<p>The <strong>Minify SVG</strong> tab makes an SVG you already have smaller without changing what it looks like.
|
| 15 |
It rewrites every path with the fewest segments that stay within a tolerance of the original, and
|
|
@@ -90,8 +90,8 @@ survive it. Compare before you replace the original.</p>
|
|
| 90 |
<h2 id="studio-lite">Studio Lite</h2>
|
| 91 |
<p><strong>Save SVG</strong> downloads the file.</p>
|
| 92 |
<p><strong>Command line:</strong> the same minifier is <code>inkvec-svgmin</code>, with <code>--tolerance</code>, <code>--judge</code>,
|
| 93 |
-
<code>--corner-degrees</code> and <code>--no-document</code>.</p><nav class="pagenav"><a class="prev" href="export.html"><span class="dir">Previous</span><span class="lbl">Export</span></a><a class="next" href="fabricate.html"><span class="dir">Next</span><span class="lbl">Fabricate</span></a></nav></article></main>
|
| 94 |
-
<aside class="rail"><
|
| 95 |
</div>
|
| 96 |
</body>
|
| 97 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html" aria-current="page">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/minify.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="minify-svg">Minify SVG</h1>
|
| 14 |
<p>The <strong>Minify SVG</strong> tab makes an SVG you already have smaller without changing what it looks like.
|
| 15 |
It rewrites every path with the fewest segments that stay within a tolerance of the original, and
|
|
|
|
| 90 |
<h2 id="studio-lite">Studio Lite</h2>
|
| 91 |
<p><strong>Save SVG</strong> downloads the file.</p>
|
| 92 |
<p><strong>Command line:</strong> the same minifier is <code>inkvec-svgmin</code>, with <code>--tolerance</code>, <code>--judge</code>,
|
| 93 |
+
<code>--corner-degrees</code> and <code>--no-document</code>.</p><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="export.html"><span class="dir">Previous</span><span class="lbl">Export</span></a><a class="next" href="fabricate.html"><span class="dir">Next</span><span class="lbl">Fabricate</span></a></nav></article></main>
|
| 94 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#opening-an-svg">Opening an SVG</a></li><li class="l2"><a href="#checking-that-nothing-moved">Checking that nothing moved</a></li><li class="l2"><a href="#the-result">The result</a></li><li class="l2"><a href="#the-controls">The controls</a></li><li class="l2"><a href="#saving">Saving</a></li><li class="l2"><a href="#rebuild-it-clean-by-re-tracing">Rebuild it clean by re-tracing</a></li><li class="l2"><a href="#studio-lite">Studio Lite</a></li></ul></aside>
|
| 95 |
</div>
|
| 96 |
</body>
|
| 97 |
</html>
|
studio/guide/palette.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html" aria-current="page">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/palette.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="the-palette-and-colour-groups">The palette and colour groups</h1>
|
| 14 |
<p>The palette card, at the bottom of the Result tab, lists every ink in the drawing: each flat
|
| 15 |
colour, and each gradient. It is where you correct a colour, match the drawing to a brand palette,
|
|
@@ -114,8 +114,8 @@ every trace of the current image, drafts included, and the Custom wizard's <stro
|
|
| 114 |
restores them with the controls.</p>
|
| 115 |
<p><strong>Command line:</strong> the same grouping is <code>inkvec --merge-colors</code>, for example
|
| 116 |
<code>--merge-colors "#c0392b,#e74c3c;#123456,#abcdef=#ffffff"</code> (groups separated by <code>;</code>, members by
|
| 117 |
-
<code>,</code>, an optional <code>=</code> target).</p><nav class="pagenav"><a class="prev" href="tune.html"><span class="dir">Previous</span><span class="lbl">Tune</span></a><a class="next" href="export.html"><span class="dir">Next</span><span class="lbl">Export</span></a></nav></article></main>
|
| 118 |
-
<aside class="rail"><
|
| 119 |
</div>
|
| 120 |
</body>
|
| 121 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html" aria-current="page">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/palette.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="the-palette-and-colour-groups">The palette and colour groups</h1>
|
| 14 |
<p>The palette card, at the bottom of the Result tab, lists every ink in the drawing: each flat
|
| 15 |
colour, and each gradient. It is where you correct a colour, match the drawing to a brand palette,
|
|
|
|
| 114 |
restores them with the controls.</p>
|
| 115 |
<p><strong>Command line:</strong> the same grouping is <code>inkvec --merge-colors</code>, for example
|
| 116 |
<code>--merge-colors "#c0392b,#e74c3c;#123456,#abcdef=#ffffff"</code> (groups separated by <code>;</code>, members by
|
| 117 |
+
<code>,</code>, an optional <code>=</code> target).</p><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="tune.html"><span class="dir">Previous</span><span class="lbl">Tune</span></a><a class="next" href="export.html"><span class="dir">Next</span><span class="lbl">Export</span></a></nav></article></main>
|
| 118 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#the-inks">The inks</a></li><li class="l2"><a href="#snapping-an-ink-to-an-exact-colour">Snapping an ink to an exact colour</a></li><li class="l2"><a href="#paste-a-brand-palette">Paste a brand palette</a></li><li class="l2"><a href="#colour-groups">Colour groups</a><ul><li class="l3"><a href="#suggested-groups">Suggested groups</a></li><li class="l3"><a href="#making-a-group-yourself">Making a group yourself</a></li><li class="l3"><a href="#what-a-group-becomes">What a group becomes</a></li><li class="l3"><a href="#what-the-engine-did">What the engine did</a></li><li class="l3"><a href="#groups-belong-to-one-image">Groups belong to one image</a></li></ul></li></ul></aside>
|
| 119 |
</div>
|
| 120 |
</body>
|
| 121 |
</html>
|
studio/guide/result.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html" aria-current="page">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/result.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="result-reading-the-quality-report">Result: reading the quality report</h1>
|
| 14 |
<p>The <strong>Result</strong> half of the rail is what the last trace produced. It is a measurement, not a
|
| 15 |
score: the SVG is rendered and compared with your image pixel by pixel, and the figures are what
|
|
@@ -206,8 +206,8 @@ link.</p>
|
|
| 206 |
</tr>
|
| 207 |
</tbody>
|
| 208 |
</table>
|
| 209 |
-
<p>The first row in this panel is also copied into the asset pack's README when you export one.</p><nav class="pagenav"><a class="prev" href="viewer.html"><span class="dir">Previous</span><span class="lbl">The viewer</span></a><a class="next" href="tune.html"><span class="dir">Next</span><span class="lbl">Tune</span></a></nav></article></main>
|
| 210 |
-
<aside class="rail"><
|
| 211 |
</div>
|
| 212 |
</body>
|
| 213 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html" aria-current="page">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/result.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="result-reading-the-quality-report">Result: reading the quality report</h1>
|
| 14 |
<p>The <strong>Result</strong> half of the rail is what the last trace produced. It is a measurement, not a
|
| 15 |
score: the SVG is rendered and compared with your image pixel by pixel, and the figures are what
|
|
|
|
| 206 |
</tr>
|
| 207 |
</tbody>
|
| 208 |
</table>
|
| 209 |
+
<p>The first row in this panel is also copied into the asset pack's README when you export one.</p><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="viewer.html"><span class="dir">Previous</span><span class="lbl">The viewer</span></a><a class="next" href="tune.html"><span class="dir">Next</span><span class="lbl">Tune</span></a></nav></article></main>
|
| 210 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#the-quality-report">The quality report</a></li><li class="l2"><a href="#the-readout-at-the-foot">The readout at the foot</a></li><li class="l2"><a href="#editability">Editability</a></li><li class="l2"><a href="#what-this-trace-could-not-recover">What this trace could not recover</a></li></ul></aside>
|
| 211 |
</div>
|
| 212 |
</body>
|
| 213 |
</html>
|
studio/guide/settings.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html" aria-current="page">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/settings.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="settings">Settings</h1>
|
| 14 |
<p><strong>Settings</strong> in the app bar (or <kbd>Ctrl</kbd>+<kbd>,</kbd>, <kbd>⌘</kbd>+<kbd>,</kbd> on a Mac)
|
| 15 |
opens the preferences on one page. Changes apply as you make them; <strong>Done</strong> or <kbd>Esc</kbd>
|
|
@@ -186,8 +186,8 @@ storage for the Space's site, and the denoiser in its Cache Storage; clearing th
|
|
| 186 |
the browser removes both. In a private window, or with site data blocked, nothing can be kept:
|
| 187 |
the app works the same and starts from the defaults each time. It has no <strong>Advanced</strong> entries (no
|
| 188 |
command on the PATH, no right-click menu) and no default output folder, since files are
|
| 189 |
-
downloaded.</p><nav class="pagenav"><a class="prev" href="batch.html"><span class="dir">Previous</span><span class="lbl">Batch</span></a><a class="next" href="shortcuts.html"><span class="dir">Next</span><span class="lbl">Keyboard and mouse</span></a></nav></article></main>
|
| 190 |
-
<aside class="rail"><
|
| 191 |
</div>
|
| 192 |
</body>
|
| 193 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html" aria-current="page">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/settings.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="settings">Settings</h1>
|
| 14 |
<p><strong>Settings</strong> in the app bar (or <kbd>Ctrl</kbd>+<kbd>,</kbd>, <kbd>⌘</kbd>+<kbd>,</kbd> on a Mac)
|
| 15 |
opens the preferences on one page. Changes apply as you make them; <strong>Done</strong> or <kbd>Esc</kbd>
|
|
|
|
| 186 |
the browser removes both. In a private window, or with site data blocked, nothing can be kept:
|
| 187 |
the app works the same and starts from the defaults each time. It has no <strong>Advanced</strong> entries (no
|
| 188 |
command on the PATH, no right-click menu) and no default output folder, since files are
|
| 189 |
+
downloaded.</p><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="batch.html"><span class="dir">Previous</span><span class="lbl">Batch</span></a><a class="next" href="shortcuts.html"><span class="dir">Next</span><span class="lbl">Keyboard and mouse</span></a></nav></article></main>
|
| 190 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#general">General</a></li><li class="l2"><a href="#performance">Performance</a></li><li class="l2"><a href="#denoiser">Denoiser</a></li><li class="l2"><a href="#updates">Updates</a></li><li class="l2"><a href="#advanced">Advanced</a></li><li class="l2"><a href="#what-the-app-remembers">What the app remembers</a></li><li class="l2"><a href="#privacy">Privacy</a></li><li class="l2"><a href="#where-things-are-kept">Where things are kept</a></li><li class="l2"><a href="#about">About</a></li><li class="l2"><a href="#studio-lite">Studio Lite</a></li></ul></aside>
|
| 191 |
</div>
|
| 192 |
</body>
|
| 193 |
</html>
|
studio/guide/shortcuts.html
CHANGED
|
@@ -9,9 +9,11 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html" aria-current="page">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/shortcuts.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="keyboard-and-mouse">Keyboard and mouse</h1>
|
| 14 |
-
<p>On a Mac, read <kbd>⌘</kbd> for <kbd>Ctrl</kbd>.
|
|
|
|
|
|
|
| 15 |
<h2 id="anywhere">Anywhere</h2>
|
| 16 |
<table>
|
| 17 |
<thead>
|
|
@@ -26,6 +28,10 @@
|
|
| 26 |
<td>Open an image</td>
|
| 27 |
</tr>
|
| 28 |
<tr>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
<td><kbd>Ctrl</kbd>+<kbd>E</kbd></td>
|
| 30 |
<td>Open the export sheet (once there is a drawing)</td>
|
| 31 |
</tr>
|
|
@@ -43,11 +49,37 @@
|
|
| 43 |
</tr>
|
| 44 |
<tr>
|
| 45 |
<td><kbd>Esc</kbd></td>
|
| 46 |
-
<td>Close, in this order: Settings, About or the guide; the Custom wizard (keeping what you chose); the choice card (keeping Auto). With none of those open, cancel the trace in progress.</td>
|
| 47 |
</tr>
|
| 48 |
</tbody>
|
| 49 |
</table>
|
| 50 |
<p>The preset shortcuts do nothing while you are typing in a field.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
<h2 id="in-the-vectorize-viewer">In the Vectorize viewer</h2>
|
| 52 |
<table>
|
| 53 |
<thead>
|
|
@@ -82,12 +114,25 @@
|
|
| 82 |
<td>Pan</td>
|
| 83 |
</tr>
|
| 84 |
<tr>
|
| 85 |
-
<td>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
<td>Move it (in Wipe)</td>
|
| 87 |
</tr>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 88 |
</tbody>
|
| 89 |
</table>
|
| 90 |
-
<p><kbd>Space</kbd> also flicks between Before and After in the Minify SVG tab
|
|
|
|
| 91 |
<h2 id="in-the-rail">In the rail</h2>
|
| 92 |
<table>
|
| 93 |
<thead>
|
|
@@ -125,9 +170,13 @@
|
|
| 125 |
<td><kbd>Enter</kbd>, in the save-preset or colour field</td>
|
| 126 |
<td>Save or use it</td>
|
| 127 |
</tr>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 128 |
</tbody>
|
| 129 |
-
</table><nav class="pagenav"><a class="prev" href="settings.html"><span class="dir">Previous</span><span class="lbl">Settings</span></a><a class="next" href="troubleshooting.html"><span class="dir">Next</span><span class="lbl">Troubleshooting</span></a></nav></article></main>
|
| 130 |
-
<aside class="rail"><
|
| 131 |
</div>
|
| 132 |
</body>
|
| 133 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html" aria-current="page">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/shortcuts.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="keyboard-and-mouse">Keyboard and mouse</h1>
|
| 14 |
+
<p>On a Mac, read <kbd>⌘</kbd> for <kbd>Ctrl</kbd>. Every drag in the viewer has a key and a single
|
| 15 |
+
click or tap that does the same, and every drag in the palette has a button (tick and <strong>Merge</strong>,
|
| 16 |
+
or a chip's <strong>×</strong>).</p>
|
| 17 |
<h2 id="anywhere">Anywhere</h2>
|
| 18 |
<table>
|
| 19 |
<thead>
|
|
|
|
| 28 |
<td>Open an image</td>
|
| 29 |
</tr>
|
| 30 |
<tr>
|
| 31 |
+
<td><kbd>Ctrl</kbd>+<kbd>V</kbd></td>
|
| 32 |
+
<td>Open the image on the clipboard (a screenshot, or a picture copied with <em>Copy image</em>), outside a text field</td>
|
| 33 |
+
</tr>
|
| 34 |
+
<tr>
|
| 35 |
<td><kbd>Ctrl</kbd>+<kbd>E</kbd></td>
|
| 36 |
<td>Open the export sheet (once there is a drawing)</td>
|
| 37 |
</tr>
|
|
|
|
| 49 |
</tr>
|
| 50 |
<tr>
|
| 51 |
<td><kbd>Esc</kbd></td>
|
| 52 |
+
<td>Close, in this order: a dialog or the export sheet; Settings, About, Showcase or the guide; the Custom wizard (keeping what you chose); the choice card (keeping Auto). With none of those open, cancel the trace in progress.</td>
|
| 53 |
</tr>
|
| 54 |
</tbody>
|
| 55 |
</table>
|
| 56 |
<p>The preset shortcuts do nothing while you are typing in a field.</p>
|
| 57 |
+
<h2 id="in-a-dialog">In a dialog</h2>
|
| 58 |
+
<p>The export sheet, Settings, About, Showcase, the guide and every dialog over the window behave
|
| 59 |
+
the same way:</p>
|
| 60 |
+
<table>
|
| 61 |
+
<thead>
|
| 62 |
+
<tr>
|
| 63 |
+
<th>Keys</th>
|
| 64 |
+
<th>Does</th>
|
| 65 |
+
</tr>
|
| 66 |
+
</thead>
|
| 67 |
+
<tbody>
|
| 68 |
+
<tr>
|
| 69 |
+
<td>(opening it)</td>
|
| 70 |
+
<td>The keyboard moves into it</td>
|
| 71 |
+
</tr>
|
| 72 |
+
<tr>
|
| 73 |
+
<td><kbd>Tab</kbd>, <kbd>Shift</kbd>+<kbd>Tab</kbd></td>
|
| 74 |
+
<td>Move between its controls; past the last one it goes back to the first, never to the window behind</td>
|
| 75 |
+
</tr>
|
| 76 |
+
<tr>
|
| 77 |
+
<td><kbd>Esc</kbd></td>
|
| 78 |
+
<td>Close it; the keyboard goes back to the button that opened it</td>
|
| 79 |
+
</tr>
|
| 80 |
+
</tbody>
|
| 81 |
+
</table>
|
| 82 |
+
<p>The window behind is out of reach while one is open, for the keyboard and for a screen reader.</p>
|
| 83 |
<h2 id="in-the-vectorize-viewer">In the Vectorize viewer</h2>
|
| 84 |
<table>
|
| 85 |
<thead>
|
|
|
|
| 114 |
<td>Pan</td>
|
| 115 |
</tr>
|
| 116 |
<tr>
|
| 117 |
+
<td>The arrow buttons beside the zoom stops</td>
|
| 118 |
+
<td>Pan a quarter of the view (shown once you have zoomed or panned)</td>
|
| 119 |
+
</tr>
|
| 120 |
+
<tr>
|
| 121 |
+
<td><kbd>Tab</kbd> to the viewer, then the arrow keys</td>
|
| 122 |
+
<td>Pan a tenth of the view; with <kbd>Shift</kbd>, half</td>
|
| 123 |
+
</tr>
|
| 124 |
+
<tr>
|
| 125 |
+
<td>Drag the wipe divider, or tap where it should go</td>
|
| 126 |
<td>Move it (in Wipe)</td>
|
| 127 |
</tr>
|
| 128 |
+
<tr>
|
| 129 |
+
<td><kbd>Tab</kbd> to the wipe divider, then <kbd>←</kbd> <kbd>→</kbd></td>
|
| 130 |
+
<td>Move it 2% of the width; with <kbd>Shift</kbd>, or <kbd>Page Up</kbd> and <kbd>Page Down</kbd>, 10%; <kbd>Home</kbd> and <kbd>End</kbd> go to the ends</td>
|
| 131 |
+
</tr>
|
| 132 |
</tbody>
|
| 133 |
</table>
|
| 134 |
+
<p><kbd>Space</kbd> also flicks between Before and After in the Minify SVG tab, whose wipe divider
|
| 135 |
+
works the same way.</p>
|
| 136 |
<h2 id="in-the-rail">In the rail</h2>
|
| 137 |
<table>
|
| 138 |
<thead>
|
|
|
|
| 170 |
<td><kbd>Enter</kbd>, in the save-preset or colour field</td>
|
| 171 |
<td>Save or use it</td>
|
| 172 |
</tr>
|
| 173 |
+
<tr>
|
| 174 |
+
<td><kbd>Tab</kbd> to the engine log's lines</td>
|
| 175 |
+
<td>Scroll them with the arrow keys</td>
|
| 176 |
+
</tr>
|
| 177 |
</tbody>
|
| 178 |
+
</table><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="settings.html"><span class="dir">Previous</span><span class="lbl">Settings</span></a><a class="next" href="troubleshooting.html"><span class="dir">Next</span><span class="lbl">Troubleshooting</span></a></nav></article></main>
|
| 179 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#anywhere">Anywhere</a></li><li class="l2"><a href="#in-a-dialog">In a dialog</a></li><li class="l2"><a href="#in-the-vectorize-viewer">In the Vectorize viewer</a></li><li class="l2"><a href="#in-the-rail">In the rail</a></li></ul></aside>
|
| 180 |
</div>
|
| 181 |
</body>
|
| 182 |
</html>
|
studio/guide/troubleshooting.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html" aria-current="page">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/troubleshooting.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="troubleshooting-and-questions">Troubleshooting and questions</h1>
|
| 14 |
<h2 id="installing-and-starting">Installing and starting</h2>
|
| 15 |
<p><strong>Windows says "Windows protected your PC".</strong> The installer is not code-signed. Choose <strong>More
|
|
@@ -82,8 +82,10 @@ original, smaller file instead.</p>
|
|
| 82 |
says so. Re-set the words in a vector editor if they must stay editable.</p>
|
| 83 |
<p><strong>Lines came back as thin filled shapes.</strong> Try the <em>Line art</em> preset. It only works for lines of one
|
| 84 |
even width; brush and calligraphic strokes stay as outlines.</p>
|
| 85 |
-
<p><strong>The draft and the final look different.</strong> A draft is traced small (512 px) for speed.
|
| 86 |
-
the
|
|
|
|
|
|
|
| 87 |
<p><strong>The favicon has space above and below the logo.</strong> Favicons are square; a wide drawing is
|
| 88 |
centred in them on a transparent background rather than stretched. Trace a square crop of the mark
|
| 89 |
for a favicon that fills its square.</p>
|
|
@@ -108,7 +110,7 @@ folder.</p>
|
|
| 108 |
<p><strong>Where are Batch, the command line and the right-click menu?</strong> They need the desktop app. See
|
| 109 |
<a href="index.html#inkvec-studio-and-inkvec-studio-lite">Inkvec Studio and Inkvec Studio Lite</a>.</p>
|
| 110 |
<p><strong>The first visit takes a few seconds to start.</strong> The loading screen is the engine arriving
|
| 111 |
-
(about
|
| 112 |
browser's cache.</p>
|
| 113 |
<p><strong>The denoiser is on but the trace looks the same, and the rail says it is downloading.</strong> The
|
| 114 |
trace shown was made without it while it downloads (about 100 MB, once). It traces again by
|
|
@@ -117,13 +119,24 @@ the status strip.</p>
|
|
| 117 |
<p><strong>Nothing is downloaded in the background.</strong> Your browser asks sites to save data, so Studio
|
| 118 |
Lite waits until you turn the denoiser on. Inside the Hugging Face frame the denoiser cannot run
|
| 119 |
at all: use <strong>Open in its own tab</strong>.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 120 |
<p><strong>My settings are not remembered.</strong> A private window, or a browser set to block site data, gives
|
| 121 |
the page nowhere to keep them. The app still works, from the defaults each time.</p>
|
| 122 |
<h2 id="reporting-a-problem">Reporting a problem</h2>
|
| 123 |
<p>Report bugs on <a href="https://github.com/logolabs/inkvec/issues">GitHub</a>. Include the app version (from
|
| 124 |
About), your operating system, and, if you can share it, the image. Security problems go through
|
| 125 |
-
the <a href="https://logolabs.github.io/inkvec/security.html">security policy</a> instead.</p><nav class="pagenav"><a class="prev" href="shortcuts.html"><span class="dir">Previous</span><span class="lbl">Keyboard and mouse</span></a><a class="next" href="tutorials/jpeg-logo.html"><span class="dir">Next</span><span class="lbl">Clean up a JPEG logo</span></a></nav></article></main>
|
| 126 |
-
<aside class="rail"><
|
| 127 |
</div>
|
| 128 |
</body>
|
| 129 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html" aria-current="page">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/troubleshooting.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="troubleshooting-and-questions">Troubleshooting and questions</h1>
|
| 14 |
<h2 id="installing-and-starting">Installing and starting</h2>
|
| 15 |
<p><strong>Windows says "Windows protected your PC".</strong> The installer is not code-signed. Choose <strong>More
|
|
|
|
| 82 |
says so. Re-set the words in a vector editor if they must stay editable.</p>
|
| 83 |
<p><strong>Lines came back as thin filled shapes.</strong> Try the <em>Line art</em> preset. It only works for lines of one
|
| 84 |
even width; brush and calligraphic strokes stay as outlines.</p>
|
| 85 |
+
<p><strong>The draft and the final look different.</strong> A draft is traced small (512 px) for speed. In Studio
|
| 86 |
+
Lite, the first draft of a large image just opened is also drawn by the Fast engine, whatever the
|
| 87 |
+
Mode control says, and the status strip says <strong>Fast draft</strong>. Wait for the chip to say <strong>final</strong>
|
| 88 |
+
before judging or copying.</p>
|
| 89 |
<p><strong>The favicon has space above and below the logo.</strong> Favicons are square; a wide drawing is
|
| 90 |
centred in them on a transparent background rather than stretched. Trace a square crop of the mark
|
| 91 |
for a favicon that fills its square.</p>
|
|
|
|
| 110 |
<p><strong>Where are Batch, the command line and the right-click menu?</strong> They need the desktop app. See
|
| 111 |
<a href="index.html#inkvec-studio-and-inkvec-studio-lite">Inkvec Studio and Inkvec Studio Lite</a>.</p>
|
| 112 |
<p><strong>The first visit takes a few seconds to start.</strong> The loading screen is the engine arriving
|
| 113 |
+
(about 6 MB) and starting; its bar follows the real download. Later visits start from the
|
| 114 |
browser's cache.</p>
|
| 115 |
<p><strong>The denoiser is on but the trace looks the same, and the rail says it is downloading.</strong> The
|
| 116 |
trace shown was made without it while it downloads (about 100 MB, once). It traces again by
|
|
|
|
| 119 |
<p><strong>Nothing is downloaded in the background.</strong> Your browser asks sites to save data, so Studio
|
| 120 |
Lite waits until you turn the denoiser on. Inside the Hugging Face frame the denoiser cannot run
|
| 121 |
at all: use <strong>Open in its own tab</strong>.</p>
|
| 122 |
+
<p><strong>Open in its own tab opened the Studio without my image.</strong> The image travels inside the page
|
| 123 |
+
address, which holds up to 1.5 MB; for a larger file the app says so before it opens the tab.
|
| 124 |
+
Open the file again in the new tab.</p>
|
| 125 |
+
<p><strong>I opened a file and it says it did not open.</strong> The file is not an image the app reads: a
|
| 126 |
+
text file renamed to <code>.png</code>, an empty file, a PDF, or a phone photo in HEIC or AVIF. The card
|
| 127 |
+
says what the app found in it. Save the picture as PNG or JPEG (any image editor, or a
|
| 128 |
+
screenshot) and open that.</p>
|
| 129 |
+
<p><strong>Can I use Studio Lite on a phone?</strong> Yes. Held upright it is one column: the drawing, then the
|
| 130 |
+
rail, with Export at the bottom of the screen; turned on its side it keeps the two side by side.
|
| 131 |
+
Everything works, but a phone is slower and has less memory than a laptop, so a large image takes
|
| 132 |
+
longer; the desktop app is the fastest.</p>
|
| 133 |
<p><strong>My settings are not remembered.</strong> A private window, or a browser set to block site data, gives
|
| 134 |
the page nowhere to keep them. The app still works, from the defaults each time.</p>
|
| 135 |
<h2 id="reporting-a-problem">Reporting a problem</h2>
|
| 136 |
<p>Report bugs on <a href="https://github.com/logolabs/inkvec/issues">GitHub</a>. Include the app version (from
|
| 137 |
About), your operating system, and, if you can share it, the image. Security problems go through
|
| 138 |
+
the <a href="https://logolabs.github.io/inkvec/security.html">security policy</a> instead.</p><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="shortcuts.html"><span class="dir">Previous</span><span class="lbl">Keyboard and mouse</span></a><a class="next" href="tutorials/jpeg-logo.html"><span class="dir">Next</span><span class="lbl">Clean up a JPEG logo</span></a></nav></article></main>
|
| 139 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#installing-and-starting">Installing and starting</a></li><li class="l2"><a href="#transparency-and-backgrounds">Transparency and backgrounds</a></li><li class="l2"><a href="#colours">Colours</a></li><li class="l2"><a href="#the-denoiser">The denoiser</a></li><li class="l2"><a href="#speed-and-size">Speed and size</a></li><li class="l2"><a href="#the-result">The result</a></li><li class="l2"><a href="#integrations">Integrations</a></li><li class="l2"><a href="#help-and-settings">Help and settings</a></li><li class="l2"><a href="#studio-lite">Studio Lite</a></li><li class="l2"><a href="#reporting-a-problem">Reporting a problem</a></li></ul></aside>
|
| 140 |
</div>
|
| 141 |
</body>
|
| 142 |
</html>
|
studio/guide/tune.html
CHANGED
|
@@ -9,9 +9,9 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html" aria-current="page">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/tune.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="tune-presets-and-every-control">Tune: presets and every control</h1>
|
| 14 |
-
<p>The <strong>Tune</strong> half of the rail holds the settings for the next trace:
|
| 15 |
saved, and twenty-three controls. Moving any of them starts a draft at once and a full trace a moment
|
| 16 |
later (see <a href="viewer.html#draft-and-full-traces">draft and full traces</a>); the readout at the foot of
|
| 17 |
the rail shows what the change bought or cost.</p>
|
|
@@ -353,8 +353,8 @@ matters mainly when that is off.</p>
|
|
| 353 |
</tr>
|
| 354 |
</tbody>
|
| 355 |
</table>
|
| 356 |
-
<p><code>inkvec --help</code> lists them all with their exact spelling.</p><nav class="pagenav"><a class="prev" href="result.html"><span class="dir">Previous</span><span class="lbl">Result</span></a><a class="next" href="palette.html"><span class="dir">Next</span><span class="lbl">Palette and colour groups</span></a></nav></article></main>
|
| 357 |
-
<aside class="rail"><
|
| 358 |
</div>
|
| 359 |
</body>
|
| 360 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html">The viewer</a><a href="result.html">Result</a><a href="tune.html" aria-current="page">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/tune.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="tune-presets-and-every-control">Tune: presets and every control</h1>
|
| 14 |
+
<p>The <strong>Tune</strong> half of the rail holds the settings for the next trace: ten presets, any presets you
|
| 15 |
saved, and twenty-three controls. Moving any of them starts a draft at once and a full trace a moment
|
| 16 |
later (see <a href="viewer.html#draft-and-full-traces">draft and full traces</a>); the readout at the foot of
|
| 17 |
the rail shows what the change bought or cost.</p>
|
|
|
|
| 353 |
</tr>
|
| 354 |
</tbody>
|
| 355 |
</table>
|
| 356 |
+
<p><code>inkvec --help</code> lists them all with their exact spelling.</p><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="result.html"><span class="dir">Previous</span><span class="lbl">Result</span></a><a class="next" href="palette.html"><span class="dir">Next</span><span class="lbl">Palette and colour groups</span></a></nav></article></main>
|
| 357 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#how-the-controls-work">How the controls work</a></li><li class="l2"><a href="#the-engine-the-denoiser-and-editable">The engine, the denoiser and Editable</a><ul><li class="l3"><a href="#which-controls-each-engine-reads">Which controls each engine reads</a></li></ul></li><li class="l2"><a href="#presets">Presets</a><ul><li class="l3"><a href="#saving-your-own">Saving your own</a></li></ul></li><li class="l2"><a href="#detail">Detail</a></li><li class="l2"><a href="#colour">Colour</a></li><li class="l2"><a href="#shape">Shape</a></li><li class="l2"><a href="#output">Output</a></li><li class="l2"><a href="#the-same-controls-on-the-command-line">The same controls on the command line</a></li></ul></aside>
|
| 358 |
</div>
|
| 359 |
</body>
|
| 360 |
</html>
|
studio/guide/tutorials/favicon-asset-pack.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="../index.html"><img src="../logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="../index.html">Overview</a><a href="../install.html">Install and first launch</a><a href="../getting-started.html">Getting started</a><a href="../viewer.html">The viewer</a><a href="../result.html">Result</a><a href="../tune.html">Tune</a><a href="../palette.html">Palette and colour groups</a><a href="../export.html">Export</a><a href="../minify.html">Minify SVG</a><a href="../fabricate.html">Fabricate</a><a href="../batch.html">Batch</a><a href="../settings.html">Settings</a><a href="../shortcuts.html">Keyboard and mouse</a><a href="../troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="jpeg-logo.html">Clean up a JPEG logo</a><a href="favicon-asset-pack.html" aria-current="page">A favicon and an asset pack</a><a href="vinyl-htv.html">Layered vinyl and iron-on</a><a href="laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/tutorials/favicon-asset-pack.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="tutorial-a-favicon-and-an-asset-pack">Tutorial: a favicon and an asset pack</h1>
|
| 14 |
<p>This tutorial takes a mark from a PNG to the set of files a website or a brand folder needs: an
|
| 15 |
SVG, a minified SVG, PNGs at three sizes, a favicon, a palette, and a zip holding all of them with a
|
|
@@ -91,8 +91,8 @@ is, and, if the trace could not recover something (lettering as outlines, JPEG c
|
|
| 91 |
<li><strong>A dark-mode favicon.</strong> Trace a light version of the mark, or edit the colours in the SVG.</li>
|
| 92 |
<li><strong>Only the SVG.</strong> <strong>Copy SVG</strong> at the foot of the rail puts it on the clipboard without writing
|
| 93 |
any files.</li>
|
| 94 |
-
</ul><nav class="pagenav"><a class="prev" href="jpeg-logo.html"><span class="dir">Previous</span><span class="lbl">Clean up a JPEG logo</span></a><a class="next" href="vinyl-htv.html"><span class="dir">Next</span><span class="lbl">Layered vinyl and iron-on</span></a></nav></article></main>
|
| 95 |
-
<aside class="rail"><
|
| 96 |
</div>
|
| 97 |
</body>
|
| 98 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="../index.html"><img src="../logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="../index.html">Overview</a><a href="../install.html">Install and first launch</a><a href="../getting-started.html">Getting started</a><a href="../viewer.html">The viewer</a><a href="../result.html">Result</a><a href="../tune.html">Tune</a><a href="../palette.html">Palette and colour groups</a><a href="../export.html">Export</a><a href="../minify.html">Minify SVG</a><a href="../fabricate.html">Fabricate</a><a href="../batch.html">Batch</a><a href="../settings.html">Settings</a><a href="../shortcuts.html">Keyboard and mouse</a><a href="../troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="jpeg-logo.html">Clean up a JPEG logo</a><a href="favicon-asset-pack.html" aria-current="page">A favicon and an asset pack</a><a href="vinyl-htv.html">Layered vinyl and iron-on</a><a href="laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/tutorials/favicon-asset-pack.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="tutorial-a-favicon-and-an-asset-pack">Tutorial: a favicon and an asset pack</h1>
|
| 14 |
<p>This tutorial takes a mark from a PNG to the set of files a website or a brand folder needs: an
|
| 15 |
SVG, a minified SVG, PNGs at three sizes, a favicon, a palette, and a zip holding all of them with a
|
|
|
|
| 91 |
<li><strong>A dark-mode favicon.</strong> Trace a light version of the mark, or edit the colours in the SVG.</li>
|
| 92 |
<li><strong>Only the SVG.</strong> <strong>Copy SVG</strong> at the foot of the rail puts it on the clipboard without writing
|
| 93 |
any files.</li>
|
| 94 |
+
</ul><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="jpeg-logo.html"><span class="dir">Previous</span><span class="lbl">Clean up a JPEG logo</span></a><a class="next" href="vinyl-htv.html"><span class="dir">Next</span><span class="lbl">Layered vinyl and iron-on</span></a></nav></article></main>
|
| 95 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#1-start-from-the-right-image">1. Start from the right image</a></li><li class="l2"><a href="#2-open-and-trace-it">2. Open and trace it</a></li><li class="l2"><a href="#3-set-the-output">3. Set the output</a></li><li class="l2"><a href="#4-export">4. Export</a></li><li class="l2"><a href="#5-put-the-favicon-on-a-site">5. Put the favicon on a site</a></li><li class="l2"><a href="#6-hand-over-the-pack">6. Hand over the pack</a></li><li class="l2"><a href="#variations">Variations</a></li></ul></aside>
|
| 96 |
</div>
|
| 97 |
</body>
|
| 98 |
</html>
|
studio/guide/tutorials/jpeg-logo.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="../index.html"><img src="../logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="../index.html">Overview</a><a href="../install.html">Install and first launch</a><a href="../getting-started.html">Getting started</a><a href="../viewer.html">The viewer</a><a href="../result.html">Result</a><a href="../tune.html">Tune</a><a href="../palette.html">Palette and colour groups</a><a href="../export.html">Export</a><a href="../minify.html">Minify SVG</a><a href="../fabricate.html">Fabricate</a><a href="../batch.html">Batch</a><a href="../settings.html">Settings</a><a href="../shortcuts.html">Keyboard and mouse</a><a href="../troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="jpeg-logo.html" aria-current="page">Clean up a JPEG logo</a><a href="favicon-asset-pack.html">A favicon and an asset pack</a><a href="vinyl-htv.html">Layered vinyl and iron-on</a><a href="laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/tutorials/jpeg-logo.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="tutorial-clean-up-a-jpeg-logo">Tutorial: clean up a JPEG logo</h1>
|
| 14 |
<p>A logo saved as a JPEG, or captured in a screenshot, is the most common thing people need to
|
| 15 |
vectorize, and the hardest to trace well. JPEG compression leaves faint blocks and halos around
|
|
@@ -88,8 +88,8 @@ so whoever uses the files knows to check the colours.</p>
|
|
| 88 |
<h2 id="why-not-trace-the-jpeg-as-it-is">Why not trace the JPEG as it is?</h2>
|
| 89 |
<p>You can: with the denoiser <strong>Off</strong>, the trace reproduces the JPEG faithfully, and the colour
|
| 90 |
difference is lower because it copies the damage. That is the right choice when the damage is part
|
| 91 |
-
of what you want to keep. For a logo, it almost never is.</p><nav class="pagenav"><a class="prev" href="../troubleshooting.html"><span class="dir">Previous</span><span class="lbl">Troubleshooting</span></a><a class="next" href="favicon-asset-pack.html"><span class="dir">Next</span><span class="lbl">A favicon and an asset pack</span></a></nav></article></main>
|
| 92 |
-
<aside class="rail"><
|
| 93 |
</div>
|
| 94 |
</body>
|
| 95 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="../index.html"><img src="../logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="../index.html">Overview</a><a href="../install.html">Install and first launch</a><a href="../getting-started.html">Getting started</a><a href="../viewer.html">The viewer</a><a href="../result.html">Result</a><a href="../tune.html">Tune</a><a href="../palette.html">Palette and colour groups</a><a href="../export.html">Export</a><a href="../minify.html">Minify SVG</a><a href="../fabricate.html">Fabricate</a><a href="../batch.html">Batch</a><a href="../settings.html">Settings</a><a href="../shortcuts.html">Keyboard and mouse</a><a href="../troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="jpeg-logo.html" aria-current="page">Clean up a JPEG logo</a><a href="favicon-asset-pack.html">A favicon and an asset pack</a><a href="vinyl-htv.html">Layered vinyl and iron-on</a><a href="laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/tutorials/jpeg-logo.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="tutorial-clean-up-a-jpeg-logo">Tutorial: clean up a JPEG logo</h1>
|
| 14 |
<p>A logo saved as a JPEG, or captured in a screenshot, is the most common thing people need to
|
| 15 |
vectorize, and the hardest to trace well. JPEG compression leaves faint blocks and halos around
|
|
|
|
| 88 |
<h2 id="why-not-trace-the-jpeg-as-it-is">Why not trace the JPEG as it is?</h2>
|
| 89 |
<p>You can: with the denoiser <strong>Off</strong>, the trace reproduces the JPEG faithfully, and the colour
|
| 90 |
difference is lower because it copies the damage. That is the right choice when the damage is part
|
| 91 |
+
of what you want to keep. For a logo, it almost never is.</p><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="../troubleshooting.html"><span class="dir">Previous</span><span class="lbl">Troubleshooting</span></a><a class="next" href="favicon-asset-pack.html"><span class="dir">Next</span><span class="lbl">A favicon and an asset pack</span></a></nav></article></main>
|
| 92 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#1-get-the-denoiser">1. Get the denoiser</a></li><li class="l2"><a href="#2-open-the-jpeg">2. Open the JPEG</a></li><li class="l2"><a href="#3-turn-the-clean-up-on">3. Turn the clean-up on</a></li><li class="l2"><a href="#4-settle-the-palette">4. Settle the palette</a></li><li class="l2"><a href="#5-check-the-edges">5. Check the edges</a></li><li class="l2"><a href="#6-match-the-brand-colours">6. Match the brand colours</a></li><li class="l2"><a href="#7-take-it-out">7. Take it out</a></li><li class="l2"><a href="#why-not-trace-the-jpeg-as-it-is">Why not trace the JPEG as it is?</a></li></ul></aside>
|
| 93 |
</div>
|
| 94 |
</body>
|
| 95 |
</html>
|
studio/guide/tutorials/laser.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="../index.html"><img src="../logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="../index.html">Overview</a><a href="../install.html">Install and first launch</a><a href="../getting-started.html">Getting started</a><a href="../viewer.html">The viewer</a><a href="../result.html">Result</a><a href="../tune.html">Tune</a><a href="../palette.html">Palette and colour groups</a><a href="../export.html">Export</a><a href="../minify.html">Minify SVG</a><a href="../fabricate.html">Fabricate</a><a href="../batch.html">Batch</a><a href="../settings.html">Settings</a><a href="../shortcuts.html">Keyboard and mouse</a><a href="../troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="jpeg-logo.html">Clean up a JPEG logo</a><a href="favicon-asset-pack.html">A favicon and an asset pack</a><a href="vinyl-htv.html">Layered vinyl and iron-on</a><a href="laser.html" aria-current="page">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/tutorials/laser.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="tutorial-laser-cutting-dxf-and-g-code">Tutorial: laser cutting, DXF and G-code</h1>
|
| 14 |
<p>This tutorial turns a logo into files for a laser cutter or a CNC router: hairline cut paths in
|
| 15 |
real millimetres, compensated for the width of the cut, as an SVG for LightBurn, a DXF for CAD and
|
|
@@ -101,8 +101,8 @@ every colour as its own group, <code>name.dxf</code> and, if on, <code>name.gcod
|
|
| 101 |
centre, rather than around both of its edges. The <strong>Drawing</strong> card sets the tip width (the preview
|
| 102 |
shows the line the tool will leave) and which lines count as lines: <em>Lines up to</em> <strong>x</strong> <em>mm wide are
|
| 103 |
drawn once</em> (0 for any width); wider parts are drawn round their outline. The DXF has lines as open
|
| 104 |
-
polylines and outlines as closed ones. G-code works as above.</p><nav class="pagenav"><a class="prev" href="vinyl-htv.html"><span class="dir">Previous</span><span class="lbl">Layered vinyl and iron-on</span></a><span></span></nav></article></main>
|
| 105 |
-
<aside class="rail"><
|
| 106 |
</div>
|
| 107 |
</body>
|
| 108 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="../index.html"><img src="../logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="../index.html">Overview</a><a href="../install.html">Install and first launch</a><a href="../getting-started.html">Getting started</a><a href="../viewer.html">The viewer</a><a href="../result.html">Result</a><a href="../tune.html">Tune</a><a href="../palette.html">Palette and colour groups</a><a href="../export.html">Export</a><a href="../minify.html">Minify SVG</a><a href="../fabricate.html">Fabricate</a><a href="../batch.html">Batch</a><a href="../settings.html">Settings</a><a href="../shortcuts.html">Keyboard and mouse</a><a href="../troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="jpeg-logo.html">Clean up a JPEG logo</a><a href="favicon-asset-pack.html">A favicon and an asset pack</a><a href="vinyl-htv.html">Layered vinyl and iron-on</a><a href="laser.html" aria-current="page">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/tutorials/laser.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="tutorial-laser-cutting-dxf-and-g-code">Tutorial: laser cutting, DXF and G-code</h1>
|
| 14 |
<p>This tutorial turns a logo into files for a laser cutter or a CNC router: hairline cut paths in
|
| 15 |
real millimetres, compensated for the width of the cut, as an SVG for LightBurn, a DXF for CAD and
|
|
|
|
| 101 |
centre, rather than around both of its edges. The <strong>Drawing</strong> card sets the tip width (the preview
|
| 102 |
shows the line the tool will leave) and which lines count as lines: <em>Lines up to</em> <strong>x</strong> <em>mm wide are
|
| 103 |
drawn once</em> (0 for any width); wider parts are drawn round their outline. The DXF has lines as open
|
| 104 |
+
polylines and outlines as closed ones. G-code works as above.</p><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="vinyl-htv.html"><span class="dir">Previous</span><span class="lbl">Layered vinyl and iron-on</span></a><span></span></nav></article></main>
|
| 105 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#1-trace-it-or-bring-an-svg">1. Trace it, or bring an SVG</a></li><li class="l2"><a href="#2-choose-laser-or-sign-cutter">2. Choose "Laser or sign cutter"</a></li><li class="l2"><a href="#3-set-the-size-and-the-units-the-file-states">3. Set the size, and the units the file states</a></li><li class="l2"><a href="#4-measure-and-set-the-kerf">4. Measure and set the kerf</a></li><li class="l2"><a href="#5-for-a-router-dogbones-and-the-bit">5. For a router: dogbones and the bit</a></li><li class="l2"><a href="#6-check-before-you-cut">6. Check before you cut</a></li><li class="l2"><a href="#7-g-code-for-a-grbl-machine">7. G-code for a GRBL machine</a></li><li class="l2"><a href="#8-save">8. Save</a></li><li class="l2"><a href="#engraving-lines-with-pen-or-score">Engraving lines with "Pen or score"</a></li></ul></aside>
|
| 106 |
</div>
|
| 107 |
</body>
|
| 108 |
</html>
|
studio/guide/tutorials/vinyl-htv.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="../index.html"><img src="../logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="../index.html">Overview</a><a href="../install.html">Install and first launch</a><a href="../getting-started.html">Getting started</a><a href="../viewer.html">The viewer</a><a href="../result.html">Result</a><a href="../tune.html">Tune</a><a href="../palette.html">Palette and colour groups</a><a href="../export.html">Export</a><a href="../minify.html">Minify SVG</a><a href="../fabricate.html">Fabricate</a><a href="../batch.html">Batch</a><a href="../settings.html">Settings</a><a href="../shortcuts.html">Keyboard and mouse</a><a href="../troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="jpeg-logo.html">Clean up a JPEG logo</a><a href="favicon-asset-pack.html">A favicon and an asset pack</a><a href="vinyl-htv.html" aria-current="page">Layered vinyl and iron-on</a><a href="laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/tutorials/vinyl-htv.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="tutorial-layered-vinyl-and-iron-on">Tutorial: layered vinyl and iron-on</h1>
|
| 14 |
<p>This tutorial takes a colour logo to cut files for a Cricut, Silhouette or Brother machine: one
|
| 15 |
sheet per colour, stacked so there are no gaps between colours, with marks to line the sheets up.
|
|
@@ -102,8 +102,8 @@ layer fully, following the vinyl's instructions.</p>
|
|
| 102 |
<li><strong>Sticker</strong>: the artwork with a contour 3 mm around it, for print-then-cut.</li>
|
| 103 |
<li><strong>Stencil</strong>: the design cut out of one sheet, with bridges holding the middles of letters.</li>
|
| 104 |
</ul>
|
| 105 |
-
<p>All of them are described in <a href="../fabricate.html">Fabricate</a>.</p><nav class="pagenav"><a class="prev" href="favicon-asset-pack.html"><span class="dir">Previous</span><span class="lbl">A favicon and an asset pack</span></a><a class="next" href="laser.html"><span class="dir">Next</span><span class="lbl">Laser: DXF and G-code</span></a></nav></article></main>
|
| 106 |
-
<aside class="rail"><
|
| 107 |
</div>
|
| 108 |
</body>
|
| 109 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="../index.html"><img src="../logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="../index.html">Overview</a><a href="../install.html">Install and first launch</a><a href="../getting-started.html">Getting started</a><a href="../viewer.html">The viewer</a><a href="../result.html">Result</a><a href="../tune.html">Tune</a><a href="../palette.html">Palette and colour groups</a><a href="../export.html">Export</a><a href="../minify.html">Minify SVG</a><a href="../fabricate.html">Fabricate</a><a href="../batch.html">Batch</a><a href="../settings.html">Settings</a><a href="../shortcuts.html">Keyboard and mouse</a><a href="../troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="jpeg-logo.html">Clean up a JPEG logo</a><a href="favicon-asset-pack.html">A favicon and an asset pack</a><a href="vinyl-htv.html" aria-current="page">Layered vinyl and iron-on</a><a href="laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/tutorials/vinyl-htv.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="tutorial-layered-vinyl-and-iron-on">Tutorial: layered vinyl and iron-on</h1>
|
| 14 |
<p>This tutorial takes a colour logo to cut files for a Cricut, Silhouette or Brother machine: one
|
| 15 |
sheet per colour, stacked so there are no gaps between colours, with marks to line the sheets up.
|
|
|
|
| 102 |
<li><strong>Sticker</strong>: the artwork with a contour 3 mm around it, for print-then-cut.</li>
|
| 103 |
<li><strong>Stencil</strong>: the design cut out of one sheet, with bridges holding the middles of letters.</li>
|
| 104 |
</ul>
|
| 105 |
+
<p>All of them are described in <a href="../fabricate.html">Fabricate</a>.</p><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="favicon-asset-pack.html"><span class="dir">Previous</span><span class="lbl">A favicon and an asset pack</span></a><a class="next" href="laser.html"><span class="dir">Next</span><span class="lbl">Laser: DXF and G-code</span></a></nav></article></main>
|
| 106 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#1-trace-with-the-cutter-in-mind">1. Trace with the cutter in mind</a></li><li class="l2"><a href="#2-bring-it-into-fabricate">2. Bring it into Fabricate</a></li><li class="l2"><a href="#3-choose-the-material-and-the-size">3. Choose the material and the size</a></li><li class="l2"><a href="#4-for-iron-on-mirror-and-a-thinner-overlap">4. For iron-on: mirror, and a thinner overlap</a></li><li class="l2"><a href="#5-the-colours-and-their-order">5. The colours and their order</a></li><li class="l2"><a href="#6-fix-what-will-go-wrong">6. Fix what will go wrong</a></li><li class="l2"><a href="#7-save-and-cut">7. Save and cut</a></li><li class="l2"><a href="#other-things-this-tab-makes">Other things this tab makes</a></li></ul></aside>
|
| 107 |
</div>
|
| 108 |
</body>
|
| 109 |
</html>
|
studio/guide/viewer.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
-
<aside class="side"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html" aria-current="page">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/viewer.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="the-viewer">The viewer</h1>
|
| 14 |
<p>The stage of the Vectorize tab shows the image you opened (<strong>Source</strong>) beside the SVG it became
|
| 15 |
(<strong>Vector · SVG</strong>). Both panes share one pan and one zoom, so the same spot is always under the
|
|
@@ -18,9 +18,13 @@ an edge, not an enlarged bitmap.</p>
|
|
| 18 |
<h2 id="comparing-side-by-side-wipe-ab">Comparing: side by side, wipe, A/B</h2>
|
| 19 |
<p>The three buttons at the left of the toolbar arrange the two panes.</p>
|
| 20 |
<ul>
|
| 21 |
-
<li><strong>Side by side</strong>: the two panes next to each other
|
| 22 |
-
<li>
|
| 23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
<li><strong>A/B</strong>: one pane at a time, the SVG. Hold <kbd>Space</kbd> to see the source instead, and
|
| 25 |
release to go back. Flicking between the two in place is the quickest way to see a small
|
| 26 |
difference.</li>
|
|
@@ -40,7 +44,11 @@ an edge, not an enlarged bitmap.</p>
|
|
| 40 |
</tr>
|
| 41 |
<tr>
|
| 42 |
<td>Pan</td>
|
| 43 |
-
<td>Drag with the left button</td>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
</tr>
|
| 45 |
<tr>
|
| 46 |
<td>Fit the drawing to the window</td>
|
|
@@ -57,7 +65,8 @@ an edge, not an enlarged bitmap.</p>
|
|
| 57 |
</tbody>
|
| 58 |
</table>
|
| 59 |
<p>Zoom runs from a quarter of the image's size to 64×. The view fits the window until you zoom or
|
| 60 |
-
pan; after that it stays where you put it when the window is resized.
|
|
|
|
| 61 |
drawn with square pixels rather than smoothed, because those pixels are the evidence the trace was
|
| 62 |
measured against.</p>
|
| 63 |
<h2 id="overlays-what-the-svg-is-made-of">Overlays: what the SVG is made of</h2>
|
|
@@ -130,13 +139,25 @@ chip at the top right of the stage says which one you are looking at:</p>
|
|
| 130 |
<p>The chip flashes when a draft is replaced by its full trace, so the swap is never silent. Draft
|
| 131 |
size, draft time limit and the wait before the full trace are in
|
| 132 |
<a href="settings.html#performance">Settings, Performance</a>.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 133 |
<p>Only the full trace is ever exported: <a href="export.html">Export</a> always runs one first.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 134 |
<h2 id="the-status-strip">The status strip</h2>
|
| 135 |
<p>The line along the bottom of the stage says what is happening: the stage the trace is on and the
|
| 136 |
time so far (with <kbd>Esc</kbd> to cancel), or how long the last trace took, at what size, and
|
| 137 |
how many segments it has. When the update check has found a new version, it says so here and
|
| 138 |
nowhere else. The right end always carries the same sentence: <em>Your image never leaves this
|
| 139 |
-
computer.</em></p>
|
| 140 |
<h2 id="when-the-stage-is-not-showing-a-drawing">When the stage is not showing a drawing</h2>
|
| 141 |
<table>
|
| 142 |
<thead>
|
|
@@ -153,6 +174,11 @@ computer.</em></p>
|
|
| 153 |
<td>Wait.</td>
|
| 154 |
</tr>
|
| 155 |
<tr>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 156 |
<td>This image is one flat colour</td>
|
| 157 |
<td>There is no boundary to trace; the whole output would be one rectangle.</td>
|
| 158 |
<td>Open another image.</td>
|
|
@@ -191,8 +217,8 @@ computer.</em></p>
|
|
| 191 |
</table>
|
| 192 |
<p>A large image is traced at the <strong>Trace size</strong> (2048 px on the longer side by default) and the SVG
|
| 193 |
is still written at the image's full size. When that happens a note says so; it is normal, and the
|
| 194 |
-
SVG scales without limit.</p><nav class="pagenav"><a class="prev" href="getting-started.html"><span class="dir">Previous</span><span class="lbl">Getting started</span></a><a class="next" href="result.html"><span class="dir">Next</span><span class="lbl">Result</span></a></nav></article></main>
|
| 195 |
-
<aside class="rail"><
|
| 196 |
</div>
|
| 197 |
</body>
|
| 198 |
</html>
|
|
|
|
| 9 |
</head>
|
| 10 |
<body>
|
| 11 |
<div class="shell">
|
| 12 |
+
<aside class="side" aria-label="Guide"><a class="guidebrand" href="index.html"><img src="logo-mono.svg" alt=""> <span>Inkvec Studio</span></a><div class="grp"><h4>User guide</h4><a href="index.html">Overview</a><a href="install.html">Install and first launch</a><a href="getting-started.html">Getting started</a><a href="viewer.html" aria-current="page">The viewer</a><a href="result.html">Result</a><a href="tune.html">Tune</a><a href="palette.html">Palette and colour groups</a><a href="export.html">Export</a><a href="minify.html">Minify SVG</a><a href="fabricate.html">Fabricate</a><a href="batch.html">Batch</a><a href="settings.html">Settings</a><a href="shortcuts.html">Keyboard and mouse</a><a href="troubleshooting.html">Troubleshooting</a></div><div class="grp"><h4>Tutorials</h4><a href="tutorials/jpeg-logo.html">Clean up a JPEG logo</a><a href="tutorials/favicon-asset-pack.html">A favicon and an asset pack</a><a href="tutorials/vinyl-htv.html">Layered vinyl and iron-on</a><a href="tutorials/laser.html">Laser: DXF and G-code</a></div><div class="grp"><h4>Online</h4><a href="https://logolabs.github.io/inkvec/">Inkvec documentation</a><a href="https://logolabs.github.io/inkvec/studio/viewer.html">This page on the web</a></div><p class="guidenote">This copy of the guide is part of the app and works without a network.</p></aside>
|
| 13 |
<main><article><h1 id="the-viewer">The viewer</h1>
|
| 14 |
<p>The stage of the Vectorize tab shows the image you opened (<strong>Source</strong>) beside the SVG it became
|
| 15 |
(<strong>Vector · SVG</strong>). Both panes share one pan and one zoom, so the same spot is always under the
|
|
|
|
| 18 |
<h2 id="comparing-side-by-side-wipe-ab">Comparing: side by side, wipe, A/B</h2>
|
| 19 |
<p>The three buttons at the left of the toolbar arrange the two panes.</p>
|
| 20 |
<ul>
|
| 21 |
+
<li><strong>Side by side</strong>: the two panes next to each other (one above the other on a phone held
|
| 22 |
+
upright).</li>
|
| 23 |
+
<li><strong>Wipe</strong>: one pane over the other, with a divider. Drag the divider to move it, or tap or click
|
| 24 |
+
where it should go; the source is on the left of it and the SVG on the right. From the keyboard,
|
| 25 |
+
<kbd>Tab</kbd> to the divider and move it with the arrow keys (see
|
| 26 |
+
<a href="shortcuts.html#in-the-vectorize-viewer">Keyboard and mouse</a>); a screen reader announces how much
|
| 27 |
+
of each side is showing.</li>
|
| 28 |
<li><strong>A/B</strong>: one pane at a time, the SVG. Hold <kbd>Space</kbd> to see the source instead, and
|
| 29 |
release to go back. Flicking between the two in place is the quickest way to see a small
|
| 30 |
difference.</li>
|
|
|
|
| 44 |
</tr>
|
| 45 |
<tr>
|
| 46 |
<td>Pan</td>
|
| 47 |
+
<td>Drag with the left button, or press the arrow buttons beside the zoom stops</td>
|
| 48 |
+
</tr>
|
| 49 |
+
<tr>
|
| 50 |
+
<td>Pan from the keyboard</td>
|
| 51 |
+
<td><kbd>Tab</kbd> to the viewer and use the arrow keys (<kbd>Shift</kbd> for a bigger step)</td>
|
| 52 |
</tr>
|
| 53 |
<tr>
|
| 54 |
<td>Fit the drawing to the window</td>
|
|
|
|
| 65 |
</tbody>
|
| 66 |
</table>
|
| 67 |
<p>Zoom runs from a quarter of the image's size to 64×. The view fits the window until you zoom or
|
| 68 |
+
pan; after that it stays where you put it when the window is resized. The four arrow buttons
|
| 69 |
+
appear beside <strong>Fit</strong> once the view is no longer fitted, and each moves it a quarter of the pane. From 4× up, the source is
|
| 70 |
drawn with square pixels rather than smoothed, because those pixels are the evidence the trace was
|
| 71 |
measured against.</p>
|
| 72 |
<h2 id="overlays-what-the-svg-is-made-of">Overlays: what the SVG is made of</h2>
|
|
|
|
| 139 |
<p>The chip flashes when a draft is replaced by its full trace, so the swap is never silent. Draft
|
| 140 |
size, draft time limit and the wait before the full trace are in
|
| 141 |
<a href="settings.html#performance">Settings, Performance</a>.</p>
|
| 142 |
+
<p><strong>Studio Lite, opening a large image.</strong> When an image larger than the draft size is opened in the
|
| 143 |
+
browser, its first draft is drawn by the Fast engine, whatever the Mode control says, so a
|
| 144 |
+
drawing appears in well under a second; the full trace, with your controls, starts the moment
|
| 145 |
+
that draft lands. The status strip names the engine that drew what is on screen: <strong>Fast draft</strong>,
|
| 146 |
+
then <strong>Quality in</strong> so many seconds. Moving a control, <strong>Cancel</strong> or opening another image in the
|
| 147 |
+
meantime drops the queued full trace. The desktop app opens with the full trace alone.</p>
|
| 148 |
<p>Only the full trace is ever exported: <a href="export.html">Export</a> always runs one first.</p>
|
| 149 |
+
<h2 id="the-engine-log">The engine log</h2>
|
| 150 |
+
<p>The small panel at the bottom right of the stage, <strong>Engine log</strong>, is what the engine is doing,
|
| 151 |
+
line by line: each stage of the trace with the time it started, what it does and how long it took
|
| 152 |
+
(or, while it runs, its own clock), and the notes the engine makes on the way (<em>8 inks</em>). It keeps
|
| 153 |
+
the last trace's log, with the total time in its header, until the next trace starts. <strong>Hide</strong> and
|
| 154 |
+
<strong>Show</strong> fold it to its header; on a phone it starts folded so it does not cover the drawing.</p>
|
| 155 |
<h2 id="the-status-strip">The status strip</h2>
|
| 156 |
<p>The line along the bottom of the stage says what is happening: the stage the trace is on and the
|
| 157 |
time so far (with <kbd>Esc</kbd> to cancel), or how long the last trace took, at what size, and
|
| 158 |
how many segments it has. When the update check has found a new version, it says so here and
|
| 159 |
nowhere else. The right end always carries the same sentence: <em>Your image never leaves this
|
| 160 |
+
computer.</em> (On a phone there is no room for it; Settings and About say the same.)</p>
|
| 161 |
<h2 id="when-the-stage-is-not-showing-a-drawing">When the stage is not showing a drawing</h2>
|
| 162 |
<table>
|
| 163 |
<thead>
|
|
|
|
| 174 |
<td>Wait.</td>
|
| 175 |
</tr>
|
| 176 |
<tr>
|
| 177 |
+
<td>That file did not open</td>
|
| 178 |
+
<td>The first file you opened is not an image the app reads (a text file, an empty file, a PDF, a phone's HEIC or AVIF photo). The card says what the app found and lists the formats it opens; the drop area and the samples stay under it.</td>
|
| 179 |
+
<td>Open another image, or save the picture as PNG or JPEG first.</td>
|
| 180 |
+
</tr>
|
| 181 |
+
<tr>
|
| 182 |
<td>This image is one flat colour</td>
|
| 183 |
<td>There is no boundary to trace; the whole output would be one rectangle.</td>
|
| 184 |
<td>Open another image.</td>
|
|
|
|
| 217 |
</table>
|
| 218 |
<p>A large image is traced at the <strong>Trace size</strong> (2048 px on the longer side by default) and the SVG
|
| 219 |
is still written at the image's full size. When that happens a note says so; it is normal, and the
|
| 220 |
+
SVG scales without limit.</p><nav class="pagenav" aria-label="Previous and next page"><a class="prev" href="getting-started.html"><span class="dir">Previous</span><span class="lbl">Getting started</span></a><a class="next" href="result.html"><span class="dir">Next</span><span class="lbl">Result</span></a></nav></article></main>
|
| 221 |
+
<aside class="rail" aria-label="On this page"><h2 class="railh">On this page</h2><ul><li class="l2"><a href="#comparing-side-by-side-wipe-ab">Comparing: side by side, wipe, A/B</a></li><li class="l2"><a href="#zooming-and-panning">Zooming and panning</a></li><li class="l2"><a href="#overlays-what-the-svg-is-made-of">Overlays: what the SVG is made of</a></li><li class="l2"><a href="#detail-the-pixel-grid-under-the-edge">Detail: the pixel grid under the edge</a></li><li class="l2"><a href="#certainty">Certainty</a></li><li class="l2"><a href="#draft-and-full-traces">Draft and full traces</a></li><li class="l2"><a href="#the-engine-log">The engine log</a></li><li class="l2"><a href="#the-status-strip">The status strip</a></li><li class="l2"><a href="#when-the-stage-is-not-showing-a-drawing">When the stage is not showing a drawing</a></li></ul></aside>
|
| 222 |
</div>
|
| 223 |
</body>
|
| 224 |
</html>
|
studio/index.html
CHANGED
|
@@ -11,8 +11,8 @@
|
|
| 11 |
<meta name="description" content="Turn a raster logo into an exact SVG, in your browser. Nothing is uploaded." />
|
| 12 |
<link rel="icon" href="./favicon.svg" type="image/svg+xml" />
|
| 13 |
<title>Inkvec Studio Lite</title>
|
| 14 |
-
<script type="module" crossorigin src="./assets/main-
|
| 15 |
-
<link rel="stylesheet" crossorigin href="./assets/main-
|
| 16 |
<link rel="preload" href="./fonts/playfair-latin.woff2" as="font" type="font/woff2" crossorigin />
|
| 17 |
<link rel="preload" href="./fonts/inter-latin.woff2" as="font" type="font/woff2" crossorigin />
|
| 18 |
<style>
|
|
|
|
| 11 |
<meta name="description" content="Turn a raster logo into an exact SVG, in your browser. Nothing is uploaded." />
|
| 12 |
<link rel="icon" href="./favicon.svg" type="image/svg+xml" />
|
| 13 |
<title>Inkvec Studio Lite</title>
|
| 14 |
+
<script type="module" crossorigin src="./assets/main-DydoLkFD.js"></script>
|
| 15 |
+
<link rel="stylesheet" crossorigin href="./assets/main-CdmTdoOg.css">
|
| 16 |
<link rel="preload" href="./fonts/playfair-latin.woff2" as="font" type="font/woff2" crossorigin />
|
| 17 |
<link rel="preload" href="./fonts/inter-latin.woff2" as="font" type="font/woff2" crossorigin />
|
| 18 |
<style>
|
studio/pkg-threads/inkvec_studio_wasm.js
CHANGED
|
@@ -546,7 +546,7 @@ function __wbg_get_imports(memory) {
|
|
| 546 |
__wbindgen_object_drop_ref: function(arg0) {
|
| 547 |
takeObject(arg0);
|
| 548 |
},
|
| 549 |
-
memory: memory || new WebAssembly.Memory({initial:
|
| 550 |
};
|
| 551 |
return {
|
| 552 |
__proto__: null,
|
|
|
|
| 546 |
__wbindgen_object_drop_ref: function(arg0) {
|
| 547 |
takeObject(arg0);
|
| 548 |
},
|
| 549 |
+
memory: memory || new WebAssembly.Memory({initial:24,maximum:65536,shared:true}),
|
| 550 |
};
|
| 551 |
return {
|
| 552 |
__proto__: null,
|
studio/pkg-threads/inkvec_studio_wasm_bg.wasm
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:08c15b39fbe98421697c5b60ebeee69d873223abc59139de92fd062081f56ccf
|
| 3 |
+
size 6139358
|
studio/pkg-threads/snippets/wasm-bindgen-rayon-38edf6e439f6d70d/src/workerHelpers.js
CHANGED
|
@@ -51,7 +51,7 @@ waitForMsgType(self, 'wasm_bindgen_worker_init').then(async ({ init, receiver })
|
|
| 51 |
// OTOH, even though it can't be inlined, it should be still reasonably
|
| 52 |
// cheap since the requested file is already in cache (it was loaded by
|
| 53 |
// the main thread).
|
| 54 |
-
const pkg = await import('../../../inkvec_studio_wasm.js?v=
|
| 55 |
await pkg.default(init);
|
| 56 |
postMessage({ type: 'wasm_bindgen_worker_ready' });
|
| 57 |
pkg.wbg_rayon_start_worker(receiver);
|
|
|
|
| 51 |
// OTOH, even though it can't be inlined, it should be still reasonably
|
| 52 |
// cheap since the requested file is already in cache (it was loaded by
|
| 53 |
// the main thread).
|
| 54 |
+
const pkg = await import('../../../inkvec_studio_wasm.js?v=a58c9495e128');
|
| 55 |
await pkg.default(init);
|
| 56 |
postMessage({ type: 'wasm_bindgen_worker_ready' });
|
| 57 |
pkg.wbg_rayon_start_worker(receiver);
|
studio/pkg/inkvec_studio_wasm_bg.wasm
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:92b651405294f14ac0fbfef9b23ed5434be03f9e9fc430b7ba3e1145008eab9e
|
| 3 |
+
size 6089582
|