Files
kaiser-natron/scripts/inline-splash-paths-import.cjs
Dorian ab888d99b0 home: brand hero with in-flow splash animation, 3-product teaser, bundle imagery
Home page now opens with a BrandHero that plays the figure entrance
animation in flow (replacing the full-screen SplashIntro overlay),
followed by a 3-product Cook/Clean/Care teaser feeding the shop. Splash
paths extracted to a shared module so BrandHero can render the same
illustration without duplicating ~500KB of SVG path strings.

ProductCard gains `cream` and `brand` tones (cream/green media wash
with white card body); homepage teaser uses `brand`, shop catalogue
switches to the green wash too. Bundle cards point at the new
/bundles/background/* artwork.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 09:40:47 +01:00

84 lines
3.0 KiB
JavaScript

#!/usr/bin/env node
// Rewrite SplashIntro.vue to import the dWide*/dPort* path constants
// from splashPaths.js instead of declaring them inline.
const fs = require('fs')
const path = require('path')
const FILE = path.join(__dirname, '..', 'src', 'components', 'SplashIntro.vue')
// File-order list, used to walk the source linearly. The import
// statement uses the same set so the order stays stable.
const NAMES_IN_FILE_ORDER = [
'dWideDark',
'dWideWhite',
'dWideLeft',
'dWideMiddle',
'dWideRight',
'dPortDark',
'dPortLeft',
'dPortRight',
'dPortTop',
'dPortMound',
]
const NAMES = NAMES_IN_FILE_ORDER
let src = fs.readFileSync(FILE, 'utf8')
// Remove each `const NAME = \`...\`` declaration (single long line per
// our writeup of the file). Tolerate trailing newline. The marker
// `/* ---- Path data ... ---- */` block comment becomes redundant once
// the constants leave; replace it with a short pointer to splashPaths.
const startMarker = '/* ---- Path data (extracted from trace-2.svg and trace.svg, then bucketed) ---- */'
const startIdx = src.indexOf(startMarker)
if (startIdx === -1) {
console.error('Path-data marker not found — splash file may have been refactored.')
process.exit(1)
}
// Strip from the marker to the end of the last constant declaration.
// Find the last constant's closing backtick + newline.
let cursor = startIdx
for (const name of NAMES) {
const constStart = src.indexOf('const ' + name, cursor)
if (constStart === -1) {
console.error('Constant', name, 'not found — aborting.')
process.exit(1)
}
cursor = constStart
}
// `cursor` is at the start of the last `const ...` line. Find the
// line's closing backtick, then the following newline.
const lastBacktickOpen = src.indexOf('`', cursor)
const lastBacktickClose = src.indexOf('`', lastBacktickOpen + 1)
const endOfLine = src.indexOf('\n', lastBacktickClose)
const removeEnd = endOfLine === -1 ? src.length : endOfLine + 1
const importStmt =
"import {\n" +
NAMES.map((n) => ' ' + n + ',').join('\n') +
"\n} from './splashPaths.js'\n"
const replacement =
'/* Path data lives in splashPaths.js — shared with BrandHero so the\n' +
' in-page brand hero can render the same illustration without\n' +
' duplicating ~500KB of SVG path strings. Regenerate via\n' +
' `node scripts/extract-splash-paths.cjs` after retracing. */\n'
src = src.slice(0, startIdx) + replacement + src.slice(removeEnd)
// Add the import at the top of the script-setup block, right after the
// existing `import { ref, ... } from 'vue'` line.
const vueImportLine = "import { ref, onMounted, onBeforeUnmount } from 'vue'"
const idx = src.indexOf(vueImportLine)
if (idx === -1) {
console.error('Vue import line not found — aborting.')
process.exit(1)
}
const insertAt = idx + vueImportLine.length
src = src.slice(0, insertAt) + '\n' + importStmt + src.slice(insertAt)
fs.writeFileSync(FILE, src)
const bytes = fs.statSync(FILE).size
console.log('Updated', FILE)
console.log('Size:', (bytes / 1024).toFixed(1), 'KB')