{
  "spec": "quick-html/v0",
  "id": "landing-page",
  "version": "0.1.0",
  "name": "Landing Page",
  "description": "Complete one-page product website: hero with abstract artwork, social-proof strip, feature grid, how-it-works steps, pricing cards with one highlighted plan, FAQ and a closing call to action. Pick it when someone wants a page for their product or service.",
  "useWhen": [
    "landing page",
    "one-page website",
    "make me a page for my product",
    "product page for my SaaS",
    "marketing site with pricing",
    "conversion page",
    "sales page",
    "landingspagina",
    "produktseite",
    "page d'atterrissage",
    "página de producto"
  ],
  "format": "page",
  "theme": "marketing",
  "audience": [
    "marketing-team",
    "small-business",
    "freelance"
  ],
  "tags": [
    "landing",
    "product",
    "saas",
    "conversion",
    "website"
  ],
  "language": "en",
  "modules": [
    "edit-overlay",
    "print-helper"
  ],
  "slots": [
    {
      "name": "doc-title",
      "type": "text",
      "required": true,
      "example": "Kaveo — scheduling software for physiotherapy practices",
      "notes": "Browser tab title; used as the download filename. Product name + what it does."
    },
    {
      "name": "brand-name",
      "type": "text",
      "required": true,
      "example": "Kaveo",
      "notes": "Wordmark in the top bar. One or two words; the mark beside it is decorative."
    },
    {
      "name": "nav-link",
      "type": "text",
      "required": true,
      "example": "Pricing",
      "notes": "Label of the top-bar link; it jumps to the pricing section on the same page. One word."
    },
    {
      "name": "product-kicker",
      "type": "text",
      "required": true,
      "example": "Practice scheduling · Rotterdam",
      "notes": "Category + place or company, separated by '·'. Under 32 characters so it stays on one line above the headline."
    },
    {
      "name": "hero-headline",
      "type": "text",
      "required": true,
      "example": "Fewer no-shows, six hours a week back at the front desk.",
      "notes": "The main promise, benefit-led and concrete. Under 65 characters — it is set very large and wraps over 2–3 lines."
    },
    {
      "name": "hero-subheadline",
      "type": "text",
      "required": true,
      "example": "Kaveo plans your practice week around real availability: online booking, automatic reminders in Dutch, English or French, and a waiting list that quietly fills cancellations while you treat.",
      "notes": "One sentence naming what the product actually does. 120–200 characters."
    },
    {
      "name": "cta-label",
      "type": "text",
      "required": true,
      "example": "Start a 30-day trial",
      "notes": "Primary button. 2–4 words, an action the visitor can take today. The arrow is added by CSS."
    },
    {
      "name": "cta-url",
      "type": "url",
      "required": true,
      "example": "https://kaveo.nl/trial",
      "notes": "href of the primary button. Needs a scheme: https://, mailto: or tel:."
    },
    {
      "name": "secondary-label",
      "type": "text",
      "required": true,
      "example": "Book a 20-minute demo",
      "notes": "Lower-commitment alternative next to the button. Under 30 characters."
    },
    {
      "name": "secondary-url",
      "type": "url",
      "required": true,
      "example": "https://kaveo.nl/demo",
      "notes": "href of the secondary link. Needs a scheme."
    },
    {
      "name": "proof-line",
      "type": "text",
      "required": true,
      "example": "Trusted by 430 physiotherapy and allied-health practices in the Netherlands and Belgium",
      "notes": "One honest, countable claim. Use a real number the user can stand behind; no 'thousands of happy customers'."
    },
    {
      "name": "proof-names",
      "type": "html",
      "required": false,
      "example": "<span>Fysio Maasoever</span><span>Beweegcentrum Zuid</span><span>Praktijk Van Rhijn</span><span>Kine Antwerpen Noord</span>",
      "notes": "4–5 <span> elements, one customer name each, set as muted wordmarks. Text only — never a real company logo, and only names the user is allowed to show."
    },
    {
      "name": "features-heading",
      "type": "text",
      "required": true,
      "example": "Built for the way a practice actually runs",
      "notes": "Section heading. Under 50 characters."
    },
    {
      "name": "features-intro",
      "type": "text",
      "required": false,
      "example": "Everything here runs in the background. Nothing your front desk has to be trained on twice.",
      "notes": "One supporting line under the heading. Under 120 characters."
    },
    {
      "name": "steps-heading",
      "type": "text",
      "required": true,
      "example": "Live in a fortnight, not a quarter",
      "notes": "Heading of the how-it-works section. Under 50 characters."
    },
    {
      "name": "pricing-heading",
      "type": "text",
      "required": true,
      "example": "Simple pricing, per practitioner",
      "notes": "Heading of the pricing section. Name the unit you charge per."
    },
    {
      "name": "pricing-intro",
      "type": "text",
      "required": false,
      "example": "No setup fee, no per-appointment charge. Every plan includes the online booking page and unlimited patient records.",
      "notes": "What every plan includes, or what is never charged. Under 130 characters."
    },
    {
      "name": "pricing-note",
      "type": "text",
      "required": false,
      "example": "All prices exclude 21% VAT. Yearly plans are invoiced once per year; monthly plans can be stopped at the end of any month.",
      "notes": "Fine print under the cards: VAT treatment, billing period, cancellation. Must agree with every plan-note above it."
    },
    {
      "name": "faq-heading",
      "type": "text",
      "required": false,
      "example": "Questions practices ask us first",
      "notes": "Inside the faq optional block."
    },
    {
      "name": "closing-heading",
      "type": "text",
      "required": true,
      "example": "See your own week in Kaveo",
      "notes": "Heading on the accent band. Under 40 characters; it is centred over max 18 characters per line."
    },
    {
      "name": "closing-text",
      "type": "text",
      "required": true,
      "example": "Send us last month's calendar export and we will show you where the gaps were and what the waiting list would have filled. Twenty minutes, no obligation.",
      "notes": "Say what happens after the click and how long it takes. 100–170 characters."
    },
    {
      "name": "closing-cta-label",
      "type": "text",
      "required": true,
      "example": "Start your 30-day trial",
      "notes": "Closing button label; may repeat the hero action in slightly different words."
    },
    {
      "name": "closing-cta-url",
      "type": "url",
      "required": true,
      "example": "https://kaveo.nl/trial",
      "notes": "href of the closing button. Needs a scheme."
    },
    {
      "name": "footer-line",
      "type": "text",
      "required": false,
      "example": "Kaveo B.V. · Scheepmakerspassage 12, 3011 VD Rotterdam · kaveo.nl",
      "notes": "Legal entity, address and domain, separated by '·'. The right-hand credit is fixed."
    }
  ],
  "repeats": [
    {
      "name": "feature",
      "description": "One card in the feature grid (3-up on desktop, 1-up on mobile). Three cards fill the row exactly. The glyph inside the card is decorative and repeats across duplicated cards; that is intended.",
      "min": 3,
      "max": 6,
      "slots": [
        {
          "name": "feature-title",
          "type": "text",
          "required": true,
          "example": "A self-filling waiting list",
          "notes": "Benefit, not mechanism. Under 32 characters; the row of titles is reserved two lines high, so keep all of them a similar length."
        },
        {
          "name": "feature-text",
          "type": "text",
          "required": true,
          "example": "When a patient cancels, Kaveo offers the slot to the next three people on the list by SMS. Most gaps close inside 20 minutes.",
          "notes": "One or two sentences with a concrete number. 90–150 characters — longer text makes the cards different heights."
        }
      ]
    },
    {
      "name": "step",
      "description": "One step in the how-it-works row: numbered, side by side on desktop, stacked on mobile.",
      "min": 3,
      "max": 4,
      "slots": [
        {
          "name": "step-number",
          "type": "text",
          "required": true,
          "example": "STEP 01",
          "notes": "Number the steps yourself, in order: 'STEP 01', 'STEP 02', … Keep the same wording in every step."
        },
        {
          "name": "step-title",
          "type": "text",
          "required": true,
          "example": "We import your agenda",
          "notes": "Who does what, in 2–5 words."
        },
        {
          "name": "step-text",
          "type": "text",
          "required": true,
          "example": "Send us a CSV, Excel or iCal export and we rebuild next month's schedule inside Kaveo. About two hours of our work, none of yours.",
          "notes": "What happens and how long it takes. 90–150 characters."
        }
      ]
    },
    {
      "name": "plan",
      "description": "One pricing card. Cards sit side by side on desktop and stack on mobile; exactly one card is highlighted via plan-card-class.",
      "min": 2,
      "max": 3,
      "slots": [
        {
          "name": "plan-card-class",
          "type": "text",
          "required": true,
          "example": "plan plan-featured",
          "notes": "The card's class attribute. Exactly two allowed values: 'plan' for a normal card and 'plan plan-featured' for the highlighted one. Use the featured value on exactly one plan."
        },
        {
          "name": "plan-badge",
          "type": "text",
          "required": false,
          "example": "Most chosen",
          "notes": "Only visible on the featured card, so the same text can stay in every card. 1–2 words."
        },
        {
          "name": "plan-name",
          "type": "text",
          "required": true,
          "example": "Practice",
          "notes": "One word if possible."
        },
        {
          "name": "plan-price",
          "type": "text",
          "required": true,
          "example": "€ 24",
          "notes": "Amount with currency symbol, no period text. Same format in every plan; use 'On request' if a plan has no list price."
        },
        {
          "name": "plan-period",
          "type": "text",
          "required": true,
          "example": "per practitioner / month",
          "notes": "The unit and the interval, always stated. Identical wording across plans so prices are comparable."
        },
        {
          "name": "plan-note",
          "type": "text",
          "required": true,
          "example": "Billed yearly — € 288 per practitioner. For 3 to 15 practitioners.",
          "notes": "Billing period and who the plan is for. Under 80 characters; check the yearly total against the monthly price."
        },
        {
          "name": "plan-features",
          "type": "html",
          "required": true,
          "example": "<ul><li>Everything in Solo</li><li>Self-filling waiting list</li><li>Insurer-ready monthly export</li><li>Support by phone until 18:00</li></ul>",
          "notes": "One <ul> with 4–5 short <li> items; ticks are added by CSS. Build up the plans ('Everything in X') instead of repeating items."
        },
        {
          "name": "plan-cta-label",
          "type": "text",
          "required": true,
          "example": "Start a 30-day trial",
          "notes": "Under 30 characters; a paid or enterprise plan may say 'Talk to us' instead."
        },
        {
          "name": "plan-cta-url",
          "type": "url",
          "required": true,
          "example": "https://kaveo.nl/trial?plan=practice",
          "notes": "href of this plan's button. Needs a scheme."
        }
      ]
    },
    {
      "name": "faq-item",
      "description": "One question and answer in the FAQ band, inside the faq optional. The <details>/<summary> disclosure is part of the template and needs no script; the first entry ships open.",
      "min": 2,
      "max": 8,
      "slots": [
        {
          "name": "faq-question",
          "type": "text",
          "required": true,
          "example": "What happens to the appointments already in our calendar?",
          "notes": "The question as a customer would ask it. Under 70 characters so the summary stays on one or two lines."
        },
        {
          "name": "faq-answer",
          "type": "html",
          "required": true,
          "example": "<p>We import them during onboarding and show you the mapping side by side. Nothing is moved or cancelled until your practice manager approves it.</p>",
          "notes": "One or two <p> paragraphs, 100–220 characters in total. Answer the real objection plainly; no sales pitch."
        }
      ]
    }
  ],
  "optionals": [
    {
      "name": "faq",
      "description": "FAQ band holding the faq-item repeat. Drop the whole band when there are no real questions to answer."
    }
  ],
  "changelog": [
    {
      "version": "0.1.0",
      "date": "2026-08-19",
      "notes": "Initial release: one-page product site with hero artwork, proof strip, feature/step/plan repeats, FAQ and closing CTA band."
    }
  ],
  "agentInstructions": "Write benefit-led copy with concrete numbers ('six hours a week', 'no-shows down a third'); no superlative soup ('revolutionary', 'best-in-class'). Respect every placeholder's length — the page is dense and overflow ruins its rhythm: hero-headline under 65 chars, subheadline under 200, feature-text and step-text 90–150, plan-note under 80. Emit one block per item for feature (3–6), step (3–4), plan (2–3) and faq-item (2–8), and delete the data-example blocks — preview filler only. plan-card-class has exactly two allowed values, 'plan' and 'plan plan-featured' — the featured one on exactly one plan, 'plan' on the rest. faq-answer takes <p> paragraphs only; the open attribute on the first entry is a design choice you can leave alone. Keep pricing consistent: state monthly or yearly in plan-period and plan-note, one money format ('€ 24'), and check yearly totals against the monthly price (€ 24 × 12 = € 288). Every CTA URL needs a scheme: https://, mailto: or tel:. Drop the faq optional when there is nothing real to answer. Never invent customer logos or testimonials attributed to real companies; proof-names may only hold names the user may show. If prices or URLs are unknown, leave markers like [YOUR PRICING URL] and tell the user to fill them via the built-in Edit button.",
  "license": "MIT",
  "authors": [
    {
      "github": "bvrln"
    }
  ]
}
