Who We Are & What We Stand For
Every design decision, word choice, and visual element flows from this foundation. When in doubt, return here.
To help service-based business owners design profitable, sustainable businesses — so they can pay themselves first, build wealth, and create the life they deserve.
A world where every small business owner has access to the financial clarity and strategic guidance that was once reserved only for large corporations.
We will always translate financial complexity into clear, actionable insight — and we will always make the engagement pay for itself.
Brand Personality
Spire Business embodies five core personality traits that should be felt in every touchpoint.
Positioning Statement
"For service-based business owners who are working hard but not seeing the profit they deserve, Spire Business is the Fractional CPO partner that transforms financial chaos into clarity — unlike traditional bookkeepers or CPAs, we focus exclusively on building profitable, sustainable businesses through the Business Profit Roadmap and D.R.E.A.M. methodology."
Brand Hierarchy
| Element | Value | Notes |
|---|---|---|
| Business Name | Spire Business | Always two words, never 'Spire' alone |
| Founder | Linda Brown | Full name on first reference; 'Linda' thereafter |
| Title (Primary) | Financial Architect | Used in headlines and introductions |
| Title (Secondary) | Fractional Chief Profitability Officer | Full form; abbreviated 'Fractional CPO' |
| Credential | Profit First Master CFO | Highest certification level — always include |
| Tagline | Your Business Should Be Paying You Back. | Period included. Never alter. |
| Methodology | D.R.E.A.M. | All caps with periods. Spell out on first use. |
| Framework | Business Profit Roadmap | Title case. Proprietary — treat as a proper noun. |
Logo System
The Spire Business logo is a two-part system: a square logomark and a wordmark. They may be used together or the wordmark alone. Never use the mark alone without context.
Logo Construction
Logo Don'ts
Color Palette
The Spire palette is built on three pillars: Navy (authority, trust, expertise), Gold (prosperity, achievement, warmth), and White/Sky (clarity, space, openness). Every color has a specific role and should not be used interchangeably.
Primary Colors
Supporting Colors
Semantic / Status Colors
Color Usage Rules
CSS Custom Properties
/* Spire Brand Colors — CSS Custom Properties */
/* Use these in Tailwind via: text-navy, bg-gold, etc. */
:root {
/* Core Brand */
--color-navy: oklch(0.28 0.09 264); /* #293980 */
--color-navy-dark: oklch(0.18 0.07 264); /* #1a2456 */
--color-navy-light: oklch(0.38 0.08 264); /* #3d4f8a */
--color-gold: oklch(0.72 0.12 75); /* #C9A84C */
--color-gold-light: oklch(0.88 0.08 75); /* #e8d5a0 */
/* Backgrounds */
--color-sky-light: oklch(0.95 0.02 220); /* #eef3f8 */
--color-sky-pale: oklch(0.97 0.01 220); /* #f5f8fa */
--background: oklch(0.99 0.002 220); /* Near-white with cool tint */
}Type System
Spire uses a deliberate two-font system. Playfair Display carries authority, heritage, and editorial gravitas for all display and headline use. DM Sans provides clarity, warmth, and readability for all body and UI text. Never substitute either font.
Be Paying You Back.
Type Scale
| Role | Font | Size | Weight | Line Height | Tailwind |
|---|---|---|---|---|---|
| Display / Hero H1 | Playfair Display | clamp(2.2rem, 4vw, 3.6rem) | 700–800 | 1.10 | font-display text-5xl md:text-6xl |
| Page H1 | Playfair Display | clamp(2rem, 3.5vw, 3rem) | 700 | 1.12 | font-display text-4xl md:text-5xl |
| Section H2 | Playfair Display | clamp(1.8rem, 3vw, 2.6rem) | 700 | 1.15 | font-display text-3xl md:text-4xl |
| Card H3 | Playfair Display | 1.25rem – 1.5rem | 700 | 1.2 | font-display text-xl md:text-2xl |
| Subheading H4 | DM Sans | 1rem – 1.125rem | 600 | 1.4 | font-body font-semibold text-base |
| Body Large | DM Sans | 1.125rem | 400 | 1.75 | font-body text-lg |
| Body Default | DM Sans | 1rem | 400 | 1.7 | font-body text-base |
| Body Small | DM Sans | 0.875rem | 400 | 1.65 | font-body text-sm |
| Caption / Label | DM Sans | 0.75rem | 500–600 | 1.5 | font-body text-xs font-medium |
| Eyebrow / Tag | DM Sans | 0.6875rem | 700 | 1.4 | font-body text-[11px] font-bold uppercase tracking-[0.2em] |
| Navigation | DM Sans | 0.875rem | 500 | 1.0 | font-body font-medium text-sm |
| Button | DM Sans | 0.875rem | 600 | 1.0 | font-body font-semibold text-sm |
| Code / Mono | System Mono | 0.8125rem | 400 | 1.6 | font-mono text-[13px] |
Typography Live Specimens
Paying You Back.
The Financial Architecture Your Business Deserves
You work too hard to wonder where the money went. Linda Brown is a Financial Architect who helps service-based business owners design profitable, sustainable businesses — without the overwhelm.
Most business owners don't have a revenue problem — they have a profit problem. Revenue goes up, but the money never seems to stay. That's not a hustle problem. It's a systems problem. And it's exactly what we fix.
"My business is FINALLY profitable! Linda gave me the confidence to run my business with clarity."
Letter Spacing Rules
Spacing System & Grid
Spire uses Tailwind's 4px base unit system. All spacing decisions should be made in multiples of 4px. Generous whitespace is a brand value — it signals clarity and confidence.
Spacing Scale
space-14pxIcon gap, tight inline spacingspace-28pxCompact element padding, small gapsspace-312pxBadge padding, list item gapsspace-416pxDefault padding, card inner spacingspace-520pxSection element gapsspace-624pxCard padding, form field spacingspace-832pxSection padding (mobile), component gapsspace-1040pxSection vertical paddingspace-1248pxLarge section paddingspace-1664pxSection padding (desktop)space-2080pxLarge section vertical paddingspace-2496pxHero section paddingspace-28112pxMaximum section paddingContainer & Breakpoints
| Breakpoint | Min Width | Container Padding | Max Width | Target Device |
|---|---|---|---|---|
| xs (default) | 0px | 1.25rem (20px) | 100% | Mobile portrait |
| sm | 640px | 2rem (32px) | 100% | Mobile landscape / large phone |
| md | 768px | 2rem (32px) | 100% | Tablet portrait |
| lg | 1024px | 3rem (48px) | 1320px | Tablet landscape / laptop |
| xl | 1280px | 3rem (48px) | 1320px | Desktop |
| 2xl | 1536px | 3rem (48px) | 1320px | Large desktop |
Border Radius
Section Rhythm
Sections follow a consistent vertical rhythm. Hero sections use py-20 to py-28. Content sections use py-16 to py-24. Compact sections use py-12 to py-16.
pt-28 pb-0 (with wave divider)py-20 md:py-28py-16 md:py-24py-14 md:py-20py-16Component Library
All interactive components follow consistent patterns. Below are the canonical implementations — use these as the reference for any new components or pages.
Buttons
{/* Primary Navy CTA */}
<button className="group flex items-center gap-2 bg-navy text-white font-body font-semibold text-sm px-6 py-3 rounded transition-all hover:bg-navy-dark hover:shadow-lg hover:-translate-y-0.5">
Book a Call <ArrowRight size={14} className="group-hover:translate-x-1 transition-transform" />
</button>
{/* Gold CTA */}
<button className="group flex items-center gap-2 bg-gold text-navy-dark font-body font-semibold text-sm px-6 py-3 rounded transition-all hover:bg-yellow-500 hover:shadow-lg hover:-translate-y-0.5">
Start Your Discovery Call <ArrowRight size={14} />
</button>
{/* Secondary Outline */}
<button className="border border-navy text-navy font-body font-medium text-sm px-6 py-3 rounded transition-all hover:bg-navy hover:text-white">
Learn More
</button>Section Eyebrow Pattern
Every section begins with this eyebrow pattern — a gold rule, a label, and optionally a closing rule. This creates visual consistency and trains the reader's eye.
Section Headline Goes Here
{/* Section Eyebrow Pattern — use at the start of every section */}
<div className="flex items-center gap-3 mb-3">
<div className="h-px w-6 bg-gold" />
<span className="font-body text-gold text-[11px] font-bold uppercase tracking-[0.2em]">
Section Label Here
</span>
</div>
<h2 className="font-display text-navy-dark" style={{ fontSize: "clamp(1.8rem, 3vw, 2.6rem)" }}>
Section Headline Goes Here
</h2>Cards
Service Card
Card description text goes here. Keep it concise and benefit-focused.
"Linda changed everything for my business."
Form Elements
Badges & Tags
Dividers & Decorative Elements
Quote text goes here.
Motion Principles
Motion in Spire is purposeful, subtle, and confidence-inspiring. Animations should feel like a natural extension of the brand — never flashy or distracting. Every motion serves a function.
Every animation communicates something: entrance, state change, or feedback. No decoration-only motion.
Transforms are small (4–8px), durations are short (200–600ms), and easing is natural (ease, ease-out).
All entrance animations use the same fadeInUp pattern. All hover states use the same -translate-y-0.5 lift.
Animation Tokens
| Token | Value | Use Case |
|---|---|---|
| Duration Fast | 150ms | Button hover, icon transitions, micro-interactions |
| Duration Default | 250ms | Card hover, nav transitions, color changes |
| Duration Medium | 400ms | Mobile menu open/close, accordion expand |
| Duration Slow | 600–700ms | Section entrance animations (scroll-triggered) |
| Duration Counter | 1800ms | Animated number counters (60 steps) |
| Easing Default | ease | General transitions |
| Easing Entrance | ease-out | Elements entering the viewport |
| Easing Exit | ease-in | Elements leaving (rarely used) |
| Translate Hover | -translate-y-0.5 (2px) | Button and card hover lift |
| Translate Entrance | translateY(24px) → 0 | Scroll-triggered section entrance |
| Stagger Delay | 60–100ms per item | List items, grid cards, accordion items |
Scroll Animation Pattern (useInView)
// Standard scroll-triggered entrance animation
// Used on every major section across the site
function useInView(threshold = 0.15) {
const ref = useRef<HTMLDivElement>(null);
const [inView, setInView] = useState(false);
useEffect(() => {
const observer = new IntersectionObserver(
([entry]) => { if (entry.isIntersecting) setInView(true); },
{ threshold }
);
if (ref.current) observer.observe(ref.current);
return () => observer.disconnect();
}, [threshold]);
return { ref, inView };
}
// Usage:
const { ref, inView } = useInView(0.1);
<div
ref={ref}
className={`transition-all duration-700 ${
inView ? "opacity-100 translate-y-0" : "opacity-0 translate-y-6"
}`}
style={{ transitionDelay: "100ms" }} // stagger with index * 80ms
>
Content here
</div>Brand Voice
Spire's voice is the written expression of Linda's personality: knowledgeable without being condescending, warm without being casual, direct without being cold. Every word should make the reader feel seen, capable, and hopeful.
Voice Attributes
We always acknowledge the reader's reality before offering a solution. They're working hard. They're frustrated. They deserve better.
"You work too hard to wonder where the money went." — not "Our services help businesses improve profitability."
We translate financial complexity into plain English. No jargon, no acronyms without explanation, no condescension.
"You're not keeping enough of what you earn" — not "Your net profit margin is suboptimal relative to industry benchmarks."
We use specific numbers, timeframes, and outcomes. Vague promises erode trust. Specific claims build it.
"Most clients recover more in the first 90 days than the entire cost of the engagement" — not "We deliver great ROI."
We speak with authority because we've earned it — but we never talk down to clients. We're a partner, not a superior.
"Here's what we've seen work" — not "Most business owners make this mistake."
StoryBrand Framework Application
All primary copy — especially homepage and landing page copy — follows the StoryBrand 7-part framework. This is non-negotiable for any primary marketing copy.
| Step | Element | Spire Application |
|---|---|---|
| 1 | Character (Hero) | Service-based business owner who works hard but struggles to pay themselves consistently |
| 2 | Problem | External: Revenue doesn't translate to profit. Internal: Confusion, shame, fear. Philosophical: You deserve to be paid for your work. |
| 3 | Guide | Linda Brown — Financial Architect with 20+ years, Profit First Master CFO, creator of the Business Profit Roadmap |
| 4 | Plan | 3-step: (1) Discovery Call, (2) Business Profit Roadmap, (3) Implement D.R.E.A.M. System |
| 5 | Call to Action | "Book Your Free Discovery Call" — direct, low-risk, specific |
| 6 | Avoid Failure | Continued profit leaks, paying yourself last, building a business you can't sell |
| 7 | Success | Consistent profit, paying yourself first, financial clarity, a business that works for you |
Word Choice Guide
| Use This | Not This | Why |
|---|---|---|
| Profit | Revenue | Revenue is vanity; profit is the goal |
| Financial Architect | Financial Advisor / Consultant | Architect implies building, designing — active creation |
| Business Profit Roadmap | Financial Plan / Strategy | Proprietary framework — always capitalize |
| Discovery Call | Sales Call / Consultation | Removes sales pressure; implies mutual exploration |
| Pay yourself first | Owner compensation | Emotional, relatable, human language |
| Clarity | Understanding / Knowledge | Clarity implies relief from confusion — emotionally resonant |
| Partner | Vendor / Provider / Service | Positions relationship as collaborative, not transactional |
| Fractional CPO | Part-time CFO / Financial Consultant | CPO = Chief Profitability Officer — unique positioning |
Tone by Context
Lead with the client's pain, then immediately offer hope. Warm, direct, human.
Outcome-focused. What will they have after working with us? Concrete and credible.
Let clients speak. Don't editorialize. Their words are more powerful than ours.
Acknowledge the concern fully before responding. Never dismiss or minimize.
Make the next step feel easy and safe. Remove friction. Be specific about what happens next.
Linda's story should feel human first, expert second. Credentials support, not lead.
Photography & Illustration
Imagery should reinforce the brand values: authority, warmth, clarity, and aspiration. Every image should make the viewer feel that financial success is achievable — not intimidating.
Photography Style
- Professional, warm, approachable portraits of Linda
- Clean, well-lit office and workspace environments
- Confident business owners in collaborative settings
- Abstract financial/architectural imagery (city skylines, blueprints)
- Warm color temperature — golden hour, natural light
- Depth of field — subject sharp, background soft
- Generic stock photos of anonymous people shaking hands
- Cold, clinical, corporate imagery
- Overly posed or stiff professional photos
- Images with competing colors (red, orange, purple)
- Dark, moody, or anxiety-inducing financial imagery
- Charts and graphs as hero imagery (data, not people)
AI-Generated Imagery (Nano Banana Style)
The site uses AI-generated portrait illustrations of Linda in the "nano banana" style — a painterly, editorial illustration style that combines photorealism with artistic warmth. These are used for hero and about sections.
Icon System
All icons use the Lucide React library. Icons should be used at consistent sizes and always paired with text labels in UI contexts.
| Context | Size | Color |
|---|---|---|
| Service card icon | size={18} | text-navy (in gold/10 bg container) |
| Navigation icon | size={14} | text-slate-400 / text-gold (active) |
| Button arrow | size={14-15} | Inherits button text color |
| Feature list checkmark | size={16} | text-gold or text-emerald-500 |
| Section icon (large) | size={24} | text-navy (in gold/10 bg container) |
| Footer icon | size={14} | text-white/50 |
Technical Implementation Guide
This section is the complete reference for developers and AI coding assistants implementing new pages or components for the Spire Business website. Follow these specifications exactly to maintain brand consistency.
Stack & Dependencies
| Technology | Version | Notes |
|---|---|---|
| React | 19.x | Client-only SPA — no SSR |
| TypeScript | 5.6.x | Strict mode — all components must be typed |
| Tailwind CSS | 4.x | Colors use OKLCH format in @theme inline block |
| Wouter | 3.x | Client-side routing — use Link and useLocation |
| Framer Motion | 12.x | Available but prefer CSS transitions for simplicity |
| Lucide React | 0.453.x | Icon library — import named icons only |
| shadcn/ui | Latest | UI primitives — import from @/components/ui/* |
| Vite | 7.x | Build tool — dev server on port 3000 |
File Structure
client/
src/
pages/ ← Page-level components (one per route)
components/
Navigation.tsx ← Sticky nav — import on every page
Footer.tsx ← Site footer — import on every page
ui/ ← shadcn/ui primitives
index.css ← Global styles + Spire design tokens
index.html ← Google Fonts loaded here
Key files:
client/src/App.tsx ← Route definitions
client/src/index.css ← ALL design tokens live here
client/src/pages/*.tsx ← Individual page componentsNew Page Template
/*
* SPIRE BUSINESS — [Page Name] Page
* Design: Corporate Modernism meets Editorial Finance
* Colors: Navy (#293980), Gold (#C9A84C), White, Sky-light
* Typography: Playfair Display headlines + DM Sans body
*/
import { useEffect, useRef, useState } from "react";
import { Link } from "wouter";
import Navigation from "@/components/Navigation";
import Footer from "@/components/Footer";
// Standard scroll animation hook — copy this into every page
function useInView(threshold = 0.15) {
const ref = useRef<HTMLDivElement>(null);
const [inView, setInView] = useState(false);
useEffect(() => {
const observer = new IntersectionObserver(
([entry]) => { if (entry.isIntersecting) setInView(true); },
{ threshold }
);
if (ref.current) observer.observe(ref.current);
return () => observer.disconnect();
}, [threshold]);
return { ref, inView };
}
export default function PageName() {
const heroSection = useInView(0.1);
return (
<div className="min-h-screen bg-white overflow-x-hidden">
<Navigation />
{/* ── Hero Section ── */}
<section className="pt-28 pb-0 md:pt-36 bg-navy overflow-hidden">
<div className="container">
<div ref={heroSection.ref} className={`max-w-3xl transition-all duration-700 ${
heroSection.inView ? "opacity-100 translate-y-0" : "opacity-0 translate-y-8"
}`}>
{/* Eyebrow */}
<div className="flex items-center gap-3 mb-4">
<div className="h-px w-8 bg-gold" />
<span className="font-body text-gold text-xs font-semibold uppercase tracking-widest">
Eyebrow Label
</span>
</div>
{/* Headline */}
<h1 className="font-display text-white mb-5" style={{ fontSize: "clamp(2rem, 4vw, 3.2rem)" }}>
Primary Headline<br />
<span className="text-gold italic">Gold Italic Accent</span>
</h1>
{/* Subheadline */}
<p className="font-body text-white/75 text-lg leading-relaxed max-w-2xl mb-8">
Supporting description text goes here.
</p>
{/* CTA */}
<Link href="/contact">
<button className="group flex items-center gap-2 bg-gold text-navy-dark font-body font-semibold text-sm px-6 py-3 rounded transition-all hover:bg-yellow-500 hover:shadow-lg hover:-translate-y-0.5">
Primary CTA
</button>
</Link>
</div>
</div>
{/* Wave divider — always end navy hero sections with this */}
<div className="mt-14">
<svg viewBox="0 0 1440 48" fill="none" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="none" className="w-full block">
<path d="M0 48L1440 48L1440 12C1200 48 720 0 0 36L0 48Z" fill="white" />
</svg>
</div>
</section>
{/* ── Content Section ── */}
<section className="py-16 md:py-24 bg-white">
<div className="container">
{/* Section header */}
<div className="text-center mb-12">
<div className="flex items-center justify-center gap-3 mb-4">
<div className="h-px w-8 bg-gold" />
<span className="font-body text-gold text-xs font-semibold uppercase tracking-widest">
Section Label
</span>
<div className="h-px w-8 bg-gold" />
</div>
<h2 className="font-display text-navy-dark mb-4" style={{ fontSize: "clamp(1.8rem, 3vw, 2.6rem)" }}>
Section Headline
</h2>
<p className="font-body text-slate-500 text-base max-w-2xl mx-auto">
Section description text.
</p>
</div>
{/* Content here */}
</div>
</section>
<Footer />
</div>
);
}Critical Rules for AI Coding Assistants
Every page must start with <Navigation /> and end with <Footer />. These are never optional.
Playfair Display is the brand headline font. Never use font-body (DM Sans) for major headlines.
DM Sans for all body copy, labels, buttons, nav items, captions. Never use font-display for paragraph text.
bg-gold is only used for CTA buttons and small badge elements. Never use it for section backgrounds or large areas.
Every section starts with: gold rule line + gold uppercase tracking-[0.2em] label + h2 headline.
The wave SVG creates the smooth transition from navy to white. Never end a navy section abruptly.
Copy the useInView hook exactly as shown. Use opacity-0 translate-y-6 → opacity-100 translate-y-0 with duration-700.
In index.css, always use OKLCH format. In JSX inline styles, hex is acceptable. Always add hex as a comment.
The pattern <span className='text-gold italic'>phrase</span> inside a Playfair Display headline is a core brand signature.
group-hover:translate-x-1 transition-transform on the ArrowRight icon inside a group button.
Adding a New Route
// In client/src/App.tsx:
// 1. Import the page component
import NewPage from "./pages/NewPage";
// 2. Add the route inside <Switch>
<Route path="/new-page" component={NewPage} />
// 3. To add to navigation, edit client/src/components/Navigation.tsx:
const navLinks = [
{ label: "Services", href: "/services" },
{ label: "Why Fractional CPO", href: "/why-fractional" },
{ label: "About", href: "/about" },
{ label: "Testimonials", href: "/testimonials" },
{ label: "Contact", href: "/contact" },
// Add new link here:
{ label: "New Page", href: "/new-page" },
];Image Handling
# NEVER store images in client/public/ or client/src/assets/
# This causes deployment timeouts.
# CORRECT workflow:
# 1. Store originals in /home/ubuntu/webdev-static-assets/
# 2. Upload to CDN:
manus-upload-file --webdev /home/ubuntu/webdev-static-assets/image.jpg
# 3. Use the returned CDN URL in code:
# <img src="https://cdn.manus.im/..." alt="..." />
# Current CDN images in use:
# Hero portrait (Linda, nano banana style): CDN URL in Home.tsx
# About portrait (Linda, warm library): CDN URL in About.tsxAccessibility Requirements
| Requirement | Standard | Implementation |
|---|---|---|
| Color contrast (body) | WCAG AA (4.5:1) | Navy text on white: 8.2:1 ✓ |
| Color contrast (large text) | WCAG AA (3:1) | Gold on navy: 4.1:1 ✓ |
| Focus indicators | Visible focus ring | outline-ring/50 applied globally in index.css |
| Alt text | All images | Descriptive alt text required on all <img> elements |
| Keyboard navigation | Full keyboard access | All interactive elements must be keyboard-reachable |
| ARIA labels | Buttons without text | aria-label required on icon-only buttons |
| Heading hierarchy | Logical h1→h2→h3 | One h1 per page; h2 for sections; h3 for cards |
| Mobile touch targets | 44×44px minimum | All buttons and links meet minimum touch target size |
Brand & Style Guide · Version 2.0 · 2025
Internal document. All brand elements are proprietary to Spire Business and Linda Brown.