Files

188 lines
2.1 MiB
HTML
Raw Permalink Normal View History

2026-06-25 13:47:06 -04:00
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Bundled Page</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 viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<rect width="100" height="100" fill="#F4F4F6"></rect>
<circle cx="50" cy="50" r="22" fill="none" stroke="url(#tg)" stroke-width="5"></circle>
<circle cx="44" cy="46" r="3" fill="#18181D"></circle>
<circle cx="56" cy="46" r="3" fill="#18181D"></circle>
<path d="M42 56 Q50 63 58 56" stroke="#18181D" stroke-width="2.5" fill="none" stroke-linecap="round"></path>
<defs>
<linearGradient id="tg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#3B3AB8"></stop>
<stop offset="1" stop-color="#A035CC"></stop>
</linearGradient>
</defs>
</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">
{"7f0ff314-b957-48f1-9e0d-7904e8fb9d43":{"mime":"image/png","compressed":false,"data":"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
</script>
<script type="__bundler/ext_resources">
[]
</script>
<script type="__bundler/template">
"<!DOCTYPE html>\n<html><head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<script src=\"ff149e5b-4aa7-4ba3-9d81-853cdc280878\"><\u002Fscript>\n<\u002Fhead>\n<body>\n<x-dc>\n<helmet>\n <style>/* ============================================================\n CubeCraft Creations — @font-face Declarations\n Nunito variable font (covers all weights 200900)\n ============================================================ */\n\n@font-face {\n font-family: 'Nunito';\n src: url(\"3a1a4594-fd4f-4ab8-bf8f-4c5f48a68860\") format('truetype');\n font-weight: 200 900;\n font-style: normal;\n font-display: swap;\n}\n\n@font-face {\n font-family: 'Nunito';\n src: url(\"32fbc537-fc03-4e7b-89fa-e6c0c3094f64\") format('truetype');\n font-weight: 200 900;\n font-style: italic;\n font-display: swap;\n}\n\n/* Static fallbacks for environments that don't support variable fonts */\n@font-face {\n font-family: 'Nunito Fallback';\n src: url(\"63073b2b-5cd8-431e-af11-4dcf2040a26e\") format('truetype');\n font-weight: 300;\n font-style: normal;\n font-display: swap;\n}\n\n@font-face {\n font-family: 'Nunito Fallback';\n src: url(\"69b6e747-0d40-4477-8247-4fca9f72d54b\") format('truetype');\n font-weight: 400;\n font-style: normal;\n font-display: swap;\n}\n\n@font-face {\n font-family: 'Nunito Fallback';\n src: url(\"e56d30b9-22d0-46aa-bbd4-745628359d50\") format('truetype');\n font-weight: 600;\n font-style: normal;\n font-display: swap;\n}\n\n@font-face {\n font-family: 'Nunito Fallback';\n src: url(\"ba9d1f0f-fd88-496f-ae84-2c0c7d8edb07\") format('truetype');\n font-weight: 700;\n font-style: normal;\n font-display: swap;\n}\n\n@font-face {\n font-family: 'Nunito Fallback';\n src: url(\"a8540794-14d9-49db-9264-f5220fe60ef5\") format('truetype');\n font-weight: 800;\n font-style: normal;\n font-display: swap;\n}\n<\u002Fstyle>\n <style>/* ============================================================\n CubeCraft Creations — Color Tokens\n Brand gradient: cobalt blue #3B3AB8 → magenta purple #A035CC\n ============================================================ */\n\n:root {\n /* ── Brand Gradient ──────────────────────────────────────── */\n --brand-blue: #3B3AB8; /* gradient start / logo blue */\n --brand-purple: #A035CC; /* gradient end / logo purple */\n --brand-gradient: linear-gradient(135deg, #3B3AB8 0%, #A035CC 100%); /* @kind color */\n --brand-gradient-h: linear-gradient(90deg, #3B3AB8 0%, #A035CC 100%); /* @kind color */\n\n /* ── Primary ─────────────────────────────────────────────── */\n --color-primary-50: #EBEBF8;\n --color-primary-100: #CDCDF0;\n --color-primary-200: #9F9EE0;\n --color-primary-300: #7170D0;\n --color-primary-400: #5554CC;\n --color-primary-500: #3B3AB8; /* base */\n --color-primary-600: #2D2C9A;\n --color-primary-700: #201F7A;\n --color-primary-800: #141358;\n --color-primary-900: #0A0938;\n\n /* ── Accent (Purple) ─────────────────────────────────────── */\n --color-accent-50: #F6EAFD;\n --color-accent-100: #E8CBFA;\n --color-accent-200: #D49AF5;\n --color-accent-300: #C060E8;\n --color-accent-400: #B040D8;\n --color-accent-500: #A035CC; /* base */\n --color-accent-600: #7D28A0;\n --color-accent-700: #5C1C78;\n --color-accent-800: #3C1050;\n --color-accent-900: #1E0828;\n\n /* ── Neutral ─────────────────────────────────────────────── */\n --color-neutral-0: #FFFFFF;\n --color-neutral-50: #FAFAFA;\n --color-neutral-100: #F4F4F6;\n --color-neutral-150: #EDEDF1;\n --color-neutral-200: #E4E4EA;\n --color-neutral-300: #C8C8D4;\n --color-neutral-400: #9898A8;\n
</script>
</body>
</html>