diff --git a/build.mjs b/build.mjs index 3cdd6f6..f62d166 100644 --- a/build.mjs +++ b/build.mjs @@ -15,7 +15,7 @@ await cp(join(root, 'static'), out, { recursive: true }); // Fingerprint CSS/JS so a new deploy never reuses a stale cached copy. const hashOf = async (f) => createHash('sha256').update(await readFile(join(root, 'static', f))).digest('hex').slice(0, 10); -const assetVersions = { '/assets/styles.css': await hashOf('assets/styles.css'), '/assets/site.js': await hashOf('assets/site.js') }; +const assetVersions = Object.fromEntries(await Promise.all(['styles.css', 'site.js', 'home.css', 'home.js', 'fonts.css'].map(async (f) => ['/assets/' + f, await hashOf('assets/' + f)]))); const fingerprint = (html) => Object.entries(assetVersions).reduce((h, [u, v]) => h.replaceAll(`"${u}"`, `"${u}?v=${v}"`), html); const urls = []; diff --git a/src/layout.mjs b/src/layout.mjs index ce9e063..f28c72e 100644 --- a/src/layout.mjs +++ b/src/layout.mjs @@ -61,13 +61,13 @@ export function icon(name, cls = '') { // Dylan Mazzei monogram: italic "D" (inherits text color) and the sky-blue blade. export const mark = (cls = 'logo-mark') => ``; -export const logo = () => `${mark()}Dylan Mazzei`; +export const logo = () => `${mark()}Dylan Mazzei`; export const eyebrow = (t) => `${t}`; export function btn(text, href, variant = 'primary', extra = '') { const ext = /^https?:/.test(href) ? ' target="_blank" rel="noopener"' : ''; - return `${text} ${icon('arrow')}`; + return `${text}${icon('arrow')}`; } export function textLink(text, href) { @@ -126,13 +126,13 @@ function nav(path) { `; } @@ -184,7 +184,7 @@ function footer() { `; } -export function page({ path, title, description, body, schema = [] }) { +export function page({ path, title, description, body, schema = [], head = '', scripts = '' }) { const canonical = SITE.url + path; const person = { '@context': 'https://schema.org', @@ -206,8 +206,7 @@ export function page({ path, title, description, body, schema = [] }) { ${title} - - + @@ -222,18 +221,24 @@ export function page({ path, title, description, body, schema = [] }) { - + + + - +${head} + ${ld} + + ${nav(path)}
${body}
${footer()} +${scripts} `; diff --git a/src/pages/contact.mjs b/src/pages/contact.mjs index fe78130..aa829ee 100644 --- a/src/pages/contact.mjs +++ b/src/pages/contact.mjs @@ -50,7 +50,7 @@ export default {
- +

diff --git a/src/pages/home.mjs b/src/pages/home.mjs index ea8faa4..beb43a0 100644 --- a/src/pages/home.mjs +++ b/src/pages/home.mjs @@ -1,109 +1,181 @@ import { icon, eyebrow, btn, textLink, mark } from '../layout.mjs'; const ventures = [ - ['search', 'MARKETING & AI SEARCH', 'Leading teams through a constantly changing search landscape.'], - ['chip', 'AI SOFTWARE', 'Building around new opportunities created by AI.'], - ['bottle', 'SPIRITS', 'Taking a consumer brand from idea to market.'], - ['edu', 'EDUCATION TECHNOLOGY', 'Creating technology designed for real classrooms.'], - ['shield', 'CYBERSECURITY', 'Solving security challenges for growing businesses.'], - ['bag', 'E-COMMERCE', 'Turning product ideas into businesses built around real customers.'], + ['search', 'MARKETING & AI SEARCH'], + ['chip', 'AI SOFTWARE'], + ['bottle', 'SPIRITS'], + ['edu', 'EDUCATION TECHNOLOGY'], + ['shield', 'CYBERSECURITY'], + ['bag', 'E-COMMERCE'], ]; const exits = [ - ['umbrella', 'Insurance', 'I grew an insurance business around strong client relationships, a clear understanding of the market, and service people could trust.'], - ['megaphone', 'Marketing', 'Led an agency focused on helping businesses reach the right audiences, strengthen their presence, and turn attention into growth.'], - ['heart', 'Home Healthcare', 'Grew a people-first business in an industry where trust, quality of care, and responsible leadership mattered every day.'], - ['shirt', 'Apparel', 'Took a consumer concept into the market, shaping the product, brand, and customer experience from the ground up.'], + ['Insurance', 'I grew an insurance business around strong client relationships, a clear understanding of the market, and service people could trust.', ''], + ['Marketing', 'Led an agency focused on helping businesses reach the right audiences, strengthen their presence, and turn attention into growth.', ''], + ['Home Healthcare', 'Grew a people-first business in an industry where trust, quality of care, and responsible leadership mattered every day.', ''], + ['Apparel', 'Took a consumer concept into the market, shaping the product, brand, and customer experience from the ground up.', ''], +]; + +const consult = [ + ['', 'We look closely at the business', ''], + ['', 'Talk through what is getting in the way', ''], + ['', 'Figure out where your attention can make the biggest difference', ''], + ['', 'Every engagement starts with a diagnostic.', 'Not because I already know the answer, but because your business deserves one that actually fits.'], ]; const ventureRows = ventures - .map(([ic, name]) => `
${icon(ic)}${name.replace('&', '&')}Active
`) + .map(([ic, name]) => `
${icon(ic)}${name}Active
`) .join(''); const exitRows = exits - .map(([, name]) => `
${icon('check', 'check')}${name}Exited
`) + .map(([name]) => `
${icon('check', 'check')}${name}Exited
`) .join(''); +const exitWords = ['Insurance.', 'Marketing.', 'Home Healthcare.', 'Apparel.']; +const arrowUR = ''; export default { path: '/', title: 'Dylan Mazzei | Founder, Operator & Entrepreneur', description: 'Meet Dylan Mazzei, a founder and operator leading ventures across AI, software, spirits, education, cybersecurity, e-commerce, and more.', + head: '', + scripts: '\n\n', body: ` -
-
-
- DYLAN MAZZEI | FOUNDER & OPERATOR -

One Good Idea Has Never Been Enough for Me.

-

I’ve spent the last eight years turning ideas into companies across marketing, AI, software, spirits, education, cybersecurity, e-commerce, and more. Four have been sold. Others are growing. And I’m nowhere near finished building.

-
${btn('MY STORY', '/about/')}
-
+
-