# Versione 1.0.2: Impostazioni ordinate, svuota e sostituisci, lente staccata

Data: 2026-09-28. Chiesto da Paolo il 25-28/09; «vai, parti pure con la 1.0.2».
Le scelte di prodotto non rispose esplicitamente (voci nuove, concept prima o
no): valgono i default qui sotto, da mostrare a Paolo sul simulatore.

## 1. Impostazioni a riquadri (come WhatsApp / Impostazioni di iPhone)

Oggi: pulsanti a pillola per tema e lingua, poi righe di solo testo, tutto di
seguito. Diventa una pagina di **riquadri arrotondati** (`colori.superficie`,
angoli `RAGGIO` delle schede), una voce per riga: **segno a sinistra, testo,
valore attuale tenue a destra se c'è, freccia `›`** (o `↗` per chi apre il
browser). Separatori sottili fra le righe dentro il riquadro, rientrati dopo
il segno. Niente intestazioni di sezione.

```
┌ Esporta ricette            › ┐   foglio attuale (Tutte / una categoria)
│ Importa ricette            › │   scelta del file → Anteprima
└ Svuota il ricettario       › ┘   testo rosso (colori.pericolo o simile), conferma

┌ Tema      Come il telefono › ┐   schermata dedicata
└ Lingua    Italiano         › ┘   schermata dedicata

┌ Assistenza                 ↗ ┐   https://www.duebytes.it/quantobasta/
│ Privacy                    ↗ │   INDIRIZZO_PRIVACY (come oggi)
└ Consiglia a un amico       › ┘   foglio di condivisione di sistema

        Quanto Basta 1.0.2 (5)
```

- **Tema** e **Lingua**: schermata ciascuna (nello stack radice, come
  Anteprima), titolo in Barra con indietro, elenco delle scelte (quelle di
  oggi: Come il telefono / Chiaro / Scuro; Come il telefono / Italiano /
  English) con la spunta sulla scelta attiva. Toccare applica subito e resta
  sulla schermata (come iOS). Il valore nella riga di Impostazioni è il testo
  della scelta attiva.
- **Consiglia a un amico**: `Share.share` di React Native con un testo breve
  e il link dello store della piattaforma: iOS
  `https://apps.apple.com/app/id6812658311`, Android
  `https://play.google.com/store/apps/details?id=it.duebytes.quantobasta`.
  Il link e il testo li decide un modulo puro (niente `Platform.OS ===` nei
  .tsx: si passa `Platform.OS`).
- I **segni** nuovi (esporta, importa, cestino, tema, lingua, assistenza,
  privacy, cuore, freccia, esterno) si disegnano con `scripts/genera-segni.py`,
  stessa griglia di 32 e tratto 2,6 degli altri, e si aggiungono a `SEGNI` in
  `src/ui/segni.ts`.
- Resta dentro `SopraIlMenu` con la ScrollView prima nell'albero e
  `column-reverse` (il menù di vetro si rimpicciolisce solo così).
- Accessibilità: ogni riga `accessibilityRole="button"` (o `link` per ↗), con
  il valore nel label («Tema, Come il telefono»).

## 2. Svuota il ricettario

- Riga «Svuota il ricettario» in rosso. Se il ricettario è già vuoto (0
  ricette vive e 0 categorie vive) la riga è spenta.
- Conferma con `Alert`: titolo «Svuotare il ricettario?», messaggio «Cancelli
  {n} ricette e {m} categorie. Se non ne hai esportato una copia, non potrai
  più recuperarle.» Tasti: «Esporta prima una copia» (apre l'esportazione di
  tutte le ricette, la stessa di Esporta → Tutte), «Svuota» (distruttivo),
  «Annulla».
- Effetto: **tombstone** di tutte le ricette e categorie vive in una sola
  transazione (stessa semantica di `cancellaRicetta`/`cancellaCategoria`:
  `cancellata_il`, `modificata_il`, `foto = NULL`, via il riscalo), poi dopo
  il commit si cancellano i file delle foto. Funzione nuova nel livello dati
  (`svuotaRicettario(db)`), provata con `dbMemoria`.
- Dopo lo svuotamento la pagina Ricette mostra lo stato vuoto di sempre.

## 3. Importa: aggiungi o sostituisci

Nell'Anteprima, **se il ricettario locale ha almeno una ricetta o categoria
viva**, sotto il tasto principale di oggi («Importa N ricette…», che aggiunge
e aggiorna come adesso) compare un secondo tasto, secondario (contorno, non
pieno): **«Sostituisci il ricettario»**. Con ricettario vuoto resta solo il
tasto di oggi.

Inoltre compare solo se **il file porta almeno 2 ricette vive** (le
tombstone non contano): una ricetta sola è quella che manda un amico, e si può
solo aggiungere. Deciso da Paolo il 2026-09-28; la regola sta tutta in
`mostraSostituisci`.

- «Sostituisci» chiede conferma con lo stesso Alert di Svuota ma testo
  «Sostituire il ricettario?» / «Le tue {n} ricette e {m} categorie vengono
  cancellate e al loro posto entra il file. Se non ne hai esportato una copia,
  non potrai più recuperarle.» e tasti «Esporta prima una copia», «Sostituisci»
  (distruttivo), «Annulla».
- Effetto: in **una sola transazione** dentro `importaLetto` (opzione
  `{ sostituisci: true }`): tombstone di tutte le ricette/categorie vive, poi
  l'import di sempre. Il piano già fa vincere il file contro una tombstone
  locale, quindi il risultato è esattamente il contenuto del file. Le foto
  delle ricette tolte si cancellano dopo il commit. Test con `dbMemoria`: dopo
  «sostituisci» le vive sono esattamente quelle del file (anche quando una
  ricetta locale è più recente della versione nel file).
- L'esito mostrato alla fine dice quante ne sono entrate, come oggi.

## 4. Lente di Cerca staccata su iOS 27

react-native-screens (anche 4.28, nightly, 5.0 alpha) costruisce la barra con
`setViewControllers` + `UITabBarSystemItemSearch`: con l'SDK di iOS 27 la lente
non si stacca più. Apple la stacca solo con l'API `UITabBarController.tabs` e
un `UISearchTab`. Upstream: issue #4671, PR #4675 e #4679, non ancora
rilasciate.

- Si applica **una patch** a `react-native-screens` con `patch-package`
  (devDependency + `postinstall`), partendo da quella pubblicata in #4671
  (copiata in `specs/allegati/2026-09-28-patch-uisearchtab-manuhook.md`),
  adattata alla 4.26 che usiamo. Con meno di 6 schede e una scheda `search`,
  su iOS ≥ 27 i figli si installano come `UITab`, la scheda di ricerca come
  `UISearchTab`.
- Collaudo sul simulatore iPhone 18 Pro (iOS 27): lente staccata a destra;
  tocchi su tutte e quattro le sezioni; la ricerca con i Recenti e il fuoco
  sul campo come oggi (tabPress), senza doppio fuoco; aprire una ricetta da
  Cerca e tornare; il menù che si rimpicciolisce scorrendo; i due pannelli
  su iPad/schermo largo non si usano su iPhone ma Android deve restare
  identico (la patch è solo iOS).
- Commento `ponytail:` nel patch/LEGGIMI: da togliere quando esce una versione
  di react-native-screens con #4679.

## 5. Store e versione

- `app.json`: `version` 1.0.2, `android.versionCode` 6, `ios.buildNumber` "5".
- Parole chiave App Store (da mettere nella versione 1.0.2 su App Store
  Connect, 99 caratteri):
  `ricette,dosi,porzioni,ricettario,ingredienti,dolci,torte,cucinare,grammi,proporzioni,impasto,cucina`.
  Niente marchi (regola Apple 2.3.7).
- Testi i18n italiano e inglese per tutto il nuovo.

## Fuori

Niente sync, niente schermata dedicata per l'export (il foglio di oggi resta),
niente «Valuta l'app».
