Add five consulting service pages
Business Optimization, Supply Chain, Cybersecurity, Education and Fractional Leadership, with copy verbatim from the content documents and the same layout as the existing service pages (shared blocks in src/service.mjs). Adds them to the Consulting menu (now two columns) and footer, restores the Consulting page links to them, and fixes a mobile overflow from card glows that were not anchored to their cards. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -7,6 +7,7 @@ Sitio de Dylan Mazzei, Founder & Operator. HTML estático generado con un script
|
||||
```
|
||||
src/layout.mjs Layout compartido: <head>, nav, footer, iconos y helpers
|
||||
src/pages/*.mjs Una página por archivo (texto literal del documento de contenido)
|
||||
src/service.mjs Bloques compartidos de las páginas de servicios de Consulting
|
||||
static/ Se copia tal cual a dist/ (CSS, JS, imágenes, favicon)
|
||||
build.mjs Genera dist/ + sitemap.xml + robots.txt + 404.html
|
||||
```
|
||||
@@ -19,6 +20,11 @@ build.mjs Genera dist/ + sitemap.xml + robots.txt + 404.html
|
||||
| `/consulting/` | `src/pages/consulting.mjs` |
|
||||
| `/consulting/marketing/` | `src/pages/marketing.mjs` |
|
||||
| `/consulting/business-setup/` | `src/pages/business-setup.mjs` |
|
||||
| `/consulting/business-optimization/` | `src/pages/business-optimization.mjs` |
|
||||
| `/consulting/supply-chain/` | `src/pages/supply-chain.mjs` |
|
||||
| `/consulting/cybersecurity/` | `src/pages/cybersecurity.mjs` |
|
||||
| `/consulting/education/` | `src/pages/education.mjs` |
|
||||
| `/consulting/fractional/` | `src/pages/fractional.mjs` |
|
||||
| `/contact/` | `src/pages/contact.mjs` |
|
||||
| `/press/` | `src/pages/press.mjs` |
|
||||
|
||||
@@ -36,6 +42,6 @@ Importa el repo en Vercel. `vercel.json` ya define el build (`npm run build`), l
|
||||
## Pendientes de contenido
|
||||
|
||||
- **Press:** confirmar el titular exacto del artículo de Gulf Magazine y su URL (`FEATURE` en `src/pages/press.mjs`).
|
||||
- **Páginas fuera del alcance actual:** Playbook, Poetry, Fractional Roles, Business Optimization, Supply Chain, Cybersecurity y Education 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.
|
||||
- **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.).
|
||||
|
||||
@@ -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', 'contact', 'press'];
|
||||
const pages = ['home', 'about', 'portfolio', 'consulting', 'marketing', 'business-setup', 'business-optimization', 'supply-chain', 'cybersecurity', 'education', 'fractional', 'contact', 'press'];
|
||||
|
||||
await rm(out, { recursive: true, force: true });
|
||||
await mkdir(out, { recursive: true });
|
||||
|
||||
@@ -95,6 +95,11 @@ const NAV = [
|
||||
{ label: 'Consulting', desc: 'Find the Real Problem. Then Fix the Right One.', href: '/consulting/', icon: 'compass' },
|
||||
{ label: 'Marketing & AI Search', desc: 'Get Found Where Attention Is Moving.', href: '/consulting/marketing/', icon: 'search' },
|
||||
{ label: 'Business Setup', desc: 'Start With Fewer Expensive Mistakes.', href: '/consulting/business-setup/', icon: 'building' },
|
||||
{ label: 'Business Optimization', desc: 'Find What Growth Made Messy.', href: '/consulting/business-optimization/', icon: 'gauge' },
|
||||
{ label: 'Supply Chain', desc: 'Know What Happens Before It Reaches the Customer.', href: '/consulting/supply-chain/', icon: 'truck' },
|
||||
{ label: 'Cybersecurity', desc: 'Find the Exposure Before Someone Else Does.', href: '/consulting/cybersecurity/', icon: 'shield' },
|
||||
{ label: 'Education', desc: 'Make the Strategy Survive the Classroom.', href: '/consulting/education/', icon: 'edu' },
|
||||
{ label: 'Fractional Leadership', desc: 'When the Business Needs an Owner, Not Another Recommendation.', href: '/consulting/fractional/', icon: 'users' },
|
||||
],
|
||||
},
|
||||
{ label: 'Press', href: '/press/' },
|
||||
@@ -160,6 +165,11 @@ function footer() {
|
||||
<li><a href="/consulting/">Consulting</a></li>
|
||||
<li><a href="/consulting/marketing/">Marketing & AI Search</a></li>
|
||||
<li><a href="/consulting/business-setup/">Business Setup</a></li>
|
||||
<li><a href="/consulting/business-optimization/">Business Optimization</a></li>
|
||||
<li><a href="/consulting/supply-chain/">Supply Chain</a></li>
|
||||
<li><a href="/consulting/cybersecurity/">Cybersecurity</a></li>
|
||||
<li><a href="/consulting/education/">Education</a></li>
|
||||
<li><a href="/consulting/fractional/">Fractional Leadership</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="foot-col">
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
import { icon } from '../layout.mjs';
|
||||
import { heroBlock, coversBlock, whoBlock, deliveryBlock, operatorBlock, faqBlock, closingBlock, faqSchema } from '../service.mjs';
|
||||
|
||||
const faqs = [
|
||||
['How is business optimisation different from hiring a fractional COO?', ['Business optimisation is a defined diagnostic and improvement engagement.', 'A fractional COO takes ongoing ownership of an operating function. If the diagnostic shows that the business needs continuing operational leadership rather than a focused optimisation sprint, we can discuss whether a fractional role makes more sense.']],
|
||||
['Will AI automation replace my staff?', ['That is not the assumption.', 'We look for work that is repetitive, manual, slow, or unnecessarily dependent on people before deciding whether AI or another form of automation belongs there.', 'Sometimes technology is the answer. Sometimes the process itself needs to change first.']],
|
||||
['My business is small. Is optimisation premature?', ['Not necessarily.', 'Optimisation becomes useful when operational friction is affecting margin, time, customer experience, decision-making, or the founder’s ability to focus.', 'Company size alone does not determine that.']],
|
||||
['What do you need from me to start?', ['Enough access to understand how the business actually operates.', 'Depending on the diagnostic, that can include financial information, software and vendor costs, team structure, existing processes, reporting, and conversations with the people closest to the work.']],
|
||||
];
|
||||
|
||||
const visual = `<div class="panel-bar"><span class="lights"><i></i><i></i><i></i></span><span class="file">${icon('brace')}operations.log</span></div>
|
||||
<pre class="code-pre"><span class="ln"><span class="p">$</span> <span class="k">find</span> the friction</span><span class="ln"><span class="n">→</span> time</span><span class="ln"><span class="n">→</span> margin</span><span class="ln"><span class="n">→</span> visibility</span><span class="ln"><span class="n">→</span> unnecessary founder attention</span><span class="ln"><span class="p">$</span> <span class="k">prioritise</span> the fixes</span><span class="ln"><span class="s">✓</span> what deserves attention first</span><span class="ln"><span class="s">✓</span> what can wait</span><span class="ln"><span class="p">$</span> <span class="k">make</span> it lighter<span class="cursor"></span></span></pre>`;
|
||||
|
||||
export default {
|
||||
path: '/consulting/business-optimization/',
|
||||
title: 'Business Optimisation Consulting | Dylan Mazzei',
|
||||
description: 'Business optimisation consulting for founders focused on margins, processes, team structure, AI automation, reporting, and operational efficiency.',
|
||||
schema: [faqSchema(faqs)],
|
||||
body:
|
||||
heroBlock({
|
||||
id: 'bo-hero',
|
||||
crumb: 'Business Optimization',
|
||||
kicker: 'BUSINESS OPTIMIZATION CONSULTING',
|
||||
h1: 'Better Operations Create Better Businesses.',
|
||||
lead: 'Revenue can grow while margins tighten, processes multiply, teams get harder to manage, and the founder somehow ends up with more on their plate.',
|
||||
paras: [
|
||||
'*That doesn’t always mean the business needs more sales.',
|
||||
'Sometimes it needs a closer look at where the money, time, people, and decisions are going.',
|
||||
'My teams and I find the friction, determine what is actually creating it, and make the business easier to operate as it grows.',
|
||||
],
|
||||
visual,
|
||||
}).replace('<div class="panel anim" aria-hidden="true">', '<div class="panel panel-dark anim" aria-hidden="true">') +
|
||||
coversBlock({
|
||||
id: 'bo-covers',
|
||||
kicker: 'WHERE THE BUSINESS GETS HEAVY',
|
||||
h2: 'Find the Friction Growth Left Behind.',
|
||||
intro: ['Growth changes what a business asks of its systems, people, and processes.', '*We look at where the company has become more complicated than it needs to be and what can make it work better.'],
|
||||
items: [
|
||||
['chart', 'Margin & Cost', ['Operations audit to see where time and money actually go', 'Pricing, packaging, tiers, and unit economics review', 'Vendor, software, and recurring-spend analysis', 'Cost structure opportunities without cutting simply for the sake of cutting']],
|
||||
['users', 'Team & Process', ['Roles, ownership, and accountability', 'Team design for the company’s next stage', 'Process documentation and SOPs', 'Delegation architecture for founders carrying too many decisions']],
|
||||
['chip', 'Automation & Visibility', ['AI workflow automation across operations, content, research, reporting, and customer service', 'KPI and reporting design', 'Automated visibility into the numbers that deserve attention', 'Identification of repetitive work that technology can genuinely make easier']],
|
||||
],
|
||||
}) +
|
||||
whoBlock({
|
||||
id: 'bo-who',
|
||||
h2: 'When Growth Starts Creating Its Own Problems.',
|
||||
items: [
|
||||
['gauge', 'Revenue Grew. Margin Didn’t.', ['The top line is moving, but more revenue isn’t translating into the improvement you expected.', 'We look underneath the growth to find out where the economics are getting lost.']],
|
||||
['target', 'You’re Still in Too Many Decisions.', ['The company has a team, systems, and processes.', 'Somehow, too much still finds its way back to you.', 'The objective isn’t to make the founder less important. It’s to stop making the founder necessary for decisions that shouldn’t require them.']],
|
||||
['layers', 'The Team Got Bigger Faster Than the System Did.', ['Headcount can solve a capacity problem.', 'It can also hide a process problem.', 'Before adding another role, we look at what the existing team is being asked to work around.']],
|
||||
],
|
||||
}) +
|
||||
deliveryBlock({
|
||||
id: 'bo-delivery',
|
||||
h2: 'Fix What’s Creating the Drag.',
|
||||
intro: ['Business optimisation follows the same diagnostic-first approach behind my consulting work.'],
|
||||
steps: [
|
||||
['Find the Friction', ['The Business Diagnostic examines cost, process, team structure, reporting, technology, and AI leverage.', 'We look for where the business is losing time, margin, visibility, or unnecessary founder attention.']],
|
||||
['Prioritise the Fixes', ['You receive a scored roadmap showing what deserves attention first, what can wait, and what improvement should actually look like.', 'Not every inefficiency deserves a project.']],
|
||||
['Make It Lighter', ['When execution makes sense, the 90-Day Optimisation Sprint turns the roadmap into changes inside the business.', 'That can mean rebuilding processes, improving reporting, deploying useful automation, reviewing the vendor stack, clarifying ownership, or removing work that no longer needs to exist.', 'It’s the same operating discipline I apply across my current ventures.']],
|
||||
],
|
||||
}) +
|
||||
operatorBlock({
|
||||
id: 'bo-op',
|
||||
h2: 'Efficiency Isn’t About Cutting Everything.',
|
||||
paras: ['*A cheaper business is not automatically a better business.', 'The point is to know what deserves money, what deserves people, what deserves automation, and what probably shouldn’t be happening at all.', 'I’ve seen those decisions play out across businesses in very different industries.'],
|
||||
side: '<p class="statement">The details change.</p><article class="card card-dark"><h3 class="h-lg">The cost of unnecessary complexity doesn’t.</h3></article>',
|
||||
cta: 'EXPLORE MY PORTFOLIO',
|
||||
}) +
|
||||
faqBlock({ id: 'bo-faq', h2: 'Before We Start Taking Things Apart.', items: faqs }) +
|
||||
closingBlock({
|
||||
id: 'bo-close',
|
||||
kicker: 'MAKE GROWTH EASIER TO CARRY',
|
||||
h2: 'Keep the Growth. Lose the Unnecessary Weight.',
|
||||
paras: ['You don’t need to strip the business down just to call it efficient.', 'We’ll find where margin, time, and attention are getting lost, then identify the changes worth making.', '*The result should be a business that can do more without making everything harder to run.'],
|
||||
}),
|
||||
};
|
||||
@@ -27,10 +27,10 @@ const plans = [
|
||||
const services = [
|
||||
{ id: 'marketing', icon: 'search', name: 'Marketing & AI Search', h: 'Get Found Where Attention Is Moving.', p: ['SEO, AI search visibility, paid media, and funnel strategy grounded in what people actually discover, click, and choose.', 'Marketing has been part of my operating world for years, and it remains one of the areas where technology keeps changing the answer.'], cta: 'EXPLORE MARKETING & AI SEARCH', href: '/consulting/marketing/' },
|
||||
{ id: 'business-setup', icon: 'building', name: 'Business Setup', h: 'Start With Fewer Expensive Mistakes.', p: ['Entity and state selection, licensing, banking architecture, and the practical decisions that turn an idea into an operating business.', 'I’ve started enough companies to know that early decisions have a habit of following you. I unpack more of that thinking in The Business Launch Playbook.'], cta: 'EXPLORE BUSINESS SETUP', href: '/consulting/business-setup/' },
|
||||
{ id: 'optimization', icon: 'gauge', name: 'Business Optimization', h: 'Find What Growth Made Messy.', p: ['Growth creates opportunity.', 'It also creates workarounds, extra steps, unnecessary costs, unclear ownership, and processes nobody remembers choosing.', 'The job is to find what the business has outgrown and make it work for where the company is going next.'] },
|
||||
{ id: 'supply-chain', icon: 'truck', name: 'Supply Chain', h: 'Know What Happens Before It Reaches the Customer.', p: ['Sourcing, supplier vetting, logistics planning, and landed-cost analysis for businesses where products have to move through the real world.', 'My work across consumer products and e-commerce has taught me that what happens before the sale can determine whether the sale makes sense.'] },
|
||||
{ id: 'cybersecurity', icon: 'shield', name: 'Cybersecurity', h: 'Find the Exposure Before Someone Else Does.', p: ['Security posture assessments, vulnerability reviews, and compliance readiness grounded in how the business actually operates.', 'The goal isn’t security theatre.', 'It’s understanding where the business is exposed and what deserves attention first.'] },
|
||||
{ id: 'education', icon: 'edu', name: 'Education', h: 'Make the Strategy Survive the Classroom.', p: ['EdTech product strategy, institutional technology adoption, and market-entry thinking shaped around the realities of schools, educators, and implementation.', 'A product can make perfect sense in a meeting and still fail the people expected to use it.', 'The classroom gets the final vote.'] },
|
||||
{ id: 'optimization', icon: 'gauge', name: 'Business Optimization', h: 'Find What Growth Made Messy.', p: ['Growth creates opportunity.', 'It also creates workarounds, extra steps, unnecessary costs, unclear ownership, and processes nobody remembers choosing.', 'The job is to find what the business has outgrown and make it work for where the company is going next.'] , cta: 'EXPLORE BUSINESS OPTIMIZATION', href: '/consulting/business-optimization/' },
|
||||
{ id: 'supply-chain', icon: 'truck', name: 'Supply Chain', h: 'Know What Happens Before It Reaches the Customer.', p: ['Sourcing, supplier vetting, logistics planning, and landed-cost analysis for businesses where products have to move through the real world.', 'My work across consumer products and e-commerce has taught me that what happens before the sale can determine whether the sale makes sense.'] , cta: 'EXPLORE SUPPLY CHAIN', href: '/consulting/supply-chain/' },
|
||||
{ id: 'cybersecurity', icon: 'shield', name: 'Cybersecurity', h: 'Find the Exposure Before Someone Else Does.', p: ['Security posture assessments, vulnerability reviews, and compliance readiness grounded in how the business actually operates.', 'The goal isn’t security theatre.', 'It’s understanding where the business is exposed and what deserves attention first.'] , cta: 'EXPLORE CYBERSECURITY', href: '/consulting/cybersecurity/' },
|
||||
{ id: 'education', icon: 'edu', name: 'Education', h: 'Make the Strategy Survive the Classroom.', p: ['EdTech product strategy, institutional technology adoption, and market-entry thinking shaped around the realities of schools, educators, and implementation.', 'A product can make perfect sense in a meeting and still fail the people expected to use it.', 'The classroom gets the final vote.'] , cta: 'EXPLORE EDUCATION CONSULTING', href: '/consulting/education/' },
|
||||
];
|
||||
|
||||
const faqs = [
|
||||
@@ -117,6 +117,7 @@ export default {
|
||||
<p>I can step into the business as a fractional CMO, COO, CISO, or Chief AI Officer, bringing the same operator mindset that shapes my current ventures into a defined leadership role.</p>
|
||||
</div>
|
||||
<p class="statement">Strategy gets more useful when someone owns what happens next.</p>
|
||||
<div class="btn-row">${btn('EXPLORE FRACTIONAL ROLES', '/consulting/fractional/', 'light')}</div>
|
||||
</div>
|
||||
<div class="roles reveal" aria-hidden="true">
|
||||
<div class="role"><span class="index">FRACTIONAL</span><b>CMO</b></div>
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
import { icon } from '../layout.mjs';
|
||||
import { heroBlock, coversBlock, whoBlock, deliveryBlock, operatorBlock, faqBlock, closingBlock, faqSchema, panelBar } from '../service.mjs';
|
||||
|
||||
const faqs = [
|
||||
['We are a small business. Are we really a target?', ['Business size alone does not determine cyber risk.', 'Smaller companies still use email, payment systems, cloud platforms, customer data, employee accounts, and third-party vendors. Many common forms of cybercrime are automated or opportunistic, not aimed only at large enterprises.', 'The useful question is what exposure your particular business has.']],
|
||||
['Is this a penetration test?', ['Not automatically.', 'The engagement begins with a security-posture diagnostic. If deeper technical testing is appropriate, we define the scope and authorisation before any assessment activity begins.', 'A penetration test should only be performed against systems the client owns or has explicit authorisation to test.']],
|
||||
['Will the assessment disrupt our systems?', ['The initial diagnostic is designed to understand security posture without unnecessarily interfering with normal operations.', 'If deeper testing is recommended, we agree on the scope, method, authorisation, and potential operational considerations before that work begins.']],
|
||||
['We already have an IT provider. Why would we need this?', ['Your IT provider may already be doing valuable work.', 'The diagnostic helps establish what is currently covered, what responsibilities sit elsewhere, and whether any meaningful gaps remain.', 'The goal is not to replace a capable provider. It is to make sure assumptions about coverage match reality.']],
|
||||
];
|
||||
|
||||
const gaps = [
|
||||
['users', 'An old account keeps access.'],
|
||||
['shield', 'MFA never gets switched on somewhere important.'],
|
||||
['layers', 'A vendor covers less than everyone assumes.'],
|
||||
['mail', 'An employee receives a convincing payment request at exactly the wrong moment.'],
|
||||
];
|
||||
|
||||
const visual =
|
||||
panelBar('Most security gaps are quiet.') +
|
||||
`<div style="padding:20px;display:grid;gap:10px">${gaps
|
||||
.map(([ic, t], i) => `<div class="row" style="border:1px solid var(--mist);border-radius:12px;padding:12px 14px"><span class="ico">${icon(ic)}</span><span class="name" style="white-space:normal">${t}</span><span class="status"><span class="dot" style="background:${i === 3 ? '#f5a524' : '#e5484d'};box-shadow:none"></span></span></div>`)
|
||||
.join('')}</div>`;
|
||||
|
||||
export default {
|
||||
path: '/consulting/cybersecurity/',
|
||||
title: 'Cybersecurity Consulting for Businesses | Dylan Mazzei',
|
||||
description: 'Cybersecurity consulting for businesses covering security posture, vulnerabilities, fraud defences, access controls, compliance, vendors, and incident readiness.',
|
||||
schema: [faqSchema(faqs)],
|
||||
body:
|
||||
heroBlock({
|
||||
id: 'cy-hero',
|
||||
crumb: 'Cybersecurity',
|
||||
kicker: 'CYBERSECURITY CONSULTING',
|
||||
h1: 'Good Security Starts With Knowing Where You Stand.',
|
||||
lead: 'Most security gaps are quiet.',
|
||||
paras: [
|
||||
'An old account keeps access. MFA never gets switched on somewhere important. A vendor covers less than everyone assumes. An employee receives a convincing payment request at exactly the wrong moment.',
|
||||
'*My security team and I look at the business from the outside in and the inside out, so you can see where the exposure actually is and decide what deserves attention first.',
|
||||
],
|
||||
visual,
|
||||
}) +
|
||||
coversBlock({
|
||||
id: 'cy-covers',
|
||||
kicker: 'WHERE EXPOSURE HIDES',
|
||||
h2: 'Security Is Usually More Than One Big Vulnerability.',
|
||||
intro: ['A company’s security posture is shaped by dozens of smaller decisions across accounts, people, vendors, systems, and processes.', '*We bring those pieces into one view.'],
|
||||
items: [
|
||||
['shield', 'Systems & Access', ['Security posture assessment across domains, email, cloud accounts, and access controls', 'Review of externally visible vulnerabilities', 'MFA coverage and password practices', 'Administrator access and privilege review', 'Employee onboarding and offboarding gaps']],
|
||||
['mail', 'People & Payments', ['Email and payment-fraud defences', 'Wire and invoice-fraud controls', 'Phishing exposure', 'Practical employee security awareness', 'Internal processes around sensitive requests and approvals']],
|
||||
['layers', 'Compliance & Readiness', ['Gap review against relevant client, insurer, or industry requirements', 'SOC 2 and ISO 27001 readiness considerations', 'IT provider, MSP, and security-tool review', 'Basic incident-response planning', 'Prioritised remediation roadmap']],
|
||||
],
|
||||
}) +
|
||||
whoBlock({
|
||||
id: 'cy-who',
|
||||
h2: 'When “We Have IT” Isn’t the Same as “We Know Our Risk.”',
|
||||
items: [
|
||||
['target', 'You’ve Never Established a Security Baseline.', ['The business has software, email, cloud accounts, employees, and vendors, but nobody has stepped back and looked at the exposure as a whole.', 'The diagnostic gives you that baseline.']],
|
||||
['users', 'Clients Are Starting to Ask Harder Questions.', ['Enterprise customers, partners, and insurers increasingly want to know how you manage access, data, vendors, and security controls.', 'We identify the gaps before the questionnaire becomes the project.']],
|
||||
['spark', 'Something Happened Close Enough to Get Your Attention.', ['A suspicious login. A fraudulent payment request. A compromised account. An incident at a vendor or another company in your industry.', '*You don’t need panic.', 'You need a clear picture of what your own business looks like.']],
|
||||
],
|
||||
}) +
|
||||
deliveryBlock({
|
||||
id: 'cy-delivery',
|
||||
h2: 'See the Risk. Rank the Risk. Address the Risk.',
|
||||
intro: ['Cybersecurity follows the same diagnostic-first approach behind my consulting work.'],
|
||||
steps: [
|
||||
['Establish the Baseline', ['The Business Diagnostic includes an initial review of the company’s security posture.', 'We look at the systems, access, controls, vendors, and processes that shape the business’s exposure.']],
|
||||
['Go Deeper Where It Matters', ['When the baseline identifies areas that warrant deeper assessment, my cybersecurity team conducts the appropriate authorised review using the assessment capabilities we use in our own security business.', 'All assessment activity is limited to systems the business owns or is authorised to test, with written permission defining the scope.']],
|
||||
['Prioritise the Fixes', ['You receive a scored report that ranks findings by risk, business impact, and the effort or cost involved in addressing them.', 'The objective isn’t to produce the longest vulnerability list.', '*It’s to make clear what deserves attention first.']],
|
||||
],
|
||||
}) +
|
||||
operatorBlock({
|
||||
id: 'cy-op',
|
||||
h2: 'Security Has to Work on a Normal Tuesday.',
|
||||
paras: ['*A policy nobody follows isn’t much protection.', 'Neither is a security tool everyone assumes somebody else configured.', 'That practical view comes from operating businesses where technology and security are part of the day-to-day responsibility.'],
|
||||
side: '<article class="card card-dark"><h3 class="h-lg">The strongest controls are the ones that still work while invoices move, employees join and leave, vendors need access, and everyone tries to get through a normal workday.</h3></article>',
|
||||
cta: 'EXPLORE MY VENTURES',
|
||||
}) +
|
||||
faqBlock({ id: 'cy-faq', h2: 'Before We Look Under the Hood.', items: faqs }) +
|
||||
closingBlock({
|
||||
id: 'cy-close',
|
||||
kicker: 'START WITH VISIBILITY',
|
||||
h2: 'Know What You’re Protecting and Where the Gaps Are.',
|
||||
paras: ['You don’t need to treat every security concern like an emergency.', 'You do need a clear view of your systems, access, vendors, people, and existing controls.', '*We’ll establish the baseline, rank what matters, and give you a practical place to start.'],
|
||||
}),
|
||||
};
|
||||
@@ -0,0 +1,82 @@
|
||||
import { heroBlock, coversBlock, whoBlock, deliveryBlock, operatorBlock, faqBlock, closingBlock, faqSchema, panelBar, panelRow, panelRowAccent } from '../service.mjs';
|
||||
|
||||
const faqs = [
|
||||
['Do you work with both EdTech companies and schools?', ['Yes.', 'I work with companies developing or bringing education products to market as well as schools and educational organizations evaluating or implementing technology.', 'The diagnostic is structured around which side of that equation you are on.']],
|
||||
['Can you help with education hardware, not just software?', ['Yes.', 'My education work includes hardware as well as software, including product strategy, sourcing and manufacturing considerations, R&D partnerships, device management, and implementation at classroom scale.']],
|
||||
['We are pre-product. Is it too early?', ['Not necessarily.', 'The period before significant product investment can be a valuable time to test assumptions around users, market fit, procurement, implementation, manufacturing, and adoption.', 'The objective is not to make the product more complicated. It is to understand the environment it will eventually enter.']],
|
||||
['Do you cover higher education and corporate training, or just K-12?', ['The work is not limited to K-12.', 'The appropriate strategy depends on the institution, learner, product, procurement environment, and market. Higher education, training organizations, and other learning environments can also fit the engagement.']],
|
||||
];
|
||||
|
||||
const sides = [
|
||||
['building', 'Schools have procurement cycles.'],
|
||||
['users', 'Teachers have classrooms to run.'],
|
||||
['edu', 'Students have different needs.'],
|
||||
['chip', 'Technology teams have infrastructure to manage.'],
|
||||
];
|
||||
|
||||
export default {
|
||||
path: '/consulting/education/',
|
||||
title: 'Education & EdTech Consulting | Dylan Mazzei',
|
||||
description: 'Education and EdTech consulting for product strategy, school procurement, technology adoption, hardware, AI, privacy, and education market entry.',
|
||||
schema: [faqSchema(faqs)],
|
||||
body:
|
||||
heroBlock({
|
||||
id: 'ed-hero',
|
||||
crumb: 'Education',
|
||||
kicker: 'EDUCATION CONSULTING',
|
||||
h1: 'Better Learning Starts With Better Possibilities.',
|
||||
lead: 'A strong product is only part of the equation in education.',
|
||||
paras: [
|
||||
'Schools have procurement cycles. Teachers have classrooms to run. Students have different needs. Technology teams have infrastructure to manage. And every new tool eventually has to prove that it belongs in the day.',
|
||||
'Through my work with READTYCH and education partnerships, I’ve worked across product development, market strategy, technology adoption, and the realities of bringing new ideas into education.',
|
||||
'*My teams and I help connect those sides.',
|
||||
],
|
||||
visual:
|
||||
panelBar('FROM PRODUCT TO CLASSROOM') +
|
||||
`<div style="padding:20px;display:grid;gap:10px">${sides.map(([ic, t]) => panelRow(ic, t)).join('')}${panelRowAccent('And every new tool eventually has to prove that it belongs in the day.')}</div>`,
|
||||
}) +
|
||||
coversBlock({
|
||||
id: 'ed-covers',
|
||||
kicker: 'FROM PRODUCT TO CLASSROOM',
|
||||
h2: 'Make the Strategy Work Where Learning Actually Happens.',
|
||||
intro: ['Education has more than one decision-maker and more than one definition of success.', '*We look at the product, institution, technology, and people together.'],
|
||||
items: [
|
||||
['chip', 'Product & Technology', ['EdTech hardware and software product strategy', 'Pilot-to-product planning', 'Education hardware sourcing and manufacturing', 'R&D partnership considerations', 'Device management at classroom scale', 'AI applications across learning and operations']],
|
||||
['route', 'Market & Procurement', ['Education market-entry strategy', 'School and institutional procurement cycles', 'Decision-maker and stakeholder mapping', 'Sales-cycle planning for EdTech companies', 'US and international education market considerations']],
|
||||
['shield', 'Adoption & Readiness', ['Institutional technology evaluation', 'Vendor-selection frameworks', 'Implementation and adoption planning', 'Exam integrity and proctoring strategy', 'Student data privacy considerations', 'FERPA and COPPA readiness']],
|
||||
],
|
||||
}) +
|
||||
whoBlock({
|
||||
id: 'ed-who',
|
||||
h2: 'Different Sides of Education. One Common Challenge.',
|
||||
items: [
|
||||
['rocket', 'You’re Building for Education.', ['EdTech founders have to think beyond whether the product works.', 'The product also has to fit procurement, implementation, classroom workflows, privacy expectations, and the people responsible for adopting it.']],
|
||||
['building', 'You’re Choosing Technology for an Institution.', ['A strong feature list doesn’t guarantee a strong rollout.', 'We help schools and educational organizations evaluate technology around what they need, how it will be implemented, and whether the people using it can realistically adopt it.']],
|
||||
['compass', 'You’re Entering Education From Another Industry.', ['Education has its own timelines, stakeholders, requirements, and expectations.', 'We help companies understand those differences before bringing assumptions from another market into the classroom.']],
|
||||
],
|
||||
}) +
|
||||
deliveryBlock({
|
||||
id: 'ed-delivery',
|
||||
h2: 'Start With the People Who Have to Use It.',
|
||||
intro: ['Education consulting follows the same diagnostic-first approach behind my consulting work.'],
|
||||
steps: [
|
||||
['Understand the Environment', ['The Business Diagnostic evaluates the product, institution, market, or procurement strategy against the environment where it actually has to work.', 'For an EdTech company, that may mean product readiness, sales cycles, manufacturing, or market entry.', 'For an institution, it may mean technology requirements, vendor evaluation, implementation, and adoption.']],
|
||||
['Map the Priorities', ['We identify what deserves attention first and build a roadmap around the real stakeholders involved.', 'The buyer matters.', '*So does the person expected to use what they bought.']],
|
||||
['Move From Plan to Adoption', ['When execution makes sense, the 90-Day Education Sprint moves the roadmap forward.', 'For EdTech companies, that can include product strategy, market positioning, sales-cycle alignment, or manufacturing.', 'For institutions, it can include vendor evaluation, implementation planning, and technology adoption.']],
|
||||
],
|
||||
}) +
|
||||
operatorBlock({
|
||||
id: 'ed-op',
|
||||
h2: 'The Classroom Gets the Final Vote.',
|
||||
paras: ['A product can look excellent in a demonstration.', '*The real test comes later.', 'That perspective comes from working inside education technology, including my involvement with READTYCH and other ventures.', 'The closer the strategy gets to the classroom, the more useful it becomes.'],
|
||||
side: '<div class="qlist card card-dark" style="gap:10px"><p>Can a teacher use it without creating more work?</p><p>Can students understand it?</p><p>Can the institution support it?</p><p>Does it fit into the day instead of fighting against it?</p></div>',
|
||||
cta: 'EXPLORE MY VENTURES',
|
||||
}) +
|
||||
faqBlock({ id: 'ed-faq', h2: 'Before We Put the Plan Into Practice.', items: faqs }) +
|
||||
closingBlock({
|
||||
id: 'ed-close',
|
||||
kicker: 'FROM IDEA TO ADOPTION',
|
||||
h2: 'Give Good Education Ideas a Better Chance to Work.',
|
||||
paras: ['A product still has to fit the institution. A purchase still has to work for the people using it. And a strategy still has to survive the realities of implementation.', '*We’ll bring those pieces together, identify what deserves attention, and create a clearer path from the idea to actual use.'],
|
||||
}),
|
||||
};
|
||||
@@ -0,0 +1,149 @@
|
||||
import { icon, eyebrow, btn } from '../layout.mjs';
|
||||
import { heroBlock, whoBlock, deliveryBlock, operatorBlock, faqBlock, closingBlock, faqSchema } from '../service.mjs';
|
||||
|
||||
const seats = [
|
||||
{
|
||||
name: 'Fractional CMO', icon: 'megaphone', h: 'Marketing leadership from strategy through execution.',
|
||||
items: ['Go-to-market strategy and execution oversight', 'Paid media and SEO budget allocation', 'Marketing team leadership', 'Vendor management', 'Funnel and conversion improvement', 'Social and content strategy', 'SEO and AI search strategy'],
|
||||
backed: 'Backed by specialist teams across SEO, AI search, paid media, content, and marketing execution.',
|
||||
cta: ['EXPLORE MARKETING CONSULTING', '/consulting/marketing/'],
|
||||
},
|
||||
{
|
||||
name: 'Fractional COO', icon: 'gauge', h: 'Operational leadership for the next stage of the company.',
|
||||
items: ['Operational priorities and KPI management', 'Process documentation and SOP development', 'Team structure and hiring plans', 'Performance management', 'Cost structure review', 'Vendor negotiation', 'Systems and workflow improvement'],
|
||||
backed: 'Backed by operations and automation capabilities that can help put the systems into practice.',
|
||||
cta: ['EXPLORE BUSINESS OPTIMIZATION', '/consulting/business-optimization/'],
|
||||
},
|
||||
{
|
||||
name: 'Fractional CISO', icon: 'shield', h: 'Security leadership connected to the business itself.',
|
||||
items: ['Security posture oversight', 'Risk management', 'Compliance-readiness planning', 'IT vendor and access-control review', 'Incident-response planning', 'Employee security awareness', 'Security priorities and accountability'],
|
||||
backed: 'Backed by Dylan’s cybersecurity team and assessment capabilities for authorised security review and ongoing support.',
|
||||
cta: ['EXPLORE CYBERSECURITY CONSULTING', '/consulting/cybersecurity/'],
|
||||
},
|
||||
{
|
||||
name: 'Fractional Chief AI Officer', icon: 'chip', h: 'AI leadership with an operating mandate.',
|
||||
items: ['AI strategy and governance', 'Responsible AI policies', 'Workflow automation across departments', 'AI tool evaluation and integration', 'Software-stack rationalisation', 'Internal AI adoption and training', 'Identification of practical AI use cases'],
|
||||
backed: 'Backed by teams already implementing AI and automation across Dylan’s own operating portfolio.',
|
||||
cta: null,
|
||||
},
|
||||
];
|
||||
|
||||
const faqs = [
|
||||
['What is a fractional executive?', ['A fractional executive is an experienced senior leader who takes responsibility for an executive function without joining the company as a traditional full-time employee.', 'The role can provide companies with senior leadership when they need the function owned but aren\'t yet ready to make a permanent executive hire.']],
|
||||
['How does fractional leadership work?', ['The engagement begins with a Business Diagnostic and defined 90-day objectives.', 'From there, I join the company’s operating cadence, work with the relevant teams, establish priorities and KPIs, and bring in specialist support where appropriate.']],
|
||||
['What fractional roles are available?', ['Current roles include Fractional CMO, Fractional COO, Fractional CISO, and Fractional Chief AI Officer.', 'The appropriate seat depends on the part of the business that needs senior ownership.']],
|
||||
['How do I get started?', ['Start with the Business Diagnostic.', 'It gives us enough context to determine what the business needs, whether fractional leadership is the right model, and which executive seat would create the most value.']],
|
||||
];
|
||||
|
||||
const APPLY = 'APPLY FOR A FRACTIONAL SEAT';
|
||||
|
||||
const visual = `<div class="panel-bar"><span class="lights"><i></i><i></i><i></i></span><strong>FOUR EXECUTIVE SEATS</strong></div>
|
||||
<div style="padding:20px;display:grid;grid-template-columns:1fr 1fr;gap:10px">
|
||||
${['CMO', 'COO', 'CISO', 'Chief AI Officer'].map((r) => `<div class="kpi" style="display:grid;gap:14px;padding:18px"><span>FRACTIONAL</span><b style="font-size:24px;line-height:1.1">${r}</b></div>`).join('')}
|
||||
</div>`;
|
||||
|
||||
export default {
|
||||
path: '/consulting/fractional/',
|
||||
title: 'Fractional Executive Leadership | Dylan Mazzei',
|
||||
description: 'Fractional executive leadership from Dylan Mazzei across marketing, operations, cybersecurity, and AI, backed by specialist operating teams.',
|
||||
schema: [faqSchema(faqs)],
|
||||
body:
|
||||
heroBlock({
|
||||
id: 'fr-hero',
|
||||
crumb: 'Fractional Leadership',
|
||||
kicker: 'FRACTIONAL LEADERSHIP',
|
||||
h1: 'Bring Senior Leadership Into the Business Earlier.',
|
||||
lead: 'At some point, a business needs more than advice, but a full-time executive hire may not make sense yet.',
|
||||
paras: [
|
||||
'*That is where fractional leadership fits.',
|
||||
'I step into the executive seat, work directly with your existing team, own priorities and KPIs, and bring in specialist support from across my operating companies where the work calls for it.',
|
||||
'You get executive leadership now, with the flexibility to make the permanent hire when the business is ready.',
|
||||
],
|
||||
cta: APPLY,
|
||||
visual,
|
||||
}) +
|
||||
`
|
||||
<section class="section" aria-labelledby="fr-stage">
|
||||
<div class="wrap">
|
||||
<div class="showcase reveal">
|
||||
<div class="stack">
|
||||
${eyebrow('THE RIGHT STAGE FOR FRACTIONAL')}
|
||||
<h2 id="fr-stage" class="h-display">When the Business Needs Someone in the Seat.</h2>
|
||||
<div class="prose">
|
||||
<p class="body-ink">Consulting can tell you what should happen next.</p>
|
||||
<p>Fractional leadership goes further. I become part of the company's operating rhythm and take responsibility for moving that part of the business forward.</p>
|
||||
<p>That can mean leading the existing team, setting priorities, managing vendors, establishing KPIs, improving systems, and making sure strategy turns into actual work.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stack-sm">
|
||||
<p class="statement">The role is fractional.</p>
|
||||
<article class="card card-dark"><h3 class="h-lg">The responsibility isn’t.</h3></article>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="section" id="seats" aria-labelledby="fr-seats">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<div class="stack-sm">${eyebrow('FOUR EXECUTIVE SEATS')}<h2 id="fr-seats" class="h-display">One Executive. A Wider Operating Bench.</h2></div>
|
||||
<div class="prose">
|
||||
<p class="body-ink">Every engagement puts me directly in the executive role.</p>
|
||||
<p>Behind me are specialist teams across the businesses I operate, giving the engagement access to execution capabilities beyond one person’s calendar.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="seats reveal">
|
||||
${seats
|
||||
.map(
|
||||
(s) => `<article class="plan seat">
|
||||
<div class="plan-name"><span>${s.name}</span><span class="ic">${icon(s.icon)}</span></div>
|
||||
<h3>${s.h}</h3>
|
||||
<ul>${s.items.map((it) => `<li>${icon('check')}${it}</li>`).join('')}</ul>
|
||||
<p class="backed">${s.backed}</p>
|
||||
${s.cta ? btn(s.cta[0], s.cta[1], 'ghost') : ''}
|
||||
</article>`
|
||||
)
|
||||
.join('')}
|
||||
</div>
|
||||
</div>
|
||||
</section>` +
|
||||
deliveryBlock({
|
||||
id: 'fr-delivery',
|
||||
kicker: 'HOW THE ENGAGEMENT WORKS',
|
||||
h2: 'Step Into the Role. Stay Close to the Work.',
|
||||
intro: [],
|
||||
steps: [
|
||||
['Establish the Baseline', ['Every fractional engagement begins with the Business Diagnostic.', 'We establish the current position, identify the priorities, and define what the first 90 days need to accomplish.']],
|
||||
['Take the Seat', ['I step into the agreed executive role and work directly with the founder, leadership team, and relevant department.', 'The relationship is designed to function as part of the company, not as an outside report delivered once a month.']],
|
||||
['Set the Operating Rhythm', ['Engagements typically include weekly executive meetings, direct access to communication, and regular department reviews.', 'Priorities are translated into measurable objectives, ownership, and an operating cadence the team can follow.']],
|
||||
['Bring in the Bench', ['Where specialist execution is needed, the relevant capabilities across my operating teams can support the work.', 'This keeps strategy and execution connected.']],
|
||||
['Build Toward What Comes Next', ['Fractional leadership should help the business mature.', 'That may eventually mean developing an internal leader, strengthening the existing team, or hiring a permanent executive into a function that is now ready for one.']],
|
||||
],
|
||||
foot: '<div class="card card-dark" style="background:rgba(255,255,255,.04);border:1px solid var(--dark-line);max-width:720px"><p style="color:#fff">Engagements begin with a minimum three-month commitment and include a 30-day notice period.</p><p>Fractional seats are intentionally limited to three concurrent engagements across all roles.</p></div>',
|
||||
cta: APPLY,
|
||||
}) +
|
||||
whoBlock({
|
||||
id: 'fr-who',
|
||||
h2: 'The Company Has a Team. Now It Needs Leadership at the Next Level.',
|
||||
items: [
|
||||
['rocket', 'The Business Has Reached a New Stage.', ['You have revenue, customers, and people doing the work.', 'Now the decisions around marketing, operations, security, or AI require more experienced ownership.']],
|
||||
['users', 'The Founder Is Carrying an Executive Function.', ['You are still acting as the CMO, COO, CISO, or AI lead because nobody else owns the function yet.', 'Fractional leadership creates somewhere for that responsibility to go.']],
|
||||
['target', 'The Team Can Execute but Needs Direction.', ['There are capable people already inside the company.', 'What is missing is someone senior enough to set priorities, connect the work to the business, make decisions, and hold the function accountable.']],
|
||||
],
|
||||
}) +
|
||||
operatorBlock({
|
||||
id: 'fr-op',
|
||||
h2: 'I Don’t Advise From the Sidelines.',
|
||||
paras: ['*Fractional leadership only works if the person in the seat is willing to own decisions.', 'That is how I approach my own companies, and it is how I approach a fractional role.', 'I work with the team, review the numbers, make the calls that belong to the role, and stay close enough to see whether those decisions are working.'],
|
||||
link: ['You can see the companies I operate today and the businesses and exits that shaped that experience.', '/portfolio/'],
|
||||
side: '<div class="portrait"><img src="/assets/dylan-portrait.jpg" alt="Dylan Mazzei" width="900" height="900" loading="lazy"></div>',
|
||||
}) +
|
||||
faqBlock({ id: 'fr-faq', h2: 'Before You Open a Seat.', items: faqs }) +
|
||||
closingBlock({
|
||||
id: 'fr-close',
|
||||
kicker: 'WHEN THE BUSINESS IS READY FOR MORE',
|
||||
h2: 'Put Experience in the Seat.',
|
||||
paras: ['You may already have the people who can do the work.', 'What they need next may be someone who can set the direction, own the decisions, and lead the function alongside them.', '*That is what the fractional seat is for.'],
|
||||
cta: APPLY,
|
||||
}),
|
||||
};
|
||||
@@ -0,0 +1,77 @@
|
||||
import { heroBlock, coversBlock, whoBlock, deliveryBlock, operatorBlock, faqBlock, closingBlock, faqSchema, panelBar, panelRows, panelRow, panelRowAccent } from '../service.mjs';
|
||||
|
||||
const faqs = [
|
||||
['Do you only work with brands sourcing from China?', ['No.', 'The right sourcing market depends on the product, volumes, quality requirements, economics, lead times, and other operating considerations.', 'The diagnostic focuses on what makes sense for your business rather than starting with a predetermined country.']],
|
||||
['Can you introduce me to suppliers directly?', ['Where an appropriate supplier relationship exists, and the fit makes sense, introductions may be possible.', 'Supplier selection still requires proper vetting, sampling, commercial evaluation, and due diligence before placing an order.']],
|
||||
['My volumes are small. Will factories take me seriously?', ['Smaller volumes can affect pricing, MOQs, terms, and which manufacturers are realistic options, but they do not automatically rule out overseas sourcing.', 'Part of the work is finding a sourcing strategy appropriate for the stage of the business rather than negotiating as though you already have enterprise volume.']],
|
||||
['Do you handle ongoing supply chain management?', ['The 90-Day Supply Chain Sprint can support execution of the priorities identified in the diagnostic.', 'If the business needs ongoing operational ownership after that, we can determine whether an advisory or fractional engagement makes more sense.']],
|
||||
];
|
||||
|
||||
const costs = [['building', 'MOQs'], ['chart', 'payment terms'], ['truck', 'freight'], ['layers', 'duties'], ['target', 'defects'], ['bag', 'storage'], ['route', 'fulfilment'], ['calendar', 'delays']];
|
||||
|
||||
export default {
|
||||
path: '/consulting/supply-chain/',
|
||||
title: 'Supply Chain Consulting for Product Brands | Dylan Mazzei',
|
||||
description: 'Supply chain consulting for product brands covering sourcing, suppliers, landed costs, logistics, fulfilment, quality control, and supply risk.',
|
||||
schema: [faqSchema(faqs)],
|
||||
body:
|
||||
heroBlock({
|
||||
id: 'sc-hero',
|
||||
crumb: 'Supply Chain',
|
||||
kicker: 'SUPPLY CHAIN CONSULTING',
|
||||
h1: 'Your Margin Starts Long Before the Sale.',
|
||||
lead: 'The price on a supplier quote is only the beginning.',
|
||||
paras: [
|
||||
'MOQs, payment terms, freight, duties, defects, storage, fulfilment, and delays all factor into the real cost of a product.',
|
||||
'My teams and I source and manufacture for physical product businesses across multiple countries. We bring that operating experience to founders who want better suppliers, stronger terms, clearer costs, and a supply chain that can keep up with the business.',
|
||||
],
|
||||
visual:
|
||||
panelBar('FROM FACTORY TO CUSTOMER') +
|
||||
`<div style="padding:20px;display:grid;grid-template-columns:1fr 1fr;gap:10px">${costs.map(([ic, t]) => panelRow(ic, t)).join('')}</div>` +
|
||||
`<div style="padding:0 20px 20px">${panelRowAccent('the real cost of a product')}</div>`,
|
||||
}) +
|
||||
coversBlock({
|
||||
id: 'sc-covers',
|
||||
kicker: 'FROM FACTORY TO CUSTOMER',
|
||||
h2: 'Know What the Product Really Costs to Get There.',
|
||||
intro: ['A good supply chain connects sourcing, cost, quality, logistics, and fulfilment.', '*We look across the journey instead of optimising one piece while another quietly eats the margin.'],
|
||||
items: [
|
||||
['building', 'Sourcing & Suppliers', ['Manufacturing-market selection based on product, volume, and quality requirements', 'Supplier identification and vetting', 'Sample and trial-order strategy', 'Pricing, MOQ, and payment-term negotiation', 'Supplier diversification and backup planning']],
|
||||
['truck', 'Cost & Logistics', ['Landed-cost analysis, including freight, duties, defects, and other relevant costs', 'Air versus sea freight considerations', 'Freight-forwarding and customs planning', 'Logistics review based on volume, lead time, and cash flow', 'Tariff and supply-risk considerations']],
|
||||
['bag', 'Quality & Fulfillment', ['Quality-control and inspection protocols', 'Defect management', '3PL evaluation and selection', 'Warehouse strategy', 'Shipping and fulfilment cost review', 'Processes for managing supply as order volume grows']],
|
||||
],
|
||||
}) +
|
||||
whoBlock({
|
||||
id: 'sc-who',
|
||||
h2: 'When the Product Is Good, but the Supply Chain Needs to Catch Up.',
|
||||
items: [
|
||||
['route', 'You’re Sourcing Overseas for the First Time.', ['Finding a factory is only one part of the decision.', 'You need to understand who you’re dealing with, what to test before committing, what the terms actually mean, and what the product will cost by the time it reaches you.']],
|
||||
['chart', 'Your Margins Aren’t What They Used to Be.', ['Volumes changed. Freight changed. Supplier pricing changed.', 'But the agreements may not have.', 'We look at what you’re paying now, where the margin is going, and whether sourcing, terms, logistics, or fulfilment deserve another look.']],
|
||||
['users', 'The Founder Is Still Managing Every Shipment.', ['That can work when volumes are small.', 'As the business grows, supplier communication, freight, QC, inventory, and fulfilment need a system that doesn’t depend on the founder following every container.']],
|
||||
],
|
||||
}) +
|
||||
deliveryBlock({
|
||||
id: 'sc-delivery',
|
||||
h2: 'Start With the Cost Behind the Cost.',
|
||||
intro: ['Supply chain work follows the same diagnostic-first approach as my consulting work.'],
|
||||
steps: [
|
||||
['See the Real Cost', ['The Business Diagnostic reviews landed cost, supplier terms, logistics, fulfilment, quality issues, and supplier concentration.', 'The objective is to understand what you actually pay to get a sellable product where it needs to be.']],
|
||||
['Find the Leverage', ['We identify the strongest opportunities.', 'That could mean supplier terms, sourcing alternatives, freight decisions, QC, fulfilment, or reducing exposure to one supplier.', '*Not every lower quote is a better deal.']],
|
||||
['Strengthen the Chain', ['When execution makes sense, the 90-Day Supply Chain Sprint moves into supplier research and vetting, negotiations, logistics changes, QC protocols, and other priorities identified in the diagnostic.', 'It is grounded in the same practical experience my teams use while operating physical product businesses in my portfolio.']],
|
||||
],
|
||||
}) +
|
||||
operatorBlock({
|
||||
id: 'sc-op',
|
||||
h2: 'The Cheapest Unit Can Become the Most Expensive One.',
|
||||
paras: ['A lower factory price means very little if the MOQ traps cash, quality creates returns, freight destroys the savings, or unreliable lead times leave inventory sitting on the wrong side of the world.', 'That perspective comes from being involved in businesses where physical products have to move through the real world.'],
|
||||
side: '<p class="statement">I care about the number that matters after all of that.</p><article class="card card-dark"><h3 class="h-lg">The cost of getting a product the customer can actually buy.</h3></article>',
|
||||
cta: 'EXPLORE MY VENTURES',
|
||||
}) +
|
||||
faqBlock({ id: 'sc-faq', h2: 'Before the Next Order Goes In.', items: faqs }) +
|
||||
closingBlock({
|
||||
id: 'sc-close',
|
||||
kicker: 'BEFORE THE NEXT SHIPMENT',
|
||||
h2: 'Know the Real Cost Before You Commit.',
|
||||
paras: ['A supplier quote tells you what the factory charges. It doesn’t tell you what the product ultimately costs your business.', 'We’ll look at the suppliers, terms, freight, quality, fulfilment, and risk behind that number.', '*Then you can make the next sourcing decision with the full picture in front of you.'],
|
||||
}),
|
||||
};
|
||||
+132
@@ -0,0 +1,132 @@
|
||||
// Shared builder for the consulting service pages (same layout as Marketing and
|
||||
// Business Setup). Copy is passed in verbatim; a leading "*" marks a paragraph
|
||||
// that should read in the stronger ink color.
|
||||
import { icon, eyebrow, btn, faq } from './layout.mjs';
|
||||
|
||||
const P = (t, inkCls = 'body-ink') => (t.startsWith('*') ? `<p class="${inkCls}">${t.slice(1)}</p>` : `<p>${t}</p>`);
|
||||
const prose = (arr, inkCls) => `<div class="prose">${arr.map((t) => P(t, inkCls)).join('')}</div>`;
|
||||
|
||||
export const cover = ([ic, h, items]) =>
|
||||
`<article class="cover"><div class="cover-head"><span class="ic">${icon(ic)}</span><h3>${h}</h3></div><ul>${items.map((it) => `<li>${icon('check')}${it}</li>`).join('')}</ul></article>`;
|
||||
|
||||
export function heroBlock({ id, crumb, kicker, h1, lead, paras, cta = 'BOOK YOUR DIAGNOSTIC', ctaHref = '/contact/', visual }) {
|
||||
return `
|
||||
<section class="page-hero" aria-labelledby="${id}">
|
||||
<div class="wrap page-hero-grid">
|
||||
<div class="stack anim">
|
||||
<nav class="crumbs" aria-label="Breadcrumb"><a href="/consulting/">Consulting</a>${icon('chev')}<span>${crumb}</span></nav>
|
||||
${eyebrow(kicker)}
|
||||
<h1 id="${id}" class="h-display-lg">${h1}</h1>
|
||||
<p class="lead">${lead}</p>
|
||||
${prose(paras)}
|
||||
<div class="btn-row">${btn(cta, ctaHref)}</div>
|
||||
</div>
|
||||
<div class="panel anim" aria-hidden="true">${visual}</div>
|
||||
</div>
|
||||
</section>`;
|
||||
}
|
||||
|
||||
export function coversBlock({ id, kicker, h2, intro, items }) {
|
||||
return `
|
||||
<section class="section" aria-labelledby="${id}">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<div class="stack-sm">${eyebrow(kicker)}<h2 id="${id}" class="h-display">${h2}</h2></div>
|
||||
${prose(intro)}
|
||||
</div>
|
||||
<div class="covers reveal">${items.map(cover).join('')}</div>
|
||||
</div>
|
||||
</section>`;
|
||||
}
|
||||
|
||||
export function whoBlock({ id, kicker = 'WHO THIS IS FOR', h2, items }) {
|
||||
return `
|
||||
<section class="section" aria-labelledby="${id}">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<div class="stack-sm">${eyebrow(kicker)}<h2 id="${id}" class="h-display">${h2}</h2></div>
|
||||
</div>
|
||||
<div class="cards cards-3 reveal">
|
||||
${items.map(([ic, h, p]) => `<article class="card"><span class="ic">${icon(ic)}</span><h3 class="h-sm">${h}</h3>${prose(p)}</article>`).join('')}
|
||||
</div>
|
||||
</div>
|
||||
</section>`;
|
||||
}
|
||||
|
||||
export function deliveryBlock({ id, kicker = 'HOW DELIVERY WORKS', h2, intro, steps, foot = '', cta = 'START WITH THE DIAGNOSTIC', ctaHref = '/contact/' }) {
|
||||
return `
|
||||
<section class="section band" aria-labelledby="${id}">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<div class="stack-sm">${eyebrow(kicker)}<h2 id="${id}" class="h-display">${h2}</h2></div>
|
||||
<div class="prose">${intro.map((t) => (t.startsWith('*') ? `<p style="color:var(--on-dark)">${t.slice(1)}</p>` : `<p>${t}</p>`)).join('')}</div>
|
||||
</div>
|
||||
<div class="rules">
|
||||
${steps.map(([h, p], i) => `<article class="rule reveal"><span class="index">STEP_0${i + 1}</span><h3>${i + 1}. ${h}</h3><div class="prose">${p.map((t, j) => `<p${j === 0 || t.startsWith('*') ? ' class="ink"' : ''}>${t.replace(/^\*/, '')}</p>`).join('')}</div></article>`).join('')}
|
||||
</div>
|
||||
<div class="sec-foot reveal" style="border-top:0;margin-top:48px">
|
||||
${foot || '<span></span>'}
|
||||
${cta ? btn(cta, ctaHref, 'light') : ''}
|
||||
</div>
|
||||
</div>
|
||||
</section>`;
|
||||
}
|
||||
|
||||
export function operatorBlock({ id, kicker = 'OPERATOR PERSPECTIVE', h2, paras, side, cta, ctaHref = '/portfolio/', link }) {
|
||||
return `
|
||||
<section class="section" aria-labelledby="${id}">
|
||||
<div class="wrap">
|
||||
<div class="showcase reveal">
|
||||
<div class="stack">
|
||||
${eyebrow(kicker)}
|
||||
<h2 id="${id}" class="h-display">${h2}</h2>
|
||||
${prose(paras)}
|
||||
${link ? `<p><a class="inline-link" href="${link[1]}">${link[0]}</a></p>` : ''}
|
||||
${cta ? `<div class="btn-row">${btn(cta, ctaHref)}</div>` : ''}
|
||||
</div>
|
||||
<div class="stack-sm">${side}</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>`;
|
||||
}
|
||||
|
||||
export function faqBlock({ id, h2, items }) {
|
||||
return `
|
||||
<section class="section" aria-labelledby="${id}">
|
||||
<div class="wrap faq-layout">
|
||||
<div class="stack-sm sticky reveal">${eyebrow('FREQUENTLY ASKED QUESTIONS')}<h2 id="${id}" class="h-display">${h2}</h2></div>
|
||||
<div class="reveal">${faq(items)}</div>
|
||||
</div>
|
||||
</section>`;
|
||||
}
|
||||
|
||||
export function closingBlock({ id, kicker, h2, paras, cta = 'BOOK YOUR DIAGNOSTIC', ctaHref = '/contact/' }) {
|
||||
return `
|
||||
<section class="section" aria-labelledby="${id}">
|
||||
<div class="wrap">
|
||||
<div class="closing reveal">
|
||||
<div class="closing-inner">
|
||||
${eyebrow(kicker)}
|
||||
<h2 id="${id}" class="h-display-lg">${h2}</h2>
|
||||
${prose(paras)}
|
||||
<div class="btn-row">${btn(cta, ctaHref)}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>`;
|
||||
}
|
||||
|
||||
export const faqSchema = (items) => ({
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'FAQPage',
|
||||
mainEntity: items.map(([q, a]) => ({ '@type': 'Question', name: q, acceptedAnswer: { '@type': 'Answer', text: a.join(' ') } })),
|
||||
});
|
||||
|
||||
// Small mockup helpers for the hero panels
|
||||
export const panelBar = (title) => `<div class="panel-bar"><span class="lights"><i></i><i></i><i></i></span><strong>${title}</strong></div>`;
|
||||
export const panelRows = (rows) =>
|
||||
`<div style="padding:20px;display:grid;gap:10px">${rows.join('')}</div>`;
|
||||
export const panelRow = (ic, text, tail = '<span class="status"><span class="dot"></span></span>') =>
|
||||
`<div class="row" style="border:1px solid var(--mist);border-radius:12px;padding:12px 14px"><span class="ico">${icon(ic)}</span><span class="name" style="white-space:normal">${text}</span>${tail}</div>`;
|
||||
export const panelRowAccent = (text) =>
|
||||
`<div class="row row-accent" style="border-radius:12px;padding:12px 14px;background:var(--accent);color:var(--on-accent);border:0"><span class="name" style="white-space:normal">${text}</span>${icon('arrow', 'check')}</div>`;
|
||||
@@ -865,7 +865,7 @@ h1, h2, h3, h4 { font-weight: 600; }
|
||||
.card, .showcase, .closing, .process-step, .plan:not(.plan-featured), .venture, .tab-panel, .cover, .topic {
|
||||
background: linear-gradient(160deg, var(--glass), transparent 120%), var(--cloud);
|
||||
}
|
||||
.card, .process-step, .venture, .cover, .topic { overflow: hidden; }
|
||||
.card, .process-step, .venture, .cover, .topic { overflow: hidden; position: relative; }
|
||||
.card::after, .process-step::after, .cover::after, .topic::after {
|
||||
content: ""; position: absolute; right: -60px; top: -60px; width: 220px; height: 220px; pointer-events: none;
|
||||
background: radial-gradient(closest-side, var(--glow), transparent); opacity: 0; transition: opacity .4s ease;
|
||||
@@ -997,3 +997,14 @@ h1, h2, h3, h4 { font-weight: 600; }
|
||||
.plan-featured { outline: 1px solid rgba(31, 183, 255, .45); box-shadow: 0 0 50px rgba(26, 127, 255, .18); }
|
||||
/* Dark panels keep their dark surface in both themes (the glass card rule must not override them) */
|
||||
.card.card-dark, .closing.closing-dark { background: var(--surface-dark); }
|
||||
|
||||
/* Consulting service pages: fractional seats, accent rows, wider dropdown */
|
||||
.seats { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; }
|
||||
.seat .plan-name .ic { width: 40px; height: 40px; border-radius: 12px; }
|
||||
.seat .plan-name .ic svg { width: 20px; height: 20px; }
|
||||
.seat h3 { font-size: var(--text-heading); }
|
||||
.seat .backed { padding-top: 16px; border-top: 1px solid var(--bd); font-size: 14.5px; color: var(--slate); }
|
||||
.seat .btn { align-self: flex-start; }
|
||||
.row-accent .check { color: inherit; }
|
||||
.dropdown { grid-template-columns: repeat(2, minmax(0, 1fr)); min-width: 620px; }
|
||||
@media (max-width: 900px) { .seats { grid-template-columns: 1fr; } }
|
||||
|
||||
Reference in New Issue
Block a user