diff --git a/.cpanel.yml b/.cpanel.yml new file mode 100644 index 0000000..64fee2c --- /dev/null +++ b/.cpanel.yml @@ -0,0 +1,17 @@ +--- +deployment: + tasks: + - export DEPLOYPATH=/home/bigbreathco/public_html/ + - /bin/cp -r src/assets "$DEPLOYPATH" + - /bin/cp -r src/about "$DEPLOYPATH" + - /bin/cp -r src/contact "$DEPLOYPATH" + - /bin/cp -r src/services "$DEPLOYPATH" + - /bin/cp -r src/privacy-policy "$DEPLOYPATH" + - /bin/cp -r src/terms-of-service "$DEPLOYPATH" + - /bin/cp -r src/api "$DEPLOYPATH" + - /bin/cp src/index.html "$DEPLOYPATH" + - /bin/cp src/404.html "$DEPLOYPATH" + - /bin/cp src/500.html "$DEPLOYPATH" + - /bin/cp src/robots.txt "$DEPLOYPATH" + - /bin/cp src/sitemap.xml "$DEPLOYPATH" + - /bin/cp src/llms.txt "$DEPLOYPATH" diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..baefc49 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +.planning +.git +.gitignore +*.md +README* +node_modules diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..5f6efb5 --- /dev/null +++ b/.env.example @@ -0,0 +1,19 @@ +# Big Breath — environment variables +# Copy this file to .env and fill in real values. +# .env is excluded from Docker builds and git via .dockerignore / .gitignore. + +# ── Contact form (Resend) ────────────────────────────────────────────────── +RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxxxxxxxxxx +SEND_TO_EMAIL=hello@bigbreath.co +SEND_FROM_EMAIL=noreply@bigbreath.co +SEND_FROM_DOMAIN=bigbreath.co + +# ── reCAPTCHA v3 ────────────────────────────────────────────────────────── +RECAPTCHA_SECRET_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxx + +# ── Rate limiting ───────────────────────────────────────────────────────── +RATE_LIMIT_PER_IP_PER_10MIN=5 +SCORE_PASS=0.7 +SCORE_REVIEW=0.4 +TIME_MIN_SECONDS=3 +TRUST_PROXY=1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dac9c40 --- /dev/null +++ b/.gitignore @@ -0,0 +1,75 @@ +# Env +.env +*.env + +# Node / build +node_modules/ +dist/ +build/ +.next/ +.nuxt/ +.cache/ +.parcel-cache/ +.vite/ +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# OS / editor +.DS_Store +Thumbs.db +.idea/ +.vscode/ +*.swp +*.swo + +# Python +__pycache__/ +*.pyc +.venv/ +venv/ + +# Planning binary assets (kept locally, excluded from git) +.planning/Big Breath/ +.planning/extracted-assets/ +.planning/competitive/ +.planning/presentation-deck/ +.planning/visualconcepts/ +.planning/concept-*.png +.planning/concept-*.jpg +.planning/zip-manifest-raw.txt + +# Large binary file types anywhere +*.psd +*.ai +*.sketch +*.fig +*.indd +*.pptx +*.ppt +*.docx +*.doc +*.xlsx +*.xls +*.pdf +*.zip +*.tar +*.tar.gz +*.tgz +*.rar +*.7z +*.dmg +*.iso + +# Video files (images are kept) +*.mp4 +*.mov +*.avi +*.mkv +*.webm +*.wmv +*.flv +*.m4v +*.mpg +*.mpeg diff --git a/.planning/00_BRIEF.md b/.planning/00_BRIEF.md new file mode 100644 index 0000000..fe39798 --- /dev/null +++ b/.planning/00_BRIEF.md @@ -0,0 +1,41 @@ +# Big Breathe — Project Brief + +**Domain:** bigbreathe.com +**Client:** Big Breathe Yoga Company +**Port (local dev):** 8010 +**Brand color:** Green (#3A7D54 primary) +**Stack:** Static HTML + vanilla JS + PHP contact form — Arising Media standard stack + +## Services (6) +1. Group Classes — /services/group-classes/ +2. Private Sessions — /services/private-sessions/ +3. Corporate Wellness — /services/corporate-wellness/ +4. Prenatal Yoga — /services/prenatal-yoga/ +5. Meditation & Breathwork — /services/meditation-breathwork/ +6. Online / Virtual Yoga — /services/online-yoga/ + +## Pages complete (scaffold) +- index.html — home +- about/index.html +- services/index.html +- services/{6 services}/index.html +- contact/index.html +- privacy-policy/index.html +- terms-of-service/index.html +- 404.html / 500.html + +## DRAFT NEEDED (everywhere marked ) +All body copy, meta descriptions, OG descriptions, hero headlines, trust points, +why-cards, approach items, FAQ items, quote, instructor bio, credentials, taglines, +footer tagline, contact info. Do NOT fill in fabricated content — get copy from client. + +## Structure mirrors +vibrantyoucounseling.com — same nginx/php-fpm/supervisord/Dockerfile pattern. + +## Next steps +- [ ] Get copy from client for all DRAFT NEEDED slots +- [ ] Source instructor/studio photos → /assets/images/ +- [ ] Create favicon SVG → /assets/svg/favicon.svg +- [ ] Set Coolify env vars: SEND_FROM_EMAIL, SEND_TO_EMAIL, RESEND_API_KEY +- [ ] DNS setup per SOP 09-domain-email-dns.md +- [ ] Playwright verification per SOP 10-testing-verification.md diff --git a/.planning/01_DESIGN_TOKENS.md b/.planning/01_DESIGN_TOKENS.md new file mode 100644 index 0000000..e150db9 --- /dev/null +++ b/.planning/01_DESIGN_TOKENS.md @@ -0,0 +1,25 @@ +# Design Tokens — Big Breathe + +## Color Palette (Forest Green) + +| Token | Value | Use | +|----------------|-----------|------------------------------| +| --forest | #3A7D54 | Primary brand green | +| --forest-deep | #275C3D | Hover states, accents | +| --forest-soft | #72AF87 | Muted / secondary green | +| --forest-pale | #B8D9C5 | Borders, decorative | +| --forest-mist | #E2F2E9 | Backgrounds, orbs | +| --ink | #1E2E28 | Primary text | +| --ink-soft | #4A5E56 | Body text | +| --ink-mute | #7A8880 | Captions, labels | +| --cream | #F9F7F4 | Hero / section backgrounds | +| --bone | #FBFAF7 | Page background | +| --footer-bg | #1E2E28 | Footer dark | + +## Typography +- Display: Cormorant Garamond (Google Fonts) +- Body: Inter (Google Fonts) +- Scale: tokens.css --t-xs through --t-6xl + +## CSS class prefix +bb- (vs. vy- in vibrantyoucounseling.com) diff --git a/.planning/DESIGN_SYSTEM.md b/.planning/DESIGN_SYSTEM.md new file mode 100644 index 0000000..ced8f18 --- /dev/null +++ b/.planning/DESIGN_SYSTEM.md @@ -0,0 +1,201 @@ +# Big Breath — Design System & Homepage Blueprint + +Domain: bigbreathe.co +Client: Big Joe (Joseph Fauria) +Date: 2026-05-15 + +--- + +## Design Goal + +This is not a website. It is a cinematic entry point into Big Joe's world. The visitor should feel something before they read anything. The experience mirrors what breathwork does: it slows you down, draws you inward, and delivers clarity. Every scroll reveals intention. + +--- + +## Color System + +### Base (Dark Foundation) +--bb-void: #060D1A /* near-black, deepest bg */ +--bb-navy: #0B1428 /* primary background */ +--bb-navy-mid: #0D1B3E /* cards, lifted surfaces */ +--bb-navy-lift: #112244 /* hover states, borders */ + +### Energy (Electric Blue — the particle layer) +--bb-electric: #1B6FD8 /* primary accent, CTA bg */ +--bb-bright: #4A9FE8 /* hover, active states */ +--bb-ice: #6AB4F5 /* secondary text highlight */ +--bb-mist: #A0C8FF /* soft glows, icon fills */ + +### Foreground +--bb-white: #FFFFFF /* primary text, wordmark */ +--bb-white-70: rgba(255,255,255,0.70) /* body text on dark */ +--bb-white-40: rgba(255,255,255,0.40) /* muted labels, captions */ +--bb-white-10: rgba(255,255,255,0.08) /* subtle card borders */ + +### Utility +--bb-line: rgba(74,159,232,0.20) /* dividers, grid lines */ +--bb-glow: rgba(27,111,216,0.35) /* particle/button glow */ + +--- + +## Typography + +### Display (Cormorant Garamond — wispy, editorial, cursive feel) +- Hero heading: Cormorant Garamond, Italic, 700, clamp(3.5rem, 8vw, 7rem) +- Section heading: Cormorant Garamond, Italic, 600, clamp(2rem, 4vw, 3.5rem) +- Pull quote: Cormorant Garamond, Italic, 400, clamp(1.5rem, 3vw, 2.25rem) + +### Body (Inter — clean contrast to the wispy display) +- Body: Inter, 400, 1rem, line-height 1.7 +- Label/eyebrow: Inter, 500, 0.75rem, letter-spacing 0.15em, uppercase +- CTA/nav: Inter, 600, 0.875rem + +### Pairing Rule +Every section: one Cormorant Garamond headline (italic, light) + Inter body. Never both at the same weight. The contrast is the design. + +--- + +## Motion System + +### Entry +- Page load: canvas particle system initializes at 0 opacity, fades in over 1.2s +- Hero wordmark: translates from Y+40px to Y:0, opacity 0→1, staggered per word, 800ms, ease-out-expo +- Hero subhead: 200ms delay after wordmark, same translate +- Particles respond to mouse position (subtle parallax, max 20px shift) + +### Scroll Triggers (GSAP ScrollTrigger) +- Each section block fades in + rises 30px as it enters viewport +- Particle density decreases as user scrolls past hero (scrub: true) +- Stats counter: number increments when section enters view +- Logo bar: continuous horizontal scroll marquee, pauses on hover + +### Performance Rules +- Particles: canvas-based (tsParticles or vanilla canvas), max 80 particles on mobile, 200 desktop +- All animations: respect prefers-reduced-motion (disable translate/particles, keep fades) +- No video autoplay — use poster frames + play-on-click + +--- + +## Homepage User Flow + +### 1. HERO — "Take a Big Breath" +Full viewport. Navy void background. Particle system active (blue bokeh matching logo). + +Layout: +- Center-anchored wordmark rises on load: "Take a Big Breath" in Cormorant Garamond Italic +- Subhead: "Breathwork for those who demand more from life." (Inter, white-70) +- Two CTAs: [Book a Session] (electric blue filled) + [Watch the Story] (ghost/outline) +- Scroll indicator: animated breath-pulse dot at bottom center + +Goal: Stop the scroll. Make them feel the room shift. + +### 2. SOCIAL PROOF BAR — Partners +Full-width marquee. White logos at 60% opacity on dark navy strip. +NFL | NFLPA | Olympics | UCLA Bruins | Airbnb | Pepsi | Lincoln | GMC | Remedy Place | Kachava | Hoag + +Eyebrow label: "TRUSTED BY" in Inter 500 uppercase tracking. +No heading. The logos speak. + +### 3. WHAT IS BIG BREATH — The Philosophy +Two-column. Left: large Cormorant Garamond pull quote. Right: 3-paragraph body copy. + +Pull quote (left): "Between work and life, most people's nervous systems are on the fritz. Breath is the fastest way back." + +Right column body: +- What breathwork does scientifically (cortisol, focus, recovery) +- Why Big Breath is different: former NFL athlete, not a wellness influencer +- Who it's for: athletes, executives, teams, anyone seeking edge + +Subtle animated line separator between columns (draws in on scroll). + +### 4. MEET BIG JOE — The Human +Full-bleed section. Dark navy. Left: large portrait photo (one of the headshots from .planning). Right: his story. + +Headline: "Big Joe" in Cormorant Garamond Italic, massive. +Eyebrow: "FOUNDER & GUIDE" + +Copy beats: +1. NFL career → ankle injury → rock bottom +2. 2018: began breathwork daily. Changed everything. +3. 7 years, multiple certifications, 15,000+ people guided +4. 143K followers — built through results, not marketing +5. Countries: 15+ across every continent + +Stat row (animated counters): + 15,000+ People Guided | 15+ Countries | 7 Years of Practice | 143K Community + +### 5. THE EXPERIENCE — Services +Three cards on dark navy, each with electric blue top accent line. + +Card 1: Breathwork Sessions +"30, 60, or 120-minute immersive breath journeys. Group or curated." +→ [Explore Sessions] + +Card 2: Corporate Wellness +"Built for teams. Backed by science. A win for your organization." +→ [Corporate Programs] + +Card 3: Private 1-on-1 +"Intentional, breath-led coaching for high performers." +→ [Book Private Session] + +Below the cards: two more (Keynotes | Retreats & Live Experiences) as secondary text links. + +### 6. GLOBAL REACH — Impact +Dark section. Particle background at low opacity. +Headline (Cormorant Garamond): "Every continent. Every level of performance." +World map graphic (SVG, dots on guided countries) or simple country name list. + +Countries: USA, Mexico, Canada, Netherlands, France, Indonesia, Costa Rica, Saudi Arabia, UAE, Colombia, Greece, Japan, Sweden, Turkey, Saint Barthélemy + +### 7. TESTIMONIALS +Three-column card grid. Cards: navy-lift bg, blue left-border accent. +Quote text in Cormorant Garamond Italic. Attribution in Inter. + +"As soon as I walked into the room, I felt protected and safe." — Brian Godfrey, Los Angeles +"I didn't know the power of my breath. The experience was life-changing." — Maria Muleta, Colombia +"Big Breath transformed our team." — Mark Thompson + +### 8. CTA CLOSE — Book the Experience +Full-bleed. Electric blue background (the only section not on navy). +Headline: "Ready to take a Big Breath?" — Cormorant Garamond, white. +Subhead: "Sessions available in-person and worldwide." — Inter. +Button: [Book a Session] white on blue | [Email Us] ghost + +Contact: Hello@bigbreath.co + +--- + +## Inner Page Pattern + +All inner pages: +- Compact hero: navy bg, page title in Cormorant Garamond Italic, breadcrumb in Inter +- Content blocks: same token set, white-70 body on navy +- CTA strip at bottom of every page (book / contact) + +--- + +## Service Page Structure (each) + +1. Hero: service name + one-sentence promise +2. What it is: 2-3 paragraphs +3. Session formats (30/60/120 min where applicable) +4. Who it's for +5. What to expect +6. 1 testimonial +7. CTA + +--- + +## Files to Build (in order) + +1. tokens.css — color + type system (done) +2. index.html — homepage +3. about.html — Big Joe story (expanded) +4. services/index.html — services overview +5. services/breathwork-sessions/index.html +6. services/corporate-wellness/index.html +7. services/private-sessions/index.html +8. services/keynotes/index.html +9. services/retreats/index.html +10. contact/index.html diff --git a/.planning/EXECUTION_PHASES.md b/.planning/EXECUTION_PHASES.md new file mode 100644 index 0000000..dbea5e7 --- /dev/null +++ b/.planning/EXECUTION_PHASES.md @@ -0,0 +1,77 @@ +# Big Breath — Execution Phases + +Last screenshot: concept-v3.png (black base, blue accent, Joe in correct position) +Status: Wireframe concept approved in direction, not yet production-ready. + +--- + +## Phase 1 — Foundation & Structure (next session) + +Goal: Homepage HTML complete, all sections present, correct order, no placeholders. + +Tasks: +1. Extract partner logos from pitch deck PDF using pdfimages → save to src/assets/images/logos/ +2. Convert HEIC headshots to JPG using heif-convert → src/assets/images/headshots/ +3. Copy Big Joe JPGs to src/assets/images/joe/ +4. Rebuild index.html from scratch using concept.html as reference — clean semantic HTML, no inline styles +5. Add the 4 missing sections: + - Section A: "The Science" (stress, cortisol, HRV — cite HBR per Jermaine's note) + - Section B: "In the Room" (group photo gallery — horizontal scroll) + - Section C: "Upcoming Sessions" (event cards) + - Section D: "The Practice, Anywhere" (app/digital membership) +6. Correct section order: + Hero → USP Bridge → Philosophy → The Science → Meet Big Joe → In the Room → Services → Logo Bar → Testimonials → Global Reach → Upcoming Sessions → CTA Close + +Agent: AC-Build-AGENT (Sonnet) +Verify: Playwright full-page screenshot after each section added + +--- + +## Phase 2 — Motion & Parallax (after Phase 1 approved) + +Goal: The page moves. Visitor feels breath in the scroll. + +Tasks: +1. Wire GSAP ScrollTrigger to all section reveals (already in concept, needs production port) +2. Ghost word parallax — "BREATH" at 0.1x scroll rate spanning hero → philosophy +3. Joe photo card rises at 1.15x scroll rate (comes toward viewer) +4. Particle system: grid-distributed, zoom/disperse on scroll (done in concept, port to production) +5. Background gradient shifts blue glow position as user scrolls (GSAP scrub on radial-gradient position via CSS custom property) +6. Stat counters animate on enter (15K+, 143K, 15+) +7. Logo marquee — Swiper.js autoplay infinite, pause on hover +8. Nav: transparent on hero, frosted glass (#080808 at 85% opacity + backdrop-filter) when scrolled + +Agent: AC-Build-AGENT (Sonnet) +Verify: Manual scroll test + Playwright scroll-to screenshots at 25%, 50%, 75%, 100% + +--- + +## Phase 3 — Assets, Polish & Pre-Launch (after Phase 2 approved) + +Goal: Real photos, real logos, performance optimized, ready for Docker deploy. + +Tasks: +1. Replace all placeholder copy with approved copy from pitch deck PDFs +2. Place real Joe headshots in Meet Big Joe section (clothed shots only — Jermaine's note) +3. Place real group session photos in "In the Room" gallery +4. Wire partner logos (PNG extracted from PDF) into logo marquee +5. Add contact form to /contact/ page (POST to src/api/contact.php) +6. SEO: meta descriptions, OG tags, canonical URLs all set to bigbreathe.co +7. Performance: compress all images (convert to WebP), defer non-critical JS +8. Deploy via Docker + nginx (Dockerfile already in place) +9. Run verify-protection.sh audit (per MEMORY: am-webdesign-sops/tools/verify-protection.sh) +10. Test on mobile (375px, 390px, 430px viewports) + +Agent: AC-Build-AGENT (Sonnet) + AC-QC-AGENT (Haiku verify) +Verify: Lighthouse score >90 performance, all links resolve, mobile screenshots pass + +--- + +## Agent Dispatch Plan (Phase 1) + +Spawn in parallel after compact: +- Agent A: pdfimages extraction + heif-convert batch (Haiku) +- Agent B: index.html rebuild sections 1-4 (Sonnet) +- Agent C: index.html rebuild sections 5-8 (Sonnet) + +Gate: Both B and C screenshot via Playwright before proceeding to Phase 2. diff --git a/.planning/PARALLAX_PLAN.md b/.planning/PARALLAX_PLAN.md new file mode 100644 index 0000000..0b29091 --- /dev/null +++ b/.planning/PARALLAX_PLAN.md @@ -0,0 +1,74 @@ +# Big Breath — Parallax Architecture Plan + +## The Core Concept +As you scroll, you are moving THROUGH breath. Large typography persists across sections at a slower scroll rate than the content. Images overlap from below. The page breathes — it expands and contracts as you move through it. + +--- + +## 5 Parallax Layers (z-axis stack, back to front) + +### Layer 0 — Atmospheric (slowest, fixed-ish) +Large ghost word "BREATH" in Cormorant Garamond Italic, ~30vw tall, opacity 3-5%. +Scrolls at 0.1x rate using GSAP ScrollTrigger scrub. +Spans from hero through philosophy section — user sees it slowly moving behind everything. +```js +gsap.to('.ghost-word', { y: '-30%', ease: 'none', scrollTrigger: { scrub: 1, start: 'top top', end: 'bottom top' }}); +``` + +### Layer 1 — Background gradient shift +Body background radial gradient center shifts horizontally as user scrolls. +Creates feeling of moving through space. +Electric blue glow tracks toward center as you reach the "Meet Big Joe" section. + +### Layer 2 — Photo cards (scroll faster than content) +Big Joe headshot card scrolls at 1.15x speed — appears to "rise" as content catches up. +Implemented with GSAP `scrollTrigger: { scrub: true }` on `translateY(-80px)` to `translateY(0)`. +Creates the illusion the photo is coming toward you. + +### Layer 3 — Content blocks (normal speed, 1x) +All section text, cards, and UI at normal scroll rate. + +### Layer 4 — Foreground particles (fastest, 1.05x) +Particle canvas scrubs slightly faster — reinforces depth. + +--- + +## 4 Missing Sections to Add + +### Section A — "The Science" (after Philosophy) +Headline: "Why breath works — the research" +3 columns: Stress Reduction | Focus & Cognition | Recovery +Reference: Harvard Business Review citation (Jermaine's note) +Visual: animated line graph or pulse wave SVG + +### Section B — "In the Room" (after Meet Big Joe) +Full-bleed group photo gallery — horizontal scroll or masonry +Shows real sessions: corporates, athletes, retreats +Caption: location + context per photo +Source: Group Photos + 2026 Additions from .planning + +### Section C — "Upcoming Sessions & Events" +Dark card grid — event name, location, date, "Reserve Spot" CTA +If no live data: placeholder cards styled correctly + +### Section D — "The Practice, Anywhere" (App / Digital) +App membership mention +Simple: headline + subhead + single CTA +Positions Big Breath beyond in-person + +--- + +## Logo Block — Correct Position +Move to: AFTER testimonials, BEFORE final CTA close. +Framing: "Brands that trust the practice" — less corporate, more community signal. +Treatment: actual logos (extract from PDF with pdfimages), not text. + +--- + +## Execution Order (after /compact) +1. Extract partner logos: pdfimages on pitch deck PDF +2. Convert HEIC headshots to JPG for group photo section +3. Add ghost-word parallax layer (Layer 0) +4. Add 4 missing sections (A, B, C, D) +5. Move logo block to post-testimonials +6. Wire GSAP scrub to photo cards diff --git a/.planning/capture_sites.py b/.planning/capture_sites.py new file mode 100644 index 0000000..d7aab9d --- /dev/null +++ b/.planning/capture_sites.py @@ -0,0 +1,28 @@ +import asyncio +from playwright.async_api import async_playwright + +sites = [ + ("othership", "https://www.theothership.com"), + ("wim-hof", "https://www.wimhofmethod.com"), + ("remedy-place", "https://remedyplace.com"), +] + +async def capture(): + async with async_playwright() as p: + browser = await p.firefox.launch() + for name, url in sites: + try: + page = await browser.new_page(viewport={"width": 1440, "height": 900}) + await page.goto(url, timeout=20000) + await page.wait_for_timeout(3000) + await page.screenshot( + path=f"/home/sirdrez/arisingmedia-websites/bigbreathe.com/.planning/competitive/{name}.png", + full_page=False + ) + print(f"Captured: {name}") + await page.close() + except Exception as e: + print(f"Failed {name}: {e}") + await browser.close() + +asyncio.run(capture()) diff --git a/.planning/client-files-index.md b/.planning/client-files-index.md new file mode 100644 index 0000000..f8af59f --- /dev/null +++ b/.planning/client-files-index.md @@ -0,0 +1,143 @@ +# Big Breath — Client Files Index + +Source: 15 zip files (`Big Breath-20260515T184538Z-3-001` through `-018`, missing parts 002–004) +Extracted to: `.planning/Big Breath/` +Indexed: 2026-05-15 +Total files: 177 | Total compressed size: ~29.4 GB + +--- + +## Logos (8 files) + +Big_Breath_Logo_A.JPG +Big_Breath_Logo_AA.JPG +Big_Breath_Logo_B.JPG +Big_Breath_Logo_BB.JPG +Big_Breath_Logo_C.JPG +Big_Breath_Logo_CC.JPG +Big_Breath_Logo_D.JPG +Big_Breath_Logo_DD.JPG +Big_Breath_Logo_E.JPG +Big_Breath_Logo_EE.JPG + +--- + +## Brand / Mockup Assets (9 files) + +Lotus 3 Symbol inside circle.png +Lotus 2.png +Lotus 1.png +Yellow gold.png +Gold.png +Bracket photo.png +Big_Breath_Presntation-13.JPG +Big_Breath_Presntation-13(1).JPG +Big_Breath_Presntation-14.JPG +Big_Breath_Presntation-14(1).JPG + +--- + +## Documents (6 files) + +Links and Notes.docx +Big Breath Corporate Pitch Deck v4.pdf +big breath - Final.pdf +Big Breath_Presntation_Mockup_2.pdf +Big Breath_Presntation_Mockup_1.pdf +big breath - Draft with notes.pptx + +--- + +## Photos — Headshots (45 files) + +DSCF0876.jpg, DSCF0881.jpg, DSCF0892.jpg, DSCF0895.jpg, DSCF0898.jpg, DSCF0900.jpg +IMG_4853.heic, IMG_4854.heic, IMG_4859.heic, IMG_4862.heic, IMG_4862-2.heic +IMG_4863.heic, IMG_4865.heic, IMG_4869.heic, IMG_4878.heic, IMG_4883.heic +IMG_4888-2.heic, IMG_4896.heic, IMG_4897.heic, IMG_4898.heic, IMG_4908.heic, IMG_4910.heic +IMG_1352.JPG +CG112123-434.jpg, CG112123-442.jpg, CG112123-449.jpg, CG112123-453.jpg +CG112123-491.jpg, CG112123-494.jpg +DSC04034 kopie.jpg, DSC04047 kopie.jpg, DSC04072 kopie.jpg + +--- + +## Photos — Group (20 files) + +DSC08333.JPG, DSC08340.JPG, DSC08560.JPG, DSC08573.JPG, DSC08682.JPG +DSC09249.JPG, DSC09607.JPG +IMG_4461.JPG, IMG_4461(1).JPG, IMG_4462.JPG, IMG_4463.JPG, IMG_4466.JPG +IMG_4476.JPG, IMG_4877.JPG, IMG_4878.JPG, IMG_4882.JPG +dji_20240721100351_0001_d.HEIC +E36BBE49-07A8-4026-B05A-7B0FE5CE5264.JPG +New New 2026/DSC00012.JPG +New New 2026/IMG_6477.JPG + +--- + +## Photos — Big Joe (47 files) + +DSCF0705.jpg, DSCF0706.jpg, DSCF0718.jpg, DSCF0795.jpg (+ ~43 more DSCF series) + +--- + +## Photos — One on One (3 files) + +DSC08462.JPG +DSC08471.JPG +owncamerasday2-11.JPG + +--- + +## Photos — 2026 Additions (63 files) + +IMG_6748.JPG, IMG_3201.JPG, IMG_4878.JPG, DSC00151.JPG (+ ~59 more) +Includes: IMG_0454.JPG + +--- + +## Videos — Drone Footage (9 files) + +DJI_20240430191237_0053_D.MP4 +DJI_20240430191629_0055_D.MP4 +DJI_20240506234624_0089_D.MP4 +DJI_20240602081138_0094_D.MP4 +DJI_20240602081245_0095_D.MP4 +DJI_20240828122837_0157_D.MP4 +DJI_20250124175913_0284_D.MP4 +DJI_20250124180125_0286_D.MP4 +DJI_20250124180221_0287_D.MP4 + +--- + +## Videos — YouTube / Promo (2 files) + +BigBreath_2.mp4 +Why breathwork.mp4 + +--- + +## Videos — 2025 Pendry Hotel Event (2 files) + +Big Joe x Soulstice Pendry 0625 iPhone.mp4 +Big Joe x Soulstice Pendry 0625 V1.mp4 + +--- + +## Videos — Misc (2 files) + +IMG_7313.MOV +IMG_7315.JPG + +--- + +## Testimonials (23 files) + +IMG_1122.MOV, IMG_1123.MOV, IMG_1183.MOV, IMG_2796.MOV (+ ~19 more .MOV files) + +--- + +## Notes + +- Duplicates detected: IMG_4878.JPG (3 zips), IMG_4877.JPG (3 zips), IMG_4882.JPG (2 zips), DSC00012.JPG (2 zips), IMG_4466.JPG (2 zips). The `-o` flag was used during extraction so last-write wins. +- HEIC files require conversion before web use. +- Parts 002, 003, 004 were not present in the delivery — confirm with client if missing. diff --git a/.planning/concept-a.html b/.planning/concept-a.html new file mode 100644 index 0000000..d4af293 --- /dev/null +++ b/.planning/concept-a.html @@ -0,0 +1,1556 @@ + + + + + + Big Breath — Breathwork with Joseph Fauria + + + + + + + + + + + + + + + +
+
+
+

FORMER NFL ATHLETE · 15,000+ PEOPLE GUIDED · 15 COUNTRIES

+

Take a big breath
& have the best day ever.

+

Breathwork for athletes and high performers who demand more from life. Guided by former NFL player Big Joe — on fields, in boardrooms, and in arenas worldwide.

+ +
+
+ Joseph Fauria — Big Joe +
+
+
BREATH
+
+ + +
+
+
+
15,000+
+
People Guided
+
+
+
143K
+
Community
+
+
+
15+
+
Countries
+
+
+
7
+
Years
+
+
+
+ + +
+
+
+ +

From the field
to the breath.

+

Joseph Fauria played four years in the NFL. Then a career-altering ankle injury ended it — and started everything else. In 2018 he found breathwork. Not as a wellness trend, but as survival. What he discovered changed his life — and he has spent seven years making sure it changes yours.

+

Big Joe leads sessions for athletes, executives, and anyone standing at the edge of something new. He has guided thousands of people — from NFL locker rooms to corporate boardrooms — through the same practice that rebuilt him.

+
+

"As soon as I walked into the room, I felt protected and safe. That authenticity is rare."
— Brian Godfrey, Los Angeles

+
+
+
+ Big Joe +
+
+
+ + +
+
+

"Between work and life, most people's nervous systems are on the fritz. Breath is the fastest way back."

+
+

Seven years  ·  Fifteen countries  ·  One practice.

+
+
+ + +
+
+
+ +

Why breath works.

+
+
+
+
01
+
Stress Reduction
+

Controlled breathing increases oxygen flow to the brain, enhancing cognitive functions such as focus and memory and lowering cortisol levels.

+
+
+
02
+
Enhanced Recovery
+

By improving oxygen delivery to tissues and promoting relaxation, breathwork aids in muscle recovery and reduces fatigue.

+
+
+
03
+
Focus & Cognition
+

Specific breathing techniques enhance endurance, improve circulation and boost neuroplasticity and cognitive performance.

+
+
+
04
+
Emotional Regulation
+

Breathwork reduces symptoms of anxiety and depression. Regular practice leads to improved emotional well-being.

+
+
+
+
+ + +
+
+
+ +

Built for performance.
Available for everyone.

+
+
+
+
+
Breathwork Sessions
+

Techniques rooted in ancient practices. 30, 60, or 120-minute sessions tailored to your audience — private or group.

+
+
+
+
Corporate Wellness
+

Build team unity. Enhance creativity. Increase productivity. A happy, healthy human performs better.

+
+
+
+
Athletic Teams
+

Physical recovery. Leadership development. Manage stress and handle responsibility on and off the field.

+
+
+ + + See all services + +
+
+ + + + + +
+

Trusted By

+
+
+ NFL + NFLPA + LA Chargers + UCLA Bruins + Olympics + Airbnb + Pepsi + Hoag Sports Medicine + Dove Men+Care + MUD/WTR + Entrepreneurs Organization + NFL + NFLPA + LA Chargers + UCLA Bruins + Olympics + Airbnb + Pepsi + Hoag Sports Medicine + Dove Men+Care + MUD/WTR + Entrepreneurs Organization +
+
+
+ + +
+
+
+ +
+
+
+ +

Big Breath transformed our team. The focus shift was immediate and measurable.

+

Mark Thompson  ·  Corporate Client

+
+
+ +

As soon as I walked into the room, I felt protected and safe. That authenticity is rare.

+

Brian Godfrey  ·  Los Angeles

+
+
+
+
+ + +
+
+

Where Big Joe Has Led

+

Fifteen countries.
One practice.

+
+
USA
+
Mexico
+
Canada
+
Netherlands
+
France
+
Indonesia
+
Costa Rica
+
Saudi Arabia
+
UAE
+
Colombia
+
Greece
+
Japan
+
Sweden
+
Turkey
+
Saint Barthélemy
+
+
+
+ + +
+
+

Take a big breath.

+

Your practice begins with one session. Big Joe meets you where you are.

+
+
+

For Individuals

+

Private sessions.
Your practice.

+

Private sessions. Group events. Retreats. One breathwork guide who has been where you are.

+ Book a Session → +
+
+

For Organizations

+

Your team.
Better.

+

Corporate wellness. Athletic teams. Keynotes. Measurable performance from the first session.

+ Get in Touch → +
+
+

+ hello@bigbreath.co +   ·   + @bigjoe +

+
+
+ + + + + + + diff --git a/.planning/concept-b.html b/.planning/concept-b.html new file mode 100644 index 0000000..d2a876e --- /dev/null +++ b/.planning/concept-b.html @@ -0,0 +1,1553 @@ + + + + + +Big Breath — Breathwork for Those Who Demand More + + + + + + + + + + + + +
+ + +
+ Breathwork for Those Who've Tried Everything Else + +

+ The breath is + the fastest way back. +

+ +

+ Between work and life, most people's nervous systems are running on empty. Big Joe built a practice from the other side of burnout — seven years, fifteen countries, one tool that works. +

+ + Begin Your Practice + +
+ Big Joe — Breathwork Coach +
+
+ +
+ Scroll +
+
+
+ + +
+
+
+
15,000+
+
People Guided
+
+
+
143K
+
Community
+
+
+
15+
+
Countries
+
+
+
7
+
Years
+
+
+
+ + +
+ +
+ Philosophy +
+ "Between work and life, most people's nervous systems are on the fritz. Breath is the fastest way back." +
+

This is why Big Joe built Big Breath. Not as a wellness trend — as survival.

+
+
+
+ + +
+
+
+ Joseph Fauria — Big Joe +
+
+
+ The Guide +

From the NFL
to the breath

+

+ Joseph Fauria played four years in the NFL. Then a career-altering ankle injury ended it — and started everything else. In 2018 he found breathwork. Not as a wellness trend, but as survival. What he discovered changed his life — and he has spent seven years making sure it changes yours. +

+
+

+ "After my NFL career ended, I had to rebuild from nothing. Breathwork wasn't a trend for me — it was survival. That's the practice I bring to every room." +

+
+
+ + +
+
+ The Science +

What happens inside

+
+

Cortisol drops. Focus returns. Your body already knows how — it just needs the signal.

+
+
+ 01 + Cognitive Function +

Oxygen, focus, and memory

+

+ Controlled breathing increases oxygen flow to the brain, enhancing cognitive functions such as focus and memory and lowering cortisol levels. +

+
+
+ 02 + Nervous System +

The fastest reset available

+

+ The breath is the only autonomic function you can consciously control — making it the most direct tool to shift your nervous system state in real time. +

+
+
+
+ + +
+
+ Services +

One practice.
Every version of you.

+
+
+
+ 01 +

Breathwork Sessions

+

30, 60, or 120-minute sessions. Designed to lower cortisol, restore focus, and give your nervous system a genuine reset.

+ Begin +
+
+ 02 +

Corporate Wellness

+

Your team is exhausted. This is the intervention that actually works — not a pizza party, not a ping pong table.

+ Learn more +
+
+ 03 +

Private 1-on-1

+

Intentional, breath-led coaching. Tailored to your goals, your pace, your nervous system.

+ Explore +
+
+
+ + + + + +
+

Trusted by

+
+
+ NFL + + NFLPA + + LA Chargers + + UCLA Bruins + + Olympics + + Airbnb + + Pepsi + + Hoag Sports Medicine + + Dove Men+Care + +
+ +
+
+ + +
+
+ +
+ I didn't know the power of my breath. The experience was life-changing. +
+
+ Maria Muleta — Colombia +
+
+ + +
+
+
+
+ Begin +

One breath changes everything.

+

+ Your nervous system is waiting. So is the version of you that operates without the noise. +

+ Begin Your Practice +
+
+ + + + + + + diff --git a/.planning/concept-c.html b/.planning/concept-c.html new file mode 100644 index 0000000..3706c8a --- /dev/null +++ b/.planning/concept-c.html @@ -0,0 +1,1018 @@ + + + + + + Big Breath — Breathwork by Big Joe + + + + + + + + + + + +
+ + + +
+ The only breathwork guide
who has performed under
NFL pressure.
+
+
+

Big Joe has guided teams at the NFL, Olympics, and Fortune 500 companies. He brings the same practice that rebuilt his life after a career-ending injury — to your team, your stage, your boardroom.

+ Scroll to begin ↓ +
+
+
+ + +
+
+ 15,000+ + People Guided +
+
+ 143K + Community +
+
+ 15+ + Countries +
+
+ 7 + Years +
+
+ + +
+
+ Big Joe — former NFL athlete and breathwork guide +
+
+

Big Joe. Former NFL athlete.
Seven years building what comes after.

+
+
+ +
+
+ THE CREDENTIAL +

Four years in the NFL.
Seven years rebuilding.

+

Joseph Fauria played four years in the NFL. Then a career-altering ankle injury ended it — and started everything else. In 2018 he found breathwork. Not as a wellness trend, but as survival. What he discovered changed his life — and he has spent seven years making sure it changes yours.

+
+
+ Big Joe +

"The only breathwork guide who has performed under NFL pressure — and built a practice from what he found on the other side."

+
+
+
+ + +
+ + +
+ Philosophy +
+ "Between work and life, most people's nervous systems are on the fritz. Breath is the fastest way back." +
+ — Big Joe +
+
+ + +
+
+ FOR YOUR ORGANIZATION +

From the sideline
to the boardroom.

+ 04 offerings +
+ +
+ 01 + Corporate Wellness +

Boardrooms, off-sites, and leadership retreats. Breathwork that resets a room and sharpens a team.

+
+ +
+ 02 + Athletic Teams +

From locker rooms to practice fields. Big Joe brings breathwork to athletes at every level — measurable, performance-driven results.

+
+ +
+ 03 + Keynotes & Speaking Engagements +

Insightful speaking experiences centered on breath, clarity, and modern leadership. Extraordinary life experience. Relatable, practical guidance.

+
+ +
+ 04 + Private Sessions +

One-on-one breathwork tailored to your nervous system, performance goals, and recovery needs. In-person or remote.

+
+
+ + +
+
+ THE SCIENCE +
+
+

Why breath works.

+
+
+ 01 +

Stress Reduction

Controlled breathing increases oxygen flow to the brain, enhancing cognitive functions such as focus and memory and lowering cortisol levels.

+
+
+ 02 +

Enhanced Recovery

By improving oxygen delivery to tissues and promoting relaxation, breathwork aids in muscle recovery and reduces fatigue.

+
+
+ 03 +

Focus & Cognition

Specific breathing techniques enhance endurance, improve circulation and boost neuroplasticity and cognitive performance.

+
+
+ 04 +

Emotional Regulation

Breathwork reduces symptoms of anxiety and depression. Regular practice leads to improved emotional well-being.

+
+
+
+ + + + + +
+ Trusted by +

Trusted by teams and brands who take performance seriously.

+
+ NFL· + NFLPA· + LA CHARGERS· + OLYMPICS· + UCLA BRUINS· + AIRBNB· + PEPSI· + HOAG SPORTS MEDICINE· + DOVE MEN+CARE +
+
+ + +
+
+ +

Big Breath transformed our team. The focus shift was immediate and measurable.

+ — Mark Thompson, Corporate Client +
+
+ + +
+ Ready to bring this
to your team?
+
+
+

For Teams & Events

+

Corporate wellness. Athletic programs. Keynotes. Retreats.

+ Start a Conversation → +
+
+

For Brands & Partnerships

+

Co-branded experiences. Long-term partnerships. Media opportunities.

+ Get in Touch → +
+
+
+ + + + + + diff --git a/.planning/concept.html b/.planning/concept.html new file mode 100644 index 0000000..167c7b1 --- /dev/null +++ b/.planning/concept.html @@ -0,0 +1,922 @@ + + + + + +Big Breath — Design Concept + + + + + + + + + + + + + + + + +
+ +
+ Breathwork · Wellness · Performance +

Take a Big Breath

+

Breathwork for those who demand more from life. Led by former NFL athlete Big Joe — in rooms, boardrooms, and arenas worldwide.

+
+ + +
+
+
Breath
+
+
+ + +
+
+

+ The only breathwork guide who has performed under NFL pressure — and built a practice from what he found on the other side. +

+
+
+ 15,000+ + People Guided +
+
+ 15+ + Countries +
+
+ 143K + Community +
+
+
+
+ + +
+
+
+ "Between work and life, most people's nervous systems are on the fritz. Breath is the fastest way back." +
+
+ What is Big Breath +

Most wellness programs treat the symptoms. Big Breath goes to the source — your nervous system. Through intentional breathing, cortisol drops, focus sharpens, and your body stops running on emergency mode.

+

This is not a yoga studio. This is not a meditation app. Big Breath is a live, guided experience led by someone who has performed at the highest level under pressure — and found breath on the other side of it.

+

Whether you're an athlete in recovery, an executive preparing to lead, or a team that needs to realign — the practice is the same. The breath is the tool.

+
+
+
+ +
+ + +
+
+
+ Big Joe +
+
+ Founder & Guide +

Big Joe

+
+

Joseph Fauria played four years in the NFL. Then an ankle injury ended it — and started everything else.

+

In 2018 he found breathwork. Not as a wellness trend, but as survival. What he discovered changed his life — and he has spent seven years making sure it changes yours.

+

Today Big Joe has guided over 15,000 people across 15 countries. Athletes, entrepreneurs, executives, and everyday people who needed a reset. The practice is ancient. His approach is completely his own.

+
+
+
15K+Guided
+
15+Countries
+
7Years
+
143KCommunity
+
+
+
+
+ +
+ + +
+ The Experience +

What Big Breath offers

+
+
+
+
Breathwork Sessions
+

30, 60, or 120-minute immersive breath journeys. Group or individually curated. Designed for reset and transformation.

+ Explore Sessions +
+
+
+
Corporate Wellness
+

Built for teams. Backed by science. Reduce cortisol, sharpen focus, and build the kind of trust that closes deals.

+ Corporate Programs +
+
+
+
Private 1-on-1
+

Intentional, breath-led coaching sessions for high performers. Tailored to your goals, your pace, your system.

+ Book Private Session +
+
+
+ +
+ + +
+
Brands that trust the practice
+
+ NFLNFLPAOlympicsUCLA BruinsAirbnbPepsiLincolnGMCRemedy PlaceHoagKachavaLA ChargersNFLNFLPAOlympicsUCLA BruinsAirbnbPepsiLincolnGMCRemedy PlaceHoag +
+
+ +
+ + +
+
+ What people say +

Rooms, boardrooms, and everything between

+
+
+

"As soon as I walked into the room, I felt protected and safe. That authenticity is rare."

+ Brian Godfrey — Los Angeles +
+
+

"I didn't know the power of my breath. The experience was life-changing."

+ Maria Muleta — Colombia +
+
+

"Big Breath transformed our team. The focus shift was immediate and measurable."

+ Mark Thompson — Corporate Client +
+
+
+
+ + +
+

Ready to take a Big Breath?

+

Sessions available in-person worldwide and for teams of any size.

+
+ + +
+
+ + + + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4de81aa --- /dev/null +++ b/Dockerfile @@ -0,0 +1,50 @@ +# Big Breathe — single-container web image for Coolify. +# nginx 1.x (static HTML/CSS/JS) +# php-fpm 8.3 (contact form /api/contact.php) +# supervisord (PID-1 process manager) + +FROM php:8.3-fpm-alpine + +RUN apk add --no-cache nginx supervisor curl tini \ + && mkdir -p /run/nginx /var/log/supervisor + +COPY infra/nginx.conf /etc/nginx/nginx.conf +COPY infra/supervisord.conf /etc/supervisord.conf +COPY infra/php-fpm-pool.conf /usr/local/etc/php-fpm.d/zzz-pool.conf + +COPY src/index.html /var/www/html/index.html +COPY src/404.html /var/www/html/404.html +COPY src/500.html /var/www/html/500.html +COPY src/robots.txt /var/www/html/robots.txt +COPY src/sitemap.xml /var/www/html/sitemap.xml +COPY src/llms.txt /var/www/html/llms.txt + +COPY src/about /var/www/html/about/ +COPY src/contact /var/www/html/contact/ +COPY src/services /var/www/html/services/ +COPY src/privacy-policy /var/www/html/privacy-policy/ +COPY src/terms-of-service /var/www/html/terms-of-service/ + +COPY src/assets /var/www/html/assets/ +COPY src/api/contact.php /var/www/html/api/contact.php + +RUN chown -R www-data:www-data /var/www/html + +ENV SEND_FROM_EMAIL="" \ + SEND_TO_EMAIL="" \ + SEND_FROM_DOMAIN="" \ + RESEND_API_KEY="" \ + RECAPTCHA_SECRET_KEY="" \ + RATE_LIMIT_PER_IP_PER_10MIN=5 \ + SCORE_PASS=0.7 \ + SCORE_REVIEW=0.4 \ + TIME_MIN_SECONDS=3 \ + TRUST_PROXY=1 + +EXPOSE 80 + +HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ + CMD curl -fsS http://127.0.0.1/index.html > /dev/null || exit 1 + +ENTRYPOINT ["/sbin/tini", "--"] +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf", "-n"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..38fc8d7 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,20 @@ +services: + web: + image: bigbreathe + build: + context: . + dockerfile: Dockerfile + container_name: bigbreathe-web + ports: + - "8011:80" + environment: + SEND_FROM_EMAIL: ${SEND_FROM_EMAIL:-} + SEND_TO_EMAIL: ${SEND_TO_EMAIL:-} + SEND_FROM_DOMAIN: ${SEND_FROM_DOMAIN:-} + RESEND_API_KEY: ${RESEND_API_KEY:-} + RECAPTCHA_SECRET_KEY: ${RECAPTCHA_SECRET_KEY:-} + RATE_LIMIT_PER_IP_PER_10MIN: ${RATE_LIMIT_PER_IP_PER_10MIN:-5} + SCORE_PASS: ${SCORE_PASS:-0.7} + SCORE_REVIEW: ${SCORE_REVIEW:-0.4} + TIME_MIN_SECONDS: ${TIME_MIN_SECONDS:-3} + restart: unless-stopped diff --git a/infra/nginx.conf b/infra/nginx.conf new file mode 100644 index 0000000..834bc2d --- /dev/null +++ b/infra/nginx.conf @@ -0,0 +1,99 @@ +user www-data; +worker_processes auto; +pid /run/nginx.pid; +error_log /dev/stderr warn; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + access_log /dev/stdout; + + sendfile on; + tcp_nopush on; + keepalive_timeout 65; + server_tokens off; + + limit_req_zone $binary_remote_addr zone=contact_limit:10m rate=5r/m; + + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_proxied any; + gzip_types text/plain text/css text/javascript application/javascript + application/json image/svg+xml font/woff2; + + server { + listen 80; + server_name _; + root /var/www/html; + index index.html index.php; + charset utf-8; + + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header Referrer-Policy "strict-origin-when-cross-origin" always; + add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always; + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "same-origin" always; + add_header Content-Security-Policy "default-src 'self'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'; object-src 'none'; img-src 'self' data:; font-src 'self' https://fonts.gstatic.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; script-src 'self' 'unsafe-inline' https://www.google.com/recaptcha/ https://www.gstatic.com/recaptcha/; frame-src https://www.google.com/recaptcha/; connect-src 'self' https://www.google.com/recaptcha/; upgrade-insecure-requests" always; + + location ~ /\. { deny all; return 404; } + location ~* \.(env|conf|yml|yaml|md|sh|py|pyc|sql|bak|old|swp|log|dockerfile)$ { + deny all; return 404; + } + location = /Dockerfile { deny all; return 404; } + + location = /robots.txt { try_files $uri =404; access_log off; } + location = /sitemap.xml { try_files $uri =404; access_log off; } + location = /llms.txt { try_files $uri =404; access_log off; } + + location ~* \.(css|js|woff2|woff|ttf|otf)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + access_log off; + } + location ~* \.(jpg|jpeg|png|webp|gif|ico|svg|mp4|webm)$ { + expires 6M; + add_header Cache-Control "public"; + access_log off; + } + + location = /api/contact { + limit_req zone=contact_limit burst=3 nodelay; + limit_req_status 429; + rewrite ^ /api/contact.php last; + } + location = /api/contact/ { + limit_req zone=contact_limit burst=3 nodelay; + limit_req_status 429; + rewrite ^ /api/contact.php last; + } + + location ~ \.php$ { + try_files $uri =404; + fastcgi_pass 127.0.0.1:9000; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + fastcgi_read_timeout 30s; + } + + location ~ ^/(?!404\.html$|500\.html$)(.+)\.html$ { + return 301 /$1/; + } + + location / { + try_files $uri $uri/index.html $uri/ =404; + } + + error_page 404 /404.html; + error_page 500 502 503 504 /500.html; + location = /404.html { internal; } + location = /500.html { internal; } + } +} diff --git a/infra/php-fpm-pool.conf b/infra/php-fpm-pool.conf new file mode 100644 index 0000000..2c660d9 --- /dev/null +++ b/infra/php-fpm-pool.conf @@ -0,0 +1,4 @@ +[www] +clear_env = no +catch_workers_output = yes +decorate_workers_output = no diff --git a/infra/supervisord.conf b/infra/supervisord.conf new file mode 100644 index 0000000..1d4b2f5 --- /dev/null +++ b/infra/supervisord.conf @@ -0,0 +1,28 @@ +[supervisord] +nodaemon=true +user=root +logfile=/dev/stdout +logfile_maxbytes=0 +pidfile=/run/supervisord.pid + +[program:php-fpm] +command=/usr/local/sbin/php-fpm -F +autostart=true +autorestart=true +startretries=3 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +priority=10 + +[program:nginx] +command=/usr/sbin/nginx -g "daemon off;" +autostart=true +autorestart=true +startretries=3 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +priority=20 diff --git a/src/404.html b/src/404.html new file mode 100644 index 0000000..3ffc1e8 --- /dev/null +++ b/src/404.html @@ -0,0 +1,27 @@ + + + + + + + Page Not Found | Big Breathe Yoga & Wellness + + + + + + + +
+
+

404

+

Page not found

+

The page you are looking for has moved or does not exist.

+
+ Back to Home + View Services +
+
+
+ + diff --git a/src/500.html b/src/500.html new file mode 100644 index 0000000..a9a0a7c --- /dev/null +++ b/src/500.html @@ -0,0 +1,24 @@ + + + + + + + Server Error | Big Breathe Yoga & Wellness + + + + + + + +
+
+

500

+

Something went wrong

+

We are working on it. Please try again in a moment.

+ Back to Home +
+
+ + diff --git a/src/about/index.html b/src/about/index.html new file mode 100644 index 0000000..d770c66 --- /dev/null +++ b/src/about/index.html @@ -0,0 +1,199 @@ + + + + + + + + + + + + + About | Big Breathe Yoga & Wellness + + + + + + + + + + + + + +
+ + +
+
+ +

+

+
+
+ + +
+
+
+
+ <!-- DRAFT NEEDED: instructor name and alt text --> +
+
+ +

+

+

+
+
Certifications
+
Specialties
+
Experience
+
Location
+
+
+
+
+
+ + +
+
+
+ +

+
+
+
+ +

+

+
+
+ +

+

+
+
+ +

+

+
+
+
+
+ + +
+ + +
+ +

Ready to take the first breath?

+

+ +
+
+ +
+ + + + + + diff --git a/src/api/contact.php b/src/api/contact.php new file mode 100644 index 0000000..59c4f77 --- /dev/null +++ b/src/api/contact.php @@ -0,0 +1,165 @@ +', $SEND_FROM_EMAIL); + +function send_json(array $data, int $status = 200): void { + http_response_code($status); + echo json_encode($data, JSON_UNESCAPED_SLASHES); + exit; +} +function fail(string $msg, int $status = 200): void { send_json(['ok' => false, 'error' => $msg], $status); } + +function client_ip(): string { + $trust = (getenv('TRUST_PROXY') === '1'); + if ($trust) { $fwd = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? ''; if ($fwd) return trim(explode(',', $fwd)[0]); } + return $_SERVER['REMOTE_ADDR'] ?? 'unknown'; +} + +function rate_limit_check(string $ip, int $max, int $window): bool { + $dir = sys_get_temp_dir() . '/bb-rl'; + if (!is_dir($dir)) @mkdir($dir, 0700, true); + $file = $dir . '/' . preg_replace('/[^a-zA-Z0-9._:-]/', '_', $ip); + $now = time(); + $events = []; + if (is_file($file)) { + $raw = @file_get_contents($file); + $events = $raw ? array_filter(array_map('intval', explode("\n", $raw))) : []; + $events = array_filter($events, fn($t) => $now - $t <= $window); + } + if (count($events) >= $max) return false; + $events[] = $now; + @file_put_contents($file, implode("\n", $events), LOCK_EX); + return true; +} + +function http_post_json(string $url, array $headers, array $body, int $timeout = 15): array { + $ch = curl_init($url); + curl_setopt_array($ch, [ + CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, + CURLOPT_POSTFIELDS => json_encode($body, JSON_UNESCAPED_SLASHES), + CURLOPT_HTTPHEADER => array_merge(['Content-Type: application/json'], $headers), + CURLOPT_CONNECTTIMEOUT => 5, CURLOPT_TIMEOUT => $timeout, + ]); + $resp = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); + return ['status' => $code, 'body' => $resp]; +} + +function http_post_form(string $url, array $fields, int $timeout = 10): array { + $ch = curl_init($url); + curl_setopt_array($ch, [ + CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, + CURLOPT_POSTFIELDS => http_build_query($fields), + CURLOPT_CONNECTTIMEOUT => 5, CURLOPT_TIMEOUT => $timeout, + ]); + $resp = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); + return ['status' => $code, 'body' => $resp]; +} + +if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') fail('Method Not Allowed', 405); + +$raw = ''; $in = fopen('php://input', 'rb'); +if ($in) { $raw = stream_get_contents($in, 32769); fclose($in); } +if (strlen($raw) > 32768) fail('Payload too large.', 413); +$body = json_decode($raw, true); +if (!is_array($body)) fail('Invalid request payload.'); + +$request_id = bin2hex(random_bytes(6)); +$ip = client_ip(); + +if (!rate_limit_check($ip, $RATE_LIMIT, 600)) { + error_log("[bb.form] rate_limited request_id=$request_id ip=$ip"); + fail('Too many requests. Please wait a few minutes.', 429); +} + +$name = trim((string)($body['name'] ?? '')); +$email = trim((string)($body['email'] ?? '')); +$reason = trim((string)($body['reason'] ?? '')); +$message = trim((string)($body['message'] ?? '')); +$website = trim((string)($body['website'] ?? '')); +$form_loaded_at = trim((string)($body['form_loaded_at'] ?? '')); +$recaptcha_token = trim((string)($body['recaptcha_token'] ?? '')); + +$errors = []; +if (mb_strlen($name) < 2 || mb_strlen($name) > 80) $errors[] = 'name'; +if (!filter_var($email, FILTER_VALIDATE_EMAIL)) $errors[] = 'email'; +if (mb_strlen($reason) < 1) $errors[] = 'reason'; +if (mb_strlen($message) > 1000) $errors[] = 'message'; +if ($errors) fail('Please check the form fields and try again.'); + +if ($website !== '') { + error_log("[bb.form] honeypot_triggered request_id=$request_id ip=$ip"); + send_json(['ok' => true, 'ref' => $request_id]); +} + +$flagged_review = false; +if ($form_loaded_at !== '' && ctype_digit(ltrim($form_loaded_at, '-'))) { + $elapsed = (microtime(true) * 1000 - (int)$form_loaded_at) / 1000.0; + if ($elapsed < $TIME_MIN_SECONDS) $flagged_review = true; +} + +$score = 1.0; +if ($recaptcha_token !== '' && $RECAPTCHA_SECRET !== '') { + $r = http_post_form('https://www.google.com/recaptcha/api/siteverify', ['secret' => $RECAPTCHA_SECRET, 'response' => $recaptcha_token]); + $rj = json_decode($r['body'] ?? '', true) ?: []; + if (empty($rj['success'])) fail('Could not verify the form. Please try again.'); + $score = (float)($rj['score'] ?? 0); + if ($score < $SCORE_REVIEW) fail('Could not verify the form. Please try again.'); + if ($score < $SCORE_PASS) $flagged_review = true; +} else { + $flagged_review = true; +} + +$subject_name = preg_replace('/[\x00-\x1F\x7F]/u', ' ', $name); +$subject_prefix = $flagged_review ? '[REVIEW] ' : ''; +$subject = "{$subject_prefix}New inquiry from {$subject_name}"; +$text_body = + "New inquiry from bigbreathe.com\n\n" . + "Name: {$name}\nEmail: {$email}\nService: {$reason}\n\n" . + "Message:\n" . ($message ?: '(none)') . "\n\n" . + "reCAPTCHA score: {$score}\n" . + "Submitted: " . gmdate('Y-m-d\TH:i:s\Z') . "\n" . + "Request ID: {$request_id}\n"; +$html_body = nl2br(htmlspecialchars($text_body, ENT_QUOTES, 'UTF-8')); + +if ($RESEND_API_KEY !== '' && $SEND_TO_EMAIL !== '') { + $r = http_post_json( + 'https://api.resend.com/emails', + ["Authorization: Bearer {$RESEND_API_KEY}"], + ['from' => $FROM_HEADER, 'to' => [$SEND_TO_EMAIL], 'reply_to' => $email, 'subject' => $subject, 'text' => $text_body, 'html' => $html_body] + ); + if ($r['status'] >= 300) { + error_log("[bb.form] resend_failed request_id=$request_id status={$r['status']}"); + fail('Could not send the message. Please email us directly.'); + } + error_log("[bb.form] sent ok request_id=$request_id score=$score"); + + http_post_json( + 'https://api.resend.com/emails', + ["Authorization: Bearer {$RESEND_API_KEY}"], + ['from' => $FROM_HEADER, 'to' => [$email], 'subject' => 'Your message reached Big Breathe', + 'text' => "Thank you for reaching out. We will be in touch within one to two business days.\n\nBig Breathe Yoga & Wellness\nbigbreathe.com", + 'html' => "

Thank you for reaching out. We will be in touch within one to two business days.

Big Breathe Yoga & Wellness
bigbreathe.com

"] + ); +} else { + error_log("[bb.form] no_key request_id=$request_id\nSubject: $subject\n$text_body"); +} + +send_json(['ok' => true, 'ref' => $request_id]); diff --git a/src/assets/css/main.css b/src/assets/css/main.css new file mode 100644 index 0000000..5bfcbb8 --- /dev/null +++ b/src/assets/css/main.css @@ -0,0 +1,1270 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Cormorant+Garamond:ital,wght@0,400;0,600;1,400;1,600;1,700&display=swap'); +@import './tokens.css'; + +/* ─── Reset ──────────────────────────────────────────────── */ +*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } +html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; } +body { + font-family: var(--font-body); + font-size: var(--t-base); + font-weight: var(--w-normal); + line-height: 1.65; + color: var(--bb-white); + background: var(--bb-navy); + overflow-x: hidden; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +body.nav-open { overflow: hidden; } +main#main-content { position: relative; z-index: 1; } +img, svg { display: block; max-width: 100%; } +a { color: inherit; text-decoration: none; } +button { font: inherit; cursor: pointer; border: none; background: none; } +ul, ol { list-style: none; } + +/* ─── Particle canvas ─────────────────────────────────────── */ +#bb-particles { + position: fixed; + inset: 0; + z-index: 0; + pointer-events: none; + width: 100%; + height: 100%; +} + +/* ─── Accessibility ──────────────────────────────────────── */ +.skip-link { + position: absolute; + left: -9999px; + top: var(--s-3); + z-index: 9999; + background: var(--bb-electric); + color: var(--bb-white); + padding: var(--s-2) var(--s-4); + border-radius: var(--r-sm); + font-size: var(--t-sm); + font-weight: var(--w-semi); + text-decoration: none; +} +.skip-link:focus { left: var(--s-4); } +:focus-visible { + outline: 2px solid var(--bb-electric); + outline-offset: 3px; + border-radius: 2px; +} + +/* ─── Layout ─────────────────────────────────────────────── */ +.container { + width: 100%; + max-width: var(--max-w); + margin-inline: auto; + padding-inline: var(--gutter); +} + +/* ─── Animation system ───────────────────────────────────── */ +.js [data-animate] { + opacity: 0; + transform: translateY(30px); + transition: opacity 700ms var(--ease-expo), + transform 700ms var(--ease-expo); +} +.js [data-animate="left"] { transform: translateX(-30px); } +.js [data-animate="right"] { transform: translateX(30px); } +.js [data-animate].in-view { opacity: 1; transform: none; } + +@media (prefers-reduced-motion: reduce) { + .js [data-animate], + .js [data-animate="left"], + .js [data-animate="right"] { + transform: none; + transition: opacity 400ms ease; + } + #bb-particles { display: none; } + .ghost-word { display: none; } + .marquee-track { animation: none; } + .hero-pulse-dot { animation: none; } + .philosophy-divider { transform: scaleX(1); } +} + +/* ─── Section gradient separators ───────────────────────── */ +.bb-sec-marquee, +.bb-sec-philosophy, +.bb-sec-bigjoe, +.bb-sec-services, +.bb-sec-global, +.bb-sec-testimonials, +.bb-sec-cta, +.bb-footer { + border-top: 1px solid rgba(74, 159, 232, 0.08); +} + +/* ─── Section label utility ──────────────────────────────── */ +.section-label { + font-family: var(--font-body); + font-size: var(--t-xs); + font-weight: var(--w-semi); + letter-spacing: 0.18em; + text-transform: uppercase; + color: var(--bb-electric); + margin-bottom: var(--s-4); + display: block; +} + +/* ─── Buttons ────────────────────────────────────────────── */ +.btn { + display: inline-flex; + align-items: center; + gap: var(--s-2); + font-size: var(--t-sm); + font-weight: var(--w-semi); + letter-spacing: 0.04em; + padding: 14px 28px; + border-radius: var(--r-pill); + transition: background var(--d-base) var(--ease), + color var(--d-base) var(--ease), + border-color var(--d-base) var(--ease), + transform var(--d-fast) var(--ease); + white-space: nowrap; + cursor: pointer; + border: 1.5px solid transparent; +} +.btn:active { transform: translateY(1px); } + +.btn-primary { + background: var(--bb-electric); + color: var(--bb-white); + border-color: var(--bb-electric); +} +.btn-primary:hover { background: var(--bb-bright); border-color: var(--bb-bright); } + +.btn-ghost-outline { + background: transparent; + color: var(--bb-white); + border: 1.5px solid rgba(255,255,255,0.28); +} +.btn-ghost-outline:hover { border-color: var(--bb-bright); color: var(--bb-bright); } + +.btn-arrow::after { + content: ''; + display: inline-block; + width: 16px; + height: 1px; + background: currentColor; + transition: width var(--d-base) var(--ease); +} +.btn-arrow:hover::after { width: 26px; } + +/* CTA section buttons */ +.btn-cta-solid { + background: var(--bb-white); + color: var(--bb-navy); + border-color: var(--bb-white); + font-weight: var(--w-bold); +} +.btn-cta-solid:hover { background: var(--bb-mist); border-color: var(--bb-mist); } + +.btn-cta-ghost { + background: transparent; + color: var(--bb-white); + border: 1.5px solid rgba(255,255,255,0.40); +} +.btn-cta-ghost:hover { border-color: var(--bb-white); } + +/* ─── Header ─────────────────────────────────────────────── */ +.bb-header { + position: fixed; + top: 0; left: 0; right: 0; + z-index: 100; + padding: 0 var(--gutter); + background: transparent; + transition: background var(--d-base) var(--ease), + box-shadow var(--d-base) var(--ease), + transform var(--d-base) var(--ease), + backdrop-filter var(--d-base) var(--ease); +} +.bb-header.scrolled { + background: rgba(3, 8, 20, 0.95); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + box-shadow: 0 1px 0 var(--bb-line); +} +body.nav-open .bb-header { transform: none !important; } +.bb-header.hidden { transform: translateY(-100%); } + +.header-inner { + display: flex; + align-items: center; + justify-content: space-between; + height: 72px; + max-width: var(--max-w); + margin-inline: auto; +} + +/* Logo */ +.bb-logo { + display: flex; + align-items: center; + gap: var(--s-3); + flex-shrink: 0; +} +.bb-logo-text { display: flex; flex-direction: column; line-height: 1.15; } +.bb-logo-name { + font-family: var(--font-display); + font-style: italic; + font-size: 20px; + font-weight: var(--w-bold); + color: var(--bb-white); + letter-spacing: 0.01em; +} +.bb-logo-eyebrow { + font-size: 9px; + font-weight: var(--w-semi); + color: var(--bb-electric); + letter-spacing: 0.22em; + text-transform: uppercase; +} + +/* Desktop nav */ +.bb-nav { + display: flex; + align-items: center; + gap: var(--s-8); +} +.bb-nav a, +.bb-nav .nav-has-dropdown { + font-size: var(--t-sm); + font-weight: var(--w-medium); + color: var(--bb-white-70); + transition: color var(--d-base) var(--ease); + cursor: pointer; + display: flex; + align-items: center; + gap: 4px; + white-space: nowrap; + line-height: 1; +} +.bb-nav a:hover, +.bb-nav .nav-has-dropdown:hover { color: var(--bb-white); } + +.nav-has-dropdown { position: relative; } +.nav-dropdown { + position: absolute; + top: calc(100% + 18px); + left: 50%; + transform: translateX(-50%) translateY(-8px); + background: var(--bb-navy-lift); + border: 1px solid var(--bb-line); + border-radius: var(--r-md); + min-width: 240px; + padding: var(--s-3) 0; + opacity: 0; + pointer-events: none; + transition: opacity var(--d-base) var(--ease), transform var(--d-base) var(--ease); + box-shadow: 0 16px 48px rgba(0,0,0,0.4); +} +.nav-dropdown.visible { + opacity: 1; + pointer-events: all; + transform: translateX(-50%) translateY(0); +} +.nav-dropdown a { + display: block; + padding: var(--s-3) var(--s-6); + font-size: var(--t-sm); + font-weight: var(--w-medium); + color: var(--bb-white-70) !important; + transition: color var(--d-base) var(--ease), background var(--d-base) var(--ease); +} +.nav-dropdown a:hover { + color: var(--bb-white) !important; + background: var(--bb-white-10); +} +.nav-caret { + width: 10px; height: 10px; + opacity: 0.5; + transition: transform var(--d-base) var(--ease); +} +.nav-has-dropdown:hover .nav-caret { transform: rotate(180deg); } +.header-cta { flex-shrink: 0; } + +/* Hamburger */ +.bb-hamburger { + display: none; + flex-direction: column; + gap: 5px; + width: 32px; + padding: 4px; + cursor: pointer; +} +.bb-hamburger span { + display: block; + height: 1.5px; + background: var(--bb-white); + transition: transform var(--d-base) var(--ease), + opacity var(--d-base) var(--ease), + width var(--d-base) var(--ease); +} +.bb-hamburger span:nth-child(3) { width: 70%; } +.bb-hamburger.open span:nth-child(1) { transform: rotate(45deg) translate(5px,5px); } +.bb-hamburger.open span:nth-child(2) { opacity: 0; } +.bb-hamburger.open span:nth-child(3) { transform: rotate(-45deg) translate(4px,-4px); width: 100%; } + +/* Mobile nav overlay */ +.bb-mobile-nav { + display: none; + position: fixed; + inset: 0; + background: var(--bb-void); + z-index: 99; + flex-direction: column; + align-items: center; + justify-content: flex-start; + gap: var(--s-6); + padding: 100px var(--s-6) var(--s-12); + overflow-y: auto; + opacity: 0; + pointer-events: none; + transition: opacity var(--d-base) var(--ease); +} +.bb-mobile-nav.open { + display: flex; + opacity: 1; + pointer-events: all; +} +.bb-mobile-nav a { + font-size: var(--t-2xl); + font-family: var(--font-display); + font-style: italic; + font-weight: var(--w-semi); + color: var(--bb-white); + letter-spacing: -0.01em; +} +.bb-mobile-nav a:hover { color: var(--bb-ice); } +.mobile-service-links { + display: flex; + flex-direction: column; + align-items: center; + gap: var(--s-3); +} +.mobile-service-links a { + font-size: var(--t-base) !important; + font-family: var(--font-body) !important; + font-weight: var(--w-medium) !important; + font-style: normal !important; + color: var(--bb-white-70) !important; +} + +/* ─── Hero ───────────────────────────────────────────────── */ +.bb-sec-hero { + position: relative; + min-height: 100svh; + display: flex; + align-items: center; + background: #030810; + overflow: hidden; + isolation: isolate; +} + +/* Ghost word parallax */ +.ghost-word { + position: absolute; + left: -4vw; + top: 50%; + transform: translateY(-50%); + font-family: var(--font-display); + font-style: italic; + font-weight: var(--w-bold); + font-size: clamp(14rem, 30vw, 30vw); + color: var(--bb-white); + opacity: 0.04; + line-height: 0.85; + pointer-events: none; + user-select: none; + white-space: nowrap; + z-index: 0; + will-change: transform; +} + +/* Decorative number */ +.hero-deco-num { + position: absolute; + right: var(--gutter); + bottom: 10%; + font-family: var(--font-display); + font-style: italic; + font-size: clamp(6rem, 12vw, 14rem); + font-weight: var(--w-bold); + color: var(--bb-white); + opacity: 0.06; + line-height: 1; + pointer-events: none; + user-select: none; + z-index: 0; +} + +.hero-inner { + position: relative; + z-index: 2; + padding: 160px 0 120px; + width: 100%; +} +.hero-content { + max-width: 55%; +} + +.hero-eyebrow { + font-family: var(--font-body); + font-size: var(--t-xs); + font-weight: var(--w-medium); + letter-spacing: 0.22em; + text-transform: uppercase; + color: var(--bb-electric); + margin-bottom: var(--s-6); + display: block; +} + +.hero-h1 { + font-family: var(--font-display); + font-style: italic; + font-size: var(--t-hero); + font-weight: var(--w-bold); + line-height: 1.0; + letter-spacing: -0.02em; + color: var(--bb-white); + margin-bottom: var(--s-6); +} +.hero-h1 .word { + display: inline-block; + opacity: 0; + transform: translateY(40px); + transition: opacity 800ms cubic-bezier(0.16, 1, 0.3, 1), + transform 800ms cubic-bezier(0.16, 1, 0.3, 1); +} +.hero-h1.revealed .word { opacity: 1; transform: none; } + +.hero-sub { + font-size: clamp(var(--t-base), 1.4vw, var(--t-lg)); + line-height: 1.7; + color: var(--bb-white-70); + max-width: 520px; + margin-bottom: var(--s-10); +} +.js .hero-sub { + opacity: 0; + transform: translateY(20px); + transition: opacity 600ms cubic-bezier(0.16, 1, 0.3, 1), + transform 600ms cubic-bezier(0.16, 1, 0.3, 1); +} +.js .hero-sub.revealed { opacity: 1; transform: none; } + +.hero-ctas { + display: flex; + align-items: center; + gap: var(--s-4); + flex-wrap: wrap; + margin-bottom: var(--s-12); +} + +/* Breath pulse dot */ +.hero-pulse-wrap { + display: flex; + align-items: center; + gap: var(--s-3); +} +.hero-pulse-dot { + display: block; + width: 10px; + height: 10px; + border-radius: 50%; + background: var(--bb-electric); + box-shadow: 0 0 12px var(--bb-glow); + animation: breath-pulse 2s var(--ease) infinite; +} +@keyframes breath-pulse { + 0%, 100% { transform: scale(1); opacity: 0.8; } + 50% { transform: scale(1.4); opacity: 1; } +} + +/* ─── Marquee / Social proof ──────────────────────────────── */ +.bb-sec-marquee { + background: #060D1A; + padding: var(--s-8) 0; + border-top: 1px solid var(--bb-line); + border-bottom: 1px solid var(--bb-line); + overflow: hidden; + position: relative; + z-index: 1; +} +.marquee-eyebrow { + text-align: center; + font-size: var(--t-xs); + font-weight: var(--w-semi); + letter-spacing: 0.22em; + text-transform: uppercase; + color: var(--bb-white-40); + margin-bottom: var(--s-5); +} +.marquee-track-wrap { + overflow: hidden; +} +.marquee-track-wrap:hover .marquee-track { animation-play-state: paused; } +.marquee-track { + display: flex; + align-items: center; + gap: var(--s-6); + white-space: nowrap; + animation: marquee-scroll 30s linear infinite; + width: max-content; +} +.marquee-track span { + font-size: var(--t-sm); + font-weight: var(--w-medium); + color: var(--bb-white-40); + letter-spacing: 0.06em; + text-transform: uppercase; + flex-shrink: 0; +} +.marquee-dot { + color: var(--bb-electric) !important; + opacity: 0.5; +} +@keyframes marquee-scroll { + 0% { transform: translateX(0); } + 100% { transform: translateX(-50%); } +} + +/* ─── Philosophy ─────────────────────────────────────────── */ +.bb-sec-philosophy { + background: #0B1428; + padding: var(--s-30) 0; + position: relative; + z-index: 1; +} +.bb-sec-philosophy .section-label { margin-bottom: var(--s-10); } + +.philosophy-grid { + display: grid; + grid-template-columns: 1fr auto 1fr; + gap: clamp(32px, 5vw, 80px); + align-items: start; +} +.philosophy-left {} +.philosophy-pullquote { + font-family: var(--font-display); + font-style: italic; + font-size: clamp(var(--t-2xl), 3vw, var(--t-4xl)); + font-weight: var(--w-semi); + line-height: 1.25; + color: var(--bb-ice); + letter-spacing: -0.01em; +} + +/* Animated divider line */ +.philosophy-divider { + width: 1px; + background: var(--bb-electric); + height: 100%; + min-height: 220px; + transform-origin: top center; + transform: scaleY(0); + transition: transform 900ms var(--ease-expo); + opacity: 0.35; + align-self: stretch; +} +.philosophy-divider.in-view { transform: scaleY(1); } + +.philosophy-right { + display: flex; + flex-direction: column; + gap: var(--s-5); +} +.philosophy-right p { + font-size: var(--t-base); + line-height: 1.8; + color: var(--bb-white-70); +} + +/* ─── Meet Big Joe ───────────────────────────────────────── */ +.bb-sec-bigjoe { + background: #0D1B3E; + padding: var(--s-30) 0; + position: relative; + z-index: 1; +} +.bigjoe-grid { + display: grid; + grid-template-columns: 0.65fr 1fr; + gap: clamp(40px, 6vw, 100px); + align-items: start; +} + +/* Portrait placeholder */ +.bigjoe-portrait { + aspect-ratio: 3/4; + background: var(--bb-navy-lift); + border-radius: var(--r-lg); + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} +.bigjoe-portrait-name { + font-family: var(--font-display); + font-style: italic; + font-size: clamp(var(--t-2xl), 4vw, var(--t-4xl)); + font-weight: var(--w-bold); + color: var(--bb-electric); + letter-spacing: 0.04em; +} + +.bigjoe-content { display: flex; flex-direction: column; gap: var(--s-6); } +.bigjoe-h2 { + font-family: var(--font-display); + font-size: clamp(3rem, 5vw, 5rem); + font-weight: var(--w-bold); + line-height: 1.0; + letter-spacing: -0.02em; + color: var(--bb-white); +} +.bigjoe-h2 em { font-style: italic; } + +.bigjoe-story { + display: flex; + flex-direction: column; + gap: var(--s-3); + padding-left: var(--s-4); + border-left: 2px solid var(--bb-line); +} +.bigjoe-story li, +.bigjoe-story p { + font-size: var(--t-base); + line-height: 1.8; + color: var(--bb-white-70); +} + +/* Stat counters */ +.bigjoe-stats { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: var(--s-6); + padding-top: var(--s-6); + border-top: 1px solid var(--bb-line); +} +.bigjoe-stat { + display: flex; + flex-direction: column; + gap: var(--s-1); +} +.bigjoe-stat .stat-num { + font-family: var(--font-display); + font-style: italic; + font-size: clamp(var(--t-3xl), 3.5vw, var(--t-5xl)); + font-weight: var(--w-bold); + color: var(--bb-electric); + line-height: 1; + letter-spacing: -0.02em; +} +.bigjoe-stat .stat-suffix { + font-family: var(--font-display); + font-style: italic; + font-size: clamp(var(--t-xl), 2vw, var(--t-3xl)); + font-weight: var(--w-bold); + color: var(--bb-electric); + line-height: 1; +} +.bigjoe-stat .stat-label { + display: block; + font-size: var(--t-xs); + font-weight: var(--w-medium); + letter-spacing: 0.08em; + color: var(--bb-white-40); + text-transform: uppercase; + margin-top: var(--s-1); +} + +/* ─── Services ───────────────────────────────────────────── */ +.bb-sec-services { + background: #112244; + padding: var(--s-30) 0; + position: relative; + z-index: 1; +} +.services-h2 { + font-family: var(--font-display); + font-style: italic; + font-size: clamp(var(--t-3xl), 4vw, var(--t-5xl)); + font-weight: var(--w-bold); + line-height: 1.05; + letter-spacing: -0.015em; + color: var(--bb-white); + margin-bottom: var(--s-12); +} +.services-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: var(--s-5); + margin-bottom: var(--s-10); +} +.service-card { + background: var(--bb-navy-lift); + border-top: 3px solid var(--bb-electric); + border-radius: var(--r-lg); + padding: var(--s-8); + display: flex; + flex-direction: column; + gap: var(--s-4); + transition: transform var(--d-base) var(--ease), + box-shadow var(--d-base) var(--ease), + background var(--d-base) var(--ease); +} +.service-card:hover { + transform: translateY(-4px); + background: var(--bb-navy-mid); + box-shadow: 0 16px 48px rgba(0,0,0,0.3); +} +.service-card-title { + font-family: var(--font-display); + font-size: var(--t-2xl); + font-weight: var(--w-semi); + letter-spacing: -0.005em; + color: var(--bb-white); + line-height: 1.15; +} +.service-card-desc { + font-size: var(--t-sm); + color: var(--bb-white-70); + line-height: 1.7; + flex: 1; +} +.service-card-cta { + display: inline-flex; + align-items: center; + gap: var(--s-2); + font-size: var(--t-xs); + font-weight: var(--w-semi); + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--bb-bright); + margin-top: var(--s-2); + transition: gap var(--d-base) var(--ease), color var(--d-base) var(--ease); +} +.service-card-cta::after { + content: '\2192'; + font-size: 1em; + transition: transform var(--d-base) var(--ease); +} +.service-card:hover .service-card-cta { gap: var(--s-3); color: var(--bb-ice); } +.service-card:hover .service-card-cta::after { transform: translateX(4px); } + +.services-secondary-links { + display: flex; + align-items: center; + gap: var(--s-8); + padding-top: var(--s-6); + border-top: 1px solid var(--bb-line); +} +.services-secondary-links a { + font-size: var(--t-sm); + font-weight: var(--w-medium); + color: var(--bb-white-40); + letter-spacing: 0.04em; + transition: color var(--d-base) var(--ease); +} +.services-secondary-links a:hover { color: var(--bb-white); } + +/* ─── Global Reach ───────────────────────────────────────── */ +.bb-sec-global { + background: #1A3260; + padding: var(--s-30) 0; + position: relative; + z-index: 1; + overflow: hidden; +} +.global-h2 { + font-family: var(--font-display); + font-style: italic; + font-size: clamp(var(--t-3xl), 4vw, var(--t-5xl)); + font-weight: var(--w-bold); + line-height: 1.05; + letter-spacing: -0.015em; + color: var(--bb-white); + margin-bottom: var(--s-8); + max-width: 700px; +} +.global-countries { + font-size: clamp(var(--t-base), 1.6vw, var(--t-xl)); + line-height: 1.9; + color: var(--bb-white-40); + max-width: 800px; + margin-bottom: var(--s-10); +} +.global-cta {} + +/* ─── Testimonials ───────────────────────────────────────── */ +.bb-sec-testimonials { + background: #1E3A72; + padding: var(--s-30) 0; + position: relative; + z-index: 1; +} +.testimonials-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: var(--s-5); + margin-top: var(--s-8); +} +.testimonial-card { + background: var(--bb-navy-lift); + border-left: 3px solid var(--bb-electric); + border-radius: var(--r-md); + padding: var(--s-8); + display: flex; + flex-direction: column; + gap: var(--s-5); +} +.testimonial-quote { + font-family: var(--font-display); + font-style: italic; + font-size: clamp(var(--t-lg), 1.5vw, var(--t-xl)); + font-weight: var(--w-semi); + line-height: 1.45; + color: var(--bb-white); + letter-spacing: -0.005em; +} +.testimonial-attr { + font-size: var(--t-sm); + color: var(--bb-white-40); + letter-spacing: 0.04em; + margin-top: auto; +} + +/* ─── CTA Close ──────────────────────────────────────────── */ +.bb-sec-cta { + background: #1B6FD8; + padding: var(--s-30) 0; + text-align: center; + position: relative; + z-index: 1; + overflow: hidden; +} +.cta-h2 { + font-family: var(--font-display); + font-style: italic; + font-size: clamp(var(--t-3xl), 4.5vw, var(--t-5xl)); + font-weight: var(--w-bold); + line-height: 1.05; + letter-spacing: -0.015em; + color: var(--bb-white); + margin-bottom: var(--s-4); + margin-top: 0; +} +.cta-sub { + font-size: var(--t-lg); + line-height: 1.7; + color: rgba(255,255,255,0.80); + margin-bottom: var(--s-10); +} +.cta-actions { + display: flex; + align-items: center; + justify-content: center; + gap: var(--s-4); + flex-wrap: wrap; + margin-bottom: var(--s-6); +} +.cta-contact { + font-size: var(--t-sm); + color: rgba(255,255,255,0.65); + letter-spacing: 0.04em; +} + +/* ─── Footer ─────────────────────────────────────────────── */ +.bb-footer { + background: #030810; + padding: var(--s-20) 0 var(--s-10); + color: var(--bb-white-70); + position: relative; + z-index: 1; + border-top: 1px solid var(--bb-line); +} +.footer-top { + display: grid; + grid-template-columns: 1.6fr 1fr 1fr 1fr; + gap: var(--s-12); + margin-bottom: var(--s-16); +} +.footer-brand { + display: flex; + flex-direction: column; + gap: var(--s-4); +} +.footer-logo-text .bb-logo-name { color: var(--bb-white); } +.footer-logo-text .bb-logo-eyebrow { color: var(--bb-electric); } +.footer-email { + font-size: var(--t-sm); + color: var(--bb-white-40); + letter-spacing: 0.04em; +} +.footer-col-title { + font-size: var(--t-xs); + font-weight: var(--w-semi); + letter-spacing: 0.18em; + text-transform: uppercase; + color: var(--bb-electric); + margin-bottom: var(--s-5); + display: block; +} +.footer-links { + display: flex; + flex-direction: column; + gap: var(--s-3); +} +.footer-links a { + font-size: var(--t-sm); + color: var(--bb-white-40); + transition: color var(--d-base) var(--ease); + line-height: 1.5; +} +.footer-links a:hover { color: var(--bb-white); } +.footer-bottom { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--s-4); + padding-top: var(--s-8); + border-top: 1px solid rgba(255,255,255,0.08); + flex-wrap: wrap; +} +.footer-copy { + font-size: var(--t-xs); + color: rgba(255,255,255,0.35); + letter-spacing: 0.04em; +} +.footer-legal { display: flex; gap: var(--s-6); } +.footer-legal a { + font-size: var(--t-xs); + color: rgba(255,255,255,0.35); + transition: color var(--d-base) var(--ease); +} +.footer-legal a:hover { color: var(--bb-white); } + +/* ─── Inner page hero (for sub-pages) ────────────────────── */ +.bb-inner-hero { + padding: 148px 0 80px; + background: var(--bb-void); + border-bottom: 1px solid var(--bb-line); +} +.inner-hero-h1 { + font-family: var(--font-display); + font-style: italic; + font-size: clamp(var(--t-3xl), 5vw, var(--t-5xl)); + font-weight: var(--w-bold); + letter-spacing: -0.015em; + line-height: 1.08; + color: var(--bb-white); + margin-top: var(--s-4); + margin-bottom: var(--s-5); +} +.inner-hero-sub { + font-size: var(--t-lg); + color: var(--bb-white-70); + line-height: 1.75; + max-width: 640px; +} + +/* ─── Content prose (inner pages) ───────────────────────── */ +.bb-content-sec { + padding: var(--s-25) 0; + background: var(--bb-navy); +} +.prose { max-width: 760px; } +.prose h2 { + font-family: var(--font-display); + font-style: italic; + font-size: clamp(var(--t-xl), 2.8vw, var(--t-3xl)); + font-weight: var(--w-semi); + letter-spacing: -0.01em; + color: var(--bb-white); + margin-top: var(--s-10); + margin-bottom: var(--s-4); +} +.prose p { + font-size: var(--t-base); + line-height: 1.8; + color: var(--bb-white-70); + margin-bottom: var(--s-5); +} +.prose ul { margin-bottom: var(--s-5); padding-left: var(--s-6); list-style: disc; } +.prose li { + font-size: var(--t-base); + line-height: 1.75; + color: var(--bb-white-70); + margin-bottom: var(--s-2); +} + +/* ─── Responsive ─────────────────────────────────────────── */ +@media (max-width: 1024px) { + .services-grid { grid-template-columns: repeat(2, 1fr); } + .testimonials-grid { grid-template-columns: repeat(2, 1fr); } + .footer-top { grid-template-columns: 1fr 1fr; gap: var(--s-10); } + .bigjoe-stats { grid-template-columns: repeat(2, 1fr); } + .philosophy-grid { + grid-template-columns: 1fr; + gap: var(--s-8); + } + .philosophy-divider { + width: 100%; + height: 1px; + min-height: unset; + transform-origin: left center; + transform: scaleX(0); + } + .philosophy-divider.in-view { transform: scaleX(1); } +} + +@media (max-width: 768px) { + :root { --gutter: 22px; } + .bb-nav, .header-cta { display: none; } + .bb-hamburger { display: flex; } + + .hero-content { max-width: 100%; } + .hero-inner { padding: 130px 0 80px; } + .hero-h1 { font-size: clamp(2.8rem, 10vw, 4rem); } + .hero-deco-num { display: none; } + + .bigjoe-grid { grid-template-columns: 1fr; gap: var(--s-10); } + .bigjoe-portrait { max-height: 320px; } + .bigjoe-stats { grid-template-columns: repeat(2, 1fr); } + + .services-grid { grid-template-columns: 1fr; } + + .testimonials-grid { grid-template-columns: 1fr; } + + .footer-top { grid-template-columns: 1fr; gap: var(--s-8); } + .footer-bottom { flex-direction: column; align-items: flex-start; } +} + +@media (max-width: 480px) { + .hero-ctas { flex-direction: column; align-items: stretch; } + .hero-ctas .btn { justify-content: center; } + .cta-actions { flex-direction: column; align-items: stretch; } + .cta-actions .btn { justify-content: center; } + .services-secondary-links { flex-direction: column; gap: var(--s-3); } + .bigjoe-stats { grid-template-columns: repeat(2, 1fr); gap: var(--s-4); } +} + +/* ─── New sections border-top ────────────────────────────── */ +.bb-sec-science, +.bb-sec-gallery { + border-top: 1px solid rgba(74, 159, 232, 0.08); +} + +/* ─── Logo mark ──────────────────────────────────────────── */ +.nav-logo-mark { + width: 36px; + height: 36px; + object-fit: contain; + flex-shrink: 0; + display: block; +} +.footer-logo-wrap { + display: flex; + align-items: center; + gap: var(--s-3); +} +.footer-logo-mark { + width: 30px; + height: 30px; + object-fit: contain; + flex-shrink: 0; + opacity: 0.85; +} + +/* ─── Big Joe portrait — real image ─────────────────────── */ +.bigjoe-portrait { + aspect-ratio: 3/4; + border-radius: var(--r-lg); + overflow: hidden; + background: var(--bb-navy-lift); + flex-shrink: 0; + display: block; +} +.bigjoe-portrait-img { + width: 100%; + height: 100%; + object-fit: cover; + object-position: center top; + display: block; +} + +/* ─── Gold stat accent ───────────────────────────────────── */ +.bigjoe-stat .stat-num, +.bigjoe-stat .stat-suffix { + color: var(--bb-gold); +} + +/* ─── Science section ────────────────────────────────────── */ +.bb-sec-science { + background: #060D1A; + padding: var(--s-30) 0; + position: relative; + z-index: 1; +} +.science-h2 { + font-family: var(--font-display); + font-style: italic; + font-size: clamp(var(--t-3xl), 4vw, var(--t-5xl)); + font-weight: var(--w-bold); + line-height: 1.05; + letter-spacing: -0.015em; + color: var(--bb-white); + margin-bottom: var(--s-12); + max-width: 600px; +} +.science-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: var(--s-6); +} +.science-card { + background: rgba(255,255,255,0.04); + border: 1px solid rgba(255,255,255,0.06); + border-radius: var(--r-lg); + padding: var(--s-8); + display: flex; + flex-direction: column; + gap: var(--s-4); + transition: background var(--d-base) var(--ease), border-color var(--d-base) var(--ease); +} +.science-card:hover { + background: rgba(255,255,255,0.07); + border-color: var(--bb-gold-glow); +} +.sci-num { + font-family: var(--font-display); + font-style: italic; + font-size: clamp(var(--t-3xl), 3vw, var(--t-4xl)); + font-weight: var(--w-bold); + color: var(--bb-gold); + line-height: 1; +} +.sci-title { + font-family: var(--font-display); + font-size: var(--t-xl); + font-weight: var(--w-semi); + color: var(--bb-white); + line-height: 1.2; +} +.sci-body { + font-size: var(--t-sm); + color: var(--bb-white-70); + line-height: 1.75; + flex: 1; +} + +/* ─── In the Room gallery ────────────────────────────────── */ +.bb-sec-gallery { + background: #060D1A; + padding-top: var(--s-30); + padding-bottom: var(--s-30); + position: relative; + z-index: 1; + overflow: hidden; +} +.gallery-h2 { + font-family: var(--font-display); + font-style: italic; + font-size: clamp(var(--t-3xl), 4vw, var(--t-5xl)); + font-weight: var(--w-bold); + line-height: 1.05; + letter-spacing: -0.015em; + color: var(--bb-white); + margin-bottom: var(--s-10); +} +.gallery-track-wrap { + overflow-x: auto; + overflow-y: hidden; + cursor: grab; + scrollbar-width: none; + -ms-overflow-style: none; + padding: 0 var(--gutter) var(--s-4); +} +.gallery-track-wrap::-webkit-scrollbar { display: none; } +.gallery-track-wrap.dragging { cursor: grabbing; user-select: none; } +.gallery-track { + display: flex; + gap: var(--s-5); + width: max-content; +} +.gallery-item { + flex-shrink: 0; + width: clamp(260px, 32vw, 480px); + aspect-ratio: 4/3; + border-radius: var(--r-lg); + overflow: hidden; + background: var(--bb-navy-lift); +} +.gallery-item img { + width: 100%; + height: 100%; + object-fit: cover; + pointer-events: none; + transition: transform 600ms var(--ease); + display: block; +} +.gallery-item:hover img { transform: scale(1.04); } + +/* ─── Two-path CTA ───────────────────────────────────────── */ +.cta-paths { + display: grid; + grid-template-columns: 1fr auto 1fr; + gap: clamp(32px, 5vw, 80px); + align-items: center; + margin-top: var(--s-10); + margin-bottom: var(--s-8); + text-align: left; +} +.cta-path { + display: flex; + flex-direction: column; + gap: var(--s-5); +} +.cta-path-label { + font-size: var(--t-xs); + font-weight: var(--w-semi); + letter-spacing: 0.18em; + text-transform: uppercase; + color: rgba(255,255,255,0.55); +} +.cta-path-title { + font-family: var(--font-display); + font-style: italic; + font-size: clamp(var(--t-xl), 2.2vw, var(--t-3xl)); + font-weight: var(--w-semi); + line-height: 1.2; + color: var(--bb-white); + letter-spacing: -0.01em; +} +.cta-path-divider { + width: 1px; + height: 160px; + background: rgba(255,255,255,0.20); + align-self: center; + flex-shrink: 0; +} + +/* ─── Responsive additions ───────────────────────────────── */ +@media (max-width: 1024px) { + .science-grid { grid-template-columns: repeat(2, 1fr); } +} + +@media (max-width: 768px) { + .science-grid { grid-template-columns: 1fr; } + .cta-paths { + grid-template-columns: 1fr; + gap: var(--s-8); + text-align: center; + } + .cta-path-divider { width: 100%; height: 1px; } + .gallery-item { width: clamp(220px, 75vw, 320px); } +} diff --git a/src/assets/css/tokens.css b/src/assets/css/tokens.css new file mode 100644 index 0000000..f2afad1 --- /dev/null +++ b/src/assets/css/tokens.css @@ -0,0 +1,102 @@ +:root { + /* Big Breath — Navy / Electric Blue palette (from logo, 2026-05-15) */ + + /* Base — dark foundation */ + --bb-void: #060D1A; + --bb-navy: #0B1428; + --bb-navy-mid: #0D1B3E; + --bb-navy-lift: #112244; + + /* Energy — electric blue (particle layer, accent) */ + --bb-electric: #1B6FD8; + --bb-bright: #4A9FE8; + --bb-ice: #6AB4F5; + --bb-mist: #A0C8FF; + + /* Foreground */ + --bb-white: #FFFFFF; + --bb-white-70: rgba(255, 255, 255, 0.70); + --bb-white-40: rgba(255, 255, 255, 0.40); + --bb-white-10: rgba(255, 255, 255, 0.08); + + /* Gold — brand accent from pitch deck */ + --bb-gold: #D4A855; + --bb-gold-glow: rgba(212, 168, 85, 0.25); + + /* Utility */ + --bb-line: rgba(74, 159, 232, 0.20); + --bb-glow: rgba(27, 111, 216, 0.35); + + /* Semantic aliases */ + --color-bg: var(--bb-navy); + --color-bg-deep: var(--bb-void); + --color-bg-lift: var(--bb-navy-mid); + --color-accent: var(--bb-electric); + --color-accent-h: var(--bb-bright); + --color-text: var(--bb-white); + --color-text-soft:var(--bb-white-70); + --color-text-mute:var(--bb-white-40); + --color-border: var(--bb-line); + + /* Type stack */ + --font-display: 'Cormorant Garamond', Georgia, 'Times New Roman', serif; + --font-body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; + + --w-normal: 400; + --w-medium: 500; + --w-semi: 600; + --w-bold: 700; + + /* Type scale */ + --t-xs: 0.6875rem; + --t-sm: 0.8125rem; + --t-base: 1rem; + --t-lg: 1.125rem; + --t-xl: 1.375rem; + --t-2xl: 1.75rem; + --t-3xl: 2.25rem; + --t-4xl: 2.875rem; + --t-5xl: 3.75rem; + --t-6xl: 4.75rem; + --t-hero: clamp(3.5rem, 8vw, 7rem); + + /* Spacing (8px grid) */ + --s-1: 4px; + --s-2: 8px; + --s-3: 12px; + --s-4: 16px; + --s-5: 20px; + --s-6: 24px; + --s-8: 32px; + --s-10: 40px; + --s-12: 48px; + --s-16: 64px; + --s-20: 80px; + --s-25: 100px; + --s-30: 120px; + + /* Layout */ + --max-w: 1200px; + --gutter: clamp(24px, 5vw, 80px); + --col-gap: clamp(16px, 2.5vw, 40px); + + /* Easing */ + --ease: cubic-bezier(0.4, 0, 0.2, 1); + --ease-out: cubic-bezier(0, 0, 0.2, 1); + --ease-in: cubic-bezier(0.4, 0, 1, 1); + --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); + --ease-expo: cubic-bezier(0.16, 1, 0.3, 1); + + /* Duration */ + --d-fast: 150ms; + --d-base: 300ms; + --d-slow: 600ms; + --d-slower: 900ms; + --d-cinematic: 1200ms; + + /* Radius */ + --r-sm: 6px; + --r-md: 12px; + --r-lg: 20px; + --r-pill: 999px; +} diff --git a/src/assets/images/bigjoe-1.webp b/src/assets/images/bigjoe-1.webp new file mode 100644 index 0000000..bce1db4 Binary files /dev/null and b/src/assets/images/bigjoe-1.webp differ diff --git a/src/assets/images/bigjoe-2.webp b/src/assets/images/bigjoe-2.webp new file mode 100644 index 0000000..1100ffb Binary files /dev/null and b/src/assets/images/bigjoe-2.webp differ diff --git a/src/assets/images/bigjoe-3.webp b/src/assets/images/bigjoe-3.webp new file mode 100644 index 0000000..93119e5 Binary files /dev/null and b/src/assets/images/bigjoe-3.webp differ diff --git a/src/assets/images/bigjoe-4.webp b/src/assets/images/bigjoe-4.webp new file mode 100644 index 0000000..ac1f102 Binary files /dev/null and b/src/assets/images/bigjoe-4.webp differ diff --git a/src/assets/images/bigjoe-5.webp b/src/assets/images/bigjoe-5.webp new file mode 100644 index 0000000..d72673c Binary files /dev/null and b/src/assets/images/bigjoe-5.webp differ diff --git a/src/assets/images/bigjoe-6.webp b/src/assets/images/bigjoe-6.webp new file mode 100644 index 0000000..8c14e52 Binary files /dev/null and b/src/assets/images/bigjoe-6.webp differ diff --git a/src/assets/images/bigjoe-action-1.webp b/src/assets/images/bigjoe-action-1.webp new file mode 100644 index 0000000..9d39e43 Binary files /dev/null and b/src/assets/images/bigjoe-action-1.webp differ diff --git a/src/assets/images/bigjoe-action-2.webp b/src/assets/images/bigjoe-action-2.webp new file mode 100644 index 0000000..b42ef9d Binary files /dev/null and b/src/assets/images/bigjoe-action-2.webp differ diff --git a/src/assets/images/logo-mark.webp b/src/assets/images/logo-mark.webp new file mode 100644 index 0000000..534dbea Binary files /dev/null and b/src/assets/images/logo-mark.webp differ diff --git a/src/assets/images/logo-outline.webp b/src/assets/images/logo-outline.webp new file mode 100644 index 0000000..0906a84 Binary files /dev/null and b/src/assets/images/logo-outline.webp differ diff --git a/src/assets/images/logo-solid.webp b/src/assets/images/logo-solid.webp new file mode 100644 index 0000000..9b3f44d Binary files /dev/null and b/src/assets/images/logo-solid.webp differ diff --git a/src/assets/images/sessions/session-1.webp b/src/assets/images/sessions/session-1.webp new file mode 100644 index 0000000..b7f47ef Binary files /dev/null and b/src/assets/images/sessions/session-1.webp differ diff --git a/src/assets/images/sessions/session-2.webp b/src/assets/images/sessions/session-2.webp new file mode 100644 index 0000000..238354c Binary files /dev/null and b/src/assets/images/sessions/session-2.webp differ diff --git a/src/assets/images/sessions/session-3.webp b/src/assets/images/sessions/session-3.webp new file mode 100644 index 0000000..3232c9b Binary files /dev/null and b/src/assets/images/sessions/session-3.webp differ diff --git a/src/assets/images/sessions/session-4.webp b/src/assets/images/sessions/session-4.webp new file mode 100644 index 0000000..22a9fd3 Binary files /dev/null and b/src/assets/images/sessions/session-4.webp differ diff --git a/src/assets/images/sessions/session-5.webp b/src/assets/images/sessions/session-5.webp new file mode 100644 index 0000000..f3e82a4 Binary files /dev/null and b/src/assets/images/sessions/session-5.webp differ diff --git a/src/assets/images/sessions/session-6.webp b/src/assets/images/sessions/session-6.webp new file mode 100644 index 0000000..79eadb7 Binary files /dev/null and b/src/assets/images/sessions/session-6.webp differ diff --git a/src/assets/js/main.js b/src/assets/js/main.js new file mode 100644 index 0000000..d63967a --- /dev/null +++ b/src/assets/js/main.js @@ -0,0 +1,366 @@ +'use strict'; +document.documentElement.classList.add('js'); + +/* ─── Particle system ─────────────────────────────────────── */ +(function initParticles() { + const canvas = document.getElementById('bb-particles'); + if (!canvas) return; + + const ctx = canvas.getContext('2d'); + const isMobile = window.matchMedia('(max-width: 768px)').matches; + const COUNT = isMobile ? 60 : 150; + + let W, H, particles, mouse = { x: -9999, y: -9999 }, raf; + let canvasOpacity = 1; + + function resize() { + W = canvas.width = window.innerWidth; + H = canvas.height = window.innerHeight; + } + + function rand(min, max) { return min + Math.random() * (max - min); } + + function createParticles() { + particles = []; + for (let i = 0; i < COUNT; i++) { + particles.push({ + x: rand(0, W), + y: rand(0, H), + r: rand(1, 3), + opacity: rand(0.15, 0.45), + vx: rand(-0.15, 0.15), + vy: rand(-0.2, -0.05), + baseX: 0, + baseY: 0, + }); + particles[i].baseX = particles[i].x; + particles[i].baseY = particles[i].y; + } + } + + function draw() { + ctx.clearRect(0, 0, W, H); + ctx.save(); + ctx.globalAlpha = canvasOpacity; + + for (const p of particles) { + // Mouse parallax — shift up to 15px toward cursor + const dx = mouse.x - p.x; + const dy = mouse.y - p.y; + const dist = Math.sqrt(dx * dx + dy * dy); + const maxDist = 300; + if (dist < maxDist) { + const factor = (1 - dist / maxDist) * 15; + p.x += dx / dist * factor * 0.015; + p.y += dy / dist * factor * 0.015; + } + + // Drift + p.x += p.vx; + p.y += p.vy; + + // Wrap + if (p.x < -5) p.x = W + 5; + if (p.x > W + 5) p.x = -5; + if (p.y < -5) p.y = H + 5; + if (p.y > H + 5) p.y = -5; + + ctx.beginPath(); + ctx.arc(p.x, p.y, p.r, 0, Math.PI * 2); + // Electric blue color: #1B6FD8 or #4A9FE8 + const shade = p.r > 2 ? '74,159,232' : '27,111,216'; + ctx.fillStyle = `rgba(${shade},${p.opacity})`; + ctx.fill(); + } + + ctx.restore(); + raf = requestAnimationFrame(draw); + } + + // Fade canvas as user scrolls past hero section + window.addEventListener('scroll', () => { + const hero = document.querySelector('.bb-sec-hero'); + const heroHeight = hero ? hero.offsetHeight : window.innerHeight; + const scrollPct = Math.min(window.scrollY / heroHeight, 1); + canvasOpacity = Math.max(0.15, 1 - scrollPct * 0.7); + }, { passive: true }); + + window.addEventListener('mousemove', e => { + mouse.x = e.clientX; + mouse.y = e.clientY; + }, { passive: true }); + + // Respect reduced-motion + if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) { + canvas.style.display = 'none'; + return; + } + + resize(); + createParticles(); + draw(); + window.addEventListener('resize', () => { resize(); createParticles(); }, { passive: true }); +})(); + +/* ─── Ghost word parallax ─────────────────────────────────── */ +(function initGhostParallax() { + const ghost = document.querySelector('.ghost-word'); + if (!ghost) return; + if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return; + + let ticking = false; + let currentY = window.scrollY; + + window.addEventListener('scroll', () => { + currentY = window.scrollY; + if (!ticking) { + requestAnimationFrame(() => { + // Move down slower than content — atmospheric layer + ghost.style.transform = `translateY(calc(-50% + ${currentY * 0.15}px))`; + ticking = false; + }); + ticking = true; + } + }, { passive: true }); +})(); + +/* ─── Scroll-triggered reveal ─────────────────────────────── */ +(function initReveal() { + const revealObserver = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + const el = entry.target; + const delay = parseInt(el.dataset.delay || '0', 10); + setTimeout(() => el.classList.add('in-view'), delay); + revealObserver.unobserve(el); + } + }); + }, { threshold: 0.10, rootMargin: '0px 0px -40px 0px' }); + + document.querySelectorAll('[data-animate]').forEach(el => revealObserver.observe(el)); + + // Philosophy divider line (separate observer — uses scaleY) + const divider = document.querySelector('.philosophy-divider'); + if (divider) { + const divObs = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + divider.classList.add('in-view'); + divObs.unobserve(divider); + } + }); + }, { threshold: 0.2 }); + divObs.observe(divider); + } + + // Fallback: reveal everything after 1.2s in case observer never fires + setTimeout(() => { + document.querySelectorAll('[data-animate]:not(.in-view)').forEach(el => { + el.classList.add('in-view'); + }); + if (divider) divider.classList.add('in-view'); + }, 1200); +})(); + +/* ─── Stat counters ───────────────────────────────────────── */ +(function initStatCounters() { + const section = document.querySelector('.bb-sec-bigjoe'); + if (!section) return; + + let triggered = false; + + function easeOutExpo(t) { + return t === 1 ? 1 : 1 - Math.pow(2, -10 * t); + } + + function animateCounter(el, target, duration) { + // target is already the display value (143 for 143K, 15000 for 15,000+, etc.) + const start = performance.now(); + + function tick(now) { + const elapsed = now - start; + const progress = Math.min(elapsed / duration, 1); + const value = Math.round(easeOutExpo(progress) * target); + el.textContent = value.toLocaleString(); + if (progress < 1) requestAnimationFrame(tick); + else el.textContent = target.toLocaleString(); + } + + requestAnimationFrame(tick); + } + + const obs = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting && !triggered) { + triggered = true; + const nums = section.querySelectorAll('.stat-num'); + nums.forEach(num => { + const target = parseInt(num.dataset.target || '0', 10); + animateCounter(num, target, 2000); + }); + obs.disconnect(); + } + }); + }, { threshold: 0.3 }); + + obs.observe(section); +})(); + +/* ─── Sticky header ───────────────────────────────────────── */ +(function initHeader() { + const header = document.querySelector('.bb-header'); + if (!header) return; + + let lastY = 0; + + window.addEventListener('scroll', () => { + const y = window.scrollY; + if (y > 60) header.classList.add('scrolled'); + else header.classList.remove('scrolled'); + if (y > lastY && y > 240) header.classList.add('hidden'); + else header.classList.remove('hidden'); + lastY = y; + }, { passive: true }); +})(); + +/* ─── Mobile nav ──────────────────────────────────────────── */ +(function initMobileNav() { + const hamburger = document.querySelector('.bb-hamburger'); + const mobileNav = document.querySelector('.bb-mobile-nav'); + if (!hamburger || !mobileNav) return; + + hamburger.addEventListener('click', () => { + const open = hamburger.classList.toggle('open'); + mobileNav.classList.toggle('open'); + document.body.classList.toggle('nav-open'); + hamburger.setAttribute('aria-expanded', open); + }); + + mobileNav.querySelectorAll('a').forEach(a => { + a.addEventListener('click', () => { + hamburger.classList.remove('open'); + mobileNav.classList.remove('open'); + document.body.classList.remove('nav-open'); + hamburger.setAttribute('aria-expanded', 'false'); + }); + }); +})(); + +/* ─── Services dropdown ───────────────────────────────────── */ +(function initDropdown() { + const trigger = document.querySelector('.nav-has-dropdown'); + if (!trigger) return; + + const menu = trigger.querySelector('.nav-dropdown'); + if (!menu) return; + + let hideTimer = null; + + const show = () => { clearTimeout(hideTimer); menu.classList.add('visible'); }; + const scheduleHide = () => { + hideTimer = setTimeout(() => menu.classList.remove('visible'), 180); + }; + + trigger.addEventListener('mouseenter', show); + trigger.addEventListener('mouseleave', scheduleHide); + menu.addEventListener('mouseenter', show); + menu.addEventListener('mouseleave', scheduleHide); + trigger.addEventListener('focusin', show); + trigger.addEventListener('focusout', scheduleHide); + + // Click outside + document.addEventListener('click', e => { + if (!trigger.contains(e.target)) menu.classList.remove('visible'); + }); +})(); + +/* ─── Hero H1 word reveal + subhead fade ─────────────────── */ +(function initHeroReveal() { + const heroH1 = document.querySelector('.hero-h1'); + const heroSub = document.querySelector('.hero-sub'); + if (!heroH1) return; + + let wordIndex = 0; + const walker = document.createTreeWalker(heroH1, NodeFilter.SHOW_TEXT); + const textNodes = []; + while (walker.nextNode()) textNodes.push(walker.currentNode); + + textNodes.forEach(node => { + const frag = document.createDocumentFragment(); + node.textContent.split(/(\s+)/).forEach(chunk => { + if (/^\s+$/.test(chunk)) { + frag.appendChild(document.createTextNode(chunk)); + } else if (chunk) { + const span = document.createElement('span'); + span.className = 'word'; + // 200ms page load delay + 120ms stagger per word + span.style.transitionDelay = (200 + wordIndex * 120) + 'ms'; + span.textContent = chunk; + frag.appendChild(span); + wordIndex++; + } + }); + node.parentNode.replaceChild(frag, node); + }); + + // Trigger on next paint + requestAnimationFrame(() => { + setTimeout(() => { + heroH1.classList.add('revealed'); + // Hero subhead: fade in after all words have staggered + if (heroSub) { + const subDelay = 200 + wordIndex * 120 + 400; + setTimeout(() => heroSub.classList.add('revealed'), subDelay); + } + }, 0); + }); +})(); + +/* ─── FAQ accordion ───────────────────────────────────────── */ +(function initFAQ() { + document.querySelectorAll('.faq-item').forEach(item => { + const btn = item.querySelector('.faq-q'); + const body = item.querySelector('.faq-a'); + if (!btn || !body) return; + btn.addEventListener('click', () => { + const open = item.classList.toggle('open'); + btn.setAttribute('aria-expanded', open); + body.style.maxHeight = open ? body.scrollHeight + 'px' : '0'; + }); + }); +})(); + +/* ─── Gallery drag-scroll ─────────────────────────────────── */ +(function initGallery() { + const wrap = document.querySelector('.gallery-track-wrap'); + if (!wrap) return; + let isDown = false, startX = 0, scrollLeft = 0; + wrap.addEventListener('mousedown', e => { + isDown = true; + wrap.classList.add('dragging'); + startX = e.pageX - wrap.offsetLeft; + scrollLeft = wrap.scrollLeft; + }); + ['mouseleave', 'mouseup'].forEach(ev => { + wrap.addEventListener(ev, () => { isDown = false; wrap.classList.remove('dragging'); }); + }); + wrap.addEventListener('mousemove', e => { + if (!isDown) return; + e.preventDefault(); + const x = e.pageX - wrap.offsetLeft; + wrap.scrollLeft = scrollLeft - (x - startX) * 1.5; + }); +})(); + +/* ─── Smooth scroll ───────────────────────────────────────── */ +document.querySelectorAll('a[href^="#"]').forEach(a => { + a.addEventListener('click', e => { + const id = a.getAttribute('href'); + if (!id || id === '#' || id.length < 2) return; + const target = document.querySelector(id); + if (target) { + e.preventDefault(); + target.scrollIntoView({ behavior: 'smooth', block: 'start' }); + } + }); +}); diff --git a/src/assets/svg/favicon.svg b/src/assets/svg/favicon.svg new file mode 100644 index 0000000..d93b696 --- /dev/null +++ b/src/assets/svg/favicon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/contact/index.html b/src/contact/index.html new file mode 100644 index 0000000..86c6fcc --- /dev/null +++ b/src/contact/index.html @@ -0,0 +1,214 @@ + + + + + + + + + + + + Contact | Big Breathe Yoga & Wellness + + + + + + + + + + + + + +
+ +
+
+ +

Book a class or ask a question

+

+
+
+ +
+
+
+ + +
+
+ + + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + +
+
+ +
+ + +
+
+
Email
+
Phone
+
Location
+
Hours
+
+
+ +
+
+
+ +
+ + + + + + diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..048fab1 --- /dev/null +++ b/src/index.html @@ -0,0 +1,412 @@ + + + + + + + + + + + + + Big Breath | Breathwork for High Performers + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+
+

FORMER NFL ATHLETE · 15,000+ PEOPLE GUIDED · 15 COUNTRIES

+

Take a big breath
& have the best day ever.

+

Breathwork for those who demand more from life. Led by former NFL athlete Big Joe — in rooms, boardrooms, and arenas worldwide.

+ + +
+
+
+
+ + +
+
TRUSTED BY
+
+
+ NFL + + NFLPA + + Olympics + + UCLA Bruins + + LA Chargers + + Airbnb + + Pepsi + + Lincoln + + GMC + + Remedy Place + + Kachava + + Hoag Sports Medicine + + Dove Men+Care + + + NFL + + NFLPA + + Olympics + + UCLA Bruins + + LA Chargers + + Airbnb + + Pepsi + + Lincoln + + GMC + + Remedy Place + + Kachava + + Hoag Sports Medicine + + Dove Men+Care + +
+
+
+ + +
+
+ +
+
+
+ Between work and life, most people's nervous systems are on the fritz. Breath is the fastest way back. +
+
+ +
+

Controlled breathing increases oxygen flow to the brain, enhancing focus, lowering cortisol, and improving recovery. Numerous studies confirm: specific breathing techniques boost endurance, circulation, and neuroplasticity.

+

Big Breath is not a wellness brand. It is a live, guided practice built by a former NFL athlete who used breathwork to rebuild after a career-ending injury — then spent seven years taking it to boardrooms, stadiums, and retreat centers worldwide.

+

Whether you are an athlete in recovery, an executive preparing to lead, or a team that needs to realign — the breath is the tool. The practice is ancient. The approach is completely his own.

+
+
+
+
+ + + + + +
+
+ +

Why the breath works.

+
+
+ 01 +

Stress Reduction

+

Controlled breathing increases oxygen flow to the brain, enhancing cognitive functions such as focus and memory while lowering cortisol levels.

+
+
+ 02 +

Enhanced Recovery

+

By improving oxygen delivery to tissues and promoting relaxation, breathwork aids in muscle recovery and reduces fatigue after physical and mental output.

+
+
+ 03 +

Improved Focus

+

Specific breathing techniques enhance endurance, improve circulation, and boost neuroplasticity and cognitive performance under pressure.

+
+
+ 04 +

Emotional Regulation

+

Breathwork reduces symptoms of anxiety and depression. Regular practice promotes relaxation and emotional balance that persists beyond the session.

+
+
+
+
+ + +
+
+
+
+ Joseph Fauria — Big Joe, founder of Big Breath +
+
+ +

Big Joe

+
+

Joseph Fauria played four years in the NFL. Then a career-altering ankle injury ended it — and started everything else.

+

In 2018 he found breathwork. Not as a wellness trend, but as survival. What he discovered changed his life — and he has spent seven years making sure it changes yours.

+

Today Big Joe has guided over 15,000 people across 15 countries. Athletes, entrepreneurs, executives, and everyday people who needed a reset. The practice is ancient. His approach is completely his own.

+
+
+
+ 0+ + People Guided +
+
+ 0K + Community +
+
+ 0+ + Countries +
+
+ 0 + Years of Practice +
+
+
+
+
+
+ + +
+
+ +

Find your practice

+
+
+

Breathwork Sessions

+

30, 60, or 120-minute immersive breath journeys rooted in ancient practices — designed to enhance mental and physical well-being. Group or individually curated.

+ Explore Sessions +
+
+

Corporate Wellness

+

Build team unity. Enhance creativity and efficiency. Reduce cortisol, sharpen focus — and watch how that positively impacts your business goals.

+ Corporate Programs +
+
+

Private 1-on-1

+

Intentional, breath-led coaching sessions for high performers. Tailored to your goals, your pace, your nervous system.

+ Book Private Session +
+
+ +
+
+ + +
+
+ +

Every continent. Every level of performance.

+

+ USA · Mexico · Canada · Netherlands · France · Indonesia · Costa Rica · Saudi Arabia · UAE · Colombia · Greece · Japan · Sweden · Turkey · Saint Barthélémy +

+ +
+
+ + +
+
+ +
+
+
As soon as I walked into the room, I felt protected and safe. That authenticity is rare.
+

Brian Godfrey — Los Angeles

+
+
+
I didn't know the power of my breath. The experience was life-changing.
+

Maria Muleta — Colombia

+
+
+
Big Breath transformed our team. The focus shift was immediate and measurable.
+

Mark Thompson — Corporate Client

+
+
+
+
+ + +
+
+ +

Take a big breath.

+
+
+

For Individuals

+

Personal sessions, retreats & private coaching

+ +
+ +
+

For Organizations

+

Corporate wellness, team events & keynotes

+ +
+
+

hello@bigbreath.co

+
+
+ +
+ + + + + + diff --git a/src/llms.txt b/src/llms.txt new file mode 100644 index 0000000..0b34ae5 --- /dev/null +++ b/src/llms.txt @@ -0,0 +1,15 @@ +# Big Breathe Yoga & Wellness + +> + +## Services +- [Group Classes](/services/group-classes/) +- [Private Sessions](/services/private-sessions/) +- [Corporate Wellness](/services/corporate-wellness/) +- [Prenatal Yoga](/services/prenatal-yoga/) +- [Meditation & Breathwork](/services/meditation-breathwork/) +- [Online / Virtual Yoga](/services/online-yoga/) + +## Studio +- [About](/about/) +- [Contact](/contact/) diff --git a/src/privacy-policy/index.html b/src/privacy-policy/index.html new file mode 100644 index 0000000..65d5cbb --- /dev/null +++ b/src/privacy-policy/index.html @@ -0,0 +1,55 @@ + + + + + + + + Privacy Policy | Big Breathe Yoga & Wellness + + + + + + + + +
+
+
+

Privacy Policy

+

Last updated:

+
+
+
+
+
+

+
+
+
+
+ + + + diff --git a/src/robots.txt b/src/robots.txt new file mode 100644 index 0000000..d268325 --- /dev/null +++ b/src/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://bigbreathe.co/sitemap.xml diff --git a/src/services/corporate-wellness/index.html b/src/services/corporate-wellness/index.html new file mode 100644 index 0000000..4d945d8 --- /dev/null +++ b/src/services/corporate-wellness/index.html @@ -0,0 +1,166 @@ + + + + + + + + + + + + Corporate Wellness | Big Breathe Yoga & Wellness + + + + + + + + + + + + + +
+ +
+
+ +

Corporate Wellness

+

+
+ Get a Quote +
+
+
+ +
+
+
+

Wellness at Work

+

+ +

What’s Included

+

+
    +
  • +
  • +
  • +
  • +
+ +

Formats & Scheduling

+

+
+
+
+ +
+ + +
+ +

Request a corporate quote

+ +
+
+ +
+ + + + + + diff --git a/src/services/group-classes/index.html b/src/services/group-classes/index.html new file mode 100644 index 0000000..78524b6 --- /dev/null +++ b/src/services/group-classes/index.html @@ -0,0 +1,165 @@ + + + + + + + + + + + + Group Classes | Big Breathe Yoga & Wellness + + + + + + + + + + + + + +
+ +
+
+ +

Group Classes

+

+
+ Book a Spot +
+
+
+ +
+
+
+

What to Expect

+

+ +

Class Formats

+

+
    +
  • +
  • +
  • +
+ +

Schedule & Pricing

+

+
+
+
+ +
+ + +
+ +

Reserve your spot in a group class

+ +
+
+ +
+ + + + + + diff --git a/src/services/index.html b/src/services/index.html new file mode 100644 index 0000000..56ada0a --- /dev/null +++ b/src/services/index.html @@ -0,0 +1,204 @@ + + + + + + + + + + + + Services | Big Breathe Yoga & Wellness + + + + + + + + + + + + + +
+ +
+
+ +

Yoga & wellness for every body

+

+
+
+ +
+ +
+ +
+ + +
+ +

We’ll help you find the right fit

+

+ +
+
+ +
+ + + + + + diff --git a/src/services/keynotes/index.html b/src/services/keynotes/index.html new file mode 100644 index 0000000..cbce3db --- /dev/null +++ b/src/services/keynotes/index.html @@ -0,0 +1,177 @@ + + + + + + + + + + + + Keynotes | Big Breath — Joseph Fauria + + + + + + + + + + + + + +
+ +
+
+ +

Keynotes

+

A keynote with Big Joe is not a talk. It is a live breathwork experience — your audience leaves breathing differently, thinking more clearly, and ready to perform.

+
+ Request Big Joe +
+
+
+ +
+
+
+

Not a Lecture. A Shift.

+

Big Joe has stood on stages across the country — from NFL locker rooms to Fortune 500 leadership summits — and the result is always the same: the room changes. He does not read slides. He guides the room through a live breathing sequence, then connects the science to your industry, your team, and the specific pressures they face every day.

+ +

What a Keynote Includes

+
    +
  • 45- to 90-minute live format — customizable to your event
  • +
  • Full-room breathwork session guided by Big Joe in real time
  • +
  • The science of HRV, nervous system regulation, and recovery — in plain language
  • +
  • NFL and elite performance case studies tailored to your audience
  • +
  • Q&A and direct engagement with attendees
  • +
  • Post-event tools your team can use immediately
  • +
+ +

Ideal For

+
    +
  • Corporate leadership conferences and all-hands events
  • +
  • Human performance and wellness summits
  • +
  • Sports organizations and athletic programs
  • +
  • Executive off-sites and strategy retreats
  • +
  • Healthcare, finance, and high-demand industry teams
  • +
+ +

Booking & Logistics

+

Big Joe is based in Los Angeles and available for domestic and international engagements. He works directly with event planners on run-of-show integration, A/V needs, and audience preparation. No special equipment is required — just a room and a group ready to breathe.

+

To check availability and receive a proposal, use the contact form below.

+
+
+
+ +
+ + +
+ +

Bring the breath to your stage

+ +
+
+ +
+ + + + + + diff --git a/src/services/meditation-breathwork/index.html b/src/services/meditation-breathwork/index.html new file mode 100644 index 0000000..4e088d3 --- /dev/null +++ b/src/services/meditation-breathwork/index.html @@ -0,0 +1,164 @@ + + + + + + + + + + + + Meditation & Breathwork | Big Breathe Yoga & Wellness + + + + + + + + + + + + + +
+ +
+
+ +

Meditation & Breathwork

+

+
+ Book a Session +
+
+
+ +
+
+
+

The Power of the Breath

+

+ +

Techniques We Teach

+
    +
  • +
  • +
  • +
+ +

Who Benefits

+

+
+
+
+ +
+ + +
+ +

Book a meditation session

+ +
+
+ +
+ + + + + + diff --git a/src/services/online/index.html b/src/services/online/index.html new file mode 100644 index 0000000..95708d2 --- /dev/null +++ b/src/services/online/index.html @@ -0,0 +1,168 @@ + + + + + + + + + + + + Online | Big Breath — Joseph Fauria + + + + + + + + + + + + + +
+ +
+
+ +

Online

+

Big Breath on your schedule. Live virtual sessions and on-demand content — the same breath, wherever you are in the world.

+
+ Start Online +
+
+
+ +
+
+
+

Practice Without Borders

+

Big Joe has guided sessions across 15 countries. Distance is not a barrier — breathwork translates completely over video. Many of his most consistent clients are executives and athletes who do not live in Los Angeles. They show up virtually, week after week, because the work moves.

+ +

What Online Includes

+
    +
  • Live 1-on-1 virtual sessions — private sessions with Big Joe via video call. Same protocol, same attention, fully personalized.
  • +
  • Live group sessions — join a scheduled virtual group class. Typically 45 to 60 minutes. Dates announced to the mailing list.
  • +
  • On-demand library — recorded sessions you can return to: morning activation, stress reset, pre-performance, deep sleep preparation. Available to active clients.
  • +
  • Virtual corporate programs — team sessions delivered live over video for distributed organizations. Minimum 5 participants.
  • +
+ +

How to Get Started

+

Use the contact form to tell us what you are working toward — performance, recovery, stress, sleep, or something else. Big Joe or his team will reach back within 24 hours to match you with the right format and schedule an intake call.

+ +

Technology

+

Sessions run over Zoom or Google Meet. No special software or equipment is required beyond a stable internet connection and a quiet space where you can lie flat.

+
+
+
+ +
+ + +
+ +

Start your online practice

+ +
+
+ +
+ + + + + + diff --git a/src/services/private-sessions/index.html b/src/services/private-sessions/index.html new file mode 100644 index 0000000..3207092 --- /dev/null +++ b/src/services/private-sessions/index.html @@ -0,0 +1,165 @@ + + + + + + + + + + + + Private Sessions | Big Breathe Yoga & Wellness + + + + + + + + + + + + + +
+ +
+
+ +

Private Sessions

+

+
+ Book a Session +
+
+
+ +
+
+
+

One-on-One Instruction

+

+ +

Who This Is For

+

+
    +
  • +
  • +
  • +
+ +

Session Details & Pricing

+

+
+
+
+ +
+ + +
+ +

Book your private session today

+ +
+
+ +
+ + + + + + diff --git a/src/services/retreats/index.html b/src/services/retreats/index.html new file mode 100644 index 0000000..50c5af0 --- /dev/null +++ b/src/services/retreats/index.html @@ -0,0 +1,174 @@ + + + + + + + + + + + + Retreats & Live Experiences | Big Breath — Joseph Fauria + + + + + + + + + + + + + +
+ +
+
+ +

Retreats & Live Experiences

+

Multi-day immersive experiences with Big Joe. Small groups. Deep work. The kind of shift that stays with you long after you go home.

+
+ Inquire About Retreats +
+
+
+ +
+
+
+

Immersion Over Instruction

+

A single session can open a door. A retreat walks you through it. Big Joe leads intimate multi-day experiences — two to five days — where breathwork is woven into every morning, every meal break, every evening wind-down. The result is a nervous system reset that one-hour sessions cannot replicate.

+ +

What Retreats Cover

+
    +
  • Daily guided breathwork: morning activation, midday recalibration, evening recovery
  • +
  • HRV tracking and biofeedback to show each participant real-time results
  • +
  • Cold exposure and movement integration (where facilities allow)
  • +
  • One-on-one time with Big Joe for personal protocol design
  • +
  • Group processing sessions — what is coming up, what is shifting
  • +
  • A custom home practice plan for every participant
  • +
+ +

Retreat Formats

+
    +
  • Individual retreats — open enrollment, small group (8–16 participants), held in curated locations across the U.S. and internationally
  • +
  • Private group retreats — custom designed for executive teams, athletic programs, or private organizations. Minimum 6 participants. Location is your choice.
  • +
  • Corporate immersions — 2-day off-site experiences built around leadership performance, burnout recovery, or team cohesion
  • +
+ +

Upcoming Dates

+

Retreat dates and locations are announced to the mailing list first. Join the list or contact us directly to learn what is next on the calendar.

+
+
+
+ +
+ + +
+ +

Join the next retreat

+ +
+
+ +
+ + + + + + diff --git a/src/sitemap.xml b/src/sitemap.xml new file mode 100644 index 0000000..abdbc42 --- /dev/null +++ b/src/sitemap.xml @@ -0,0 +1,14 @@ + + + https://bigbreathe.co/weekly1.0 + https://bigbreathe.co/about/monthly0.8 + https://bigbreathe.co/services/monthly0.9 + https://bigbreathe.co/services/breathwork-sessions/monthly0.8 + https://bigbreathe.co/services/corporate-wellness/monthly0.8 + https://bigbreathe.co/services/private-sessions/monthly0.8 + https://bigbreathe.co/services/keynotes/monthly0.8 + https://bigbreathe.co/services/retreats/monthly0.8 + https://bigbreathe.co/contact/monthly0.7 + https://bigbreathe.co/privacy-policy/yearly0.3 + https://bigbreathe.co/terms-of-service/yearly0.3 + diff --git a/src/terms-of-service/index.html b/src/terms-of-service/index.html new file mode 100644 index 0000000..9b828a1 --- /dev/null +++ b/src/terms-of-service/index.html @@ -0,0 +1,55 @@ + + + + + + + + Terms of Service | Big Breathe Yoga & Wellness + + + + + + + + +
+
+
+

Terms of Service

+

Last updated:

+
+
+
+
+
+

+
+
+
+
+ + + +