Files
my-biz/AGENTS.md
T

480 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AGENTS.md — my-biz.app Landing Page
Read this file fully before taking any action.
---
## Project Context
Single-page static landing page for **my-biz.app** — a hassle-free all-in-one back-office product built on Odoo Community Edition, targeting NGOs, Startups, Manufacturers, and Restaurants.
| Item | Detail |
|---|---|
| Live page | `index.html` — the only production HTML file |
| Design | Warm coffee/latte light theme · cream/burnt-orange/dark-roast |
| Styling | 100% inline `<style>` in `index.html` — no external CSS |
| JavaScript | Inline `<script>` at bottom of `index.html` — no external JS except MotionFlow |
| External dep | MotionFlow CDN (CSS + JS) — the only allowed external dependency |
| Archive | `old/` — previous style explorations (do not touch) |
---
## File Map
```
my-biz/
├── index.html ← production page (only file to edit)
├── style.html ← brand style guide for designers (read-only)
├── logo.png ← nav logo image (36px tall in nav)
├── AGENTS.md ← this file
├── start ← dev server launcher
└── old/ ← archived variants (read-only, never touch)
```
---
## External Dependencies (Allowed)
- **MotionFlow CSS** — `https://cdn.jsdelivr.net/npm/@slicemypage/motionflow@latest/dist/motionflow.min.css` (in `<head>`)
- **MotionFlow JS** — `https://cdn.jsdelivr.net/npm/@slicemypage/motionflow@latest/dist/motionflow.min.js` (before `</body>`)
- MotionFlow auto-initializes. No manual JS setup needed.
No other external CSS, JS, or fonts are permitted.
---
## Design System
### CSS Custom Properties (defined in `:root`)
| Token | Value | Usage |
|---|---|---|
| `--bg` | `#efebe9` | Latte — main page background (LIGHT) |
| `--surf1` | `#e8e0da` | Warm Latte — alternate section background |
| `--card` | `#fff3e0` | Cream — cards, modal, chat panel |
| `--lift` | `#f5ece4` | Lifted Cream — card hover, featured card bg |
| `--bg-deep` | `#3e2723` | Dark Roast — footer, overlays |
| `--border` | `rgba(93,64,55,0.25)` | All borders and grid gaps |
| `--grey` | `#a1887f` | Warm Taupe — muted text, captions |
| `--silver` | `#6d4c41` | Deep Brown — secondary text |
| `--light` | `#5d4037` | Medium Roast — body text |
| `--gold` | `#e65100` | Burnt Orange — primary CTA, accents |
| `--gold-hi` | `#fb8c00` | Warm Orange — hover highlight |
| `--gold-lo` | `#bf360c` | Deep Burnt — gradient start/end stop |
| `--gold-glow` | `rgba(230,81,0,0.18)` | Box-shadow glow on gold elements |
| `--white` | `#3e2723` | Dark Roast — headings on light background |
**NEVER use raw hex values in HTML or CSS.** Always reference the token.
### Brand Gradient (5-stop, 135deg)
Applied to: nav logo (text clip), footer logo, modal title, featured pricing price, pricing badge, `.btn-primary`, featured `.pricing-cta`, `.custom-rate`.
```css
background: linear-gradient(
135deg,
var(--gold-lo) 0%,
var(--gold) 38%,
var(--gold-hi) 55%,
var(--gold) 75%,
var(--gold-lo) 100%
);
```
Text clip usage (for gradient text):
```css
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
```
### Typography
| Use | Font | Size |
|---|---|---|
| Headings (`h1`, `h2`, card titles, pricing, modal title) | `Georgia, "Times New Roman", serif` | varies |
| Body / UI / buttons / forms / chat | `"Segoe UI", system-ui, -apple-system, sans-serif` | 0.651.0rem |
| Labels / section labels / tags | system-ui, UPPERCASE, wide tracking | 0.620.78rem |
### No @keyframes Rule
**There are zero `@keyframes` in `index.html`.** Motion is limited to CSS `transition` on hover/focus states only. MotionFlow handles all scroll animations via its own internal logic — that is allowed and expected. Do not add any `@keyframes` or `animation` properties.
---
## Page Structure
All sections are in normal document flow. The user scrolls the page. Sections appear in this order:
```
<nav> sticky, 62px, cream bg with burnt-orange bottom border
<div#chat-panel> fixed dropdown below nav-right, hidden by default
<section.hero#home> 55vh, latte bg, parallax image behind content
<section#verticals> MotionFlow ticker with image cards linking to subdomains
<section#news> latte bg, 4-card news grid
<section#pricing> surf1 bg, 3 pricing cards (Side Hustle / On the Rise / Empire)
<section#customization> latte bg, 2 custom cards
<footer> bg-deep (dark roast), 3px burnt-orange top border
<div#modal-overlay> fixed, shown/hidden by JS
```
All sections use `scroll-margin-top: 62px` to offset the sticky nav.
---
## Nav
```
display: flex; align-items: center; gap: 16px;
background: rgba(255,243,224,0.97); ← CREAM (logo readable)
border-bottom: 2px solid var(--gold);
box-shadow: 0 2px 14px rgba(62,39,35,0.1);
height: 62px; padding: 0 8vw;
```
Layout:
```
[logo.png img] [gap 12px] [Book Meeting] [Free Trial] [→ auto margin →] [💬 chat input 440px wide ]
```
- **Logo** `.nav-logo``<img src="logo.png">` — 36px tall
- **`.nav-center`** — flex, gap 12px — holds Book Meeting + Free Trial CTAs
- **`.nav-right`** — `margin-left: auto` — holds `.nav-chat` widget + mobile-only Free Trial button
- **`.nav-cta`** (Free Trial) — burnt-orange border + text, fills on hover
- **`.nav-cta-book`** (Book Meeting) — taupe border, grey text, warm-orange on hover
- **`.nav-chat`** — 440px wide, subtle tint, toggle 💬 button + text input + send button
**Responsive:**
- `≤ 768px``.nav-center` hidden, `.nav-chat` hidden, mobile Free Trial button appears
---
## Chat Panel (`div#chat-panel`)
```
position: fixed; top: 62px; right: 8vw; width: 440px;
background: var(--card);
border-top: 2px solid var(--gold);
```
- Toggles open/close via 💬 button in `.nav-chat`, or `Escape` key, or click outside, or on scroll
- Shows chat history (240px tall, scrollable) and a message input at the bottom
- Hidden on `≤ 768px`
**Public API (exposed on `window._mbs`):**
- `window._mbs.appendMsg(role, text)` — appends a message to the chat history
- `window._mbs.openSilent()` — opens the panel without triggering the default greeting
**Chat Webhook:**
```
POST https://002-001-5dd6e535-4d1c-46bc-9bd9-42ad4bc5f082.odoo4projects.com/webhook/702862fd-dd17-4a34-8efb-e9056d2c50df/chat
Content-Type: application/json
Body: { "action": "sendMessage", "chatid": "<uuid-v4>", "chatInput": "<text>" }
```
**30-second new-user probe:** fires once after 30 seconds, collects browser/OS/device/geo fingerprint, POSTs to the chat webhook, displays the response, and auto-opens the chat panel.
---
## Hero (`section.hero#home`)
- `min-height: 55vh`, flex column, centred, latte bg, `position: relative; overflow: hidden`
- **Parallax bg**: `<div class="hero-bg-wrap"><img data-mf-parallax data-mf-parallax-speed="0.4" /></div>` — Unsplash office image, 28% opacity with latte overlay
- Parallax disabled on tablet/mobile: `data-mf-parallax-speed-tablet="0" data-mf-parallax-speed-mobile="0"`
Elements:
- `.hero-eyebrow` — pill, burnt-orange border + text
- `h1` — Georgia, 2.6rem, dark-roast; `<em>` in burnt-orange
- `.hero-sub` — silver, 0.92rem
- `.hero-tagline` — cycling typing text via MotionFlow (`data-mf-text-type="typing"`), 3 phrases
- `.hero-actions` — two buttons:
- `.btn-primary` `id="open-modal-hero"`**opens modal**
- `.btn-secondary` → scrolls to `#verticals` (Book Meeting)
- `.hero-trust` — small muted trust line
All hero elements carry `data-mf-animation="fade-up"` with `data-mf-animation-once="true"` and staggered delays.
---
## Verticals (`section#verticals`)
- Background: `var(--surf1)`
- **MotionFlow ticker**: `<div class="vtick-wrap" data-mf-ticker data-mf-ticker-speed="55">`
- Direct children are `<span>` elements, each containing a `.vtick-card` link
**5 cards:**
| Vertical | Link | Tag |
|---|---|---|
| NGO & Non-Profit | `https://ngo.my-biz.app` | Donor CRM · Impact Reports |
| Startups | `https://startups.my-biz.app` | Invoicing · CRM · Reporting |
| Manufacturing | `https://manufacturing.my-biz.app` | MRP · Inventory · Quality |
| Restaurants | `https://restaurants.my-biz.app` | POS · Payroll · Food Cost |
| Agentic Businesses | `https://agentic.my-biz.app` | AI · Automation · Agents |
Card CSS: `.vtick-card` — 220px wide, image (140px tall), `.vtick-name` (Georgia, dark-roast), `.vtick-tag` (burnt-orange uppercase label)
---
## News (`section#news`)
- Background: `var(--bg)`
- `.news-grid``auto-fit minmax(220px,1fr)`, `gap: 24px`
- **4 cards**: NGO · Startups · Manufacturing · Restaurants
- `.news-card``border-top: 1px solid var(--border)`, hover → burnt-orange
- Card anatomy: `.news-area` (burnt-orange label) · `.news-title` (Georgia) · `.news-teaser` (silver) · `.news-date` (grey)
- MotionFlow stagger: `data-mf-stagger-animation="fade-up"` on the grid element
---
## Pricing (`section#pricing`)
- Background: `var(--surf1)`
- `.pricing-grid``auto-fit minmax(300px,1fr)`, no max-width, gold hairline gaps
- **3 cards**: Side Hustle · On the Rise (featured) · Empire
| Plan | Price | Key detail |
|---|---|---|
| Side Hustle | $214/yr | Up to 3 users, community support |
| On the Rise | $395/yr | Featured card — "Most Popular" badge |
| Empire | $750/yr + $500 setup | Self-hosted, "My house! My horse! My server!" |
**Plain cards** (Side Hustle, Empire):
- `background: var(--card)`
- CTA: burnt-orange border + text, fills on hover
**Featured card** (On the Rise):
- `background: var(--lift)`
- `box-shadow: 0 0 0 1px var(--gold), 0 0 28px var(--gold-glow)`
- `.pricing-price` — 5-stop gradient text
- `.pricing-badge` — 5-stop gradient background, dark text
- MotionFlow: `data-mf-animation="zoom-in"` `data-mf-animation-once="true"`
**Empire card extras:**
- `.pricing-setup` — shows setup fee in burnt-orange
- Feature list includes self-hosted server/VPS installation and maintenance
Feature list uses `—` em-dash in burnt-orange as bullet (`::before`).
All pricing CTAs use `class="open-modal"`**opens modal**.
---
## Customization (`section#customization`)
- Background: `var(--bg)`
- `.custom-grid``auto-fit minmax(300px,1fr)`, gold hairline gaps
- **2 cards**: Hire Any Odoo Developer · Our In-House Team
- `.custom-card::after` — 2px gradient bar, `scaleX(0)``scaleX(1)` on hover (transition)
- `.custom-rate` — 5-stop gradient text, Georgia, 1.4rem (`$65 USD / hour`)
- `.custom-link` — burnt-orange, uppercase, underline reveals on hover
---
## Footer
```
background: var(--bg-deep); ← dark roast
border-top: 3px solid var(--gold);
padding: 72px 8vw 40px;
```
- **Brand column** — logo (5-stop gradient text), tagline (grey), `flex: 2`
- **3 link columns** — Product · Company · Legal — each `flex: 1`
- `.footer-col h4` — burnt-orange, 0.65rem, uppercase, tracked
- `.footer-col a` — grey → burnt-orange on hover
- `.footer-bottom` — flex row, grey text, gold rule separator on top
- MotionFlow: `data-mf-stagger-animation="fade-up"` on `.footer-top`
---
## Modal
### Triggers
| Element | ID / Class |
|---|---|
| Nav "Get Started" | `id="open-modal"` |
| Hero "See Plans & Pricing" | `id="open-modal-hero"` |
| All pricing CTAs | `class="open-modal"` |
All triggers call `openModal()`. The JS attaches listeners on `DOMContentLoaded`.
### Structure
```
#modal-overlay fixed, inset 0, backdrop-filter blur(14px), rgba(62,39,35,0.7)
#modal-box max-width 480px, var(--card) bg, burnt-orange top border (3px)
#modal-close × button, top-right
.modal-title Georgia, 5-stop gradient text
.modal-subtitle grey, 0.82rem
#trial-form
.modal-field-group (email)
.field-label burnt-orange, uppercase, 0.62rem
input[type=email] .modal-field
.modal-field-group (location)
.field-label
select.modal-field custom burnt-orange SVG arrow
option: Boston · Manchester · Mumbai · saopaulo · Meppel · Sydney
input[hidden] name="product" value="odoo_19" ← ALWAYS odoo_19, never change
input[hidden] name="utm_source" value="homepage"
input[hidden] name="utm_medium" value="direct"
input[hidden] name="utm_campaign" value="none"
input[hidden] name="utm_term" value=""
input[hidden] name="utm_content" value=""
button.modal-submit "Start Free Trial"
#modal-confirm shown after successful POST
.confirm-title burnt-orange
.confirm-sub silver
button.modal-submit "Close" → closeModal()
```
### Trial Webhook
```
POST https://002-001-5dd6e535-4d1c-46bc-9bd9-42ad4bc5f082.odoo4projects.com/webhook/c25169c6-4234-4b47-8e74-612b9539da0a
Content-Type: multipart/form-data (FormData)
```
The form POSTs via `fetch()`. Both `.then()` and `.catch()` show the confirmation — the webhook may not return CORS headers.
### Modal CSS Rules (summary)
| Rule | Value |
|---|---|
| Overlay bg | `rgba(62,39,35,0.7)` |
| Overlay backdrop | `blur(14px)` |
| Box border-top | `3px solid var(--gold)` |
| Field bg | `rgba(255,243,224,0.6)` |
| Field border | `1px solid rgba(93,64,55,0.25)` |
| Field focus | `border-color: var(--gold)` |
| Submit bg | 5-stop brand gradient |
| Submit text | `var(--card)` (cream) |
### Modal JS Behaviour
- Opens on click of `#open-modal`, `#open-modal-hero`, `.open-modal`
- Closes on: `#modal-close` click · click outside `#modal-box` · `Escape` key
- On close: resets form, re-shows form, hides confirmation, re-enables submit button
- Disables `document.body` scroll while open
---
## MotionFlow Usage Reference
| Feature | Attribute | Where used |
|---|---|---|
| Scroll animation | `data-mf-animation="fade-up"` | Hero elements, section headers |
| Scroll animation | `data-mf-animation="fade-left"` | Section labels |
| Scroll animation | `data-mf-animation="zoom-in"` | Featured pricing card |
| Stagger | `data-mf-stagger-animation="fade-up"` | News grid, custom grid, footer-top |
| Parallax | `data-mf-parallax data-mf-parallax-speed="0.4"` | Hero background image |
| Typing text | `data-mf-text-type="typing"` | Hero tagline |
| Ticker | `data-mf-ticker data-mf-ticker-speed="55"` | Verticals section |
- All scroll animations use `data-mf-animation-once="true"`.
- Parallax disabled on tablet/mobile: `data-mf-parallax-speed-tablet="0" data-mf-parallax-speed-mobile="0"`.
---
## Inline Scripts (end of `<body>`, in order)
1. **MotionFlow**`<script src="...motionflow.min.js">` (last `<script>` before `</body>`)
2. **Sales Agent Chat IIFE** — chat panel open/close logic, message send/receive, exposes `window._mbs`
3. **30s Probe IIFE** — collects browser/device/geo fingerprint, POSTs to chat webhook, shows reply and opens panel
4. **Modal IIFE** — trial form submission to trial webhook, confirmation display
No other external scripts may be added.
---
## Responsive Breakpoints
| Breakpoint | Changes |
|---|---|
| `≤ 768px` | `h1` → 1.9rem · `.nav-center` hidden · `.nav-chat` hidden · mobile Free Trial shown · `#chat-panel` hidden |
| `≤ 480px` | `h1` → 1.5rem · nav/section/footer padding → 5vw · modal padding reduced · `.modal-title` font-size reduced |
---
## Quality Bar
| Concern | Rule |
|---|---|
| Design tokens | NEVER use raw hex values — always CSS custom properties |
| `@keyframes` | NEVER — CSS transitions only (MotionFlow handles scroll animations) |
| External deps | ONLY MotionFlow CDN is allowed — no other external CSS, JS, or fonts |
| Brand gradient | Always 5-stop 135deg pattern using `--gold-lo` / `--gold` / `--gold-hi` |
| Modal product | `name="product" value="odoo_19"` — never change, never show to user |
| Chat webhook | Never change URL without explicit instruction |
| Trial webhook | Never change URL without explicit instruction |
| Section order | hero → verticals → news → pricing → customization → footer |
| Responsive | Every element must work at 375px, 768px, and 1280px+ |
| Hover states | All interactive elements must have visible hover/focus states in burnt-orange/gold |
---
## Git Rules
- ALWAYS work on **`main`** branch.
- Pull before every session: `git pull origin main`
- Commit message patterns:
- `content: <short description>` — copy or section changes
- `fix: <short description>` — bug or visual fixes
- `feat: <short description>` — new functionality
- `style: <short description>` — CSS-only changes
- Push immediately after committing — never leave unpushed commits.
---
## File Safety Rules
- **ONLY** edit `index.html` (and `AGENTS.md` when explicitly told)
- NEVER touch files inside `old/`
- NEVER split CSS into external files
- NEVER split JS into external files
- NEVER add a `<link>` to an external stylesheet
- NEVER add a `<script src="...">` tag except the already-present MotionFlow CDN script
- `style.html` is a designer reference — treat as read-only unless explicitly told otherwise
---
## Execution Workflow
Follow this order for every task:
1. `git pull origin main`
2. Read the relevant section(s) of `index.html` before editing.
3. Apply minimal, targeted edits — do not reformat unrelated code.
4. Validate: sticky nav · chat panel toggles · all sections visible on scroll · modal opens from all three triggers · form submits · MotionFlow animations fire.
5. Commit with a descriptive message following the pattern above.
6. `git push origin main`
---
## Success Criteria
- `index.html` is valid HTML5 with no external dependencies other than MotionFlow CDN.
- All CSS tokens used correctly — no raw hex values anywhere.
- No `@keyframes` present anywhere in `index.html`.
- Modal opens from all three trigger points and POSTs to the correct trial webhook.
- Chat panel opens, sends messages to the correct chat webhook, and exposes `window._mbs`.
- 30s probe fires once and posts fingerprint to the chat webhook.
- Product field is always hidden and always `odoo_19`.
- Page scrolls naturally through all sections with sticky nav intact.
- All commits pushed to `main`.
---
## Failure Conditions
- Adding external CSS, JS, or fonts beyond MotionFlow CDN.
- Introducing `@keyframes` or scroll-hijacking behaviour.
- Changing either webhook URL without explicit instruction.
- Exposing the product field or changing its value from `odoo_19`.
- Using raw hex values instead of CSS custom properties.
- Editing files inside `old/`.
- Editing `style.html` without explicit instruction.
- Leaving unpushed commits.
- Modifying files outside the scope of the task.