diff --git a/README.md b/README.md index 1879ed5..9220c41 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ build.mjs Genera dist/ + sitemap.xml + robots.txt + 404.html | `/consulting/education/` | `src/pages/education.mjs` | | `/consulting/fractional/` | `src/pages/fractional.mjs` | | `/contact/` | `src/pages/contact.mjs` | +| `/contact/book/` | `src/pages/book.mjs` | | `/press/` | `src/pages/press.mjs` | ## Desarrollo @@ -44,5 +45,4 @@ Importa el repo en Vercel. `vercel.json` ya define el build (`npm run build`), l - **Press:** falta el link del artículo de Gulf Insider y confirmar su titular exacto (`FEATURE` en `src/pages/press.mjs`). - **Korrith:** falta el cargo de Dylan (el tercer campo, vacío, en `src/pages/portfolio.mjs`). - **Páginas fuera del alcance actual:** Playbook y Poetry no forman parte del sitio. Sus secciones se muestran sin botón; si se crean esas páginas, se añade el botón con su texto original del documento. -- **Calendario:** poner el link real de agenda en `SITE.calendar`. -- **Formulario de contacto:** hoy abre el cliente de correo con el mensaje prellenado. Para recibirlo directo hay que conectar un servicio (Formspree, Resend, etc.). +- **Formulario y agenda (GoHighLevel):** los IDs están en `SITE.ghl` (`src/layout.mjs`). En GoHighLevel, el formulario "Dylan – Lead Form" debe redirigir a `https://dylanmazzei.com/contact/book/` al enviarse. diff --git a/build.mjs b/build.mjs index 815054a..6640221 100644 --- a/build.mjs +++ b/build.mjs @@ -7,7 +7,7 @@ import { page, eyebrow, btn } from './src/layout.mjs'; const root = dirname(fileURLToPath(import.meta.url)); const out = join(root, 'dist'); -const pages = ['home', 'about', 'portfolio', 'consulting', 'marketing', 'business-setup', 'business-optimization', 'supply-chain', 'cybersecurity', 'education', 'fractional', 'contact', 'press']; +const pages = ['home', 'about', 'portfolio', 'consulting', 'marketing', 'business-setup', 'business-optimization', 'supply-chain', 'cybersecurity', 'education', 'fractional', 'contact', 'book', 'press']; await rm(out, { recursive: true, force: true }); await mkdir(out, { recursive: true }); @@ -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 = 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 assetVersions = Object.fromEntries(await Promise.all(['styles.css', 'site.js', 'home.css', 'home.js', 'fonts.css', 'book.js'].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 076a9cf..bf354ad 100644 --- a/src/layout.mjs +++ b/src/layout.mjs @@ -7,7 +7,13 @@ export const SITE = { linkedin: 'https://www.linkedin.com/in/dylanmazzei/', instagram: 'https://www.instagram.com/thedylanmazzei', // Replace with the real scheduling link (Calendly, Cal.com, etc.). - calendar: 'mailto:dylan@dylanmazzei.com?subject=Scheduling%20a%20conversation', + calendar: '/contact/book/', + // GoHighLevel (LeadConnector) widgets. Contacts land in Dylan's GHL account. + ghl: { + form: 'xm10A7alZrxeKDtkMkD2', // "Dylan – Lead Form" + freeCalendar: '81JqpCRit6APOwavApzh', // Free 15-min intro call with Dylan's team + vipCalendar: 'lK9IYtCRGIuA7W93WjMF', // 15-min 1:1 with Dylan ($100) + }, }; const ICONS = { @@ -194,7 +200,7 @@ function footer() { `; } -export function page({ path, title, description, body, schema = [], head = '', scripts = '' }) { +export function page({ path, title, description, body, schema = [], head = '', scripts = '', noindex = false }) { const canonical = SITE.url + path; const person = { '@context': 'https://schema.org', @@ -215,7 +221,7 @@ export function page({ path, title, description, body, schema = [], head = '', s