mirror of
https://github.com/awizemann/scarf.git
synced 2026-05-10 02:26:37 +00:00
179 lines
1.8 MiB
HTML
179 lines
1.8 MiB
HTML
|
|
<!DOCTYPE html>
|
||
|
|
<html>
|
||
|
|
<head>
|
||
|
|
<meta charset="utf-8">
|
||
|
|
<title>Scarf — UI Kit</title>
|
||
|
|
<style>
|
||
|
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||
|
|
body { background: #faf9f5; display: flex; align-items: center; justify-content: center; min-height: 100vh; font-family: -apple-system, BlinkMacSystemFont, sans-serif; }
|
||
|
|
#__bundler_loading { position: fixed; bottom: 20px; right: 20px; font: 13px/1.4 -apple-system, BlinkMacSystemFont, sans-serif; color: #666; background: #fff; padding: 8px 14px; border-radius: 8px; box-shadow: 0 1px 4px rgba(0,0,0,0.12); z-index: 10000; }
|
||
|
|
#__bundler_thumbnail { position: fixed; inset: 0; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; background: #faf9f5; z-index: 9999; }
|
||
|
|
#__bundler_thumbnail svg { width: 100%; height: 100%; object-fit: contain; }
|
||
|
|
#__bundler_placeholder { color: #999; font-size: 14px; }
|
||
|
|
</style>
|
||
|
|
<noscript>
|
||
|
|
<style>#__bundler_loading { display: none; }</style>
|
||
|
|
<div style="position:fixed;bottom:12px;left:12px;font:13px/1.4 -apple-system,BlinkMacSystemFont,sans-serif;color:#999;background:rgba(255,255,255,0.9);padding:6px 12px;border-radius:6px;box-shadow:0 1px 4px rgba(0,0,0,0.08);z-index:10000;">
|
||
|
|
This page requires JavaScript to display.
|
||
|
|
</div>
|
||
|
|
</noscript>
|
||
|
|
</head>
|
||
|
|
<body>
|
||
|
|
<div id="__bundler_thumbnail">
|
||
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
||
|
|
<rect width="100" height="100" fill="#C25A2A"></rect>
|
||
|
|
<text x="50" y="62" text-anchor="middle" font-family="Georgia, serif" font-size="48" font-style="italic" fill="#FAF7F2" font-weight="600">S</text>
|
||
|
|
</svg>
|
||
|
|
</div>
|
||
|
|
<div id="__bundler_loading">Unpacking...</div>
|
||
|
|
|
||
|
|
<script>
|
||
|
|
|
||
|
|
document.addEventListener('DOMContentLoaded', async function() {
|
||
|
|
const loading = document.getElementById('__bundler_loading');
|
||
|
|
function setStatus(msg) { if (loading) loading.textContent = msg; }
|
||
|
|
|
||
|
|
// Error sink persists across replaceWith since it's on window, not the DOM.
|
||
|
|
window.addEventListener('error', function(e) {
|
||
|
|
var p = document.body || document.documentElement;
|
||
|
|
var d = document.getElementById('__bundler_err') || p.appendChild(document.createElement('div'));
|
||
|
|
d.id = '__bundler_err';
|
||
|
|
d.style.cssText = 'position:fixed;bottom:12px;left:12px;right:12px;font:12px/1.4 ui-monospace,monospace;background:#2a1215;color:#ff8a80;padding:10px 14px;border-radius:8px;border:1px solid #5c2b2e;z-index:99999;white-space:pre-wrap;max-height:40vh;overflow:auto';
|
||
|
|
d.textContent = (d.textContent ? d.textContent + String.fromCharCode(10) : '') +
|
||
|
|
'[bundle] ' + (e.message || e.type) +
|
||
|
|
(e.filename ? ' (' + e.filename.slice(0, 60) + ':' + e.lineno + ')' : '');
|
||
|
|
}, true);
|
||
|
|
|
||
|
|
try {
|
||
|
|
const manifestEl = document.querySelector('script[type="__bundler/manifest"]');
|
||
|
|
const templateEl = document.querySelector('script[type="__bundler/template"]');
|
||
|
|
if (!manifestEl || !templateEl) {
|
||
|
|
setStatus('Error: missing bundle data');
|
||
|
|
console.error('[bundler] Missing script tags — manifestEl:', !!manifestEl, 'templateEl:', !!templateEl);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const manifest = JSON.parse(manifestEl.textContent);
|
||
|
|
let template = JSON.parse(templateEl.textContent);
|
||
|
|
|
||
|
|
const uuids = Object.keys(manifest);
|
||
|
|
setStatus('Unpacking ' + uuids.length + ' assets...');
|
||
|
|
|
||
|
|
const blobUrls = {};
|
||
|
|
await Promise.all(uuids.map(async (uuid) => {
|
||
|
|
const entry = manifest[uuid];
|
||
|
|
try {
|
||
|
|
const binaryStr = atob(entry.data);
|
||
|
|
const bytes = new Uint8Array(binaryStr.length);
|
||
|
|
for (let i = 0; i < binaryStr.length; i++) bytes[i] = binaryStr.charCodeAt(i);
|
||
|
|
|
||
|
|
let finalBytes = bytes;
|
||
|
|
if (entry.compressed) {
|
||
|
|
if (typeof DecompressionStream !== 'undefined') {
|
||
|
|
const ds = new DecompressionStream('gzip');
|
||
|
|
const writer = ds.writable.getWriter();
|
||
|
|
const reader = ds.readable.getReader();
|
||
|
|
writer.write(bytes);
|
||
|
|
writer.close();
|
||
|
|
const chunks = [];
|
||
|
|
let totalLen = 0;
|
||
|
|
while (true) {
|
||
|
|
const { done, value } = await reader.read();
|
||
|
|
if (done) break;
|
||
|
|
chunks.push(value);
|
||
|
|
totalLen += value.length;
|
||
|
|
}
|
||
|
|
finalBytes = new Uint8Array(totalLen);
|
||
|
|
let offset = 0;
|
||
|
|
for (const chunk of chunks) { finalBytes.set(chunk, offset); offset += chunk.length; }
|
||
|
|
} else {
|
||
|
|
console.warn('DecompressionStream not available, asset ' + uuid + ' may not render');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
blobUrls[uuid] = URL.createObjectURL(new Blob([finalBytes], { type: entry.mime }));
|
||
|
|
} catch (err) {
|
||
|
|
console.error('Failed to decode asset ' + uuid + ':', err);
|
||
|
|
blobUrls[uuid] = URL.createObjectURL(new Blob([], { type: entry.mime }));
|
||
|
|
}
|
||
|
|
}));
|
||
|
|
|
||
|
|
const extResEl = document.querySelector('script[type="__bundler/ext_resources"]');
|
||
|
|
const extResources = extResEl ? JSON.parse(extResEl.textContent) : [];
|
||
|
|
const resourceMap = {};
|
||
|
|
for (const entry of extResources) {
|
||
|
|
if (blobUrls[entry.uuid]) resourceMap[entry.id] = blobUrls[entry.uuid];
|
||
|
|
}
|
||
|
|
|
||
|
|
setStatus('Rendering...');
|
||
|
|
for (const uuid of uuids) template = template.split(uuid).join(blobUrls[uuid]);
|
||
|
|
|
||
|
|
// Strip integrity + crossorigin — blob URLs from a file:// document inherit
|
||
|
|
// a null origin, so crossorigin forces a CORS fetch that SRI then rejects.
|
||
|
|
// The manifest bytes are ours; SRI protects against CDN compromise, not this.
|
||
|
|
template = template.replace(/\s+integrity="[^"]*"/gi, '').replace(/\s+crossorigin="[^"]*"/gi, '');
|
||
|
|
|
||
|
|
const resourceScript = '<script>window.__resources = ' +
|
||
|
|
JSON.stringify(resourceMap).split('</' + 'script>').join('<\\/' + 'script>') +
|
||
|
|
';</' + 'script>';
|
||
|
|
// Inject after <head> so the DOCTYPE stays first; prepending the script
|
||
|
|
// would push the parser into quirks mode. DOMParser always emits a <head>
|
||
|
|
// (synthesizing one if the source HTML omitted it) but may carry
|
||
|
|
// attributes through, so match the full opening tag. slice() rather than
|
||
|
|
// replace() keeps us clear of $-pattern substitution in resourceScript.
|
||
|
|
const headOpen = template.match(/<head[^>]*>/i);
|
||
|
|
if (headOpen) {
|
||
|
|
const i = headOpen.index + headOpen[0].length;
|
||
|
|
template = template.slice(0, i) + resourceScript + template.slice(i);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Parse the template and swap the root element. Scripts inserted via
|
||
|
|
// DOMParser/replaceWith are inert per spec — re-create each with
|
||
|
|
// createElement so they execute, awaiting onload for src scripts to
|
||
|
|
// preserve ordering (React before ReactDOM before Babel before text/babel).
|
||
|
|
const doc = new DOMParser().parseFromString(template, 'text/html');
|
||
|
|
document.documentElement.replaceWith(doc.documentElement);
|
||
|
|
const dead = Array.from(document.scripts);
|
||
|
|
for (const old of dead) {
|
||
|
|
const s = document.createElement('script');
|
||
|
|
for (const a of old.attributes) s.setAttribute(a.name, a.value);
|
||
|
|
s.textContent = old.textContent;
|
||
|
|
// text/babel scripts with a src: fetch and inline. transformScriptTags
|
||
|
|
// does XHR against the src, but blob:null/ from a file:// origin is
|
||
|
|
// silently dropped. Inlining makes it a plain inline babel script,
|
||
|
|
// which transformScriptTags handles unconditionally.
|
||
|
|
if ((s.type === 'text/babel' || s.type === 'text/jsx') && s.src) {
|
||
|
|
const r = await fetch(s.src);
|
||
|
|
s.textContent = await r.text();
|
||
|
|
s.removeAttribute('src');
|
||
|
|
}
|
||
|
|
const p = s.src ? new Promise(function(r) { s.onload = s.onerror = r; }) : null;
|
||
|
|
old.replaceWith(s);
|
||
|
|
if (p) await p;
|
||
|
|
}
|
||
|
|
// Babel standalone auto-transforms type=text/babel on DOMContentLoaded,
|
||
|
|
// which fired before we swapped the document. Trigger manually if present.
|
||
|
|
if (window.Babel && typeof window.Babel.transformScriptTags === 'function') {
|
||
|
|
window.Babel.transformScriptTags();
|
||
|
|
}
|
||
|
|
} catch (err) {
|
||
|
|
setStatus('Error unpacking: ' + err.message);
|
||
|
|
console.error('Bundle unpack error:', err);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<script type="__bundler/manifest">
|
||
|
|
{"389d7186-5adc-4627-91c0-024d37f212b5":{"mime":"text/javascript","compressed":true,"data":"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
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<script type="__bundler/ext_resources">
|
||
|
|
[]
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<script type="__bundler/template">
|
||
|
|
"<!DOCTYPE html>\n<html lang=\"en\"><head>\n <meta charset=\"utf-8\">\n <title>Scarf — UI Kit<\u002Ftitle>\n <style>/* Scarf Design System — colors + type tokens. v2 (amber→rust)\n *\n * Light/dark via [data-theme=\"dark\"] override on a parent. Default light.\n *\n * v2 changes: brand shifted from purple to a tri-stop amber→rust gradient.\n * Neutrals warmed (yellow undertone). Semantic green/blue/red/orange preserved\n * — those still mean success/info/danger and remain the tool-kind colors in chat.\n */\n\n/* cyrillic-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(\"2cc289c6-3e08-400f-a77a-f3e0f5bb1378\") format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(\"c4b22f21-f89d-43d2-a232-3635109cbca3\") format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(\"2a0cc323-440d-4a06-a9ca-5a7e59f3e050\") format('woff2');\n unicode-range: U+1F00-1FFF;\n}\n/* greek */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(\"33fd7dc2-8e74-4391-8f2d-1ad07abd87bb\") format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(\"f3df2dbb-021c-442a-8436-b7eacf5667dd\") format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(\"14d3c31d-7ecc-471c-9071-64d139bd4484\") format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(\"dd5c1dac-ac96-43d8-af87-2c6eab7698f1\") format('woff2');\n 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;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(\"2cc289c6-3e08-400f-a77a-f3e0f5bb1378\") format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(\"c4b22f21-f89d-43d2-a232-3635109cbca3\") format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(\"2a0cc323-440d-4a06-a9ca-5a7e59f3e050\") format('woff2');\n unicode-range: U+1F00-1FFF;\n}\n/* greek */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(\"33fd7dc2-8e74-4391-8f2d-1ad07abd87bb\") format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(\"f3df2dbb-021c-442a-8436-b7eacf5667dd\") format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0
|
||
|
|
</script>
|
||
|
|
</body>
|
||
|
|
</html>
|