Files
my-biz/AGENTS.md
T

18 KiB
Raw Blame History

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 CSShttps://cdn.jsdelivr.net/npm/@slicemypage/motionflow@latest/dist/motionflow.min.css (in <head>)
  • MotionFlow JShttps://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.

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):

-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-rightmargin-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-gridauto-fit minmax(220px,1fr), gap: 24px
  • 4 cards: NGO · Startups · Manufacturing · Restaurants
  • .news-cardborder-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-gridauto-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-gridauto-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

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.