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>
84 lines
3.0 KiB
JavaScript
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')
|