# Versione 1.0.2 — piano

Spec: `docs/superpowers/specs/2026-09-28-versione-1.0.2-design.md` (è la
fonte dei requisiti e dei testi). Ramo `versione-1.0.2` in
`/Users/paolo/dev/quantobasta`.

## Vincoli globali

- Scrivere in italiano: nomi, commenti, commit, come il resto del codice.
- Ogni decisione di una schermata sta in un modulo puro `src/ui/logica-*.ts`
  (o `src/io`, `src/data`) con test `node --test` che diventano rossi se si
  muta la riga. Niente `Platform.OS === ...` nei `.tsx`: si passa `Platform.OS`
  a una funzione pura. Nessun motore di test per componenti.
- Test: `npm test` (tutti, oggi 466 verdi) e `npx tsc --noEmit`.
- Ogni testo visibile passa da i18n, italiano **e** inglese
  (`src/i18n/it.ts`, `src/i18n/en.ts`; `i18n.test.ts` controlla le chiavi).
- Stile dei `.tsx`: `useColori()`, `SPAZIO`, `RAGGIO`, `TESTO` da `tema.ts`;
  tocchi ≥ 44 pt; `accessibilityRole` su ogni pressabile.
- Commit con le righe finali esatte:
  `Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>` e
  `Claude-Session: https://claude.ai/code/session_01RWR5c8CCX2MqNN8fuq9sYH`.
- Non toccare simulatori/emulatori salvo il task che lo dice: il nostro è
  l'iPhone 18 Pro `48A45E07-8B92-434B-96A1-CE2A0301967E`; mai l'iPhone 17
  `5BE717F2…` né l'iPhone 18 Pro Max `569BB1D0…` né l'iPad Pro 13" (altre
  sessioni).

## Task 1 — Dati: svuota e sostituisci

File: `src/data/ricette.ts` (o un nuovo `src/data/ricettario.ts`),
`src/io/importa.ts`, test relativi con `dbMemoria`.

- `contaVive(db): Promise<{ ricette: number; categorie: number }>` — solo
  righe con `cancellata_il IS NULL`.
- `svuotaRicettario(db): Promise<void>` — in una transazione tombstone di tutte
  le ricette e categorie vive (stessa semantica di `cancellaRicetta` e
  `cancellaCategoria`: `cancellata_il` e `modificata_il` = adesso, `foto =
  NULL`, righe di `riscalo` cancellate); dopo il commit `cancellaFoto` sui
  file delle foto che c'erano.
- `importaLetto(db, letto, opzioni?: { sostituisci?: boolean })` — con
  `sostituisci` la tombstone di tutte le vive avviene **dentro la stessa
  transazione esclusiva** dell'import, prima di applicare il file; foto
  cancellate dopo il commit (solo quelle non più usate da ricette vive).
- Test: svuota → 0 vive, tombstone presenti, riscalo vuoto; sostituisci →
  le vive sono esattamente quelle del file, anche quando una ricetta locale con
  lo stesso id è più recente del file; categorie idem; ricette locali non nel
  file restano tombstone; senza opzione il comportamento di oggi non cambia
  (i test esistenti restano verdi).

## Task 2 — Logica pura e testi

File: `src/ui/logica-impostazioni.ts` (+ test), `src/i18n/it.ts`, `en.ts`.

- `linkStore(os: string): string` e `testoConsiglia(os, lingua)` →
  `{ message, url }` per `Share.share` (iOS: message con link dentro e anche
  `url`; Android: solo message). Link nello spec.
- `INDIRIZZO_ASSISTENZA = 'https://www.duebytes.it/quantobasta/'`.
- `svuotaAttivo(conti)`: false con 0 ricette e 0 categorie vive.
- `mostraSostituisci(conti)`: true se almeno una viva (per l'Anteprima).
- Chiavi i18n per tutte le righe, le due schermate (titoli «Tema», «Lingua»),
  la conferma di Svuota e di Sostituisci (con `{n}` e `{m}`), i tasti
  «Esporta prima una copia», «Svuota», «Sostituisci», «Sostituisci il
  ricettario», «Consiglia a un amico», «Assistenza», testo di condivisione.
  Testi esatti nello spec; inglese naturale.

## Task 3 — Segni nuovi

`scripts/genera-segni.py`: aggiungere `esporta`, `importa`, `cestino`, `tema`,
`lingua`, `assistenza`, `privacy`, `cuore`, `freccia` (›, piccola), `esterno`
(↗) con le regole del set (griglia 32, tratto 2,6, capi tondi, niente
riempimenti, raggio 5). Rigenerare `assets/segni/`, aggiornare `SEGNI` in
`src/ui/segni.ts` e il componente che li mappa (require statici). Il test dei
segni deve restare verde. Guardare le PNG a occhio (Read) prima del commit.

## Task 4 — Pagina Impostazioni a riquadri, schermate Tema e Lingua

File: `src/ui/schermate/Impostazioni.tsx`, nuove `SceltaTema.tsx` e
`SceltaLingua.tsx` (o una sola `Scelta.tsx` parametrica), `navigazione.ts`,
`App.tsx` (stack radice), eventuale componente `componenti/RiquadroImpostazioni.tsx`.

Layout e comportamento nello spec §1 e §2 (Svuota con Alert a tre tasti;
«Esporta prima una copia» avvia l'export di tutte le ricette come Esporta →
Tutte). Mantenere `SopraIlMenu`, ScrollView prima nell'albero,
`column-reverse`, `collapsable={false}` dove c'è oggi. Il foglio Esporta resta.

## Task 5 — Anteprima: Sostituisci

File: `src/ui/schermate/Anteprima.tsx`. Legge `contaVive` insieme alla
fotografia locale; se `mostraSostituisci`, secondo tasto a contorno sotto
quello di oggi. Conferma con Alert (spec §3), poi
`importaLetto(db, letto, { sostituisci: true })` nello stesso `scrittoreUnico`;
esito come oggi.

## Task 6 — Lente di Cerca staccata (iOS 27)

`patch-package` (devDependency, `"postinstall": "patch-package"`), patch in
`patches/react-native-screens+4.26.x.patch` ricavata da
`docs/superpowers/specs/allegati/2026-09-28-patch-uisearchtab-manuhook.md`
adattata alla versione installata. Prebuild, build Release per simulatore
iPhone 18 Pro e collaudo della lista nello spec §4 con screenshot. Android
non si tocca.

## Task 7 — Versione e documenti

`app.json` 1.0.2 / versionCode 6 / buildNumber "5"; `docs/STATO.md` (sezione
1.0.2: cosa c'è e cosa resta da provare), `docs/store/app-store.md` (parole
chiave nuove), `docs/BUILD.md` (patch-package e quando toglierla).

Poi revisione finale dell'intero ramo col modello più capace.
