/* ========================================================== YAPPY. — Informational pages ========================================================== */ function HowItWorks() { useReveal(); const steps = [ ['bag', 'Shop', 'Choose BRB., DND. or OFFLINE. and add it to your cart.'], ['lock', 'Check out', 'One simple page: contact, delivery, payment.'], ['doc', 'Upload your prescription', 'Right after ordering, from your order page. PDF, JPG or PNG.'], ['decision', 'We verify it', 'Our team checks the prescription before anything ships.'], ['box', 'Delivered', 'Track your order until it arrives.'], ]; return (
Shop. Upload.
Find your
quiet.}>

A simple order, then your prescription. We ship once it’s verified.

    {steps.map(([ic, h, d], i) => (
  1. {String(i + 1).padStart(2, '0')}
    {h}.

    {d}

  2. ))}

If a prescription can’t be verified, the order is cancelled and refunded in line with our refund policy (terms TBC). Prescription requirements are subject to the final approved product classification.

Ready when you are.

Shop Yappy Read FAQs
); } function Standards() { useReveal(); const rows = [ ['Product information', 'Pack descriptor, net quantity and mandatory declarations as approved on the final label.', 'Label copy pending regulatory sign-off'], ['Ingredient transparency', 'Complete ingredient list and per-gummy composition for each status.', 'To be supplied'], ['Manufacturing', 'Manufacturing site, quality system and any third-party certifications.', 'Certifications to be verified'], ['Testing', 'Batch testing approach and how results are made available.', 'To be supplied — no results shown until verified'], ['Doctors', 'Who conducts free consultations, their qualifications and registration.', 'Doctor details to be confirmed'], ['Privacy', 'What we collect, why, who sees it and how long we keep it.', 'Privacy policy to be finalised'], ]; return (
No noise.
Just clarity.} tone="forest" flow="a">

We only publish what we can verify. Where something is still being confirmed, we say so.

{rows.map(([h, d, f]) => (
{h}

{d}

{f}
))}
What we will never say.

Yappy is about mood and moment — never medicine.

We make no claims about insomnia, anxiety, pain relief, alcohol dependence, treatment, cure, prevention or guaranteed effect, and we never compare the three statuses by strength.

); } const FAQ_GROUPS = [ ['The product', [ ['What is Yappy?', `Yappy is a Greenrise Pharma brand of ${PACK.descriptor.toLowerCase()}, available in three statuses: BRB., DND. and OFFLINE. Each pouch contains ${PACK.count}.`], ['What do 5%, 8.5% and 12.5% mean?', 'They are variant identifiers — part of each product’s name. They do not indicate strength, potency, dosage or effect.'], ['How do I choose between BRB., DND. and OFFLINE.?', 'Choose the status that suits you, in line with your prescription. The percentages are identifiers, not a ranking.'], ['What are the ingredients?', 'A full ingredient list will be published on each product page once confirmed against the final approved formulation.'], ]], ['Prescription & consultation', [ ['Do I need a prescription?', 'Yes. You upload it after checkout, from your order page. We ship once it’s verified.'], ['I don’t have a prescription. What can I do?', 'Book a free consultation with our doctor. If they decide it’s appropriate, they’ll issue a prescription and it’s attached to your order.'], ['Is the doctor consultation really free?', 'Yes — there is no charge for the consultation and no obligation to buy.'], ['Is a prescription guaranteed?', 'No. The doctor decides independently whether prescribing is appropriate.'], ]], ['Orders, privacy & support', [ ['When do I pay?', 'At checkout. Your order is held until your prescription is verified.'], ['What if my prescription isn’t accepted?', 'Your order is cancelled and refunded in line with our refund policy (terms TBC). Support is always available.'], ['How is my information handled?', 'Only what is needed for your consultation and order is collected, and it is shared only with the people involved in your care and fulfilment. Full privacy policy to be finalised.'], ['Where do you deliver?', 'Delivery areas, timeframes and fees are to be confirmed.'], ]], ]; function FAQ() { const [tab, setTab] = React.useState(0); return (
Questions,
answered.} flow="b" />
{FAQ_GROUPS.map(([g], i) => )} Still stuck? Contact us
); } function Learn() { useReveal(); return (
One family.
Three statuses.} flow="a" />
{SKU_ORDER.map((k) => { const p = PRODUCTS[k]; return (
{p.status}

{p.line}

Explore {p.name}.
); })}

What the percentages are.

5%, 8.5% and 12.5% are identifiers. Think of them like a status label — part of the name.

And what they aren’t.

They are not a measure of strength, potency, dosage or effect, and one status is not “more” than another.

Abstract botanical form in low light
Crafted from traditional botanicals

{PACK.descriptor}.

{PACK.basis}. {PACK.count} per {PACK.format.toLowerCase()}. Full composition will be published once confirmed against the final approved formulation and label.

Composition to be supplied
); } function Support() { const [sent, setSent] = React.useState(false); const [busy, setBusy] = React.useState(false); const [topic, setTopic] = React.useState('Consultation'); const [msg, setMsg] = React.useState(''); const [err, setErr] = React.useState(''); const submit = (e) => { e.preventDefault(); if (msg.trim().length < 10) { setErr('Tell us a little more — at least 10 characters.'); return; } setErr(''); setBusy(true); setTimeout(() => { setBusy(false); setSent(true); }, 900); }; return (
Talk to
a human.} flow="c" />
{[['mail', 'Email', 'Address to be confirmed'], ['support', 'Phone', 'Number & hours to be confirmed'], ['doc', 'Grievance officer', 'Details to be confirmed']].map(([ic, h, v]) => (
{h}
{v}
))}
{sent ? (
Message received.

This is a simulated form — nothing was sent. In the live service, a member of the team would reply here.

) : (<>
Send a message
{['Consultation', 'Order', 'Refund', 'Privacy', 'Other'].map((t) => )}