// onboarding.jsx — first-run flow

// Curated species libraries (the search filters these; custom adds an "Other" entry)
const PET_LIBRARY = [
  { em: '🐱', lbl: 'Cat',         tint: 'sand',   aliases: 'kitten feline kitty' },
  { em: '🐕', lbl: 'Dog',         tint: 'honey',  aliases: 'puppy canine pup' },
  { em: '🐹', lbl: 'Guinea pig',  tint: 'terra',  aliases: 'cavy piggy' },
  { em: '🐰', lbl: 'Rabbit',      tint: 'sand',   aliases: 'bunny hare' },
  { em: '🐭', lbl: 'Hamster',     tint: 'honey',  aliases: 'syrian dwarf' },
  { em: '🐀', lbl: 'Rat',         tint: 'sand',   aliases: 'fancy dumbo' },
  { em: '🐿️', lbl: 'Chinchilla',  tint: 'sand',   aliases: 'chin' },
  { em: '🦔', lbl: 'Hedgehog',    tint: 'honey',  aliases: 'african pygmy' },
  { em: '🐦', lbl: 'Bird',        tint: 'pond',   aliases: 'budgie parakeet canary cockatiel' },
  { em: '🦜', lbl: 'Parrot',      tint: 'forest', aliases: 'macaw cockatoo amazon' },
  { em: '🐟', lbl: 'Fish',        tint: 'pond',   aliases: 'betta goldfish guppy tetra' },
  { em: '🐢', lbl: 'Turtle',      tint: 'forest', aliases: 'tortoise terrapin' },
  { em: '🦎', lbl: 'Lizard',      tint: 'sage',   aliases: 'gecko bearded dragon iguana' },
  { em: '🐍', lbl: 'Snake',       tint: 'forest', aliases: 'python ball corn' },
  { em: '🐸', lbl: 'Frog',        tint: 'sage',   aliases: 'toad tree' },
  { em: '🦋', lbl: 'Invertebrate',tint: 'terra',  aliases: 'tarantula stick crab snail axolotl' },
];

const PLANT_LIBRARY = [
  { em: '🌱', lbl: 'Monstera',    tint: 'forest', aliases: 'deliciosa swiss cheese adansonii' },
  { em: '🌿', lbl: 'Fern',        tint: 'sage',   aliases: 'maidenhair boston bird nest' },
  { em: '🪴', lbl: 'Snake plant', tint: 'olive',  aliases: 'sansevieria mother in law' },
  { em: '🍃', lbl: 'Pothos',      tint: 'sage',   aliases: 'devils ivy golden marble queen' },
  { em: '🌵', lbl: 'Cactus',      tint: 'desert', aliases: 'barrel pincushion saguaro' },
  { em: '🌴', lbl: 'Palm',        tint: 'sage',   aliases: 'parlor areca majesty' },
  { em: '🌳', lbl: 'Fiddle leaf', tint: 'forest', aliases: 'fig ficus lyrata' },
  { em: '🪷', lbl: 'Peace lily',  tint: 'forest', aliases: 'spathiphyllum' },
  { em: '🌼', lbl: 'Orchid',      tint: 'terra',  aliases: 'phalaenopsis moth' },
  { em: '🌸', lbl: 'Flower',      tint: 'terra',  aliases: 'rose tulip violet primrose geranium' },
  { em: '🍅', lbl: 'Vegetable',   tint: 'terra',  aliases: 'tomato pepper lettuce kale' },
  { em: '🌾', lbl: 'Herb',        tint: 'sage',   aliases: 'basil mint rosemary thyme oregano' },
  { em: '🌴', lbl: 'Ponytail palm', tint: 'olive', aliases: 'beaucarnea recurvata palm' },
  { em: '🌺', lbl: 'Hibiscus',    tint: 'terra',  aliases: '' },
  { em: '🥑', lbl: 'Avocado',     tint: 'sage',   aliases: 'pit stone' },
  { em: '🍀', lbl: 'Other',       tint: 'forest', aliases: 'succulent jade aloe spider zz' },
];

const PICKER_PAGE_SIZE = 12;
const FULL_PET_LIBRARY_DATA = `
dog|Dog
puppy|Puppy
cat|Cat
rabbit|Rabbit
guinea pig|Guinea Pig
syrian hamster|Syrian Hamster
dwarf hamster|Dwarf Hamster
rat|Rat
mouse|Mouse
ferret|Ferret
gerbil|Mongolian Gerbil
budgerigar|Budgerigar
cockatiel|Cockatiel
canary|Canary
bearded dragon|Bearded Dragon
leopard gecko|Leopard Gecko
crested gecko|Crested Gecko
corn snake|Corn Snake
ball python|Ball Python
red-eared slider|Red-Eared Slider
axolotl|Axolotl
african dwarf frog|African Dwarf Frog
betta|Siamese Fighting Fish
fancy goldfish|Fancy Goldfish
neon tetra|Neon Tetra
guppy|Guppy
corydoras|Corydoras Catfish
cherry shrimp|Red Cherry Shrimp
mystery snail|Mystery Snail
chicken|Chicken
molly|Molly
platy|Platy
zebra danio|Zebra Danio
otocinclus|Otocinclus
angelfish|Freshwater Angelfish
bristlenose pleco|Bristlenose Pleco
kuhli loach|Kuhli Loach
chinchilla|Chinchilla
lovebird|Lovebird
russian tortoise|Russian Tortoise
green-cheeked conure|Green-cheeked Conure
hedgehog|African Pygmy Hedgehog
sulcata tortoise|Sulcata Tortoise
sugar glider|Sugar Glider
coturnix quail|Coturnix Quail
hermit crab|Land Hermit Crab
chilean rose tarantula|Chilean Rose Tarantula
german blue ram|German Blue Ram
labrador retriever|Labrador Retriever
golden retriever|Golden Retriever
french bulldog|French Bulldog
german shepherd|German Shepherd
poodle|Poodle
dachshund|Dachshund
beagle|Beagle
chihuahua|Chihuahua
border collie|Border Collie
cocker spaniel|Cocker Spaniel
jack russell terrier|Jack Russell Terrier
shih tzu|Shih Tzu
yorkshire terrier|Yorkshire Terrier
domestic shorthair cat|Domestic Shorthair
domestic longhair cat|Domestic Longhair
maine coon|Maine Coon
ragdoll|Ragdoll
siamese|Siamese
persian|Persian
british shorthair|British Shorthair
bengal cat|Bengal
sphynx cat|Sphynx
norwegian forest cat|Norwegian Forest Cat
degu|Degu
miniature pig|Miniature Pig
horse|Horse
pony|Pony
donkey|Donkey
goat|Goat
sheep|Sheep
duck|Domestic duck
goose|Domestic goose
zebra finch|Zebra finch
society finch|Society finch
parrotlet|Pacific parrotlet
african grey parrot|African grey parrot
amazon parrot|Amazon parrot
dove|Ringneck dove
pigeon|Domestic pigeon
cardinal tetra|Cardinal Tetra
swordtail|Swordtail
cherry barb|Cherry Barb
dwarf gourami|Dwarf Gourami
discus|Discus
clownfish|Clownfish
koi|Koi
nerite snail|Nerite Snail
gargoyle gecko|Gargoyle Gecko
blue-tongued skink|Blue-Tongued Skink
green anole|Green Anole
panther chameleon|Panther Chameleon
king snake|Kingsnake
milk snake|Milk Snake
garter snake|Common Garter Snake
boa constrictor|Boa Constrictor
musk turtle|Common Musk Turtle
greek tortoise|Greek Tortoise
white's tree frog|White's Tree Frog
pacman frog|Pacman Frog
jumping spider|Regal Jumping Spider
`;
const FULL_PLANT_LIBRARY_DATA = `
pothos|Golden Pothos
monstera|Monstera
snake plant|Snake Plant
peace lily|Peace Lily
zz plant|ZZ Plant
heartleaf philodendron|Heartleaf Philodendron
spider plant|Spider Plant
rubber plant|Rubber Plant
fiddle leaf fig|Fiddle Leaf Fig
corn plant|Corn Plant
lily|Lily
sago palm|Sago Palm
dieffenbachia|Dieffenbachia
oleander|Oleander
azalea|Azalea
basil|Basil
mint|Mint
rosemary|Rosemary
thyme|Thyme
parsley|Parsley
tomato|Tomato
lettuce|Lettuce
bell pepper|Bell Pepper
jade plant|Jade Plant
aloe vera|Aloe Vera
echeveria|Echeveria
christmas cactus|Christmas Cactus
lavender|Lavender
rose|Rose
geranium|Geranium (Zonal)
calathea|Calathea
pilea peperomioides|Chinese Money Plant
hoya|Wax Plant
syngonium|Arrowhead Vine
alocasia|Alocasia 'Polly'
peperomia|Peperomia
boston fern|Boston Fern
anthurium|Anthurium
schefflera|Dwarf Umbrella Tree
orchid|Moth Orchid
oregano|Oregano
strawberry|Strawberry
daffodil|Daffodil
tulip|Tulip
hyacinth|Hyacinth
croton|Croton
bird of paradise|Bird of Paradise
weeping fig|Weeping Fig
string of pearls|String of Pearls
hydrangea|Hydrangea
chives|Chives
prayer plant|Prayer Plant
marble queen pothos|Marble Queen Pothos
monstera adansonii|Monstera Adansonii
philodendron brasil|Philodendron Brasil
philodendron birkin|Philodendron Birkin
philodendron xanadu|Philodendron Xanadu
string of hearts|String of Hearts
hoya kerrii|Sweetheart Hoya
african violet|African Violet
rex begonia|Rex Begonia
nerve plant|Nerve Plant
polka dot plant|Polka Dot Plant
chinese evergreen|Chinese Evergreen
dracaena marginata|Dragon Tree
yucca cane|Yucca Cane
parlor palm|Parlor Palm
areca palm|Areca Palm
kentia palm|Kentia Palm
maidenhair fern|Maidenhair fern
staghorn fern|Staghorn fern
asparagus fern|Asparagus fern
air plant|Air plant
easter cactus|Easter cactus
kalanchoe|Kalanchoe
haworthia|Haworthia
burro's tail|Burro's tail
ponytail palm|Ponytail palm
cilantro|Cilantro / Coriander
sage|Sage
crocus|Spring Crocus
dahlia|Dahlia
petunia|Petunia
marigold|Marigold
zinnia|Zinnia
sunflower|Sunflower
coneflower|Purple Coneflower
black-eyed susan|Black-eyed Susan
peony|Peony
iris|Bearded Iris
chrysanthemum|Chrysanthemum
pansy|Pansy
impatiens|Impatiens
fuchsia|Fuchsia
bougainvillea|Bougainvillea
clematis|Clematis
wisteria|Wisteria
jasmine|Jasmine
gardenia|Gardenia
hibiscus|Tropical hibiscus
rhododendron|Rhododendron
camellia|Camellia
boxwood|Boxwood
hosta|Hosta
coleus|Coleus
heuchera|Heuchera
fountain grass|Fountain Grass (verify exact species)
bamboo|Bamboo (verify exact species)
`;

function iconKeyForPickerKey(key) {
  return String(key || '')
    .toLowerCase()
    .replace(/['’]/g, '')
    .replace(/[^a-z0-9]+/g, '_')
    .replace(/^_+|_+$/g, '');
}

function parseFullLibrary(data, kind) {
  const tints = kind === 'pet'
    ? ['sand', 'honey', 'terra', 'pond', 'forest', 'sage']
    : ['forest', 'sage', 'olive', 'terra', 'desert'];
  return data.trim().split('\n').map((line, index) => {
    const [key, lbl] = line.split('|');
    return {
      key,
      lbl,
      iconKey: iconKeyForPickerKey(key),
      em: kind === 'pet' ? '🐾' : '🌿',
      tint: tints[index % tints.length],
      aliases: key,
    };
  });
}

function mergeLibraries(common, full) {
  const seen = new Set(common.map((s) => String(s.lbl || '').toLowerCase()));
  return [
    ...common.map((s) => ({ ...s, key: s.key || String(s.lbl || '').toLowerCase() })),
    ...full.filter((s) => {
      const label = String(s.lbl || '').toLowerCase();
      if (seen.has(label)) return false;
      seen.add(label);
      return true;
    }),
  ];
}

const FULL_PET_LIBRARY = mergeLibraries(PET_LIBRARY, parseFullLibrary(FULL_PET_LIBRARY_DATA, 'pet'));
const FULL_PLANT_LIBRARY = mergeLibraries(PLANT_LIBRARY, parseFullLibrary(FULL_PLANT_LIBRARY_DATA, 'plant'));

function libraryFor(kind) { return kind === 'pet' ? FULL_PET_LIBRARY : FULL_PLANT_LIBRARY; }

// ─── Step 0: welcome ─────────────────────────────────────────────────────
function OnbWelcome({ onNext, onDemo }) {
  return (
    <div className="onb-screen onb-welcome fade-in">
      <div className="onb-hero">
        <div className="onb-mark">
          <div className="onb-glyph">
            <window.I.leaf size={56} sw={1.7} />
          </div>
          <h1>Welcome to Tendlet</h1>
          <div className="onb-tag">
            A warm place for everything that<br />
            breathes or grows under your roof.
          </div>
        </div>
      </div>
      <div className="onb-foot">
        <button className="cta" onClick={onNext}>Begin →</button>
        {onDemo && (
          <button className="onb-demo" type="button" onClick={onDemo}>
            Explore with demo household
          </button>
        )}
        <div className="onb-skip" style={{ opacity: 0.6 }}>Takes about a minute.</div>
      </div>
    </div>
  );
}

// ─── Step 1: name ────────────────────────────────────────────────────────
function OnbName({ name, setName, onNext, onBack, step, total }) {
  return (
    <div className="onb-screen fade-in">
      <OnbHeader step={step} total={total} onBack={onBack} />
      <div className="onb-body">
        <h2 className="onb-h2">First — what should we call <i>you</i>?</h2>
        <div className="onb-lead">A small thing, but Tendlet feels warmer with a name.</div>
        <div className="field" style={{ marginTop: 22 }}>
          <label>Your name</label>
          <input autoFocus value={name} onChange={(e) => setName(e.target.value)}
                 placeholder="Maya, Sam, Alex…" />
        </div>
      </div>
      <div className="onb-foot">
        <button className="cta" disabled={!name.trim()} onClick={onNext}
                style={{ opacity: name.trim() ? 1 : 0.4 }}>
          Continue →
        </button>
      </div>
    </div>
  );
}

// ─── Step 2: add multiple folk ───────────────────────────────────────────
function OnbAddFolk({ folks, setFolks, onNext, onBack, step, total }) {
  const [mode, setMode] = React.useState('list'); // list | picker | naming
  const [draft, setDraft] = React.useState(null); // { kind, species, em, tint, name }
  const [kindFilter, setKindFilter] = React.useState('pet');
  const [query, setQuery] = React.useState('');
  const [page, setPage] = React.useState(0);

  const lib = libraryFor(kindFilter);
  const q = query.trim().toLowerCase();
  const filtered = q
    ? lib.filter((s) => s.lbl.toLowerCase().includes(q) || (s.aliases || '').toLowerCase().includes(q))
    : lib;
  const noMatch = q && filtered.length === 0;
  const pageCount = Math.max(1, Math.ceil(filtered.length / PICKER_PAGE_SIZE));
  const safePage = Math.min(page, pageCount - 1);
  const pageStart = safePage * PICKER_PAGE_SIZE;
  const pageItems = filtered.slice(pageStart, pageStart + PICKER_PAGE_SIZE);

  React.useEffect(() => {
    setPage(0);
  }, [kindFilter, query]);

  const pickSpecies = (s) => {
    setDraft({ kind: kindFilter, species: s.lbl, em: s.em, tint: s.tint, iconKey: s.iconKey, careKey: s.key, name: '' });
    setMode('meet');
  };
  const pickCustom = () => {
    const labeled = query.trim().replace(/\b\w/g, (c) => c.toUpperCase());
    setDraft({ kind: kindFilter, species: labeled || 'Custom', em: '•', tint: kindFilter === 'pet' ? 'sand' : 'sage', name: '', custom: true });
    setMode('meet');
  };
  const saveDraft = () => {
    setFolks((arr) => [...arr, { ...draft, id: `o-${Date.now()}` }]);
    setDraft(null);
    setQuery('');
    setMode('list');
  };
  const removeFolk = (id) => setFolks((arr) => arr.filter((f) => f.id !== id));

  // ── List view (start screen — what they've added) ──
  if (mode === 'list') {
    const empty = folks.length === 0;
    return (
      <div className="onb-screen fade-in">
        <OnbHeader step={step} total={total} onBack={onBack} />
        <div className="onb-body">
          <h2 className="onb-h2">Now, your <i>folk</i>.</h2>
          <div className="onb-lead">
            Add as many as you like — pets and plants both live here together.
            You can edit details later.
          </div>

          {empty ? (
            <button className="onb-big-add" onClick={() => setMode('picker')}>
              <div className="ic"><window.I.plus size={28} sw={1.8} /></div>
              <div className="t">
                <b>Add your first</b>
                <span>One creature, one plant, or twelve</span>
              </div>
            </button>
          ) : (
            <>
              <div className="h-mono onb-sect">Added so far · {folks.length}</div>
              <div className="onb-folk-stack">
                {folks.map((f) => (
	                  <div key={f.id} className="onb-folk-row">
	                    <div className="avatar" data-tint={f.tint}>
	                      <window.SpeciesIcon folk={f} fallback={f.em} />
	                    </div>
                    <div className="onb-folk-info">
                      <div className="name h-serif">{f.name || <span className="italic muted">unnamed</span>}</div>
                      <div className="meta">{f.species} · {f.kind === 'pet' ? 'animal' : 'plant'}</div>
                    </div>
                    <button className="onb-x" onClick={() => removeFolk(f.id)} aria-label="Remove">
                      <window.I.plus size={16} sw={1.8} style={{ transform: 'rotate(45deg)' }} />
                    </button>
                  </div>
                ))}
              </div>
              <button className="onb-add-more" onClick={() => setMode('picker')}>
                <window.I.plus size={16} sw={1.8} /> Add another
              </button>
            </>
          )}
        </div>
        <div className="onb-foot">
          <button className="cta" disabled={empty} onClick={onNext}
                  style={{ opacity: empty ? 0.4 : 1 }}>
            {empty ? 'Add at least one to continue' : `I'm ready — ${folks.length} added`}
          </button>
        </div>
      </div>
    );
  }

  // ── Picker (species + search) ──
  if (mode === 'picker') {
    return (
      <div className="onb-screen fade-in">
        <OnbHeader step={step} total={total} onBack={() => setMode('list')} />
        <div className="onb-body">
          <h2 className="onb-h2" style={{ fontSize: 28 }}>What did you <i>bring home</i>?</h2>

          <div className="kind-pills">
            <button data-on={kindFilter === 'pet' ? '1' : '0'} onClick={() => setKindFilter('pet')}>
              <window.I.paw size={14} sw={1.7} /> Animal
            </button>
            <button data-on={kindFilter === 'plant' ? '1' : '0'} onClick={() => setKindFilter('plant')}>
              <window.I.leaf size={14} sw={1.7} /> Plant
            </button>
          </div>

          <div className="onb-search">
            <window.I.cal size={16} sw={1.6} style={{ display: 'none' }} />
            <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor"
                 strokeWidth="1.8" strokeLinecap="round" style={{ color: 'var(--ink-3)', flexShrink: 0 }}>
              <circle cx="10.5" cy="10.5" r="6.5" /><path d="M20 20l-4.5-4.5" />
            </svg>
            <input value={query} onChange={(e) => setQuery(e.target.value)}
                   placeholder={kindFilter === 'pet' ? 'Search: betta, axolotl, ferret…' : 'Search: pothos, basil, succulent…'} />
            {query && (
              <button className="onb-clear" onClick={() => setQuery('')} aria-label="Clear">
                <window.I.plus size={14} sw={1.8} style={{ transform: 'rotate(45deg)' }} />
              </button>
            )}
          </div>

          <div className="species-grid" style={{ marginTop: 14 }}>
            {pageItems.map((s) => (
              <button key={s.lbl} onClick={() => pickSpecies(s)}>
                <window.SpeciesIcon folk={s} kind={kindFilter} className="species-grid-icon" fallbackClassName="em" fallback={s.em} />
                <span>{s.lbl}</span>
              </button>
            ))}
          </div>

          {filtered.length > PICKER_PAGE_SIZE && (
            <div className="species-pager">
              <button type="button" disabled={safePage === 0} onClick={() => setPage((p) => Math.max(0, p - 1))}>Prev</button>
              <span>{pageStart + 1}-{Math.min(pageStart + PICKER_PAGE_SIZE, filtered.length)} of {filtered.length}</span>
              <button type="button" disabled={safePage >= pageCount - 1} onClick={() => setPage((p) => Math.min(pageCount - 1, p + 1))}>Next</button>
            </div>
          )}

          {noMatch && (
            <button className="onb-custom" onClick={pickCustom}>
              <div className="onb-custom-ic">+</div>
              <div>
                <b>Add "{query}" as a custom kind</b>
                <span>We'll help you build a care routine</span>
              </div>
            </button>
          )}

          {!noMatch && (
            <div className="onb-hint">
              Don't see it? <a onClick={() => setQuery(query || 'custom')}>Try searching</a> — or type any species name and we'll add it as custom.
            </div>
          )}
        </div>
      </div>
    );
  }

  // ── Meet (between species pick + naming) ──
  if (mode === 'meet') {
    return (
      <div className="onb-screen fade-in">
        <OnbHeader step={step} total={total} onBack={() => setMode('picker')} />
        <div className="onb-body" style={{ paddingTop: 8 }}>
          <window.MeetCard
            kind={draft.kind}
            species={draft.species}
            iconKey={draft.iconKey}
            em={draft.em}
            tint={draft.tint}
            custom={draft.custom}
            embedded
          />
        </div>
        <div className="onb-foot">
          <button className="cta" onClick={() => setMode('naming')}>Continue → give them a name</button>
          <button className="onb-skip" onClick={() => setMode('naming')}>Skip the briefing</button>
        </div>
      </div>
    );
  }

  // ── Naming (after meet) ──
  if (mode === 'naming') {
    return (
      <div className="onb-screen fade-in">
        <OnbHeader step={step} total={total} onBack={() => setMode('picker')} />
        <div className="onb-body">
	          <div className="onb-naming-hero">
	            <div className="avatar xl" data-tint={draft.tint}>
	              <window.SpeciesIcon species={draft.species} kind={draft.kind} fallback={draft.em} />
	            </div>
            <div className="onb-naming-info">
              <div className="h-mono" style={{ fontSize: 10, letterSpacing: '0.1em', textTransform: 'uppercase', color: 'var(--ink-3)' }}>
                {draft.kind === 'pet' ? 'Animal' : 'Plant'}{draft.custom ? ' · custom' : ''}
              </div>
              <h2 className="onb-h2" style={{ fontSize: 28, margin: '4px 0 0' }}>{draft.species}</h2>
            </div>
          </div>

          <div className="field" style={{ marginTop: 22 }}>
            <label>{draft.kind === 'pet' ? 'Their name' : 'Plant nickname'}</label>
            <input autoFocus value={draft.name}
                   onChange={(e) => setDraft({ ...draft, name: e.target.value })}
                   placeholder={draft.kind === 'pet' ? 'Luna, Mochi, Koda…' : 'Echo, Fern, Sprout…'} />
          </div>

          <div className="photo-slot">
            <div className="ic"><window.I.camera size={20} sw={1.7} /></div>
            <div><b style={{ color: 'var(--ink)' }}>Add a photo (optional)</b></div>
            <div style={{ fontSize: 11.5 }}>You can do this later from their card.</div>
          </div>
        </div>
        <div className="onb-foot">
          <button className="cta" onClick={saveDraft}>
            {draft.name ? `Welcome ${draft.name} →` : 'Add without a name →'}
          </button>
        </div>
      </div>
    );
  }
}

// ─── Step 3: family ──────────────────────────────────────────────────────
function OnbFamily({ onNext, onBack, step, total }) {
  const [emails, setEmails] = React.useState([]);
  const [draft, setDraft] = React.useState('');
  const add = () => {
    if (draft.trim()) { setEmails([...emails, draft.trim()]); setDraft(''); }
  };
  return (
    <div className="onb-screen fade-in">
      <OnbHeader step={step} total={total} onBack={onBack} />
      <div className="onb-body">
        <h2 className="onb-h2">Tend <i>together</i>?</h2>
        <div className="onb-lead">
          Invite a partner, roommate or family — anyone who helps care for your folk.
          They'll see today's tasks and can check things off too.
        </div>

        <div className="field" style={{ marginTop: 18 }}>
          <label>Their email</label>
          <div style={{ display: 'flex', gap: 8 }}>
            <input value={draft} onChange={(e) => setDraft(e.target.value)}
                   onKeyDown={(e) => e.key === 'Enter' && add()}
                   placeholder="alex@tendlet.app" style={{ flex: 1 }} />
            <button onClick={add} className="onb-mini-cta"
                    style={{ opacity: draft.trim() ? 1 : 0.4 }}>Invite</button>
          </div>
        </div>

        {emails.length > 0 && (
          <div className="onb-folk-stack" style={{ marginTop: 14 }}>
            {emails.map((e, i) => (
              <div key={i} className="onb-folk-row">
                <div className="avatar" style={{ background: 'var(--bisque)', color: 'var(--forest-deep)', display: 'flex', alignItems: 'center', justifyContent: 'center', fontFamily: 'var(--serif)', fontSize: 20 }}>
                  {e[0]?.toUpperCase()}
                </div>
                <div className="onb-folk-info">
                  <div className="name" style={{ fontSize: 14 }}>{e}</div>
                  <div className="meta">Invite pending</div>
                </div>
              </div>
            ))}
          </div>
        )}

        <div className="onb-tip">
          Plants need water whether you're home or not. Shared accounts mean one missed reminder isn't a missed watering.
        </div>
      </div>
      <div className="onb-foot">
        <button className="cta" onClick={onNext}>
          {emails.length
            ? `Send ${emails.length} ${emails.length === 1 ? 'invite' : 'invites'} →`
            : 'Continue — tending solo'}
        </button>
      </div>
    </div>
  );
}

// ─── Step 4: notifications ───────────────────────────────────────────────
function OnbReminders({ onNext, onBack, step, total }) {
  const [picks, setPicks] = React.useState({ morning: true, evening: true, lowSupply: true, photo: false });
  const anyOn = Object.values(picks).some(Boolean);
  const T = ({ id, t, d, time }) => (
    <button className={'onb-toggle-row' + (picks[id] ? ' on' : '')}
            onClick={() => setPicks({ ...picks, [id]: !picks[id] })}>
      <div className="t">
        <b>{t}</b>
        <span>{d}</span>
      </div>
      <div className="time h-mono">{time}</div>
      <div className="onb-switch" data-on={picks[id] ? '1' : '0'}><i /></div>
    </button>
  );
  return (
    <div className="onb-screen fade-in">
      <OnbHeader step={step} total={total} onBack={onBack} />
      <div className="onb-body">
        <h2 className="onb-h2">Gentle <i>reminders</i>.</h2>
        <div className="onb-lead">No buzzes when you're sleeping. No nags when you're at work. You set the rhythm.</div>

        <div className="onb-toggles">
          <T id="morning"   t="Morning brief"      d="A summary of today's care, while coffee" time="7:30" />
          <T id="evening"   t="Evening check-in"   d="What's still undone, and a calm wrap-up"  time="20:00" />
          <T id="lowSupply" t="Supplies running low" d="When hay, kibble or soil is below 7d" time="when needed" />
          <T id="photo"     t="Photo prompts"      d="A nudge to snap a memory on slow Sundays" time="weekly" />
        </div>
      </div>
      <div className="onb-foot">
        <button className="cta" onClick={onNext}>
          {anyOn ? 'Set up reminders →' : 'Continue — no reminders'}
        </button>
      </div>
    </div>
  );
}

// ─── Step 5: done ────────────────────────────────────────────────────────
function OnbDone({ name, folks, onFinish }) {
  return (
    <div className="onb-screen onb-done fade-in">
      <div className="onb-body" style={{ textAlign: 'center' }}>
        <div className="onb-done-mark">
          <svg width="64" height="64" viewBox="0 0 64 64" fill="none">
            <circle cx="32" cy="32" r="30" stroke="var(--forest)" strokeWidth="1.5" />
            <path d="M18 33 l10 10 l18 -22" stroke="var(--forest)" strokeWidth="2.5"
                  strokeLinecap="round" strokeLinejoin="round" fill="none" />
          </svg>
        </div>
        <h2 className="onb-h2" style={{ textAlign: 'center', fontSize: 36 }}>
          Welcome, <i>{name || 'friend'}</i>.
        </h2>
        <div className="onb-lead" style={{ textAlign: 'center', maxWidth: 280, margin: '12px auto 0' }}>
          You're tending <b style={{ color: 'var(--forest)' }}>{folks.length}</b> living {folks.length === 1 ? 'thing' : 'things'}.
          {folks.length > 0 && <> We've drafted a starting routine for {folks.length === 1 ? folks[0].name || 'them' : 'each of them'}.</>}
        </div>

        <div className="onb-folk-cluster">
	          {folks.slice(0, 8).map((f, i) => (
	            <div key={f.id} className="avatar" data-tint={f.tint}
	                 style={{ transform: `rotate(${(i % 2 ? 1 : -1) * (4 + i)}deg)`, marginLeft: i ? -8 : 0, zIndex: 10 - i }}>
	              <window.SpeciesIcon species={f.species} kind={f.kind} fallback={f.em} />
	            </div>
          ))}
        </div>

        <div className="onb-first-task">
          <div className="h-mono" style={{ fontSize: 10, letterSpacing: '0.1em', textTransform: 'uppercase', color: 'var(--ink-3)', marginBottom: 6 }}>
            Your first kindness
          </div>
          <div style={{ fontFamily: 'var(--serif)', fontSize: 20, fontStyle: 'italic', color: 'var(--forest)' }}>
            "Say hello." — Tendlet
          </div>
        </div>
      </div>
      <div className="onb-foot">
        <button className="cta" onClick={onFinish}>Open Tendlet →</button>
      </div>
    </div>
  );
}

// ─── Shared header (progress dots + back) ────────────────────────────────
function OnbHeader({ step, total, onBack }) {
  return (
    <div className="onb-head">
      <button className="onb-back" onClick={onBack} aria-label="Back">
        <window.I.back size={18} sw={1.8} />
      </button>
      <div className="onb-dots">
        {[...Array(total)].map((_, i) => (
          <div key={i} className={'dot' + (i === step ? ' on' : '') + (i < step ? ' done' : '')} />
        ))}
      </div>
      <div style={{ width: 36 }} />
    </div>
  );
}

// ─── Main onboarding orchestrator ────────────────────────────────────────
function OnboardingFlow({ onComplete, onDemo }) {
  const [step, setStep] = React.useState(0);
  const [name, setName] = React.useState('');
  const [folks, setFolks] = React.useState([]);

  const TOTAL = 5; // welcome doesn't count as a dot
  const next = () => setStep((s) => s + 1);
  const back = () => setStep((s) => Math.max(0, s - 1));

  if (step === 0) return <OnbWelcome onNext={next} onDemo={onDemo} />;
  if (step === 1) return <OnbName name={name} setName={setName} onNext={next} onBack={back} step={0} total={TOTAL} />;
  if (step === 2) return <OnbAddFolk folks={folks} setFolks={setFolks} onNext={next} onBack={back} step={1} total={TOTAL} />;
  if (step === 3) return <OnbFamily onNext={next} onBack={back} step={2} total={TOTAL} />;
  if (step === 4) return <OnbReminders onNext={next} onBack={back} step={3} total={TOTAL} />;
  if (step === 5) return <OnbDone name={name} folks={folks} onFinish={() => onComplete({ name, folks })} />;
}

Object.assign(window, { OnboardingFlow, PET_LIBRARY, PLANT_LIBRARY, FULL_PET_LIBRARY, FULL_PLANT_LIBRARY, PICKER_PAGE_SIZE, libraryFor });
