This skill gives you the tools and permission to make design that earns the name out-of-distribution craft. Work as an award-winning design director would: production-grade code, a clear POV, a deep grasp of what the client and its users need, and exceptional craft. Core principles: - Finish the job. No hedging, no shortcuts: the deliverable is complete, except assets the user must provide. - Scale ambition to the surface's mode (see Modes). Persuade and Experience get full commitment: bold, distinct work with a point of view. On Operate and Read, ambition shows as precision and restraint, an…

)\n || key.startsWith('__reactProps

This skill gives you the tools and permission to make design that earns the name out-of-distribution craft. Work as an award-winning design director would: production-grade code, a clear POV, a deep grasp of what the client and its users need, and exceptional craft. Core principles: - Finish the job. No hedging, no shortcuts: the deliverable is complete, except assets the user must provide. - Scale ambition to the surface's mode (see Modes). Persuade and Experience get full commitment: bold, distinct work with a point of view. On Operate and Read, ambition shows as precision and restraint, an…

)\n || key.startsWith('__reactContainer

This skill gives you the tools and permission to make design that earns the name out-of-distribution craft. Work as an award-winning design director would: production-grade code, a clear POV, a deep grasp of what the client and its users need, and exceptional craft. Core principles: - Finish the job. No hedging, no shortcuts: the deliverable is complete, except assets the user must provide. - Scale ambition to the surface's mode (see Modes). Persuade and Experience get full commitment: bold, distinct work with a point of view. On Operate and Read, ambition shows as precision and restraint, an…

)\n || key === '_reactRootContainer'\n || key === '__vueParentComponent'\n || key === '__vue_app__'\n || key === '__vnode'\n || key === '__svelte_meta'\n ))) {\n return true;\n }\n }\n return false;\n }\n\n function id8() {\n // randomUUID is secure-context only (issue #1055); getRandomValues is not.\n try {\n if (typeof crypto?.randomUUID === 'function') return crypto.randomUUID().replace(/-/g, '').slice(0, 8);\n } catch { /* fall through */ }\n try {\n if (typeof crypto?.getRandomValues === 'function') {\n const bytes = crypto.getRandomValues(new Uint8Array(4));\n return Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n }\n } catch { /* fall through */ }\n return (Math.random().toString(16).slice(2) + Date.now().toString(16)).slice(0, 8);\n }\n\n function cssId(id) {\n if (css?.escape) return css.escape(id);\n return String(id).replace(/([ !\"#$%&'()*+,./:;\u003c=>?@[\\\\\\]^`{|}~])/g, '\\\\$1');\n }\n\n function liveUiRoot() {\n const uiRoot = root.__IMPECCABLE_LIVE_UI_ROOT__;\n if (uiRoot && typeof uiRoot.appendChild === 'function') return uiRoot;\n return doc.body;\n }\n\n // A modal \u003cdialog> (showModal) paints in the top layer and makes every\n // node outside its subtree inert, so chrome on \u003cbody> can be neither seen\n // nor clicked while one is open, and no z-index reaches it (issue #879).\n // While a modal is open the chrome parks inside the topmost one, in one\n // popover: inside the dialog it is not inert, and a popover shown after\n // the dialog paints above it. One popover for all of it, because\n // top-layer entries stack by show order, which would drop the z-index\n // order between the roots. The detect overlay (browser-bundle/\n // 40-overlay.js) mounts its outlines here too: it finds the host by this\n // id and places its outlines again on the event of the same name, fired\n // on every move.\n const topLayerHost = doc.createElement('div');\n topLayerHost.id = prefix + '-top-layer';\n // Same box as the SvelteKit shadow host: 0x0, fixed, chrome overflows it.\n // `all: initial` also clears the popover UA box.\n for (const [name, value] of Object.entries({\n all: 'initial', position: 'fixed', top: '0', left: '0', width: '0', height: '0', overflow: 'visible',\n })) topLayerHost.style.setProperty(name, value, 'important');\n const pageRoots = new WeakSet(); // chrome nodes mounted on the page itself\n const openModals = []; // in the order they opened; last is topmost\n\n // Modals that were open before watching began have no readable top-layer\n // order, but the topmost one's backdrop covers the viewport, so a hit\n // test lands in it. Raise that one to the top of the stack.\n function raiseHitModal() {\n const i = openModals.indexOf(doc.elementFromPoint(0, 0)?.closest('dialog:modal'));\n if (i !== -1) openModals.push(...openModals.splice(i, 1));\n }\n\n function syncTopLayerHost(records = []) {\n for (const { type, target, oldValue } of records) {\n if (type !== 'attributes' || oldValue !== null || !target.matches('dialog:modal')) continue;\n // Opened, or closed and reopened in one task (the observer sees only\n // the end state): either way it is back on top of the top layer, so\n // a host shown inside it earlier has to be shown again. A write to an\n // `open` that was already set (oldValue not null) moved nothing.\n const i = openModals.indexOf(target);\n if (i !== -1) openModals.splice(i, 1);\n openModals.push(target);\n if (topLayerHost.parentNode === target) topLayerHost.remove();\n }\n // A closed dialog, or one removed from the document while open, stops\n // matching :modal. Whichever is now on top may predate the watch.\n const before = openModals.length;\n for (let i = openModals.length - 1; i >= 0; i--) {\n if (!openModals[i].matches('dialog:modal')) openModals.splice(i, 1);\n }\n if (openModals.length \u003c before && openModals.length > 1) raiseHitModal();\n const modal = openModals[openModals.length - 1] || null;\n if (topLayerHost.parentNode === modal) return;\n if (modal) {\n modal.appendChild(topLayerHost);\n for (const el of [...doc.body.children]) if (pageRoots.has(el)) topLayerHost.appendChild(el);\n topLayerHost.showPopover();\n } else {\n doc.body.append(...topLayerHost.childNodes);\n topLayerHost.remove();\n }\n doc.dispatchEvent(new Event(topLayerHost.id));\n }\n\n // Returns the function that stops watching and puts the chrome back.\n function watchModalDialogs() {\n if (typeof topLayerHost.showPopover !== 'function') return () => {};\n topLayerHost.popover = 'manual';\n // Parked in the page's dialog, chrome clicks would bubble into its own\n // handlers, such as a click-outside-the-box close. Live listens in capture.\n topLayerHost.addEventListener('click', (e) => e.stopPropagation());\n openModals.push(...doc.querySelectorAll('dialog:modal'));\n raiseHitModal();\n const observer = new MutationObserver(syncTopLayerHost);\n observer.observe(doc, { subtree: true, childList: true, attributes: true, attributeOldValue: true, attributeFilter: ['open'] });\n syncTopLayerHost();\n return () => {\n observer.disconnect();\n openModals.length = 0;\n syncTopLayerHost();\n };\n }\n\n // A copy of a page element without the chrome parked inside it, which a\n // picked modal dialog contains.\n function cloneWithoutChrome(el) {\n const clone = el.cloneNode(true);\n if (el.contains(topLayerHost)) clone.querySelector('#' + cssId(topLayerHost.id)).remove();\n return clone;\n }\n\n // Mount a chrome node on the page itself: \u003cbody>, or the top-layer host\n // while the chrome is parked in a modal.\n function uiAppendToPage(el) {\n pageRoots.add(el);\n (topLayerHost.parentNode ? topLayerHost : doc.body).appendChild(el);\n return el;\n }\n\n // Copy text through a selected textarea and execCommand, for origins where\n // navigator.clipboard is missing or refused (plain HTTP, issue #1055).\n // The textarea mounts like any page-level chrome, so while a modal\n // \u003cdialog> is open it sits in that dialog's top-layer host: on \u003cbody> it\n // would be inert, and inert text cannot be selected or copied.\n function copyTextViaSelection(text) {\n let ta = null;\n const previous = activeElementDeep();\n try {\n ta = doc.createElement('textarea');\n ta.id = prefix + '-clipboard';\n ta.value = text;\n ta.setAttribute('readonly', '');\n ta.setAttribute('aria-hidden', 'true');\n ta.tabIndex = -1;\n ta.style.cssText = 'position:fixed;top:0;left:0;width:1px;height:1px;opacity:0;pointer-events:none;';\n uiAppendToPage(ta);\n ta.select();\n return doc.execCommand('copy');\n } catch {\n return false;\n } finally {\n ta?.remove();\n if (previous && previous !== activeElementDeep() && typeof previous.focus === 'function') {\n try { previous.focus({ preventScroll: true }); } catch { /* best effort */ }\n }\n }\n }\n\n function uiAppend(el) {\n const uiRoot = liveUiRoot();\n if (uiRoot === doc.body) return uiAppendToPage(el);\n // An adapter shadow root: its host is the node that sits on the page.\n if (uiRoot.host) pageRoots.add(uiRoot.host);\n uiRoot.appendChild(el);\n return el;\n }\n\n function uiAppendStyle(styleEl) {\n const uiRoot = liveUiRoot();\n if (uiRoot && uiRoot !== doc.body) uiRoot.appendChild(styleEl);\n else doc.head.appendChild(styleEl);\n return styleEl;\n }\n\n function uiGetById(id) {\n const uiRoot = liveUiRoot();\n if (uiRoot?.getElementById) {\n const found = uiRoot.getElementById(id);\n if (found) return found;\n }\n if (uiRoot?.querySelector) {\n const found = uiRoot.querySelector('#' + cssId(id));\n if (found) return found;\n }\n return doc.getElementById(id);\n }\n\n function activeElementDeep() {\n let active = doc.activeElement;\n while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;\n return active;\n }\n\n function defangOutsideHandlers(rootEl, { setPointerEvents = true } = {}) {\n if (!rootEl) return;\n if (setPointerEvents) {\n rootEl.style.setProperty('pointer-events', 'auto', 'important');\n }\n const stop = (e) => e.stopPropagation();\n rootEl.addEventListener('pointerdown', stop);\n rootEl.addEventListener('mousedown', stop);\n rootEl.addEventListener('focusin', stop);\n }\n\n // The half of the defang that cannot sit on the chrome: a focus trap (Radix /\n // Reka FocusScope) also hears the page's own focusout as focus leaves its\n // modal for our chrome, and pulls it back. Register on the document in\n // capture, ahead of the trap. The page's own focusout handlers miss that\n // one transition too; blur still fires.\n function stopFocusOutIntoChrome(e) {\n if (own(e.relatedTarget)) e.stopPropagation();\n }\n\n return {\n own,\n pickable,\n desc,\n rectIsUsableAnchor,\n makeFrozenAnchor,\n hasFrameworkHmrOwnership,\n id8,\n cssId,\n liveUiRoot,\n uiAppend,\n uiAppendToPage,\n copyTextViaSelection,\n topLayerHost,\n watchModalDialogs,\n cloneWithoutChrome,\n uiAppendStyle,\n uiGetById,\n activeElementDeep,\n defangOutsideHandlers,\n stopFocusOutIntoChrome,\n };\n }\n\n root.__IMPECCABLE_LIVE_DOM__ = {\n version: 1,\n createLiveBrowserDomHelpers,\n };\n})(typeof window !== 'undefined' ? window : globalThis);\n","content_type":"text/javascript; charset=utf-8","language":"javascript","size":12283,"content_sha256":"4b379aff87ce0f485008a2b6a0dc711d00a869f5cf0ec2459279d6364fbf0c9e"},{"filename":"scripts/live-browser-ignores.js","content":"/**\n * Browser-side resolution of project detector waivers for Impeccable live mode.\n *\n * The live server serializes `.impeccable/config.json` + `config.local.json`\n * detector ignores (plus the served-root prefixes from the inject config's\n * `files` globs) into `window.__IMPECCABLE_PROJECT_IGNORES__`. This part\n * resolves that config against the current page's URL path when a detect scan\n * starts, so the overlay suppresses the same findings the CLI and the edit\n * hook do (issue #639).\n *\n * Mirrors filterDetectionFindings in cli/lib/impeccable-config.mjs:\n * 1. `ignoreRules` suppress a rule project-wide.\n * 2. `ignoreValues` entries with `value: \"*\"` suppress their rule in the\n * files their globs name. The CLI never applies an unscoped wildcard\n * (isIgnoredFindingValue returns false for it), so neither does this.\n * 3. Remaining `ignoreValues` entries match on the finding's own value;\n * those are forwarded as `disabledValues` for the detector bundle to\n * apply where the findings are assembled.\n * 4. `ignoreFiles` globs that name the page waive it wholesale: the\n * resolver reports `skipScan: true` and the detector answers the scan\n * with zero findings, mirroring shouldIgnoreDetectionFile in the CLI\n * and the edit hook's own ignoreFiles gate.\n *\n * `pageFiles`, when the server could resolve it, lists the real project\n * files the inject config serves. A URL that suffix-matches exactly one of\n * them takes that file as its only project identity; an ambiguous or absent\n * match falls back to the served-root common ancestor below.\n *\n * Known gap, unchanged from PR #645: framework apps inject into source files\n * (src/routes/about/+page.svelte) while scans see route URLs (/about), so\n * entries scoped to source or asset paths never match a page candidate and\n * are dropped. That shows the finding, which is the conservative direction.\n *\n * Kept separate from live-browser.js so the glob and page-scope logic can be\n * unit tested in Node (tests/live-browser-ignores.test.mjs) without the full\n * overlay UI bundle.\n */\n(function (root) {\n 'use strict';\n if (!root) return;\n\n // Keep in step with normalizeIgnoreRule / normalizeIgnoreValue in\n // cli/lib/impeccable-config.mjs.\n function normalizeIgnoreRule(rule) {\n return String(rule || '').trim().toLowerCase();\n }\n\n function normalizeIgnoreValue(value) {\n return String(value || '')\n .trim()\n .replace(/^[\"']|[\"']$/g, '')\n .replace(/\\+/g, ' ')\n .replace(/\\s+/g, ' ')\n .toLowerCase();\n }\n\n // Glob -> RegExp. Supports `**`, `*`, `?`, and `{a,b}` alternation.\n // Keep in step with globToRegex in cli/lib/impeccable-config.mjs.\n function globToRegex(glob) {\n let re = '^';\n let i = 0;\n while (i \u003c glob.length) {\n const c = glob[i];\n if (c === '*') {\n if (glob[i + 1] === '*') {\n i += 2;\n if (glob[i] === '/') {\n re += '(?:.*/)?';\n i += 1;\n } else {\n re += '.*';\n }\n } else {\n re += '[^/]*';\n i += 1;\n }\n } else if (c === '?') {\n re += '[^/]';\n i += 1;\n } else if (c === '{') {\n const end = glob.indexOf('}', i);\n if (end === -1) { re += '\\\\{'; i += 1; continue; }\n const parts = glob.slice(i + 1, end).split(',').map((p) => p.replace(/[.+^$()|[\\]\\\\]/g, '\\\\{head-tags}'));\n re += `(?:${parts.join('|')})`;\n i = end + 1;\n } else if (/[.+^$()|[\\]\\\\]/.test(c)) {\n re += `\\\\${c}`;\n i += 1;\n } else {\n re += c;\n i += 1;\n }\n }\n re += '

This skill gives you the tools and permission to make design that earns the name out-of-distribution craft. Work as an award-winning design director would: production-grade code, a clear POV, a deep grasp of what the client and its users need, and exceptional craft. Core principles: - Finish the job. No hedging, no shortcuts: the deliverable is complete, except assets the user must provide. - Scale ambition to the surface's mode (see Modes). Persuade and Experience get full commitment: bold, distinct work with a point of view. On Operate and Read, ambition shows as precision and restraint, an…

;\n return new RegExp(re);\n }\n\n // The project-relative paths this page could be known as. Ignore globs are\n // project-relative (prototype/foo.html) and the URL is site-relative\n // (/foo.html), because a static server's root usually sits inside the\n // project; `roots` carries that prefix. The server reads it from the inject\n // config's own `files` globs, which already state where the served pages\n // are. Do not derive it from the ignore globs: a single entry scoped to\n // prototype/library/** would then lend prototype/library/ as a candidate\n // prefix to every page, and that rule would suppress site-wide.\n //\n // Each prefixed path also contributes its slash suffixes, mirroring\n // findingMatchesScopedIgnoreFile in cli/lib/impeccable-config.mjs (which\n // matches globs against every path suffix of the finding's file).\n //\n // One live session is served by one server, so a single document root must\n // sit at or above every configured page. The only prefix that can safely\n // be asserted is therefore the deepest common ancestor of the glob roots.\n // Treating each glob's own prefix as an identity goes wrong in both\n // directions: disjoint roots (src/ and public/) invent simultaneous\n // identities for one URL, so a waiver scoped to src/foo.html hides a\n // finding on a page served from public/foo.html; nested roots (prototype/\n // and prototype/library/, from globs at two depths in one tree) are not\n // alternatives at all, and demanding a waiver match under both stops\n // prototype/index.html from applying anywhere. When the globs share no\n // common root, no prefix is asserted and only the URL path itself matches.\n function pageCandidates(pathname, roots, pageFiles) {\n let pagePath = String(pathname || '');\n try {\n pagePath = decodeURIComponent(pagePath);\n } catch {\n // Malformed percent-escape: match on the raw path rather than throwing.\n }\n pagePath = pagePath.replace(/^\\/+/, '');\n // A directory URL serves that directory's index, and the ignore globs\n // name files. Without this, /news/ never matches prototype/news/index.html.\n if (pagePath === '' || pagePath.endsWith('/')) pagePath += 'index.html';\n\n const candidates = new Set();\n const addSuffixes = (fullPath) => {\n const parts = fullPath.split('/').filter(Boolean);\n for (let i = 0; i \u003c parts.length; i++) {\n candidates.add(parts.slice(i).join('/'));\n }\n };\n addSuffixes(pagePath);\n\n // The served page list names the real files the inject config serves.\n // A URL that suffix-matches exactly one of them has an unambiguous\n // project identity; assert that identity and stop guessing from roots\n // (PR #645 review: with src/ and public/ both served, /foo.html must not\n // borrow src/foo.html's waivers while actually serving public/foo.html).\n // Zero matches or several fall through to the common-ancestor fallback:\n // ambiguity resolves toward showing the finding.\n const knownPages = [];\n for (const entry of Array.isArray(pageFiles) ? pageFiles : []) {\n if (typeof entry !== 'string' || !entry) continue;\n if (entry === pagePath || entry.endsWith('/' + pagePath)) knownPages.push(entry);\n }\n if (knownPages.length === 1) {\n addSuffixes(knownPages[0]);\n return [...candidates];\n }\n\n const prefixes = [];\n for (const entry of Array.isArray(roots) ? roots : []) {\n if (typeof entry !== 'string') continue;\n prefixes.push(entry.split('/').filter(Boolean));\n }\n let common = prefixes.length > 0 ? prefixes[0] : [];\n for (const segments of prefixes.slice(1)) {\n let i = 0;\n while (i \u003c common.length && i \u003c segments.length && common[i] === segments[i]) i += 1;\n common = common.slice(0, i);\n }\n\n if (common.length > 0) addSuffixes(common.join('/') + '/' + pagePath);\n return [...candidates];\n }\n\n function matchesScope(globs, candidates) {\n return globs.some((glob) => {\n let re;\n try {\n re = globToRegex(String(glob));\n } catch {\n // Malformed glob: skip it, as matchesAnyGlob does in the CLI.\n return false;\n }\n return candidates.some((candidate) => re.test(candidate));\n });\n }\n\n /**\n * Resolve the serialized project ignores for one page.\n *\n * @param {object} options\n * @param {object} options.ignores window.__IMPECCABLE_PROJECT_IGNORES__,\n * in whatever state it arrived: absent, null, or hand-edited into the\n * wrong shape. Every read tolerates that and degrades to no filtering.\n * @param {string} options.pathname location.pathname of the scanned page.\n * @returns {{ disabledRules: string[], disabledValues: Array\u003c{rule: string, value: string}>, skipScan: boolean }}\n */\n function resolveDetectIgnores({ ignores, pathname } = {}) {\n const config = ignores && typeof ignores === 'object' ? ignores : {};\n const asArray = (value) => (Array.isArray(value) ? value : []);\n const candidates = pageCandidates(pathname, config.roots, config.pageFiles);\n\n // detector.ignoreFiles waives whole files. When any glob names this\n // page, the scan itself is skipped; rule and value lists are returned\n // empty because nothing will run.\n const ignoreFileGlobs = asArray(config.ignoreFiles)\n .filter((glob) => typeof glob === 'string' && glob.trim());\n if (ignoreFileGlobs.length > 0 && matchesScope(ignoreFileGlobs, candidates)) {\n return { disabledRules: [], disabledValues: [], skipScan: true };\n }\n\n const disabledRules = new Set(\n asArray(config.ignoreRules)\n .filter((rule) => typeof rule === 'string')\n .map(normalizeIgnoreRule)\n .filter(Boolean),\n );\n const disabledValues = [];\n\n for (const entry of asArray(config.ignoreValues)) {\n if (!entry || typeof entry !== 'object') continue;\n const rule = normalizeIgnoreRule(entry.rule);\n const value = normalizeIgnoreValue(entry.value);\n if (!rule || !value) continue;\n const files = [\n ...(typeof entry.file === 'string' && entry.file.trim() ? [entry.file.trim()] : []),\n ...asArray(entry.files).filter((glob) => typeof glob === 'string' && glob.trim()),\n ];\n if (value === '*') {\n // Wildcards suppress their rule only inside the files they name.\n if (files.length > 0 && matchesScope(files, candidates)) disabledRules.add(rule);\n continue;\n }\n if (files.length > 0 && !matchesScope(files, candidates)) continue;\n disabledValues.push({ rule, value });\n }\n\n return { disabledRules: [...disabledRules], disabledValues, skipScan: false };\n }\n\n root.__IMPECCABLE_LIVE_IGNORES__ = {\n version: 1,\n resolveDetectIgnores,\n };\n})(typeof window !== 'undefined' ? window : globalThis);\n","content_type":"text/javascript; charset=utf-8","language":"javascript","size":10423,"content_sha256":"ba8905ab865fde5162e34fc17eb80eba26cc990b319b14a6eed6ca89fd491897"},{"filename":"scripts/live-browser-session.js","content":"/**\n * Browser-side durable session helpers for Impeccable live mode.\n *\n * Kept separate from live-browser.js so recovery state can be tested without\n * booting the full overlay UI. Served before live-browser.js and attached to\n * window.__IMPECCABLE_LIVE_SESSION__.\n */\n(function (root) {\n 'use strict';\n\n // crypto.randomUUID() exists only in secure contexts (HTTPS, localhost), so a\n // dev site on a LAN IP, a Tailscale address, or a custom hostname over plain\n // HTTP has no randomUUID at all (issue #1055). getRandomValues() is available\n // in every context; Math.random() covers runtimes with no crypto. Live ids\n // only have to be unique per session, not unguessable.\n function randomUUID(cryptoImpl) {\n const c = cryptoImpl === undefined ? root.crypto : cryptoImpl;\n try {\n if (c && typeof c.randomUUID === 'function') return c.randomUUID();\n } catch { /* fall through to getRandomValues */ }\n const bytes = new Uint8Array(16);\n let filled = false;\n try {\n if (c && typeof c.getRandomValues === 'function') {\n c.getRandomValues(bytes);\n filled = true;\n }\n } catch { /* fall through to Math.random */ }\n if (!filled) {\n for (let i = 0; i \u003c 16; i++) bytes[i] = Math.floor(Math.random() * 256);\n }\n bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // RFC 4122 variant\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n return hex.slice(0, 8) + '-' + hex.slice(8, 12) + '-' + hex.slice(12, 16)\n + '-' + hex.slice(16, 20) + '-' + hex.slice(20);\n }\n\n function randomId8(cryptoImpl) {\n return randomUUID(cryptoImpl).replace(/-/g, '').slice(0, 8);\n }\n\n function createLiveBrowserSessionState({ prefix, storage, idFactory }) {\n if (!prefix) throw new Error('prefix required');\n let store = storage;\n if (!store) {\n try { store = root.localStorage; } catch { store = null; /* storage denied */ }\n }\n const makeId = idFactory || function () { return randomId8(); };\n const sessionKey = prefix + '-session';\n const handledKey = sessionKey + '-handled';\n const scrollKey = sessionKey + '-scroll';\n let checkpointRevision = 0;\n const owner = makeId();\n\n function safeRead(key) {\n try { return store.getItem(key); } catch { return null; }\n }\n\n function safeWrite(key, value) {\n try { store.setItem(key, value); } catch { /* quota exceeded or private mode */ }\n }\n\n function safeRemove(key) {\n try { store.removeItem(key); } catch { /* unavailable storage */ }\n }\n\n function loadSession() {\n try {\n const raw = safeRead(sessionKey);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (Number.isInteger(parsed.checkpointRevision)) {\n checkpointRevision = Math.max(checkpointRevision, parsed.checkpointRevision);\n }\n return parsed;\n } catch { return null; }\n }\n\n function saveSession(session) {\n if (!session || !session.id) return;\n // Adopt a revision another tab stored so this write does not lower it.\n // localStorage has no compare-and-set, so a save from another tab that\n // lands between this read and the write below can still be overwritten.\n loadSession();\n const payload = {\n ...session,\n checkpointRevision,\n };\n safeWrite(sessionKey, JSON.stringify(payload));\n }\n\n function clearSession() {\n safeRemove(sessionKey);\n }\n\n function nextCheckpointRevision() {\n const existing = loadSession();\n checkpointRevision += 1;\n if (existing?.id) saveSession(existing);\n return checkpointRevision;\n }\n\n function seedCheckpointRevision(value) {\n if (Number.isInteger(value)) checkpointRevision = Math.max(checkpointRevision, value);\n return checkpointRevision;\n }\n\n function currentCheckpointRevision() {\n return checkpointRevision;\n }\n\n function readHandledIds() {\n const raw = safeRead(handledKey);\n if (!raw) return [];\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n return parsed.filter(id => typeof id === 'string' && id);\n }\n if (typeof parsed === 'string' && parsed) return [parsed];\n } catch { /* legacy values were stored as a plain session id */ }\n return [raw];\n }\n\n function markHandled(id) {\n if (!id) return;\n const ids = readHandledIds().filter(existing => existing !== id);\n ids.push(id);\n safeWrite(handledKey, JSON.stringify(ids.slice(-8)));\n }\n\n function isHandled(id) {\n return !!id && readHandledIds().includes(id);\n }\n\n function clearHandled(id) {\n if (!id) {\n safeRemove(handledKey);\n return;\n }\n const remaining = readHandledIds().filter(existing => existing !== id);\n if (remaining.length > 0) safeWrite(handledKey, JSON.stringify(remaining));\n else safeRemove(handledKey);\n }\n\n function writeScrollY(y) {\n safeWrite(scrollKey, String(y));\n }\n\n function readScrollY() {\n const raw = safeRead(scrollKey);\n if (raw == null) return null;\n const n = parseFloat(raw);\n return isFinite(n) ? n : null;\n }\n\n function clearScrollY() {\n safeRemove(scrollKey);\n }\n\n return {\n owner,\n sessionKey,\n handledKey,\n scrollKey,\n saveSession,\n loadSession,\n clearSession,\n nextCheckpointRevision,\n seedCheckpointRevision,\n currentCheckpointRevision,\n markHandled,\n isHandled,\n clearHandled,\n writeScrollY,\n readScrollY,\n clearScrollY,\n };\n }\n\n root.__IMPECCABLE_LIVE_SESSION__ = { createLiveBrowserSessionState, randomUUID, randomId8 };\n})(typeof window !== 'undefined' ? window : globalThis);\n","content_type":"text/javascript; charset=utf-8","language":"javascript","size":5838,"content_sha256":"e042339a54d4521fc47555b602013ed5b51410ec9d7d8878d99a526f5f237f68"},{"filename":"scripts/modern-screenshot.umd.js","content":"(function(y,v){typeof exports==\"object\"&&typeof module!=\"undefined\"?v(exports):typeof define==\"function\"&&define.amd?define([\"exports\"],v):(y=typeof globalThis!=\"undefined\"?globalThis:y||self,v(y.modernScreenshot={}))})(this,function(y){\"use strict\";var rr=Object.defineProperty,nr=Object.defineProperties;var or=Object.getOwnPropertyDescriptors;var Z=Object.getOwnPropertySymbols;var xe=Object.prototype.hasOwnProperty,Me=Object.prototype.propertyIsEnumerable;var Oe=Math.pow,Le=(y,v,N)=>v in y?rr(y,v,{enumerable:!0,configurable:!0,writable:!0,value:N}):y[v]=N,D=(y,v)=>{for(var N in v||(v={}))xe.call(v,N)&&Le(y,N,v[N]);if(Z)for(var N of Z(v))Me.call(v,N)&&Le(y,N,v[N]);return y},M=(y,v)=>nr(y,or(v));var je=(y,v)=>{var N={};for(var R in y)xe.call(y,R)&&v.indexOf(R)\u003c0&&(N[R]=y[R]);if(y!=null&&Z)for(var R of Z(y))v.indexOf(R)\u003c0&&Me.call(y,R)&&(N[R]=y[R]);return N};var C=(y,v,N)=>new Promise((R,O)=>{var X=P=>{try{q(N.next(P))}catch(W){O(W)}},j=P=>{try{q(N.throw(P))}catch(W){O(W)}},q=P=>P.done?R(P.value):Promise.resolve(P.value).then(X,j);q((N=N.apply(y,v)).next())});var Be;function v(e,t){return e[13]=1,e[14]=t>>8,e[15]=t&255,e[16]=t>>8,e[17]=t&255,e}const N=112,R=72,O=89,X=115;let j;function q(){const e=new Int32Array(256);for(let t=0;t\u003c256;t++){let r=t;for(let n=0;n\u003c8;n++)r=r&1?3988292384^r>>>1:r>>>1;e[t]=r}return e}function P(e){let t=-1;j||(j=q());for(let r=0;r\u003ce.length;r++)t=j[(t^e[r])&255]^t>>>8;return t^-1}function W(e){const t=e.length-1;for(let r=t;r>=4;r--)if(e[r-4]===9&&e[r-3]===N&&e[r-2]===R&&e[r-1]===O&&e[r]===X)return r-3;return 0}function ae(e,t,r=!1){const n=new Uint8Array(13);t*=39.3701,n[0]=N,n[1]=R,n[2]=O,n[3]=X,n[4]=t>>>24,n[5]=t>>>16,n[6]=t>>>8,n[7]=t&255,n[8]=n[4],n[9]=n[5],n[10]=n[6],n[11]=n[7],n[12]=1;const i=P(n),a=new Uint8Array(4);if(a[0]=i>>>24,a[1]=i>>>16,a[2]=i>>>8,a[3]=i&255,r){const s=W(e);return e.set(n,s),e.set(a,s+13),e}else{const s=new Uint8Array(4);s[0]=0,s[1]=0,s[2]=0,s[3]=9;const o=new Uint8Array(54);return o.set(e,0),o.set(s,33),o.set(n,37),o.set(a,50),o}}const qe=\"AAlwSFlz\",We=\"AAAJcEhZ\",He=\"AAAACXBI\";function Ve(e){let t=e.indexOf(qe);return t===-1&&(t=e.indexOf(We)),t===-1&&(t=e.indexOf(He)),t}const se=\"[modern-screenshot]\",U=typeof window!=\"undefined\",ze=U&&\"Worker\"in window,ie=U&&\"atob\"in window,Xe=U&&\"btoa\"in window,ee=U?(Be=window.navigator)==null?void 0:Be.userAgent:\"\",le=ee.includes(\"Chrome\"),G=ee.includes(\"AppleWebKit\")&&!le,te=ee.includes(\"Firefox\"),Ge=e=>e&&\"__CONTEXT__\"in e,Ye=e=>e.constructor.name===\"CSSFontFaceRule\",Je=e=>e.constructor.name===\"CSSImportRule\",Ke=e=>e.constructor.name===\"CSSLayerBlockRule\",I=e=>e.nodeType===1,H=e=>typeof e.className==\"object\",ce=e=>e.tagName===\"image\",Qe=e=>e.tagName===\"use\",V=e=>I(e)&&typeof e.style!=\"undefined\"&&!H(e),Ze=e=>e.nodeType===8,et=e=>e.nodeType===3,$=e=>e.tagName===\"IMG\",Y=e=>e.tagName===\"VIDEO\",tt=e=>e.tagName===\"CANVAS\",rt=e=>e.tagName===\"TEXTAREA\",nt=e=>e.tagName===\"INPUT\",ot=e=>e.tagName===\"STYLE\",at=e=>e.tagName===\"SCRIPT\",st=e=>e.tagName===\"SELECT\",it=e=>e.tagName===\"SLOT\",lt=e=>e.tagName===\"IFRAME\",ct=(...e)=>console.warn(se,...e);function ut(e){var r;const t=(r=e==null?void 0:e.createElement)==null?void 0:r.call(e,\"canvas\");return t&&(t.height=t.width=1),!!t&&\"toDataURL\"in t&&!!t.toDataURL(\"image/webp\").includes(\"image/webp\")}const re=e=>e.startsWith(\"data:\");function ue(e,t){if(e.match(/^[a-z]+:\\/\\//i))return e;if(U&&e.match(/^\\/\\//))return window.location.protocol+e;if(e.match(/^[a-z]+:/i)||!U)return e;const r=J().implementation.createHTMLDocument(),n=r.createElement(\"base\"),i=r.createElement(\"a\");return r.head.appendChild(n),r.body.appendChild(i),t&&(n.href=t),i.href=e,i.href}function J(e){var t;return(t=e&&I(e)?e==null?void 0:e.ownerDocument:e)!=null?t:window.document}const K=\"http://www.w3.org/2000/svg\";function fe(e,t,r){const n=J(r).createElementNS(K,\"svg\");return n.setAttributeNS(null,\"width\",e.toString()),n.setAttributeNS(null,\"height\",t.toString()),n.setAttributeNS(null,\"viewBox\",`0 0 ${e} ${t}`),n}function de(e,t){let r=new XMLSerializer().serializeToString(e);return t&&(r=r.replace(/[\\u0000-\\u0008\\v\\f\\u000E-\\u001F\\uD800-\\uDFFF\\uFFFE\\uFFFF]/gu,\"\")),`data:image/svg+xml;charset=utf-8,${encodeURIComponent(r)}`}function ft(e,t=\"image/png\",r=1){return C(this,null,function*(){try{return yield new Promise((n,i)=>{e.toBlob(a=>{a?n(a):i(new Error(\"Blob is null\"))},t,r)})}catch(n){if(ie)return dt(e.toDataURL(t,r));throw n}})}function dt(e){var o,c;const[t,r]=e.split(\",\"),n=(c=(o=t.match(/data:(.+);/))==null?void 0:o[1])!=null?c:void 0,i=window.atob(r),a=i.length,s=new Uint8Array(a);for(let u=0;u\u003ca;u+=1)s[u]=i.charCodeAt(u);return new Blob([s],{type:n})}function ge(e,t){return new Promise((r,n)=>{const i=new FileReader;i.onload=()=>r(i.result),i.onerror=()=>n(i.error),i.onabort=()=>n(new Error(`Failed read blob to ${t}`)),t===\"dataUrl\"?i.readAsDataURL(e):t===\"arrayBuffer\"&&i.readAsArrayBuffer(e)})}const gt=e=>ge(e,\"dataUrl\"),mt=e=>ge(e,\"arrayBuffer\");function _(e,t){const r=J(t).createElement(\"img\");return r.decoding=\"sync\",r.loading=\"eager\",r.src=e,r}function L(e,t){return new Promise(r=>{const{timeout:n,ownerDocument:i,onError:a,onWarn:s}=t!=null?t:{},o=typeof e==\"string\"?_(e,J(i)):e;let c=null,u=null;function l(){r(o),c&&clearTimeout(c),u==null||u()}if(n&&(c=setTimeout(l,n)),Y(o)){const d=o.currentSrc||o.src;if(!d)return o.poster?L(o.poster,t).then(r):l();if(o.readyState>=2)return l();const m=l,f=h=>{s==null||s(\"Failed video load\",d,h),a==null||a(h),l()};u=()=>{o.removeEventListener(\"loadeddata\",m),o.removeEventListener(\"error\",f)},o.addEventListener(\"loadeddata\",m,{once:!0}),o.addEventListener(\"error\",f,{once:!0})}else{const d=ce(o)?o.href.baseVal:o.currentSrc||o.src;if(!d)return l();const m=()=>C(this,null,function*(){if($(o)&&\"decode\"in o)try{yield o.decode()}catch(h){s==null||s(\"Failed to decode image, trying to render anyway\",o.dataset.originalSrc||d,h)}l()}),f=h=>{s==null||s(\"Failed image load\",o.dataset.originalSrc||d,h),l()};if($(o)&&o.complete)return m();u=()=>{o.removeEventListener(\"load\",m),o.removeEventListener(\"error\",f)},o.addEventListener(\"load\",m,{once:!0}),o.addEventListener(\"error\",f,{once:!0})}})}function me(e,t){return C(this,null,function*(){V(e)&&($(e)||Y(e)?yield L(e,t):yield Promise.all([\"img\",\"video\"].flatMap(r=>Array.from(e.querySelectorAll(r)).map(n=>L(n,t)))))})}const he=function(){let t=0;const r=()=>`0000${(Math.random()*Oe(36,4)\u003c\u003c0).toString(36)}`.slice(-4);return()=>(t+=1,`u${r()}${t}`)}();function we(e){return e==null?void 0:e.split(\",\").map(t=>t.trim().replace(/\"|'/g,\"\").toLowerCase()).filter(Boolean)}let pe=0;function ht(e){const t=`${se}[#${pe}]`;return pe++,{time:r=>e&&console.time(`${t} ${r}`),timeEnd:r=>e&&console.timeEnd(`${t} ${r}`),warn:(...r)=>e&&ct(...r)}}function wt(e){return{cache:e?\"no-cache\":\"force-cache\"}}function k(e,t){return C(this,null,function*(){return Ge(e)?e:ye(e,M(D({},t),{autoDestruct:!0}))})}function ye(e,t){return C(this,null,function*(){var f,h,g,p,E;const{scale:r=1,workerUrl:n,workerNumber:i=1}=t||{},a=!!(t!=null&&t.debug),s=(f=t==null?void 0:t.features)!=null?f:!0,o=(h=e.ownerDocument)!=null?h:U?window.document:void 0,c=(p=(g=e.ownerDocument)==null?void 0:g.defaultView)!=null?p:U?window:void 0,u=new Map,l=M(D({width:0,height:0,quality:1,type:\"image/png\",scale:r,backgroundColor:null,style:null,filter:null,maximumCanvasSize:0,timeout:3e4,progress:null,debug:a,fetch:D({requestInit:wt((E=t==null?void 0:t.fetch)==null?void 0:E.bypassingCache),placeholderImage:\"data:image/png;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\",bypassingCache:!1},t==null?void 0:t.fetch),fetchFn:null,font:{},drawImageInterval:100,workerUrl:null,workerNumber:i,onCloneEachNode:null,onCloneNode:null,onEmbedNode:null,onCreateForeignObjectSvg:null,includeStyleProperties:null,autoDestruct:!1},t),{__CONTEXT__:!0,log:ht(a),node:e,ownerDocument:o,ownerWindow:c,dpi:r===1?null:96*r,svgStyleElement:be(o),svgDefsElement:o==null?void 0:o.createElementNS(K,\"defs\"),svgStyles:new Map,defaultComputedStyles:new Map,workers:[...Array.from({length:ze&&n&&i?i:0})].map(()=>{try{const b=new Worker(n);return b.onmessage=w=>C(this,null,function*(){var A,F,B,$e;const{url:S,result:T}=w.data;T?(F=(A=u.get(S))==null?void 0:A.resolve)==null||F.call(A,T):($e=(B=u.get(S))==null?void 0:B.reject)==null||$e.call(B,new Error(`Error receiving message from worker: ${S}`))}),b.onmessageerror=w=>{var T,A;const{url:S}=w.data;(A=(T=u.get(S))==null?void 0:T.reject)==null||A.call(T,new Error(`Error receiving message from worker: ${S}`))},b}catch(b){return l.log.warn(\"Failed to new Worker\",b),null}}).filter(Boolean),fontFamilies:new Map,fontCssTexts:new Map,acceptOfImage:`${[ut(o)&&\"image/webp\",\"image/svg+xml\",\"image/*\",\"*/*\"].filter(Boolean).join(\",\")};q=0.8`,requests:u,drawImageCount:0,tasks:[],features:s,isEnable:b=>{var w,S;return b===\"restoreScrollPosition\"?typeof s==\"boolean\"?!1:(w=s[b])!=null?w:!1:typeof s==\"boolean\"?s:(S=s[b])!=null?S:!0},shadowRoots:[]});l.log.time(\"wait until load\"),yield me(e,{timeout:l.timeout,onWarn:l.log.warn}),l.log.timeEnd(\"wait until load\");const{width:d,height:m}=pt(e,l);return l.width=d,l.height=m,l})}function be(e){if(!e)return;const t=e.createElement(\"style\"),r=t.ownerDocument.createTextNode(`\n.______background-clip--text {\n background-clip: text;\n -webkit-background-clip: text;\n}\n`);return t.appendChild(r),t}function pt(e,t){let{width:r,height:n}=t;if(I(e)&&(!r||!n)){const i=e.getBoundingClientRect();r=r||i.width||Number(e.getAttribute(\"width\"))||0,n=n||i.height||Number(e.getAttribute(\"height\"))||0}return{width:r,height:n}}function yt(e,t){return C(this,null,function*(){const{log:r,timeout:n,drawImageCount:i,drawImageInterval:a}=t;r.time(\"image to canvas\");const s=yield L(e,{timeout:n,onWarn:t.log.warn}),{canvas:o,context2d:c}=bt(e.ownerDocument,t),u=()=>{try{c==null||c.drawImage(s,0,0,o.width,o.height)}catch(l){t.log.warn(\"Failed to drawImage\",l)}};if(u(),t.isEnable(\"fixSvgXmlDecode\"))for(let l=0;l\u003ci;l++)yield new Promise(d=>{setTimeout(()=>{c==null||c.clearRect(0,0,o.width,o.height),u(),d()},l+a)});return t.drawImageCount=0,r.timeEnd(\"image to canvas\"),o})}function bt(e,t){const{width:r,height:n,scale:i,backgroundColor:a,maximumCanvasSize:s}=t,o=e.createElement(\"canvas\");o.width=Math.floor(r*i),o.height=Math.floor(n*i),o.style.width=`${r}px`,o.style.height=`${n}px`,s&&(o.width>s||o.height>s)&&(o.width>s&&o.height>s?o.width>o.height?(o.height*=s/o.width,o.width=s):(o.width*=s/o.height,o.height=s):o.width>s?(o.height*=s/o.width,o.width=s):(o.width*=s/o.height,o.height=s));const c=o.getContext(\"2d\");return c&&a&&(c.fillStyle=a,c.fillRect(0,0,o.width,o.height)),{canvas:o,context2d:c}}function Se(e,t){if(e.ownerDocument)try{const a=e.toDataURL();if(a!==\"data:,\")return _(a,e.ownerDocument)}catch(a){t.log.warn(\"Failed to clone canvas\",a)}const r=e.cloneNode(!1),n=e.getContext(\"2d\"),i=r.getContext(\"2d\");try{return n&&i&&i.putImageData(n.getImageData(0,0,e.width,e.height),0,0),r}catch(a){t.log.warn(\"Failed to clone canvas\",a)}return r}function St(e,t){var r;try{if((r=e==null?void 0:e.contentDocument)!=null&&r.documentElement)return ne(e.contentDocument.documentElement,t)}catch(n){t.log.warn(\"Failed to clone iframe\",n)}return e.cloneNode(!1)}function Et(e){const t=e.cloneNode(!1);return e.currentSrc&&e.currentSrc!==e.src&&(t.src=e.currentSrc,t.srcset=\"\"),t.loading===\"lazy\"&&(t.loading=\"eager\"),t}function Ct(e,t){return C(this,null,function*(){if(e.ownerDocument&&!e.currentSrc&&e.poster)return _(e.poster,e.ownerDocument);const r=e.cloneNode(!1);r.crossOrigin=\"anonymous\",e.currentSrc&&e.currentSrc!==e.src&&(r.src=e.currentSrc);const n=r.ownerDocument;if(n){let i=!0;if(yield L(r,{onError:()=>i=!1,onWarn:t.log.warn}),!i)return e.poster?_(e.poster,e.ownerDocument):r;r.currentTime=e.currentTime,yield new Promise(s=>{r.addEventListener(\"seeked\",s,{once:!0})});const a=n.createElement(\"canvas\");a.width=e.offsetWidth,a.height=e.offsetHeight;try{const s=a.getContext(\"2d\");s&&s.drawImage(r,0,0,a.width,a.height)}catch(s){return t.log.warn(\"Failed to clone video\",s),e.poster?_(e.poster,e.ownerDocument):r}return Se(a,t)}return r})}function Tt(e,t){return tt(e)?Se(e,t):lt(e)?St(e,t):$(e)?Et(e):Y(e)?Ct(e,t):e.cloneNode(!1)}function vt(e){let t=e.sandbox;if(!t){const{ownerDocument:r}=e;try{r&&(t=r.createElement(\"iframe\"),t.id=`__SANDBOX__${he()}`,t.width=\"0\",t.height=\"0\",t.style.visibility=\"hidden\",t.style.position=\"fixed\",r.body.appendChild(t),t.srcdoc='\u003c!DOCTYPE html>\u003cmeta charset=\"UTF-8\">\u003ctitle>\u003c/title>\u003cbody>',e.sandbox=t)}catch(n){e.log.warn(\"Failed to getSandBox\",n)}}return t}const At=[\"width\",\"height\",\"-webkit-text-fill-color\"],Nt=[\"stroke\",\"fill\"];function Ee(e,t,r){const{defaultComputedStyles:n}=r,i=e.nodeName.toLowerCase(),a=H(e)&&i!==\"svg\",s=a?Nt.map(g=>[g,e.getAttribute(g)]).filter(([,g])=>g!==null):[],o=[a&&\"svg\",i,s.map((g,p)=>`${g}=${p}`).join(\",\"),t].filter(Boolean).join(\":\");if(n.has(o))return n.get(o);const c=vt(r),u=c==null?void 0:c.contentWindow;if(!u)return new Map;const l=u==null?void 0:u.document;let d,m;a?(d=l.createElementNS(K,\"svg\"),m=d.ownerDocument.createElementNS(d.namespaceURI,i),s.forEach(([g,p])=>{m.setAttributeNS(null,g,p)}),d.appendChild(m)):d=m=l.createElement(i),m.textContent=\" \",l.body.appendChild(d);const f=u.getComputedStyle(m,t),h=new Map;for(let g=f.length,p=0;p\u003cg;p++){const E=f.item(p);At.includes(E)||h.set(E,f.getPropertyValue(E))}return l.body.removeChild(d),n.set(o,h),h}function Ce(e,t,r){var o;const n=new Map,i=[],a=new Map;if(r)for(const c of r)s(c);else for(let c=e.length,u=0;u\u003cc;u++){const l=e.item(u);s(l)}for(let c=i.length,u=0;u\u003cc;u++)(o=a.get(i[u]))==null||o.forEach((l,d)=>n.set(d,l));function s(c){const u=e.getPropertyValue(c),l=e.getPropertyPriority(c),d=c.lastIndexOf(\"-\"),m=d>-1?c.substring(0,d):void 0;if(m){let f=a.get(m);f||(f=new Map,a.set(m,f)),f.set(c,[u,l])}t.get(c)===u&&!l||(m?i.push(m):n.set(c,[u,l]))}return n}function Rt(e,t,r,n){var d,m,f,h;const{ownerWindow:i,includeStyleProperties:a,currentParentNodeStyle:s}=n,o=t.style,c=i.getComputedStyle(e),u=Ee(e,null,n);s==null||s.forEach((g,p)=>{u.delete(p)});const l=Ce(c,u,a);l.delete(\"transition-property\"),l.delete(\"all\"),l.delete(\"d\"),l.delete(\"content\"),r&&(l.delete(\"position\"),l.delete(\"margin-top\"),l.delete(\"margin-right\"),l.delete(\"margin-bottom\"),l.delete(\"margin-left\"),l.delete(\"margin-block-start\"),l.delete(\"margin-block-end\"),l.delete(\"margin-inline-start\"),l.delete(\"margin-inline-end\"),l.set(\"box-sizing\",[\"border-box\",\"\"])),((d=l.get(\"background-clip\"))==null?void 0:d[0])===\"text\"&&t.classList.add(\"______background-clip--text\"),le&&(l.has(\"font-kerning\")||l.set(\"font-kerning\",[\"normal\",\"\"]),(((m=l.get(\"overflow-x\"))==null?void 0:m[0])===\"hidden\"||((f=l.get(\"overflow-y\"))==null?void 0:f[0])===\"hidden\")&&((h=l.get(\"text-overflow\"))==null?void 0:h[0])===\"ellipsis\"&&e.scrollWidth===e.clientWidth&&l.set(\"text-overflow\",[\"clip\",\"\"]));for(let g=o.length,p=0;p\u003cg;p++)o.removeProperty(o.item(p));return l.forEach(([g,p],E)=>{o.setProperty(E,g,p)}),l}function It(e,t){(rt(e)||nt(e)||st(e))&&t.setAttribute(\"value\",e.value)}const kt=[\"::before\",\"::after\"],Dt=[\"::-webkit-scrollbar\",\"::-webkit-scrollbar-button\",\"::-webkit-scrollbar-thumb\",\"::-webkit-scrollbar-track\",\"::-webkit-scrollbar-track-piece\",\"::-webkit-scrollbar-corner\",\"::-webkit-resizer\"];function Pt(e,t,r,n,i){const{ownerWindow:a,svgStyleElement:s,svgStyles:o,currentNodeStyle:c}=n;if(!s||!a)return;function u(l){var w;const d=a.getComputedStyle(e,l);let m=d.getPropertyValue(\"content\");if(!m||m===\"none\")return;i==null||i(m),m=m.replace(/(')|(\")|(counter\\(.+\\))/g,\"\");const f=[he()],h=Ee(e,l,n);c==null||c.forEach((S,T)=>{h.delete(T)});const g=Ce(d,h,n.includeStyleProperties);g.delete(\"content\"),g.delete(\"-webkit-locale\"),((w=g.get(\"background-clip\"))==null?void 0:w[0])===\"text\"&&t.classList.add(\"______background-clip--text\");const p=[`content: '${m}';`];if(g.forEach(([S,T],A)=>{p.push(`${A}: ${S}${T?\" !important\":\"\"};`)}),p.length===1)return;try{t.className=[t.className,...f].join(\" \")}catch(S){n.log.warn(\"Failed to copyPseudoClass\",S);return}const E=p.join(`\n `);let b=o.get(E);b||(b=[],o.set(E,b)),b.push(`.${f[0]}${l}`)}kt.forEach(u),r&&Dt.forEach(u)}const Te=new Set([\"symbol\"]);function ve(e,t,r,n,i){return C(this,null,function*(){if(I(r)&&(ot(r)||at(r))||n.filter&&!n.filter(r))return;Te.has(t.nodeName)||Te.has(r.nodeName)?n.currentParentNodeStyle=void 0:n.currentParentNodeStyle=n.currentNodeStyle;const a=yield ne(r,n,!1,i);n.isEnable(\"restoreScrollPosition\")&&Ut(e,a),t.appendChild(a)})}function Ae(e,t,r,n){return C(this,null,function*(){var a;let i=e.firstChild;I(e)&&e.shadowRoot&&(i=(a=e.shadowRoot)==null?void 0:a.firstChild,r.shadowRoots.push(e.shadowRoot));for(let s=i;s;s=s.nextSibling)if(!Ze(s))if(I(s)&&it(s)&&typeof s.assignedNodes==\"function\"){const o=s.assignedNodes();for(let c=0;c\u003co.length;c++)yield ve(e,t,o[c],r,n)}else yield ve(e,t,s,r,n)})}function Ut(e,t){if(!V(e)||!V(t))return;const{scrollTop:r,scrollLeft:n}=e;if(!r&&!n)return;const{transform:i}=t.style,a=new DOMMatrix(i),{a:s,b:o,c,d:u}=a;a.a=1,a.b=0,a.c=0,a.d=1,a.translateSelf(-n,-r),a.a=s,a.b=o,a.c=c,a.d=u,t.style.transform=a.toString()}function _t(e,t){const{backgroundColor:r,width:n,height:i,style:a}=t,s=e.style;if(r&&s.setProperty(\"background-color\",r,\"important\"),n&&s.setProperty(\"width\",`${n}px`,\"important\"),i&&s.setProperty(\"height\",`${i}px`,\"important\"),a)for(const o in a)s[o]=a[o]}const Ft=/^[\\w-:]+$/;function ne(e,t,r=!1,n){return C(this,null,function*(){var u,l,d,m;const{ownerDocument:i,ownerWindow:a,fontFamilies:s,onCloneEachNode:o}=t;if(i&&et(e))return n&&/\\S/.test(e.data)&&n(e.data),i.createTextNode(e.data);if(i&&a&&I(e)&&(V(e)||H(e))){const f=yield Tt(e,t);if(t.isEnable(\"removeAbnormalAttributes\")){const w=f.getAttributeNames();for(let S=w.length,T=0;T\u003cS;T++){const A=w[T];Ft.test(A)||f.removeAttribute(A)}}const h=t.currentNodeStyle=Rt(e,f,r,t);r&&_t(f,t);let g=!1;if(t.isEnable(\"copyScrollbar\")){const w=[(u=h.get(\"overflow-x\"))==null?void 0:u[0],(l=h.get(\"overflow-y\"))==null?void 0:l[0]];g=w.includes(\"scroll\")||(w.includes(\"auto\")||w.includes(\"overlay\"))&&(e.scrollHeight>e.clientHeight||e.scrollWidth>e.clientWidth)}const p=(d=h.get(\"text-transform\"))==null?void 0:d[0],E=we((m=h.get(\"font-family\"))==null?void 0:m[0]),b=E?w=>{p===\"uppercase\"?w=w.toUpperCase():p===\"lowercase\"?w=w.toLowerCase():p===\"capitalize\"&&(w=w[0].toUpperCase()+w.substring(1)),E.forEach(S=>{let T=s.get(S);T||s.set(S,T=new Set),w.split(\"\").forEach(A=>T.add(A))})}:void 0;return Pt(e,f,g,t,b),It(e,f),Y(e)||(yield Ae(e,f,t,b)),yield o==null?void 0:o(f),f}const c=e.cloneNode(!1);return yield Ae(e,c,t),yield o==null?void 0:o(c),c})}function Ne(e){if(e.ownerDocument=void 0,e.ownerWindow=void 0,e.svgStyleElement=void 0,e.svgDefsElement=void 0,e.svgStyles.clear(),e.defaultComputedStyles.clear(),e.sandbox){try{e.sandbox.remove()}catch(t){e.log.warn(\"Failed to destroyContext\",t)}e.sandbox=void 0}e.workers=[],e.fontFamilies.clear(),e.fontCssTexts.clear(),e.requests.clear(),e.tasks=[],e.shadowRoots=[]}function Bt(e){const o=e,{url:t,timeout:r,responseType:n}=o,i=je(o,[\"url\",\"timeout\",\"responseType\"]),a=new AbortController,s=r?setTimeout(()=>a.abort(),r):void 0;return fetch(t,D({signal:a.signal},i)).then(c=>{if(!c.ok)throw new Error(\"Failed fetch, not 2xx response\",{cause:c});switch(n){case\"arrayBuffer\":return c.arrayBuffer();case\"dataUrl\":return c.blob().then(gt);case\"text\":default:return c.text()}}).finally(()=>clearTimeout(s))}function z(e,t){const{url:r,requestType:n=\"text\",responseType:i=\"text\",imageDom:a}=t;let s=r;const{timeout:o,acceptOfImage:c,requests:u,fetchFn:l,fetch:{requestInit:d,bypassingCache:m,placeholderImage:f},font:h,workers:g,fontFamilies:p}=e;n===\"image\"&&(G||te)&&e.drawImageCount++;let E=u.get(r);if(!E){m&&m instanceof RegExp&&m.test(s)&&(s+=(/\\?/.test(s)?\"&\":\"?\")+new Date().getTime());const b=n.startsWith(\"font\")&&h&&h.minify,w=new Set;b&&n.split(\";\")[1].split(\",\").forEach(F=>{p.has(F)&&p.get(F).forEach(B=>w.add(B))});const S=b&&w.size,T=D({url:s,timeout:o,responseType:S?\"arrayBuffer\":i,headers:n===\"image\"?{accept:c}:void 0},d);E={type:n,resolve:void 0,reject:void 0,response:null},E.response=C(this,null,function*(){if(l&&n===\"image\"){const A=yield l(r);if(A)return A}return!G&&r.startsWith(\"http\")&&g.length?new Promise((A,F)=>{g[u.size&g.length-1].postMessage(D({rawUrl:r},T)),E.resolve=A,E.reject=F}):Bt(T)}).catch(A=>{if(u.delete(r),n===\"image\"&&f)return e.log.warn(\"Failed to fetch image base64, trying to use placeholder image\",s),typeof f==\"string\"?f:f(a);throw A}),u.set(r,E)}return E.response}function Re(e,t,r,n){return C(this,null,function*(){if(!Ie(e))return e;for(const[i,a]of $t(e,t))try{const s=yield z(r,{url:a,requestType:n?\"image\":\"text\",responseType:\"dataUrl\"});e=e.replace(Lt(i),`$1${s}$3`)}catch(s){r.log.warn(\"Failed to fetch css data url\",i,s)}return e})}function Ie(e){return/url\\((['\"]?)([^'\"]+?)\\1\\)/.test(e)}const ke=/url\\((['\"]?)([^'\"]+?)\\1\\)/g;function $t(e,t){const r=[];return e.replace(ke,(n,i,a)=>(r.push([a,ue(a,t)]),n)),r.filter(([n])=>!re(n))}function Lt(e){const t=e.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g,\"\\\\$1\");return new RegExp(`(url\\\\(['\"]?)(${t})(['\"]?\\\\))`,\"g\")}const xt=[\"background-image\",\"border-image-source\",\"-webkit-border-image\",\"-webkit-mask-image\",\"list-style-image\"];function Mt(e,t){return xt.map(r=>{const n=e.getPropertyValue(r);return!n||n===\"none\"?null:((G||te)&&t.drawImageCount++,Re(n,null,t,!0).then(i=>{!i||n===i||e.setProperty(r,i,e.getPropertyPriority(r))}))}).filter(Boolean)}function Ot(e,t){if($(e)){const r=e.currentSrc||e.src;if(!re(r))return[z(t,{url:r,imageDom:e,requestType:\"image\",responseType:\"dataUrl\"}).then(n=>{n&&(e.srcset=\"\",e.dataset.originalSrc=r,e.src=n||\"\")})];(G||te)&&t.drawImageCount++}else if(H(e)&&!re(e.href.baseVal)){const r=e.href.baseVal;return[z(t,{url:r,imageDom:e,requestType:\"image\",responseType:\"dataUrl\"}).then(n=>{n&&(e.dataset.originalSrc=r,e.href.baseVal=n||\"\")})]}return[]}function jt(e,t){var o;const{ownerDocument:r,svgDefsElement:n}=t,i=(o=e.getAttribute(\"href\"))!=null?o:e.getAttribute(\"xlink:href\");if(!i)return[];const[a,s]=i.split(\"#\");if(s){const c=`#${s}`,u=t.shadowRoots.reduce((l,d)=>l!=null?l:d.querySelector(`svg ${c}`),r==null?void 0:r.querySelector(`svg ${c}`));if(a&&e.setAttribute(\"href\",c),n!=null&&n.querySelector(c))return[];if(u)return n==null||n.appendChild(u.cloneNode(!0)),[];if(a)return[z(t,{url:a,responseType:\"text\"}).then(l=>{n==null||n.insertAdjacentHTML(\"beforeend\",l)})]}return[]}function De(e,t){const{tasks:r}=t;I(e)&&(($(e)||ce(e))&&r.push(...Ot(e,t)),Qe(e)&&r.push(...jt(e,t))),V(e)&&r.push(...Mt(e.style,t)),e.childNodes.forEach(n=>{De(n,t)})}function qt(e,t){return C(this,null,function*(){const{ownerDocument:r,svgStyleElement:n,fontFamilies:i,fontCssTexts:a,tasks:s,font:o}=t;if(!(!r||!n||!i.size))if(o&&o.cssText){const c=Ue(o.cssText,t);n.appendChild(r.createTextNode(`${c}\n`))}else{const c=Array.from(r.styleSheets).filter(f=>{try{return\"cssRules\"in f&&!!f.cssRules.length}catch(h){return t.log.warn(`Error while reading CSS rules from ${f.href}`,h),!1}}),u=r.implementation.createHTMLDocument(\"\"),l=u.createElement(\"style\");u.head.appendChild(l);const d=l.sheet;yield Promise.all(c.flatMap(f=>Array.from(f.cssRules).map(h=>C(this,null,function*(){if(Je(h)){const g=h.href;let p=\"\";try{p=yield z(t,{url:g,requestType:\"text\",responseType:\"text\"})}catch(b){t.log.warn(`Error fetch remote css import from ${g}`,b)}const E=p.replace(ke,(b,w,S)=>b.replace(S,ue(S,g)));for(const b of Ht(E))try{d.insertRule(b,d.cssRules.length)}catch(w){t.log.warn(\"Error inserting rule from remote css import\",{rule:b,error:w})}}})))),d.cssRules.length&&c.push(d);const m=[];c.forEach(f=>{oe(f.cssRules,m)}),m.filter(f=>{var h;return Ye(f)&&Ie(f.style.getPropertyValue(\"src\"))&&((h=we(f.style.getPropertyValue(\"font-family\")))==null?void 0:h.some(g=>i.has(g)))}).forEach(f=>{const h=f,g=a.get(h.cssText);g?n.appendChild(r.createTextNode(`${g}\n`)):s.push(Re(h.cssText,h.parentStyleSheet?h.parentStyleSheet.href:null,t).then(p=>{p=Ue(p,t),a.set(h.cssText,p),n.appendChild(r.createTextNode(`${p}\n`))}))})}})}const Wt=/(\\/\\*[\\s\\S]*?\\*\\/)/g,Pe=/((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})/gi;function Ht(e){if(e==null)return[];const t=[];let r=e.replace(Wt,\"\");for(;;){const a=Pe.exec(r);if(!a)break;t.push(a[0])}r=r.replace(Pe,\"\");const n=/@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi,i=new RegExp(\"((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})\",\"gi\");for(;;){let a=n.exec(r);if(a)i.lastIndex=n.lastIndex;else if(a=i.exec(r),a)n.lastIndex=i.lastIndex;else break;t.push(a[0])}return t}const Vt=/url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g,zt=/src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g;function Ue(e,t){const{font:r}=t,n=r?r==null?void 0:r.preferredFormat:void 0;return n?e.replace(zt,i=>{for(;;){const[a,,s]=Vt.exec(i)||[];if(!s)return\"\";if(s===n)return`src: ${a};`}}):e}function oe(e,t=[]){for(const r of Array.from(e))Ke(r)?t.push(...oe(r.cssRules)):\"cssRules\"in r?oe(r.cssRules,t):t.push(r);return t}const Xt=/\\bx?link:?href\\s*=\\s*[\"'](?!data:)[^\"']+[\"']/i;function Gt(e){return Xt.test(e.innerHTML)}function _e(e,t){return C(this,null,function*(){const r=yield k(e,t);if(I(r.node)&&H(r.node)&&!Gt(r.node))return r.node;const{ownerDocument:n,log:i,tasks:a,svgStyleElement:s,svgDefsElement:o,svgStyles:c,font:u,progress:l,autoDestruct:d,onCloneNode:m,onEmbedNode:f,onCreateForeignObjectSvg:h}=r;i.time(\"clone node\");const g=yield ne(r.node,r,!0);if(s&&n){let S=\"\";c.forEach((T,A)=>{S+=`${T.join(`,\n`)} {\n ${A}\n}\n`}),s.appendChild(n.createTextNode(S))}i.timeEnd(\"clone node\"),yield m==null?void 0:m(g),u!==!1&&I(g)&&(i.time(\"embed web font\"),yield qt(g,r),i.timeEnd(\"embed web font\")),i.time(\"embed node\"),De(g,r);const p=a.length;let E=0;const b=()=>C(this,null,function*(){for(;;){const S=a.pop();if(!S)break;try{yield S}catch(T){r.log.warn(\"Failed to run task\",T)}l==null||l(++E,p)}});l==null||l(E,p),yield Promise.all([...Array.from({length:4})].map(b)),i.timeEnd(\"embed node\"),yield f==null?void 0:f(g);const w=Yt(g,r);return o&&w.insertBefore(o,w.children[0]),s&&w.insertBefore(s,w.children[0]),d&&Ne(r),yield h==null?void 0:h(w),w})}function Yt(e,t){const{width:r,height:n}=t,i=fe(r,n,e.ownerDocument),a=i.ownerDocument.createElementNS(i.namespaceURI,\"foreignObject\");return a.setAttributeNS(null,\"x\",\"0%\"),a.setAttributeNS(null,\"y\",\"0%\"),a.setAttributeNS(null,\"width\",\"100%\"),a.setAttributeNS(null,\"height\",\"100%\"),a.append(e),i.appendChild(a),i}function Q(e,t){return C(this,null,function*(){var s;const r=yield k(e,t),n=yield _e(r),i=de(n,r.isEnable(\"removeControlCharacter\"));r.autoDestruct||(r.svgStyleElement=be(r.ownerDocument),r.svgDefsElement=(s=r.ownerDocument)==null?void 0:s.createElementNS(K,\"defs\"),r.svgStyles.clear());const a=_(i,n.ownerDocument);return yield yt(a,r)})}function Jt(e,t){return C(this,null,function*(){const r=yield k(e,t),{log:n,type:i,quality:a,dpi:s}=r,o=yield Q(r);n.time(\"canvas to blob\");const c=yield ft(o,i,a);if([\"image/png\",\"image/jpeg\"].includes(i)&&s){const u=yield mt(c.slice(0,33));let l=new Uint8Array(u);return i===\"image/png\"?l=ae(l,s):i===\"image/jpeg\"&&(l=v(l,s)),n.timeEnd(\"canvas to blob\"),new Blob([l,c.slice(33)],{type:i})}return n.timeEnd(\"canvas to blob\"),c})}function x(e,t){return C(this,null,function*(){const r=yield k(e,t),{log:n,quality:i,type:a,dpi:s}=r,o=yield Q(r);n.time(\"canvas to data url\");let c=o.toDataURL(a,i);if([\"image/png\",\"image/jpeg\"].includes(a)&&s&&ie&&Xe){const[u,l]=c.split(\",\");let d=0,m=!1;if(a===\"image/png\"){const w=Ve(l);w>=0?(d=Math.ceil((w+28)/3)*4,m=!0):d=33/3*4}else a===\"image/jpeg\"&&(d=18/3*4);const f=l.substring(0,d),h=l.substring(d),g=window.atob(f),p=new Uint8Array(g.length);for(let w=0;w\u003cp.length;w++)p[w]=g.charCodeAt(w);const E=a===\"image/png\"?ae(p,s,m):v(p,s),b=window.btoa(String.fromCharCode(...E));c=[u,\",\",b,h].join(\"\")}return n.timeEnd(\"canvas to data url\"),c})}function Fe(e,t){return C(this,null,function*(){const r=yield k(e,t),{width:n,height:i,ownerDocument:a}=r,s=yield x(r),o=fe(n,i,a),c=o.ownerDocument.createElementNS(o.namespaceURI,\"image\");return c.setAttributeNS(null,\"href\",s),c.setAttributeNS(null,\"height\",\"100%\"),c.setAttributeNS(null,\"width\",\"100%\"),o.appendChild(c),de(o,r.isEnable(\"removeControlCharacter\"))})}function Kt(e,t){return C(this,null,function*(){const r=yield k(e,t),{ownerDocument:n,width:i,height:a,scale:s,type:o}=r,c=o===\"image/svg+xml\"?yield Fe(r):yield x(r),u=_(c,n);return u.width=Math.floor(i*s),u.height=Math.floor(a*s),u.style.width=`${i}px`,u.style.height=`${a}px`,u})}function Qt(e,t){return C(this,null,function*(){return x(yield k(e,M(D({},t),{type:\"image/jpeg\"})))})}function Zt(e,t){return C(this,null,function*(){const r=yield k(e,t),n=yield Q(r);return n.getContext(\"2d\").getImageData(0,0,n.width,n.height).data})}function er(e,t){return C(this,null,function*(){return x(yield k(e,M(D({},t),{type:\"image/png\"})))})}function tr(e,t){return C(this,null,function*(){return x(yield k(e,M(D({},t),{type:\"image/webp\"})))})}y.createContext=ye,y.destroyContext=Ne,y.domToBlob=Jt,y.domToCanvas=Q,y.domToDataUrl=x,y.domToForeignObjectSvg=_e,y.domToImage=Kt,y.domToJpeg=Qt,y.domToPixel=Zt,y.domToPng=er,y.domToSvg=Fe,y.domToWebp=tr,y.loadMedia=L,y.waitUntilLoad=me,Object.defineProperty(y,Symbol.toStringTag,{value:\"Module\"})});\n","content_type":"text/javascript; charset=utf-8","language":"javascript","size":29290,"content_sha256":"bb36665889124a0b6e15f16045265737449c3bdcf2712cdb08af3cfa01563e2b"},{"filename":"scripts/VERSION","content":"0.1.18\n","content_type":"text/plain; charset=utf-8","language":null,"size":7,"content_sha256":"447836d46f39c5900faf74ad6a6554b8e1fafeca1f78de0416d5f05c6e09a080"}],"content_json":{"type":"doc","content":[{"type":"paragraph","content":[{"text":"This skill gives you the tools and permission to make design that earns the name out-of-distribution craft. Work as an award-winning design director would: production-grade code, a clear POV, a deep grasp of what the client and its users need, and exceptional craft.","type":"text"}]},{"type":"paragraph","content":[{"text":"Core principles:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Finish the job. No hedging, no shortcuts: the deliverable is complete, except assets the user must provide.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Scale ambition to the surface's mode (see Modes). Persuade and Experience get full commitment: bold, distinct work with a point of view. On Operate and Read, ambition shows as precision and restraint, and patterns the visitor already knows earn their place.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Verify by looking at the rendered result at the sizes it ships at, and batch the checks: fix what one look shows before looking again, rather than screenshotting after every tweak.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Setup","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Run ","type":"text"},{"text":"\u003cskill-base-dir>/scripts/impeccable context","type":"text","marks":[{"type":"code_inline"}]},{"text":" once per session, where ","type":"text"},{"text":"\u003cskill-base-dir>","type":"text","marks":[{"type":"code_inline"}]},{"text":" is the directory that contains this SKILL.md (the skill folder, not a plugin root two levels above it); keep cwd at the user's project. That base directory resolves every ","type":"text"},{"text":".pi/skills/impeccable/scripts/impeccable \u003cverb>","type":"text","marks":[{"type":"code_inline"}]},{"text":" command in this skill and its references, and ","type":"text"},{"text":".pi/skills/impeccable/scripts","type":"text","marks":[{"type":"code_inline"}]},{"text":" is the fallback only when the runtime reports no base directory. On a Windows shell without ","type":"text"},{"text":"sh","type":"text","marks":[{"type":"code_inline"}]},{"text":", call ","type":"text"},{"text":".pi/skills/impeccable/scripts/impeccable.cmd","type":"text","marks":[{"type":"code_inline"}]},{"text":" instead. The launcher runs a self-contained binary that ships next to it or is downloaded once on first run; no Node or other runtime is required. Pass a named source file or route as ","type":"text"},{"text":"--target \u003cpath>","type":"text","marks":[{"type":"code_inline"}]},{"text":". It loads PRODUCT.md, DESIGN.md, the matching surface brief, and native-platform guidance when applicable; follow its directives and do not rerun it.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Load the request's playbook: its Commands-table reference for an explicit/implied sub-command, or ","type":"text"},{"text":"reference/new-work.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/new-work.md","title":null}}]},{"text":" for a new surface or replacement visual world. Inspect target and incumbent visual truth before editing. When the app cannot run, start with committed visual-regression goldens or screenshot fixtures; verify target and freshness against current tokens, CSS, components, or assets, resolve conflicts, and compare theme/variant captures.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"After resolving analysis and direction, read ","type":"text"},{"text":"reference/craft-floor.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/craft-floor.md","title":null}}]},{"text":" immediately before any UI edit, including small refinements. It carries the quality floor, the absolute bans, and the reflexes no detector catches. Do not load it for planning-only work.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Launcher unavailable:","type":"text","marks":[{"type":"strong"}]},{"text":" On refusal or failure, send a separate message ","type":"text"},{"text":"before the next tool call","type":"text","marks":[{"type":"strong"}]},{"text":": “Context loading did not run; I’ll read the existing project context directly.” Then read existing PRODUCT.md and DESIGN.md without inventing missing context, follow applicable steps 2–3, including reading ","type":"text"},{"text":"reference/craft-floor.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/craft-floor.md","title":null}}]},{"text":" immediately before any UI edit, and continue through permitted tools. This applies to planning and editing; launcher failure alone does not block either.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"How to design","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The brief wins.","type":"text","marks":[{"type":"strong"}]},{"text":" Honor pinned aesthetics, eras, materials, fonts, and palettes even when they conflict with a saturated-pattern warning. Redirecting a clear brief toward your taste is failure.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Refinement preserves; redesign replaces.","type":"text","marks":[{"type":"strong"}]},{"text":" Refinement keeps the incumbent identity, behavior, copy, and everything outside scope. Ask before replacing factual copy or adding claims. Redesign keeps product truth, content, function, native affordances, and constraints, but treats the old look as evidence and anti-reference; choose a replacement world in new-work and replace DESIGN.md. Never split the difference into polish on the discarded look.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Loaded symbols stay out of the decoration.","type":"text","marks":[{"type":"strong"}]},{"text":" A subject's world does not license emblems tied to militarism, supremacy, or hate movements as motifs, badges, or ornament, such as the Rising Sun flag's rays, the Confederate battle flag, or Nazi-era insignia and their stylised variants; reach for that world's neutral forms instead. Content that documents such a symbol as fact stays as it is.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Visual authority is evidence, not a filename.","type":"text","marks":[{"type":"strong"}]},{"text":" Missing DESIGN.md alone does not make a project greenfield; new-work decides whether to preserve, expand, or replace the incumbent world.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Modes","type":"text"}]},{"type":"paragraph","content":[{"text":"The mode names what the visitor's success looks like on this surface.","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Persuade:","type":"text","marks":[{"type":"strong"}]},{"text":" the visitor decides and acts; design is the product. Landing pages, marketing, campaigns, pricing. Earn attention and action. Ship real imagery when the brief needs it; follow the committed world, not category habit.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Operate:","type":"text","marks":[{"type":"strong"}]},{"text":" the visitor completes a task. App UI, dashboards, editors, admin, settings, tools. Scanability, consistency, native expectations, and the real usage scene outrank expression. Brand lives in precise details.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read:","type":"text","marks":[{"type":"strong"}]},{"text":" the visitor understands something. Docs, articles, guides, help, changelogs. Structure for comprehension, then make the reading experience worth staying in.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Experience:","type":"text","marks":[{"type":"strong"}]},{"text":" the visitor is inside the work itself. Portfolios, galleries, showcases. Let the artifact lead from the first viewport; the interface recedes.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Choose the mode from the requested surface, not the product, and persist it only in that surface brief. A tool's landing page is still Persuade; a fashion house's documentation is still Read; a docs index is Read, not Persuade. See ","type":"text"},{"text":"new-work.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/new-work.md","title":null}}]},{"text":" for new surfaces and ","type":"text"},{"text":"operate.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/operate.md","title":null}}]},{"text":" for deeper Operate/Read guidance.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Commands","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Command","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Category","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Reference","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"craft [feature]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Build","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Deprecated alias for an ordinary new-work request","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/craft.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/craft.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"shape [feature]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Build","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Plan UX/UI before writing code","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/shape.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/shape.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"init","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Build","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Capture durable product context in PRODUCT.md","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/init.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/init.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"document","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Build","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Generate DESIGN.md from existing project code","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/document.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/document.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"extract [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Build","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Pull reusable tokens and components into design system","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/extract.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/extract.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"critique [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Evaluate","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"UX design review with heuristic scoring","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/critique.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/critique.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"audit [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Evaluate","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Technical quality checks (a11y, perf, responsive)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/audit.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/audit.md","title":null}}]},{"text":" · native: ","type":"text"},{"text":"reference/audit.native.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/audit.native.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"polish [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Refine","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Final quality pass before shipping","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/polish.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/polish.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bolder [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Refine","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Amplify safe or bland designs","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/bolder.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/bolder.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"quieter [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Refine","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Tone down aggressive or overstimulating designs","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/quieter.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/quieter.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"distill [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Refine","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Strip to essence, remove complexity","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/distill.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/distill.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"harden [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Refine","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Production-ready: errors, i18n, edge cases","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/harden.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/harden.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"onboard [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Refine","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Design first-run flows, empty states, activation","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/onboard.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/onboard.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"animate [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Enhance","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Add purposeful animations and motion","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/animate.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/animate.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"colorize [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Enhance","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Add strategic color to monochromatic UIs","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/colorize.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/colorize.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"typeset [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Enhance","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Improve typography hierarchy and fonts","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/typeset.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/typeset.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"layout [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Enhance","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Fix spacing, rhythm, and visual hierarchy","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/layout.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/layout.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"delight [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Enhance","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Add personality and memorable touches","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/delight.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/delight.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"overdrive [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Enhance","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Push past conventional limits","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/overdrive.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/overdrive.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"clarify [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Fix","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Improve UX copy, labels, and error messages","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/clarify.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/clarify.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"adapt [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Fix","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Adapt for different devices and screen sizes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/adapt.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/adapt.md","title":null}}]},{"text":" · native: ","type":"text"},{"text":"reference/adapt.native.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/adapt.native.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"optimize [target]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Fix","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Diagnose and fix UI performance","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/optimize.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/optimize.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"live","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Iterate","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Visual variant mode: pick elements in the browser, iterate on alternatives","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/live.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/live.md","title":null}}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"generate [n] [action] [element]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Iterate","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Variants, versions, or alternatives of a named element to choose from in the live browser; no manual picking","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reference/generate.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/generate.md","title":null}}]}]}]}]}]},{"type":"paragraph","content":[{"text":"Routing:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"No argument:","type":"text","marks":[{"type":"strong"}]},{"text":" read ","type":"text"},{"text":"routing.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/routing.md","title":null}}]},{"text":" and present its context-aware menu; never auto-run a command.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Explicit or clearly implied request to run a command:","type":"text","marks":[{"type":"strong"}]},{"text":" load its reference (native variant on native platforms) and follow it. Ask once if two commands fit.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Workflow or command-selection question:","type":"text","marks":[{"type":"strong"}]},{"text":" read ","type":"text"},{"text":"Workflow questions","type":"text","marks":[{"type":"link","attrs":{"href":"reference/routing.md#workflow-questions","title":null}}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Otherwise:","type":"text","marks":[{"type":"strong"}]},{"text":" treat the request as general design work. Missing PRODUCT.md routes a new surface or replacement world through init, then new-work; a narrow refinement of existing code proceeds on the incumbent implementation as ","type":"text"},{"text":"impeccable context","type":"text","marks":[{"type":"code_inline"}]},{"text":" directs, offering init afterward rather than blocking on it.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"teach","type":"text","marks":[{"type":"code_inline"}]},{"text":" aliases ","type":"text"},{"text":"init","type":"text","marks":[{"type":"code_inline"}]},{"text":". ","type":"text"},{"text":"craft","type":"text","marks":[{"type":"code_inline"}]},{"text":" is a deprecated alias for ordinary new-work and adds nothing. ","type":"text"},{"text":"shape","type":"text","marks":[{"type":"code_inline"}]},{"text":" owns task discovery, then enters new-work only for visual-world and surface-concept decisions.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"After init writes PRODUCT.md, resume without rerunning ","type":"text"},{"text":"impeccable context","type":"text","marks":[{"type":"code_inline"}]},{"text":"; init loads the native platform reference itself when the platform it recorded is ","type":"text"},{"text":"ios","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"android","type":"text","marks":[{"type":"code_inline"}]},{"text":", or ","type":"text"},{"text":"adaptive","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"Pin / Unpin:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":".pi/skills/impeccable/scripts/impeccable pin \u003cpin|unpin> \u003ccommand>","type":"text","marks":[{"type":"code_inline"}]},{"text":" creates or removes a standalone ","type":"text"},{"text":"/\u003ccommand>","type":"text","marks":[{"type":"code_inline"}]},{"text":" shortcut. Report the script's result concisely; relay stderr verbatim on error.","type":"text"}]},{"type":"paragraph","content":[{"text":"Hooks:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"/impeccable hooks \u003con|off|status|ignore-rule|ignore-file|ignore-value|reset>","type":"text","marks":[{"type":"code_inline"}]},{"text":" manages the design detector hook for this project (auto-runs the detector after UI file edits and surfaces findings). Load ","type":"text"},{"text":"reference/hooks.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/hooks.md","title":null}}]},{"text":" when the user invokes it with any argument.","type":"text"}]},{"type":"paragraph","content":[{"text":"Doctor:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"/impeccable doctor","type":"text","marks":[{"type":"code_inline"}]},{"text":" reports and repairs drift between this project's Impeccable artifacts (PRODUCT.md, DESIGN.md and its sidecar, config, surface briefs, the hook) and what this version reads. Load ","type":"text"},{"text":"reference/doctor.md","type":"text","marks":[{"type":"link","attrs":{"href":"reference/doctor.md","title":null}}]},{"text":" when the user invokes it, or when they ask what is out of date, stale, or needs refreshing. A ","type":"text"},{"text":"CONTEXT_STALE","type":"text","marks":[{"type":"code_inline"}]},{"text":" directive in Setup's output is the cheap subset of the same report; act on it there per its own instructions rather than running doctor unasked.","type":"text"}]},{"type":"paragraph","content":[{"text":"Never repair drift as a side effect of a design task.","type":"text","marks":[{"type":"strong"}]},{"text":" A ","type":"text"},{"text":"CONTEXT_STALE","type":"text","marks":[{"type":"code_inline"}]},{"text":" finding is reported, not acted on, unless the user asks. The one exception is a finding marked ","type":"text"},{"text":"auto","type":"text","marks":[{"type":"code_inline"}]},{"text":", which the next write to that file performs anyway.","type":"text"}]}]},"metadata":{"date":"2026-11-02","name":"impeccable","author":"@skillopedia","source":{"stars":100262,"repo_name":"impeccable","origin_url":"https://github.com/pbakaus/impeccable/blob/HEAD/.pi/skills/impeccable/SKILL.md","repo_owner":"pbakaus","body_sha256":"1771f63c1b51d5546399698b981da70e601662997045ba67215338a5435b6279","cluster_key":"1239fdc14fd1032cc900510decc86ecb041641efa730cf27723fb342bb913594","clean_bundle":{"format":"clean-skill-bundle-v1","source":"pbakaus/impeccable/.pi/skills/impeccable/SKILL.md","text_bytes":526836,"source_commit":"c3c94b960276a42a235d1ff68e9954a342e5407e","skills_sh_rank":244,"attachment_count":54,"text_attachments":54,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":".pi/skills/impeccable/SKILL.md","import_metadata":{"date":"2026-11-02","author":"@skillopedia","version":"4.8.0","category":"design-ux","category_label":"Design"},"exact_dupes_collapsed_into_this":0},"license":"Apache 2.0","version":"4.8.0","category":"design-ux","import_tag":"skills-sh-top20k-2026-11","description":"Use when the user wants to design, redesign, shape, critique, audit, polish, simplify, harden, animate, or otherwise improve a frontend interface: websites, landing pages, dashboards, product UI, components, forms, settings, onboarding, empty states, and native iOS or Android screens. Handles UX review, hierarchy, layout, typography, color, motion, UX copy, accessibility, responsive behavior, edge cases, and capturing or documenting design systems (DESIGN.md, tokens). Also for making bland UI bolder, loud UI quieter, or ambitious visual effects. Not for backend-only or non-UI tasks.","allowed-tools":["Bash(npx impeccable *)","Bash(.pi/skills/impeccable/scripts/impeccable *)"]}},"renderedAt":1793777137198}

This skill gives you the tools and permission to make design that earns the name out-of-distribution craft. Work as an award-winning design director would: production-grade code, a clear POV, a deep grasp of what the client and its users need, and exceptional craft. Core principles: - Finish the job. No hedging, no shortcuts: the deliverable is complete, except assets the user must provide. - Scale ambition to the surface's mode (see Modes). Persuade and Experience get full commitment: bold, distinct work with a point of view. On Operate and Read, ambition shows as precision and restraint, an…