Skip to content

Commit 2810433

Browse files
author
Hazleton, Lesley
committed
Add Fractional CFO service page and update related content
- Introduced a new service page for Fractional CFO with SEO metadata, headings, and detailed descriptions of services offered. - Updated the fractional CFO section in content.json to include comprehensive details about the service, including what's included, when to engage, and how the engagement works. - Modified the fractional CFO HTML page to reflect the new structure and content, including a video introduction and enhanced layout. - Added a new video for project engagements and updated the projects HTML page to include this video. - Made minor adjustments to other HTML pages for consistency and layout improvements. - Updated CSS styles to accommodate new design elements and remove deprecated styles. - Added new documentation files for branding and home page animation script. - Included new video assets for projects and home page animations.
1 parent e5a24f1 commit 2810433

11 files changed

Lines changed: 350 additions & 270 deletions

.documentation/Make Bold Solutions Design System-handoff.zip renamed to .documentation/branding/Make Bold Solutions Design System-handoff.zip

File renamed without changes.
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
# Home Page Animation — Script & Storyboard
2+
3+
**Working title:** *Big Firm Expertise. Small Firm Heart.*
4+
**Runtime:** ~75 seconds
5+
**Format:** Motion-graphics / kinetic-typography brand summary for the home page hero
6+
**Voice:** Warm, confident, plain-spoken. One narrator (Lesley's voice or a close match).
7+
**Palette / type:** Pull from the site design system — brand navy + accent, logo animation on entry and exit.
8+
**Music:** Understated, building. Soft piano/strings under; lands on a confident final chord at the logo.
9+
10+
---
11+
12+
## SCENE 1 — The Hook (0:00–0:09)
13+
14+
**On screen:** Black. A single cursor-blink of light, then bold kinetic type fades up, one line replacing the next.
15+
> *Big Firm Expertise.*
16+
> *Small Firm Heart.*
17+
18+
**Motion:** Words scale in with weight; the two lines settle side by side, the accent color underlining "Bold."
19+
20+
**VO:**
21+
"Every business deserves a great CFO. Not just the ones big enough to be on a typical firm's radar."
22+
23+
---
24+
25+
## SCENE 2 — The Problem (0:09–0:22)
26+
27+
**On screen:** A business owner silhouette pulled between two arrows — "Run the business" / "Steer the business." A stack of receipts and a spreadsheet dissolve into a question mark.
28+
29+
**Motion:** Numbers scroll fast, then freeze — highlighting that data alone doesn't decide.
30+
31+
**VO:**
32+
"Growth outpaces leadership. Bookkeeping tells you what happened — it can't tell you what to do next. And most owners need senior financial judgment long before they can justify a six-figure hire."
33+
34+
**On-screen text (lower third):** *Growth outpaces leadership capacity.*
35+
36+
---
37+
38+
## SCENE 3 — The Idea: Fractional (0:22–0:34)
39+
40+
**On screen:** A full "CFO" title block splits into a clean fraction — a portion lights up in the accent color. Icon: a dial scaling up and down.
41+
42+
**Motion:** The dial scales with the phrase "the scope you need."
43+
44+
**VO:**
45+
"That's what fractional leadership is for. C-suite expertise, sized to you. Senior-level guidance and hands-on partnership — engaged at the scope and pace your organization needs. No six-figure salary. No junior hand-offs."
46+
47+
**On-screen text:** *Fractional by design.*
48+
49+
---
50+
51+
## SCENE 4 — Four Ways to Engage (0:34–0:50)
52+
53+
**On screen:** Four cards fan out and lock into a 2×2 grid, each with its icon animating in:
54+
55+
| | |
56+
|---|---|
57+
| **Fractional CFO** — ongoing leadership | **Projects** — defined engagements |
58+
| **Interim CFO** — leadership continuity | **Start-up & Middle Market** — foundation to scale |
59+
60+
**Motion:** Each card lifts as it's named, then the grid settles.
61+
62+
**VO:**
63+
"Financial leadership, four ways to engage. Ongoing fractional CFO guidance. Defined projects with a clear end date. Interim leadership when a finance chief departs. And support that takes you from your first financial foundation all the way to scale."
64+
65+
---
66+
67+
## SCENE 5 — Why Us / The Proof (0:50–1:03)
68+
69+
**On screen:** Proof stats count up rapidly, one after another:
70+
`30+ Years` · `CPA` · `PwC Alumni` · **`2023 CFO of the Year`** (accent highlight, small award ribbon)
71+
72+
**Motion:** The award ribbon presses in with a subtle shine sweep.
73+
74+
**VO:**
75+
"Behind the work: over thirty years of experience. A licensed CPA and PwC alumni. And Lesley Hazleton — the Wichita Business Journal's 2023 CFO of the Year. Big-firm rigor. Owner-level care. Outcomes you can see — not billable hours."
76+
77+
**On-screen text:** *Direct senior-level access. Every time.*
78+
79+
---
80+
81+
## SCENE 6 — Who We Serve (1:03–1:10)
82+
83+
**On screen:** Three icons slide in together — a storefront, a single person, a hand-heart (nonprofit).
84+
85+
**VO:**
86+
"Built for the businesses others overlook — growing companies, sole proprietors, and the nonprofits doing important work."
87+
88+
---
89+
90+
## SCENE 7 — The Spark (1:10–1:17)
91+
92+
**On screen:** A spark/zap icon ignites; a subtle circuit motif animates behind the words "Make Bold Spark."
93+
94+
**VO:**
95+
"And when the problem needs a technical solution, we build it — with Make Bold Spark, our technical arm."
96+
97+
**On-screen text:** *Make Bold Spark ↗*
98+
99+
---
100+
101+
## SCENE 8 — Close / CTA (1:17–1:15… → 1:25)
102+
103+
**On screen:** Everything clears to brand navy. Logo animates in. Tagline underneath, then the CTA button pulses once.
104+
105+
> **Make Bold Solutions**
106+
> *Bold decisions. Rooted in strategy.*
107+
> **[ Get in Touch ]**
108+
109+
**VO:**
110+
"Make Bold Solutions. Bold decisions, rooted in strategy. The first step is a conversation — no obligation, no pressure."
111+
112+
**Music:** Resolves on final chord as the logo locks.
113+
114+
---
115+
116+
## Production notes
117+
118+
- **Length options:** Full cut ~75s for the hero; a 30s cut = Scenes 1, 3, 4, 8 for social/LinkedIn.
119+
- **Silent-autoplay version:** The on-screen text lines carry the message without VO — home-page heroes usually autoplay muted. Keep captions burned in.
120+
- **Consistency:** Matches the existing `fractional-cfo-intro.mp4` and `projects-intro.mp4` pattern — same logo bookends and type treatment.
121+
- **File target:** `docs/home-intro.mp4` (+ `.webm` and a poster frame), referenced from the home hero like the other intro videos.
4.91 MB
Binary file not shown.

build.js

Lines changed: 19 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { readFileSync, writeFileSync, mkdirSync, copyFileSync } from 'fs';
1+
import { readFileSync, writeFileSync, mkdirSync, copyFileSync, existsSync } from 'fs';
22
import { join, dirname } from 'path';
33
import { fileURLToPath } from 'url';
44
import QRCode from 'qrcode';
@@ -28,9 +28,16 @@ copyFileSync(
2828
// Copy the brand intro video used as the looping hero on the fractional-cfo page
2929
copyFileSync(
3030
join(assetsDir, 'animation', 'Make Bold Intro.mp4'),
31-
join(docsDir, content.fractionalCfo.video.src)
31+
join(docsDir, content.servicePages.find(p => p.slug === 'fractional-cfo').video.src)
3232
);
3333

34+
// Copy the project-engagements intro video used as the looping hero on the
35+
// projects page, once it has been exported and dropped into attached_assets.
36+
const projectsVideoSrc = join(assetsDir, 'Projects Animation.mp4');
37+
if (existsSync(projectsVideoSrc)) {
38+
copyFileSync(projectsVideoSrc, join(docsDir, content.servicePages.find(p => p.slug === 'projects').video.src));
39+
}
40+
3441
// Copy favicon
3542
const staticDir = join(__dirname, 'static');
3643
copyFileSync(join(staticDir, 'favicon.png'), join(docsDir, 'favicon.png'));
@@ -1062,20 +1069,11 @@ h1, h2, h3, h4, h5, h6 {
10621069
.card-spark-link:hover { color: var(--primary); }
10631070
.card-footer { text-align: center; font-size: 0.75rem; color: var(--muted-fg); opacity: 0.7; padding: 1.5rem 0; }
10641071
1065-
/* Fractional CFO — video hero + restated content */
1066-
.deck-hero { text-align: center; padding: 2.5rem 0 1.5rem; }
1067-
.deck-hero .kicker { color: var(--primary); font-weight: 800; letter-spacing: 0.18em; text-transform: uppercase; font-size: 0.8rem; }
1068-
.deck-hero h1 { font-size: 2.5rem; margin: 0.75rem 0; }
1069-
.deck-hero p { color: var(--muted-fg); max-width: 40rem; margin: 0 auto; }
1070-
.deck-intro { color: var(--muted-fg); max-width: 40rem; margin: 2.5rem auto 0; text-align: center; font-size: 1.0625rem; line-height: 1.7; }
1072+
/* Service page video hero */
10711073
.deck { max-width: 64rem; margin: 0 auto 4rem; padding: 0 1rem; }
10721074
.intro-video-frame { position: relative; overflow: hidden; border-radius: 1.25rem; box-shadow: 0 24px 60px rgba(30,30,30,0.18); background: #1E1E1E; aspect-ratio: 16 / 9; }
10731075
.intro-video-frame video { display: block; width: 100%; height: 100%; object-fit: cover; }
10741076
.intro-video-caption { text-align: center; margin-top: 0.875rem; font-size: 0.8125rem; color: var(--muted-fg); font-style: italic; }
1075-
.intro-cta { text-align: center; margin-top: 2rem; }
1076-
.cfo-card-icon { width: 3.5rem; height: 3.5rem; margin-bottom: 1.5rem; }
1077-
.cfo-card-kicker { color: var(--primary); font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; font-size: 0.75rem; display: block; margin-bottom: 0.625rem; }
1078-
@media (max-width: 640px) { .deck-hero h1 { font-size: 1.9rem; } }
10791077
`;
10801078

10811079
// Write CSS once as a shared external file so browsers cache it across page
@@ -1613,6 +1611,15 @@ function buildServicePage(page) {
16131611
<p class="text-xl text-white-80 max-w-2xl">${escapeHtml(page.subtitle)}</p>
16141612
</div>
16151613
</div>
1614+
${page.video ? `
1615+
<div class="deck" style="padding-top:2.5rem">
1616+
<div class="intro-video-frame">
1617+
<video autoplay muted loop playsinline aria-label="${escapeAttr(page.video.label)}">
1618+
<source src="${escapeAttr(page.video.src)}" type="video/mp4">
1619+
</video>
1620+
</div>
1621+
<p class="intro-video-caption">${escapeHtml(page.video.label)}</p>
1622+
</div>` : ''}
16161623
16171624
<!-- Intro -->
16181625
<div class="container section">
@@ -1892,72 +1899,6 @@ function buildContact() {
18921899
</section>` + footer() + closePage();
18931900
}
18941901

1895-
function buildFractionalCfo() {
1896-
const p = content.fractionalCfo;
1897-
const intro = p.slides[0];
1898-
const closing = p.slides[p.slides.length - 1];
1899-
const middleSlides = p.slides.slice(1, -1);
1900-
1901-
const cards = middleSlides.map(s => {
1902-
const bullets = s.bullets ? `<div class="features">${s.bullets.map(b => `<div class="feature">${escapeHtml(b)}</div>`).join('')}</div>` : '';
1903-
return `
1904-
<div class="service-card">
1905-
<div class="icon-box cfo-card-icon">${icon(s.icon, 40)}</div>
1906-
<span class="cfo-card-kicker">${escapeHtml(s.kicker)}</span>
1907-
<h3>${escapeHtml(s.title)}</h3>
1908-
<p>${escapeHtml(s.body)}</p>
1909-
${bullets}
1910-
</div>`;
1911-
}).join('');
1912-
1913-
return htmlHead(
1914-
'Fractional CFO & Executive Leadership',
1915-
'Fractional CFO and executive leadership from Make Bold Solutions — data-driven financial strategy that bridges operations and the bottom line for growing businesses.',
1916-
'fractional-cfo.html'
1917-
) + navigation('fractional-cfo.html') + `
1918-
1919-
<div class="deck-hero container">
1920-
<span class="kicker">${escapeHtml(p.kicker)}</span>
1921-
<h1>${escapeHtml(p.title)}</h1>
1922-
<p>${escapeHtml(p.subtitle)}</p>
1923-
</div>
1924-
1925-
<div class="deck">
1926-
<div class="intro-video-frame">
1927-
<video autoplay muted loop playsinline aria-label="${escapeAttr(p.video.label)}">
1928-
<source src="${escapeAttr(p.video.src)}" type="video/mp4">
1929-
</video>
1930-
</div>
1931-
<p class="intro-video-caption">${escapeHtml(p.video.label)}</p>
1932-
<div class="intro-cta">
1933-
<a href="contact.html" class="btn-primary">Start Your Climb to Value</a>
1934-
</div>
1935-
<p class="deck-intro">${escapeHtml(intro.body)}</p>
1936-
</div>
1937-
1938-
<section class="section-muted section">
1939-
<div class="container">
1940-
<div class="text-center max-w-2xl mx-auto mb-12">
1941-
<h2 class="text-3xl font-heading font-bold mb-4">${escapeHtml(p.sectionHeading)}</h2>
1942-
<p class="text-muted">${escapeHtml(p.sectionIntro)}</p>
1943-
</div>
1944-
<div class="grid grid-2-lg" style="gap:1.5rem">${cards}
1945-
</div>
1946-
</div>
1947-
</section>
1948-
1949-
<section class="section-primary section">
1950-
<div class="container text-center">
1951-
<h2 class="text-3xl font-heading font-bold mb-6">${escapeHtml(closing.title)}</h2>
1952-
<p class="text-white-80 max-w-2xl mx-auto mb-10 text-lg">${escapeHtml(closing.body)}</p>
1953-
<div class="flex flex-col sm-flex-row gap-4 justify-center">
1954-
<a href="contact.html" class="btn-white btn-large">Start Your Climb to Value</a>
1955-
<a href="services-cfo.html" class="btn-outline-white btn-large">Explore Our Services</a>
1956-
</div>
1957-
</div>
1958-
</section>` + footer() + closePage();
1959-
}
1960-
19611902
function buildNotFound() {
19621903
const nf = content.notFound;
19631904
return htmlHead('Page Not Found', nf.description, '404.html', { robots: 'noindex, follow' }) + navigation('') + `
@@ -2160,7 +2101,6 @@ const pages = [
21602101
{ file: 'about.html', builder: buildAbout },
21612102
{ file: 'cfo-of-the-year.html', builder: buildCfoOfTheYear },
21622103
{ file: 'contact.html', builder: buildContact },
2163-
{ file: 'fractional-cfo.html', builder: buildFractionalCfo },
21642104
{ file: '404.html', builder: buildNotFound },
21652105
...cards.map(person => ({ file: `${person.slug}/card/index.html`, builder: () => buildCard(person) })),
21662106
];

0 commit comments

Comments
 (0)