# MENUS-SPEC — la barra dei menu di SVGEditor (macOS) da replicare su Windows

## Cos'è questo documento

Censimento **completo e verificato** della barra dei menu dell'app macOS `SVGEditorMac`,
prodotto per il porting Win32 (`SVGEditorWin32`). Ogni riga di ogni tabella riporta il
titolo esatto, il selettore/azione, la scorciatoia Mac e la sua traduzione su Windows,
con la **provenienza `file:riga`** indicata in testa a ogni tabella.

**Sorgenti** (repo Mac in sola lettura `/Users/leo/svgeditor`, commit **`a2a033b7`**):

| # | Percorso | Ruolo |
|---|----------|-------|
| 1 | `SVGEditorMac/SVG Editor Mac/Start/SVGEMenuBuilder.swift` (2992 righe) | Costruisce a codice quasi tutti i menu: Object, Font, Type, Filter, View, le palette del menu Window, il sottomenu File ▸ Scripts, il sottomenu Help ▸ Tools, e inietta voci nei menu File/Edit dello storyboard. |
| 2 | `SVGEditorMac/SVG Editor Mac/Base.lproj/Main.storyboard` (715 righe) | Menu standard AppKit: menu applicazione, File, Edit, Format (nascosto), View (rimosso a runtime), Window, Help. |
| 3 | `SVGEditorMac/SVG Editor Mac/Utility/SVGEEnumManager.swift` | `svge_tool.get_mac_tool_list()` :168, `get_tool_name()` :423, `get_tool_shortcut()` :511 — alimentano Help ▸ Tools. |
| 4 | `Reference/gpu-window-keymap.md` | Tasti gestiti dal **canvas** (non dai menu) — sezione finale. |

## Regola di porting — non negoziabile

> **Le voci non ancora cablate su Windows si mostrano DISABILITATE (grigie), mai omesse.**

La barra dei menu è parte dell'identità del prodotto e della sua accessibilità: un utente
che non trova una voce crede che la funzione non esista, mentre una voce grigia comunica
"c'è, non è ancora attiva qui". Questo vale anche per le voci che su macOS sono già stub
permanenti (`action: nil`): su Windows si replicano **grigie allo stesso modo**, così la
parità di struttura è verificabile riga per riga.

Corollario: **l'ordine e i separatori sono parte della specifica**. Nelle tabelle il
separatore è la riga `———`; va riprodotto nella stessa posizione.

## Regola di traduzione delle scorciatoie

| Mac | Windows | Note |
|-----|---------|------|
| ⌘ (Command) | `Ctrl` | traduzione meccanica, sempre |
| ⌥ (Option/Alt) | `Alt` | traduzione meccanica, ma vedi **AMB-2** |
| ⇧ (Shift) | `Shift` | traduzione meccanica, sempre |
| ⌃ (Control **Mac**) | **caso ambiguo** — vedi **AMB-1** | ⌃ diventerebbe `Ctrl`, che è già l'immagine di ⌘ |

### Le classi di ambiguità (riferite per sigla nella colonna Note)

- **AMB-1 — ⌃ Mac collide con ⌘→Ctrl.** In quest'app **ogni** chord che contiene ⌃
  contiene anche ⌘ (verificato: nel builder i piani usati sono ⌃⌘, ⌃⇧⌘ e ⌃⌥⌘; nello
  storyboard gli unici ⌃ erano ⌃⌘S / ⌃⌘F del menu View di serie, che però viene
  **rimosso** a runtime — `SVGEMenuBuilder.swift:880-882`). Tradurre entrambi in `Ctrl`
  produce `Ctrl+Ctrl+X`, che non esiste. **Decisione da prendere per ognuno dei 26 chord
  interessati**: o si lascia cadere il ⌃ (rischio collisione con l'omologo senza ⌃), o si
  riassegna il chord su Windows. Le famiglie coinvolte sono compatte e riassegnabili in
  blocco: Edit ▸ Select (10 voci ⌃⇧⌘), Object ▸ Pathfinder (9 voci ⌃⇧⌘), Type ▸ Change
  Case (3 voci ⌃⌥⌘), più ⌃⌘T, ⌃⌘U, ⌃⌥⌘D e ⌃⇧⌘P.
- **AMB-2 — ⌥⌘ → `Ctrl+Alt` e le tastiere europee.** Su tastiere IT/DE/FR/ES il tasto
  **AltGr genera `Ctrl+Alt`**: qualunque chord `Ctrl+Alt+<lettera>` può essere prodotto
  involontariamente da AltGr, e — peggio — **ruba** le combinazioni AltGr che servono a
  digitare `@ # [ ] { } \ €` ecc. Sono **30** i chord ⌥⌘ (senza ⌃) di quest'app. Da
  verificare uno per uno su layout italiano prima di considerarli cablati.
- **AMB-3 — tasti funzione.** Su Windows **F10 apre/attiva la barra dei menu** e **F1 è
  l'aiuto**; F11 è schermo intero. Quest'app usa **F5, F6, ⇧F6, F7, ⇧F7, F8, ⇧F8**
  (7 chord, tutti palette): F1/F10/F11 non sono toccati, quindi il rischio è basso — ma
  su portatili la fila F è di default multimediale, quindi vanno documentate come
  "richiedono Fn" e affiancate da un chord alternativo.
- **AMB-4 — punteggiatura e layout non-US.** `[ ] ; " + - , ? \` sono in posizioni
  diverse (o dietro AltGr/Shift) sulle tastiere europee. 14 chord dell'app cadono qui.
- **AMB-5 — già preso dal sistema Windows.** `Ctrl+W` (chiudi documento, convenzionale ma
  non universale), `Alt+F4` (chiudi finestra — è la convenzione Windows, non `Ctrl+Q`),
  `Ctrl+Shift+Esc` (Task Manager), `Win+*` (shell), `Ctrl+Alt+Canc`. Nessuna voce dell'app
  chiede `Ctrl+Shift+Esc` o `Alt+F4`; il caso vivo è `Ctrl+W`.
- **AMB-6 — la voce cambia menu su Windows.** Il menu applicazione macOS non esiste su
  Windows. Rilocazioni obbligate:
  - **Preferences… (⌘,)** → **Modifica ▸ Opzioni…** (in coda al menu Modifica, dopo un
    separatore). Nessun chord convenzionale su Windows.
  - **About Vector Designer** → **? (Aiuto) ▸ Informazioni su Vector Designer**.
  - **Quit Vector Designer (⌘Q)** → **File ▸ Esci**, chord `Alt+F4`.
  - **Services ▸ / Hide / Hide Others / Show All** → **non esistono su Windows**: non si
    replicano (unica eccezione alla regola "mai omettere", perché sono servizi di sistema
    macOS, non funzioni dell'app).
  - **Window ▸ Minimize (⌘M)** → non è un comando di menu su Windows (è `Win+↓` /
    pulsante di titolo): la voce si può tenere grigia o togliere col resto del gruppo
    finestra.

---

# 1. Menu applicazione — «Vector Designer»

**Provenienza:** `Base.lproj/Main.storyboard:15-58` (voci) + `Start/SVGEMenuBuilder.swift:473-487`
(la voce Preferences… viene **ricablata**: azione `showAppSettings:`, target `NSApp.delegate`,
chord ⌘, riasserito; se non esistesse verrebbe creata col titolo `Settings…`).

Su Windows **questo menu non esiste**: le sue voci si distribuiscono come da **AMB-6**.

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | About Vector Designer | `orderFrontStandardAboutPanel:` (storyboard :19-24) | — | — | **AMB-6** → `? ▸ Informazioni su Vector Designer` |
| 2 | ——— | | | | storyboard :25 |
| 3 | Preferences… | `showAppSettings:` (builder :476-479; storyboard :26) | ⌘, | — | **AMB-6** → `Modifica ▸ Opzioni…`; **AMB-4** (la virgola). `Ctrl+,` non è convenzionale su Windows |
| 4 | ——— | | | | storyboard :27 |
| 5 | Services ▸ | sottomenu di sistema `systemMenu="services"` (:28-31) | — | — | **AMB-6** — non replicabile |
| 6 | ——— | | | | storyboard :32 |
| 7 | Hide Vector Designer | `hide:` (:33-37) | ⌘H | — | **AMB-6** — non esiste su Windows |
| 8 | Hide Others | `hideOtherApplications:` (:38-43) | ⌥⌘H | — | **AMB-6** |
| 9 | Show All | `unhideAllApplications:` (:44-49) | — | — | **AMB-6** |
| 10 | ——— | | | | storyboard :50 |
| 11 | Quit Vector Designer | `terminate:` (:51-55) | ⌘Q | `Alt+F4` | **AMB-6** → `File ▸ Esci`. **AMB-5**: su Windows la convenzione è `Alt+F4`, non `Ctrl+Q` |

---

# 2. File

**Provenienza:** base `Base.lproj/Main.storyboard:59-120`; voci iniettate da
`Start/SVGEMenuBuilder.swift:655-823` (blocco Import/Place/Export ancorato dopo *Save As…*,
:734-752; Document Setup… + Set Page to Selection :793-804) e `:950-961` (separatore +
sottomenu Scripts). `Print…` è **ricablato** su `x_print` (`rewire_print_item` :1501-1507,
chiamato da :822 e a ogni apertura del menu da `menuNeedsUpdate` :1482). `Revert to Saved`
è **potato** a ogni apertura (`prune_revert_items` :1520-1528).

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | New | `newDocument:` (storyboard :63-67) | ⌘N | `Ctrl+N` | |
| 2 | Open… | `openDocument:` (storyboard :68-72) | ⌘O | `Ctrl+O` | |
| 3 | Open Recent ▸ | sottomenu `systemMenu="recentDocuments"` (storyboard :73-85) | — | — | Popolato dal sistema; su Windows va ricostruito a mano (MRU). L'item viene solo **spostato** (mai ricreato) da builder :710-724 per restare sotto *Open…* |
| 4 | ——— | | | | storyboard :86 |
| 5 | Close | `performClose:` (storyboard :87-91) | ⌘W | `Ctrl+W` | **AMB-5** — `Ctrl+W` su Windows chiude il documento; la finestra si chiude con `Alt+F4` |
| 6 | Save… | `saveDocument:` (storyboard :92-96) | ⌘S | `Ctrl+S` | |
| 7 | Save As… | `saveDocumentAs:` (storyboard :97-101) | ⇧⌘S | `Ctrl+Shift+S` | |
| 8 | ——— | | | | builder :741 (SVGE-1697) |
| 9 | Import PDF… | `x_import_pdf` (builder :656-658, ins. :742) | — | — | |
| 10 | Place Image… | `x_place_image` (builder :667-670, ins. :743) | ⌘K | `Ctrl+K` | |
| 11 | Place Linked Image… | `x_place_linked_image` (builder :671-673, ins. :744) | — | — | |
| 12 | ——— | | | | builder :749 (SVGE-1699) |
| 13 | Export PDF… | `x_export_pdf` (builder :677-679, ins. :750) | — | — | |
| 14 | Export PNG… | `x_export_png` (builder :680-682, ins. :751) | — | — | |
| 15 | Export TIFF… | `x_export_tiff` (builder :683-685, ins. :752) | — | — | |
| 16 | ——— | | | | storyboard :106 (`identifier="file_last_separator"`) |
| 17 | Document Setup… | `x_document_setup` (builder :686-688, ins. :798) | — | — | Contiene anche griglia e snap (SVGE-769/791) |
| 18 | Set Page to Selection | `x_set_page_to_selection` (builder :793-796, ins. :800) | ⌃⇧⌘P | *da riassegnare* | **AMB-1** — ⌃+⌘ insieme. Grigia senza selezione (`validateMenuItem`) |
| 19 | Page Setup… | `runPageLayout:` (storyboard :107-112) | ⇧⌘P | `Ctrl+Shift+P` | |
| 20 | Print… | `x_print` (storyboard :113-117, ricablato builder :1505) | ⌘P | `Ctrl+P` | Il selettore **non** è più `printDocument:` |
| 21 | ——— | | | | builder :951 |
| 22 | Scripts ▸ | — (parent, `action: nil`) | — | — | builder :952 → `create_scripts_menu()` :2109-2172 |

## 2.1 File ▸ Scripts ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2109-2172`.

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | ▸ Scripts Panel… | `x_toggle_scripts_palette` (:2113) | ⌥⌘S | `Ctrl+Alt+S` | **AMB-2** (AltGr). ⌘S/⇧⌘S sono Save/Save As, da qui la variante ⌥. Stesso selettore di `Window ▸ Scripts` |
| 2 | ▸ New Script | `x_new_script_menu` (:2123) | — | — | Crea un `.jsx` vuoto nella libreria utente |
| 3 | ▸ Add Script… | `x_add_script_menu` (:2124) | — | — | Importa `.jsx` esistenti |
| 4 | ▸ ——— | | | | :2125 |
| 5.. | ▸ *(un item per ogni `.jsx` demo del bundle)* | `x_run_script_menu(_:)`, path in `representedObject` (:2129-2151) | — | — | **Lista dinamica**: `drawmac/jsadd/illustrator/demo`, ordinata, titolo ripulito da prefissi numerici/underscore |
| n | ▸ ——— | | | | :2163, solo se esistono script utente |
| n+1 | ▸ User Scripts | — (intestazione, `isEnabled = false`) | — | — | :2164-2166 — voce **volutamente disabilitata**, è un'etichetta |
| n+2.. | ▸ *(un item per ogni `.jsx` utente)* | `x_run_script_menu(_:)` (:2167) | — | — | **Lista dinamica**: `Application Support/SVGEditor/Scripts` |

---

# 3. Edit (Modifica)

**Provenienza:** base `Base.lproj/Main.storyboard:121-336`; blocco iniettato subito dopo
*Paste* da `Start/SVGEMenuBuilder.swift:496-653` (indice di inserimento calcolato a :538-544).
La voce storyboard *Delete* viene rimossa, **rititolata `Clear`** e reinserita (:549-553); la
voce storyboard *Select All* viene rimossa, **smascherata** e ricablata su `x_select_all`
(:557-565).

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | Undo | `undo:` (storyboard :125-129) | ⌘Z | `Ctrl+Z` | Titolo dinamico ("Undo Move"…) |
| 2 | Redo | `redo:` (storyboard :130-134) | ⇧⌘Z | `Ctrl+Y` **o** `Ctrl+Shift+Z` | Su Windows la convenzione storica è `Ctrl+Y`; consigliato accettarli entrambi |
| 3 | ——— | | | | storyboard :135 |
| 4 | Cut | `cut:` (storyboard :136-140) | ⌘X | `Ctrl+X` | |
| 5 | Copy | `copy:` (storyboard :141-145) | ⌘C | `Ctrl+C` | |
| 6 | Paste | `paste:` (storyboard :146-150) | ⌘V | `Ctrl+V` | |
| 7 | Paste In Front | `x_paste_in_front` (builder :545) | ⌘F | `Ctrl+F` | Su Windows `Ctrl+F` è per convenzione *Trova*; l'app non ha ricerca (il sottomenu Find è morto), ma l'aspettativa utente c'è → **caso da valutare** |
| 8 | Paste In Back | `x_paste_in_back` (builder :546) | ⌘B | `Ctrl+B` | Su Windows `Ctrl+B` è per convenzione *Grassetto* → **caso da valutare** |
| 9 | Clear | `delete:` (storyboard :154-159, rititolato builder :551) | — | `Canc` (consigliato) | Su Mac non ha chord: Delete/Backspace sono gestiti dal canvas (vedi §12) |
| 10 | ——— | | | | builder :554 |
| 11 | Select All | `x_select_all` (storyboard :160-164 ricablato builder :560) | ⌘A | `Ctrl+A` | Il `selectAll:` di serie selezionerebbe il testo DOM della webview |
| 12 | Deselect All | `x_deselect_all` (builder :566) | ⇧⌘A | `Ctrl+Shift+A` | |
| 13 | Select ▸ | — (parent) | — | — | builder :571-618, vedi §3.1 |
| 14 | ——— | | | | builder :619 |
| 15 | Define Pattern… | `SVGEUserPatternStore.x_define_pattern` (target esplicito, builder :625-629) | — | — | Abilitata solo con selezione (`validateMenuItem` dello store) |
| 16 | Define Brush from Selection | `SVGEBrushesStore.x_define_brush` (target esplicito, builder :636-640) | — | — | idem |
| 17 | ——— | | | | builder :641 |
| 18 | Edit Original | `x_edit_original` (builder :642) | — | — | |
| 19 | ——— | | | | builder :643 |
| 20 | Assign Profile… | **`action: nil`** (builder :644) | — | — | **Stub di parità, permanentemente grigia** — replicare grigia |
| 21 | Keyboard Shortcuts… | `x_keyboard_shortcuts` (builder :647-648) | ⌥⇧⌘K | `Ctrl+Alt+Shift+K` | **AMB-2** |

**Voci storyboard presenti ma `hidden="YES" enabled="NO"`** (non si vedono, ma esistono
nell'albero e partecipano alla risoluzione dei key-equivalent su macOS — su Windows
**non vanno replicate**): *Paste and Match Style* (:151), *Find ▸* (:166-203, con
*Find…*, *Find and Replace…*, *Find Next* ⌘G, *Find Previous* ⇧⌘G, *Use Selection for Find*,
*Jump to Selection*), *Spelling and Grammar ▸* (:204-239), *Substitutions ▸* (:240-289),
*Transformations ▸* (:290-314), *Speech ▸* (:315-333).
Il builder **spegne** i chord ⌘G/⇧⌘G (`release_group_chords` :1927-1937, chiamato a :535) e
⌥⌘F (`release_stock_chord` :1947-1961, chiamato a :536) su quel sottoalbero morto, perché
rubavano rispettivamente Object ▸ Group / Ungroup e Window ▸ Feedback. **Su Windows il
problema non esiste** (niente sottoalbero morto): è solo la spiegazione di perché quei
chord sono liberi.

## 3.1 Edit ▸ Select ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:571-618`. Tutte le voci chiamano
`x_select_advanced(_:)` con la *kind* in `representedObject`; `Select Again` replica
l'ultima kind usata.

| # | Voce | Selettore/azione (`representedObject`) | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | ▸ Select Again | `x_select_advanced` (`"again"`, :599-601) | ⌘6 | `Ctrl+6` | Unica voce con maschera `[.command]` |
| 2 | ▸ ——— | | | | :602 |
| 3 | ▸ Same Style | `x_select_advanced` (`"style"`, :603) | ⌃⇧⌘S | *da riassegnare* | **AMB-1** |
| 4 | ▸ Same Fill & Stroke | `x_select_advanced` (`"fillstroke"`, :604) | ⌃⇧⌘A | *da riassegnare* | **AMB-1** |
| 5 | ▸ Same Fill Color | `x_select_advanced` (`"fill"`, :605) | ⌃⇧⌘L | *da riassegnare* | **AMB-1** |
| 6 | ▸ Same Stroke Color | `x_select_advanced` (`"stroke"`, :606) | ⌃⇧⌘K | *da riassegnare* | **AMB-1** |
| 7 | ▸ Same Stroke Weight | `x_select_advanced` (`"weight"`, :607) | ⌃⇧⌘W | *da riassegnare* | **AMB-1** |
| 8 | ▸ Same Blending Mode | `x_select_advanced` (`"blend"`, :608) | ⌃⇧⌘N | *da riassegnare* | **AMB-1** |
| 9 | ▸ Same Opacity | `x_select_advanced` (`"opacity"`, :609) | ⌃⇧⌘O | *da riassegnare* | **AMB-1** |
| 10 | ▸ ——— | | | | :612 |
| 11 | ▸ Masks | `x_select_advanced` (`"masks"`, :613) | ⌃⇧⌘H | *da riassegnare* | **AMB-1** |
| 12 | ▸ Stray Points | `x_select_advanced` (`"stray"`, :614) | ⌃⇧⌘Y | *da riassegnare* | **AMB-1** |
| 13 | ▸ ——— | | | | :615 |
| 14 | ▸ Inverse | `x_select_advanced` (`"inverse"`, :616) | ⌃⇧⌘R | *da riassegnare* | **AMB-1** |

---

# 4. Object

**Provenienza:** `Start/SVGEMenuBuilder.swift:2189-2456` (`create_objects_menu`), inserito
nella barra a `:920-923` (indice 3, subito a destra di Edit).

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | Transform ▸ | — (parent, :2194) | — | — | vedi §4.1 |
| 2 | Arrange ▸ | — (parent, :2215) | — | — | vedi §4.2 |
| 3 | ——— | | | | :2223 |
| 4 | Group | `x_group` (:2227) | ⌘G | `Ctrl+G` | |
| 5 | Ungroup | `x_ungroup` (:2228) | ⌘U | `Ctrl+U` | Su Windows `Ctrl+U` è per convenzione *Sottolineato* → **caso da valutare** |
| 6 | Lock | `x_lock_selection` (:2234) | ⇧⌘2 | `Ctrl+Shift+2` | ⌘2 è passato al Control Palette (SVGE-1161) |
| 7 | Unlock All | `x_unlock_all` (:2235) | ⌥⌘2 | `Ctrl+Alt+2` | **AMB-2** |
| 8 | Hide Selection | `x_hide_selection` (:2236) | ⌘3 | `Ctrl+3` | |
| 9 | Show All | `x_show_all` (:2237) | ⌥⌘3 | `Ctrl+Alt+3` | **AMB-2** |
| 10 | ——— | | | | :2238 |
| 11 | Expand… | `x_expand` (:2241) | — | — | |
| 12 | Expand Appearance | `x_expand_appearance` (:2244) | — | — | |
| 13 | Flatten Transparency… | `x_flatten_transparency` (:2248) | — | — | |
| 14 | Rasterize… | `x_rasterize` (:2249) | — | — | |
| 15 | ——— | | | | :2253 |
| 16 | Path ▸ | — (parent, :2261) | — | — | vedi §4.3 |
| 17 | Blend ▸ | — (parent, :2329) | — | — | vedi §4.4 |
| 18 | Compound Paths ▸ | — (parent, :2338) | — | — | vedi §4.5 |
| 19 | Pathfinder ▸ | — (parent, :2364) | — | — | vedi §4.6 |
| 20 | Clipping Mask ▸ | — (parent, :2392) | — | — | vedi §4.7 |
| 21 | Crop Marks ▸ | — (parent, :2408) | — | — | vedi §4.8 |
| 22 | ——— | | | | :2415 |
| 23 | Fit Frame to Text | `x_fit_rect_to_text` (:2444-2445) | ⌥⌘C | `Ctrl+Alt+C` | **AMB-2**. Stesso chord di InDesign "Fit Frame to Content" |
| 24 | Convert to Path | `x_convert_to_path` (:2446) | — | — | |
| 25 | Image Trace… (Convert to Vector) | `x_convert_to_vector` (:2447) | — | — | Duplicata in `Filter ▸ Create ▸` (stesso selettore) |

## 4.1 Object ▸ Transform ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2194-2212`.

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | ▸ Transform Again | `x_transform_again` (:2196) | ⌘D | `Ctrl+D` | |
| 2 | ▸ Transform Again (Copy) | `x_transform_again_copy` (:2199) | ⇧⌘D | `Ctrl+Shift+D` | |
| 3 | ▸ ——— | | | | :2200 |
| 4 | ▸ Move… | `x_move` (:2201) | ⇧⌘M | `Ctrl+Shift+M` | |
| 5 | ▸ Scale… | `x_transform_dialog(_:)` (`"scale"`, :2202-2207) | — | — | |
| 6 | ▸ Rotate… | `x_transform_dialog(_:)` (`"rotate"`) | — | — | |
| 7 | ▸ Reflect… | `x_transform_dialog(_:)` (`"reflect"`) | — | — | |
| 8 | ▸ Shear… | `x_transform_dialog(_:)` (`"shear"`) | — | — | |
| 9 | ▸ Transform Each… | `x_transform_each` (:2208) | — | — | |
| 10 | ▸ ——— | | | | :2209 |
| 11 | ▸ Reset Bounding Box | `x_reset_bounding_box` (:2210) | — | — | |

## 4.2 Object ▸ Arrange ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2215-2222`.

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | ▸ Bring To Front | `x_bring_to_front` (:2217) | ⇧⌘] | `Ctrl+Shift+]` | **AMB-4** — su tastiera IT `]` è `AltGr+è` |
| 2 | ▸ Bring Forward | `x_bring_forward` (:2218) | ⌘] | `Ctrl+]` | **AMB-4** |
| 3 | ▸ Send Backward | `x_send_backward` (:2219) | ⌘[ | `Ctrl+[` | **AMB-4** — su tastiera IT `[` è `AltGr+è`/`AltGr+{` |
| 4 | ▸ Send To Back | `x_send_to_back` (:2220) | ⇧⌘[ | `Ctrl+Shift+[` | **AMB-4** |

## 4.3 Object ▸ Path ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2261-2323`.

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | ▸ Join | `x_object_join` (:2263) | ⌘J | `Ctrl+J` | |
| 2 | ▸ Average… | `x_object_average` (:2264) | ⌥⌘J | `Ctrl+Alt+J` | **AMB-2** |
| 3 | ▸ ——— | | | | :2265 |
| 4 | ▸ Outline Stroke | `x_outline_stroke` (:2280) | ⌥⇧⌘O | `Ctrl+Alt+Shift+O` | **AMB-2** |
| 5 | ▸ Offset Path… | `x_offset_path` (:2283) | ⌥⌘O | `Ctrl+Alt+O` | **AMB-2** |
| 6 | ▸ Smooth | `x_smooth_path` (:2284) | ⌥⇧⌘S | `Ctrl+Alt+Shift+S` | **AMB-2** |
| 7 | ▸ ——— | | | | :2285 |
| 8 | ▸ Roughen… | `x_roughen_path` (:2293) | ⌥⇧⌘R | `Ctrl+Alt+Shift+R` | **AMB-2**. Stesso comando di `Filter ▸ Distort ▸ Roughen…`; il chord è dichiarato **solo qui** |
| 9 | ▸ Trim Path… | `x_trim_path` (:2294) | ⌥⇧⌘T | `Ctrl+Alt+Shift+T` | **AMB-2** |
| 10 | ▸ Hatch Fill… | `x_hatch_fill` (:2295) | ⌥⇧⌘H | `Ctrl+Alt+Shift+H` | **AMB-2** |
| 11 | ▸ Pattern Along Path… | `x_pattern_along_path` (:2296-2297) | ⌥⇧⌘P | `Ctrl+Alt+Shift+P` | **AMB-2** |
| 12 | ▸ ——— | | | | :2298 |
| 13 | ▸ Add Anchor Points | `x_add_anchor_points` (:2299) | ⌥⇧⌘A | `Ctrl+Alt+Shift+A` | **AMB-2** |
| 14 | ▸ Subdivide | `x_subdivide_path` (:2310) | ⌃⌥⌘D | *da riassegnare* | **AMB-1** + **AMB-2** insieme |
| 15 | ▸ Round Selected Corners… | `x_round_selected_corners` (:2317) | ⌥⌘R | `Ctrl+Alt+R` | **AMB-2**. Grigia fuori dal path-edit |
| 16 | ▸ Reorient Path | `x_reorient_path` (:2321) | ⌥⇧⌘E | `Ctrl+Alt+Shift+E` | **AMB-2** |

## 4.4 Object ▸ Blend ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2329-2335`.

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | ▸ Make | `x_blend_make` (:2331) | ⌥⌘B | `Ctrl+Alt+B` | **AMB-2** |
| 2 | ▸ Release | `x_blend_release` (:2332) | ⌥⇧⌘B | `Ctrl+Alt+Shift+B` | **AMB-2** |
| 3 | ▸ Blend Options… | `x_blend_options` (:2333) | — | — | |

## 4.5 Object ▸ Compound Paths ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2338-2343`.

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | ▸ Make | `x_compound_make` (:2340) | ⇧⌘8 | `Ctrl+Shift+8` | |
| 2 | ▸ Release | `x_compound_release` (:2341) | ⌥⇧⌘8 | `Ctrl+Alt+Shift+8` | **AMB-2** |

## 4.6 Object ▸ Pathfinder ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2364-2389`. Tutte con maschera
`[.command, .control, .shift]` (:2370 e :2384) e *op* in `representedObject`.

| # | Voce | Selettore/azione (`representedObject`) | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | ▸ Unite | `x_pathfinder(_:)` (`"unite"`, :2366) | ⌃⇧⌘U | *da riassegnare* | **AMB-1** |
| 2 | ▸ Minus Front | `x_pathfinder(_:)` (`"subtract"`, :2366) | ⌃⇧⌘F | *da riassegnare* | **AMB-1** |
| 3 | ▸ Minus Back | `x_pathfinder(_:)` (`"subtract_back"`, :2367) | ⌃⇧⌘B | *da riassegnare* | **AMB-1** |
| 4 | ▸ Intersect | `x_pathfinder(_:)` (`"intersect"`, :2368) | ⌃⇧⌘I | *da riassegnare* | **AMB-1** |
| 5 | ▸ Exclude | `x_pathfinder(_:)` (`"exclude"`, :2368) | ⌃⇧⌘X | *da riassegnare* | **AMB-1** |
| 6 | ▸ ——— | | | | :2374 |
| 7 | ▸ Divide | `x_pathfinder_ex(_:)` (`"divide"`, :2381) | ⌃⇧⌘V | *da riassegnare* | **AMB-1**. È V, non D (la D era rivendicata dal canvas Mac) |
| 8 | ▸ Trim | `x_pathfinder_ex(_:)` (`"trim"`, :2381) | ⌃⇧⌘T | *da riassegnare* | **AMB-1** |
| 9 | ▸ Merge | `x_pathfinder_ex(_:)` (`"merge"`, :2382) | ⌃⇧⌘M | *da riassegnare* | **AMB-1** |
| 10 | ▸ Crop | `x_pathfinder_ex(_:)` (`"crop"`, :2382) | ⌃⇧⌘C | *da riassegnare* | **AMB-1** |

## 4.7 Object ▸ Clipping Mask ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2392-2397`.

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | ▸ Make | `x_mask_make` (:2394) | — | — | |
| 2 | ▸ Release | `x_mask_release` (:2395) | — | — | |

## 4.8 Object ▸ Crop Marks ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2408-2413`.

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | ▸ Make | `x_crop_marks_make` (:2410) | — | — | |
| 2 | ▸ Release | `x_crop_marks_release` (:2411) | — | — | |

---

# 5. Font

**Provenienza:** `Start/SVGEMenuBuilder.swift:2641-2696` (`create_font_menu`), inserito
nella barra a `:902`. **Nessuna voce ha scorciatoia** (:911 lo dichiara esplicitamente).

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 0a.. | *(sezione "Recently Used": una voce per famiglia recente + separatore)* | `x_set_font_menu(_:)` (`rebuild_font_recents` :2704-2720) | — | — | **Dinamica**, ricostruita a ogni apertura del menu (`tag = 0x5F52_4543`). Nessuna intestazione: solo il separatore in coda (:2709-2719) |
| 1 | Helvetica | `x_set_font_menu(_:)` (`representedObject` = nome, :2645-2652) | — | — | Lista breve "Illustrator-like" :2645-2647 |
| 2 | Helvetica Neue | idem | — | — | |
| 3 | Arial | idem | — | — | |
| 4 | Times New Roman | idem | — | — | |
| 5 | Georgia | idem | — | — | |
| 6 | Courier | idem | — | — | |
| 7 | Courier New | idem | — | — | |
| 8 | Verdana | idem | — | — | |
| 9 | Futura | idem | — | — | |
| 10 | Gill Sans | idem | — | — | |
| 11 | Palatino | idem | — | — | |
| 12 | Optima | idem | — | — | |
| 13 | ——— | | | | :2653 |
| 14 | All Fonts ▸ | — (parent, :2654) | — | — | Sottomenu **dinamico**: `NSFontManager.availableFontFamilies` (:2656-2666); su Windows l'equivalente è l'enumerazione GDI/DirectWrite. Ha a sua volta la sua sezione "Recently Used" (:2674) |

Il menu Font su Mac ha anche un delegato che (a) rigenera i recenti e (b) marca le famiglie
variabili (`SVGEFontMenuDelegate` :206-216, `SVGEVariableFontMark.apply` :2690) e (c) fa
**anteprima live** del font evidenziato (`SVGEFontPreview`, :2688-2694). Su Windows sono
comportamenti da replicare o da dichiarare esplicitamente non replicati.

---

# 6. Type

**Provenienza:** `Start/SVGEMenuBuilder.swift:2723-2884` (`create_type_menu`), inserito a `:901`.
*Character…* e *Paragraph…* **non sono più qui** (SVGE-1669): vivono in Window (§10) coi loro
chord ⌘T e ⌥⌘T.

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | Size ▸ | — (parent, :2738) | — | — | vedi §6.1 |
| 2 | Alignment ▸ | — (parent, :2784) | — | — | vedi §6.2 |
| 3 | Tracking… | `x_text_tracking` (:2804) | ⌥⌘K | `Ctrl+Alt+K` | **AMB-2** |
| 4 | Leading… | `x_text_leading` (:2805) | — | — | |
| 5 | Spacing… | `x_text_word_spacing` (:2806) | — | — | |
| 6 | Change Case ▸ | — (parent, :2808) | — | — | vedi §6.3 |
| 7 | ——— | | | | :2839 |
| 8 | Area Type Options… | `x_area_type_options` (:2843) | — | — | Abilitata solo con un'area text |
| 9 | Type on a Path Options… | `x_type_on_path_options` (:2848) | — | — | Abilitata solo con `<text>`+`<textPath>` |
| 10 | Threaded Text ▸ | — (parent, :2853) | — | — | vedi §6.4 |
| 11 | Create Outlines | `x_create_outlines` (:2860) | ⇧⌘O | `Ctrl+Shift+O` | |
| 12 | Fit Headline | `x_type_fit_headline` (:2866) | — | — | |
| 13 | Wrap ▸ | — (parent, :2873) | — | — | vedi §6.5 |

## 6.1 Type ▸ Size ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2738-2746`. Tredici voci
`x_set_font_size_menu(_:)` con il valore in `representedObject`, **nessuna con chord**:

`6 pt` · `8 pt` · `9 pt` · `10 pt` · `11 pt` · `12 pt` · `14 pt` · `18 pt` · `24 pt` ·
`36 pt` · `48 pt` · `60 pt` · `72 pt` (lista a :2740).

## 6.2 Type ▸ Alignment ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2784-2794`. Maschera `[.command, .shift]` (:2789),
codice paragrafo in `representedObject`.

| # | Voce | Selettore/azione (`representedObject`) | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | ▸ Left | `x_text_align(_:)` (`"l"`) | ⇧⌘L | `Ctrl+Shift+L` | |
| 2 | ▸ Center | `x_text_align(_:)` (`"c"`) | ⇧⌘C | `Ctrl+Shift+C` | |
| 3 | ▸ Right | `x_text_align(_:)` (`"r"`) | ⇧⌘R | `Ctrl+Shift+R` | |
| 4 | ▸ Justify | `x_text_align(_:)` (`"jl"`) | ⇧⌘J | `Ctrl+Shift+J` | |
| 5 | ▸ Justify All | `x_text_align(_:)` (`"ja"`) | ⇧⌘F | `Ctrl+Shift+F` | |

## 6.3 Type ▸ Change Case ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2808-2838` (tabella a :2827-2831).

| # | Voce | Selettore/azione (`representedObject`) | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | ▸ UPPERCASE | `x_change_case(_:)` (`"upper"`) | ⇧⌘K | `Ctrl+Shift+K` | |
| 2 | ▸ lowercase | `x_change_case(_:)` (`"lower"`) | ⌃⌥⌘L | *da riassegnare* | **AMB-1** + **AMB-2** |
| 3 | ▸ Title Case | `x_change_case(_:)` (`"title"`) | ⌃⌥⌘T | *da riassegnare* | **AMB-1** + **AMB-2** |
| 4 | ▸ Sentence case | `x_change_case(_:)` (`"sentence"`) | ⌃⌥⌘S | *da riassegnare* | **AMB-1** + **AMB-2** |

## 6.4 Type ▸ Threaded Text ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2853-2859`.

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | ▸ Create | `x_text_thread_create` (:2855) | — | — | |
| 2 | ▸ Release Selection | `x_text_thread_release` (:2856) | — | — | |
| 3 | ▸ Remove Threading | `x_text_thread_remove` (:2857) | — | — | |

## 6.5 Type ▸ Wrap ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2873-2878`.

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | ▸ Make | `x_type_wrap_make` (:2875) | — | — | |
| 2 | ▸ Release | `x_type_wrap_release` (:2876) | — | — | |

---

# 7. Filter

**Provenienza:** `Start/SVGEMenuBuilder.swift:2887-2990` (`create_filter_menu`), inserito a `:900`.

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | Last Filter | `x_last_filter` (:2896-2897) | ⇧⌘E | `Ctrl+Shift+E` | Il titolo si trasforma in "Apply *nome*" in `validateMenuItem` |
| 2 | ——— | | | | :2898 |
| 3 | Colors ▸ | — (parent, :2911) | — | — | vedi §7.1 |
| 4 | Create ▸ | — (parent, :2944) | — | — | vedi §7.2 |
| 5 | Distort ▸ | — (parent, :2961) | — | — | vedi §7.3 |
| 6 | Stylize ▸ | — (parent, :2973) | — | — | vedi §7.4 |
| 7 | ——— | | | | :2983 |
| 8 | Image Effects… | `x_filter_image_effects` (:2984) | — | — | |

## 7.1 Filter ▸ Colors ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2911-2935`. Nessun chord.

| # | Voce | Selettore/azione (`representedObject`) | Scorc. | Note |
|---|------|------------------|--------|------|
| 1 | ▸ Adjust Colors… | `x_filter_colors(_:)` (`"adjust"`, :2927) | — | |
| 2 | ▸ Blend Front to Back | `x_filter_blend_colors(_:)` (`"frontback"`, :2928) | — | |
| 3 | ▸ Blend Horizontally | `x_filter_blend_colors(_:)` (`"horizontal"`, :2929) | — | |
| 4 | ▸ Blend Vertically | `x_filter_blend_colors(_:)` (`"vertical"`, :2930) | — | |
| 5 | ▸ Convert to Grayscale | `x_filter_colors(_:)` (`"grayscale"`, :2931) | — | |
| 6 | ▸ Invert Colors | `x_filter_colors(_:)` (`"invert"`, :2932) | — | |
| 7 | ▸ Saturate… | `x_filter_colors(_:)` (`"saturate"`, :2933) | — | |

## 7.2 Filter ▸ Create ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2944-2955`. Nessun chord.

| # | Voce | Selettore/azione | Scorc. | Note |
|---|------|------------------|--------|------|
| 1 | ▸ Image Trace… (Convert to Vector) | `x_convert_to_vector` (:2952) | — | Stesso selettore di `Object ▸ Image Trace…` |
| 2 | ▸ Object Mosaic… | `x_filter_object_mosaic` (:2953) | — | Abilitata solo con un `<image>` selezionato |
| 3 | ▸ Trim Marks | **`action: nil`** (:2954) | — | **Stub di parità, permanentemente grigia** |

## 7.3 Filter ▸ Distort ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2961-2969`. Nessun chord.

| # | Voce | Selettore/azione | Scorc. | Note |
|---|------|------------------|--------|------|
| 1 | ▸ Free Distort… | `x_filter_free_distort` (:2963) | — | |
| 2 | ▸ Punk & Bloat… | `x_filter_punk_bloat` (:2964) | — | |
| 3 | ▸ Roughen… | `x_roughen_path` (:2965) | — | Stesso comando di `Object ▸ Path ▸ Roughen…` (che porta il chord ⌥⇧⌘R) |
| 4 | ▸ Scribble and Tweak… | `x_filter_tweak` (:2966) | — | |
| 5 | ▸ Twirl… | `x_filter_twirl` (:2967) | — | |
| 6 | ▸ Zig Zag… | `x_filter_zigzag` (:2968) | — | |

## 7.4 Filter ▸ Stylize ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2973-2978`. Nessun chord.

| # | Voce | Selettore/azione | Scorc. | Note |
|---|------|------------------|--------|------|
| 1 | ▸ Add Arrowheads… | `x_filter_arrowheads` (:2975) | — | |
| 2 | ▸ Drop Shadow… | `x_filter_drop_shadow` (:2976) | — | |
| 3 | ▸ Round Corners… | `x_filter_round_corners` (:2977) | — | |

---

# 8. View

**Provenienza:** `Start/SVGEMenuBuilder.swift:1976-2105` (`create_view_menu`). Il menu View
**di serie** dello storyboard (`Main.storyboard:599-630`: *Show Toolbar* ⌥⌘T, *Customize
Toolbar…*, *Show Sidebar* ⌃⌘S, *Enter Full Screen* ⌃⌘F) viene **rimosso** a runtime
(builder :880-882) e sostituito da questo. **Su Windows non va replicato**: le sue quattro
voci non appartengono al prodotto.

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | Outline | `x_toggle_outline` (:1981) | ⌘Y | *nessuna* | Titolo che si inverte in `validateMenuItem` ("Outline"/"Preview"). **DECISO (1/9/2026)**: `Ctrl+Y` resta **Redo** (convenzione Windows, già dichiarata alla riga 169) e **Outline non ha scorciatoia**. La voce non ne mostra nessuna: un'etichetta che promette un tasto inerte è peggio di una senza. Vedi `win/ui_menu.cpp`, voce Outline |
| 2 | Pixel Preview | `x_toggle_pixel_preview(_:)` (:1988) | ⌥⌘Y | `Ctrl+Alt+Y` | **AMB-2** |
| 3 | ——— | | | | :1993 |
| 4 | Zoom In | `x_zoom_in` (:1994) | ⌘+ | `Ctrl++` | **AMB-4** — accettare anche `Ctrl+=` e il `+` del tastierino |
| 5 | Zoom Out | `x_zoom_out` (:1995) | ⌘- | `Ctrl+-` | **AMB-4** |
| 6 | Actual Size | `x_actual_size` (:2006) | ⌘0 | `Ctrl+0` | Per scelta esplicita ⌘0 = 100% (non "Fit"), SVGE-787 |
| 7 | Fit In Window | `x_zoom_fit` (:2007) | ⌥⌘0 | `Ctrl+Alt+0` | **AMB-2** |
| 8 | ——— | | | | :2008 |
| 9 | Hide Edges | `x_toggle_hide_edges` (:2012) | — | — | Titolo che si inverte. Niente chord: ⌘H è Hide App su macOS |
| 10 | Hide Artboard | `x_toggle_artboard` (:2013) | — | — | Titolo che si inverte |
| 11 | Hide Page Tiling | `x_toggle_page_tiling` (:2014) | — | — | Titolo che si inverte |
| 12 | ——— | | | | :2015 |
| 13 | Hide Template | **`action: nil`** (:2016) | ⇧⌘W | *non assegnare* | **Stub di parità, permanentemente grigia**. **AMB-5**: `Ctrl+Shift+W` su Windows è "chiudi tutto" in molti browser → su Windows lasciare la voce grigia **senza** chord |
| 14 | Show Rulers | `x_view_rulers` (:2017) | ⌘R | `Ctrl+R` | Titolo che si inverte |
| 15 | Hide Bounding Box | `x_toggle_bounding_box` (:2018) | ⇧⌘B | `Ctrl+Shift+B` | Titolo che si inverte |
| 16 | Show Transparency Grid | `x_toggle_show_transparency` (:2027) | ⌃⌘T | *da riassegnare* | **AMB-1** |
| 17 | ——— | | | | :2028 |
| 18 | Guides ▸ | — (parent, :2032) | — | — | vedi §8.1 |
| 19 | Smart Guides | `x_toggle_smart_guides` (:2059) | ⌃⌘U | *da riassegnare* | **AMB-1**. Su Mac è ⌃⌘U e non ⌘U proprio perché ⌘U è Object ▸ Ungroup |
| 20 | ——— | | | | :2060 |
| 21 | Show Grid | `x_toggle_show_grid` (:2061) | ⌘" | `Ctrl+"` | **AMB-4** — su tastiera IT `"` è `Shift+2` |
| 22 | Snap To Grid | `x_toggle_snap_grid` (:2062) | ⇧⌘" | `Ctrl+Shift+"` | **AMB-4** |
| 23 | Snap To Point | `x_toggle_snap_point` (:2065) | ⌥⌘" | `Ctrl+Alt+"` | **AMB-2** + **AMB-4** |
| 24 | ——— | | | | :2066 |
| 25 | New View… | **`action: nil`** (:2067) | — | — | **Stub di parità, permanentemente grigia** |
| 26 | Edit Views… | **`action: nil`** (:2068) | — | — | **Stub di parità, permanentemente grigia** |
| 27 | ——— | | | | :2069 |
| 28 | Display Performance ▸ | — (parent, :2082) | — | — | vedi §8.2 |

## 8.1 View ▸ Guides ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2032-2040`.

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | ▸ Hide Guides | `x_toggle_hide_guides` (:2034) | ⌘; | `Ctrl+;` | **AMB-4** — su tastiera IT `;` è `Shift+,` |
| 2 | ▸ Lock Guides | `x_toggle_lock_guides(_:)` (:2035) | ⌥⌘; | `Ctrl+Alt+;` | **AMB-2** + **AMB-4**. È un **modo con checkmark**, non cambia titolo |
| 3 | ▸ Make Guides | `x_make_guides` (:2036) | — | — | |
| 4 | ▸ Release Guides | **`action: nil`** (:2037) | ⌥⌘5 | *non assegnare* | **Stub di parità, permanentemente grigia**. **AMB-2** |
| 5 | ▸ Clear Guides | `x_clear_guides` (:2038) | — | — | |

## 8.2 View ▸ Display Performance ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:2082-2092`. Gruppo **radio** (un livello
spuntato per volta), modalità in `representedObject`. Nessun chord.

| # | Voce | Selettore/azione (`representedObject`) | Scorc. | Note |
|---|------|------------------|--------|------|
| 1 | ▸ Fast Display | `x_set_display_performance(_:)` (`"fast"`) | — | Item **di stato** (checkmark) |
| 2 | ▸ Typical Display | `x_set_display_performance(_:)` (`"typical"`) | — | Item **di stato** |
| 3 | ▸ High Quality Display | `x_set_display_performance(_:)` (`"high"`) | — | Item **di stato** |

---

# 9. Format (nascosto — NON replicare)

**Provenienza:** `Base.lproj/Main.storyboard:337-598`, `hidden="YES" enabled="NO"`.

Il menu Format standard di AppKit (Font ▸ con *Show Fonts* ⌘T, *Bold* ⌘B, *Italic* ⌘I,
*Underline* ⌘U, *Bigger* ⌘+, *Smaller* ⌘−, Kern ▸ / Ligatures ▸ / Baseline ▸, Show Colors,
Copy Style, Paste Style; e Text ▸ con Align Left/Center/Justify/Align Right, Writing
Direction ▸, Show/Copy/Paste Ruler) resta **nell'albero ma invisibile e disabilitato**.

Su macOS un item nascosto **partecipa comunque** alla risoluzione dei key-equivalent: per
questo il builder gli **spegne** i chord ⌘+ / ⌘− (`release_zoom_chords` :1910-1919, chiamato
a :872) e ⌘T (`release_stock_chord` :873), altrimenti ruberebbe View ▸ Zoom In/Out e
Window ▸ Character.

**Su Windows questo menu non esiste e i suoi chord sono liberi**: `Ctrl++`, `Ctrl+-` e
`Ctrl+T` vanno direttamente ai loro proprietari. Nessuna voce da replicare.

---

# 10. Window

**Provenienza:** base `Base.lproj/Main.storyboard:631-655` (`systemMenu="window"`); il builder
aggiunge un separatore e l'intero blocco palette in coda (`:927-941`, lista in
`palette_menu_items()` :2460-2623).

Ogni toggle di palette porta un `SVGEPaletteToggleTag` in `representedObject` (:2491): è
quello a far mettere il **checkmark** sulle palette aperte prima che il menu si apra
(`apply_window_menu_palette_state` :1893-1901). I toggle senza target esplicito vengono
"adottati" da `SVGEPaletteMenuTarget` (:2492) perché restino abilitati anche quando la
finestra key è una palette (SVGE-1418).

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | Minimize | `performMiniaturize:` (storyboard :635-639) | ⌘M | — | **AMB-6** — su Windows non è un comando di menu |
| 2 | Zoom | `performZoom:` (storyboard :640-646) | — | — | **AMB-6** |
| 3 | ——— | | | | storyboard :646 |
| 4 | Bring All to Front | `arrangeInFront:` (storyboard :647-651) | — | — | **AMB-6** — su Windows l'equivalente MDI è "Disponi finestre" |
| 5 | ——— | | | | builder :929 |
| 6 | Toolbox | `x_toggle_tools_palette` (:2503) | ⌘1 | `Ctrl+1` | Item **di stato** (checkmark) |
| 7 | Control Palette | `x_toggle_control_palette` (:2504) | ⌘2 | `Ctrl+2` | Item **di stato** |
| 8 | ——— | | | | :2505 |
| 9 | Swatches | `x_toggle_swatches_palette` (:2507) | F5 | `F5` | **AMB-3**. Maschera modificatori **vuota** |
| 10 | Gradient | `x_toggle_gradient_palette` (:2508) | F6 | `F6` | **AMB-3** |
| 11 | Pattern | `x_toggle_pattern_palette` (:2509) | ⇧F6 | `Shift+F6` | **AMB-3** |
| 12 | Brushes | `SVGEBrushesStore.x_toggle_brushes_palette` (target esplicito, :2523 / :1190-1199) | ⌘5 | `Ctrl+5` | |
| 13 | Symbols | `SVGESymbolsStore.x_toggle_symbols_palette` (target esplicito, :2525 / :1203-1212) | ⇧F7 | `Shift+F7` | **AMB-3** |
| 14 | Stroke | `x_toggle_stroke_palette` (:2526) | ⌘7 | `Ctrl+7` | |
| 15 | Transparency | `x_toggle_transparency_palette` (:2538) | ⌘8 | `Ctrl+8` | |
| 16 | Character | `x_toggle_character_palette` (:2549) | ⌘T | `Ctrl+T` | |
| 17 | Paragraph | `SVGEPaletteManager.x_toggle_paragraph_palette` (target esplicito, :2556 / :1176-1185) | ⌥⌘T | `Ctrl+Alt+T` | **AMB-2** |
| 18 | Align | `x_toggle_align_palette` (:2572) | ⌥⌘A | `Ctrl+Alt+A` | **AMB-2**. Su Mac non è ⇧⌘3 perché è lo screenshot di sistema |
| 19 | Info | `x_toggle_info_palette` (:2573) | ⌘9 | `Ctrl+9` | |
| 20 | Links | `x_toggle_links_palette` (:2574) | F8 | `F8` | **AMB-3** |
| 21 | Layers | `x_toggle_layers_palette` (:2578) | ⌘4 | `Ctrl+4` | |
| 22 | Navigator | `SVGEPaletteManager.x_toggle_navigator_palette` (target esplicito, :2581 / :1245-1254) | ⇧F8 | `Shift+F8` | **AMB-3** |
| 23 | Pathfinder | `SVGEPaletteManager.x_toggle_pathfinder_palette` (target esplicito, :2588 / :1260-1269) | ⌥⌘P | `Ctrl+Alt+P` | **AMB-2** |
| 24 | Spray | `SVGEPaletteManager.x_toggle_spray_palette` (target esplicito, :2594 / :1274-1283) | — | — | Volutamente senza chord (:2589-2593) |
| 25 | Scripts | `x_toggle_scripts_palette` (:2597) | — | — | Il chord ⌥⌘S sta su `File ▸ Scripts ▸ Scripts Panel…`, stesso selettore |
| 26 | AI Console | `x_toggle_ai_console` (:2598) | F7 | `F7` | **AMB-3** |
| 27 | Feedback | `SVGEPaletteManager.x_toggle_feedback_palette` (target esplicito, :2615 / :1216-1225) | ⌥⌘F | `Ctrl+Alt+F` | **AMB-2** |
| 28 | ——— | | | | :2620 |
| 29 | Reset Palettes… | `x_reset_palettes` (:2621) | — | — | Non è un toggle: nessun checkmark |
| 30.. | *(elenco delle finestre documento aperte)* | gestito da `systemMenu="window"` | — | — | **Dinamico**, popolato da AppKit. Su Windows va costruito a mano |

**Palette presenti nel codice ma SENZA voce di menu** (rimosse su richiesta utente — non
replicare la voce, ma sapere che il codice esiste): *Hatch* (SVGE-1746, commento :2510-2520),
*Debug* (SVGE-1720, :2607-2610), *Beta Tools* (SVGE-1720, :2616-2619), *AI Script Console*
(SK-1734, :2599-2606) e la voce *AI Script Console…* del menu Scripts (:2114-2118).

---

# 11. Help

**Provenienza:** base `Base.lproj/Main.storyboard:656-664`; il builder inserisce il sottomenu
*Tools* in testa + separatore (`add_tools_menu` :1399-1409), **ricabla** la voce di aiuto su
`SVGEHelpWindow` (`rewire_help_menu_item` :1372-1391), e appende separatore + *Send Feedback…*
(:1316-1330) e *Credits* (:1339-1351).

| # | Voce | Selettore/azione | Scorc. Mac | Scorc. Windows | Note |
|---|------|------------------|-----------|----------------|------|
| 1 | Tools ▸ | — (parent, :1419) | — | — | vedi §11.1 |
| 2 | ——— | | | | :1404 |
| 3 | Vector Designer Help | `SVGEHelpWindow.x_show_help(_:)` (storyboard :660-663, ricablato :1378-1379) | ⌘? | `F1` | **AMB-3/AMB-5** — su Windows l'aiuto è `F1`; `Ctrl+?` non è convenzionale. Il `showHelp:` di serie apriva l'Help Viewer di macOS, che l'app non ha |
| 4 | ——— | | | | :1324 |
| 5 | Send Feedback… | `SVGEFeedbackWindow.show_feedback(_:)` (target esplicito, :1317-1320) | — | — | Apre la **finestra** feedback (diversa da `Window ▸ Feedback`, che è la palette) |
| 6 | Credits | `x_open_credits(_:)` (target = il builder stesso, :1340-1343, impl. :1356-1359) | — | — | Apre `https://vectordesigner.info/credits.html` nel browser |

Su Windows questo menu si chiama per convenzione **`?`** (o *Guida*) e ospita anche
**Informazioni su Vector Designer** (vedi **AMB-6**).

## 11.1 Help ▸ Tools ▸

**Provenienza:** `Start/SVGEMenuBuilder.swift:1418-1454` (`create_tools_menu`); ordine da
`Utility/SVGEEnumManager.swift:168-204` (`get_mac_tool_list`), titoli da `:423-484`
(`get_tool_name`), scorciatoie da `:511-559` (`get_tool_shortcut`). I separatori sono
inseriti prima dei tool elencati in `group_starts` (:1429-1436).

Tutte le voci chiamano `x_select_tool_menu(_:)` con lo `svge_tool` in `representedObject`
(:1443-1449), portano un **checkmark** sul tool attivo e hanno **maschera modificatori
vuota** (:1448): sono lettere nude. Su macOS si auto-disabilitano mentre si sta scrivendo
(`SVGEDocManager.keyboard_is_owned_by_text`) — **su Windows lo stesso gate è obbligatorio**,
altrimenti ogni lettera digitata cambia strumento.

| # | Voce | `representedObject` | Scorc. Mac | Scorc. Windows | Note |
|---|------|---------------------|-----------|----------------|------|
| 1 | ▸ Selection | `tool_selection` | `V` | `V` | |
| 2 | ▸ Direct Selection | `tool_direct_select` | `A` | `A` | |
| 3 | ▸ ——— | | | | gruppo penna/disegno |
| 4 | ▸ Path | `tool_path` | `P` | `P` | Il titolo è "Path", non "Pen" |
| 5 | ▸ Free Hand | `tool_fhpath` | — | — | Volutamente senza lettera (`SVGEEnumManager.swift:518-521`) |
| 6 | ▸ Spray | `tool_spray` | `B` | `B` | |
| 7 | ▸ Eraser | `tool_eraser` | — | — | |
| 8 | ▸ ——— | | | | gruppo linea/forme |
| 9 | ▸ Line | `tool_line` | `\` | `\` | **AMB-4** — su tastiera IT `\` è a sinistra dell'1 |
| 10 | ▸ Rect | `tool_rect` | `M` | `M` | |
| 11 | ▸ Ellipse | `tool_ellipse` | `L` | `L` | |
| 12 | ▸ Rounded Rect | `tool_rounded_rect` | — | — | |
| 13 | ▸ Polygon | `tool_polygon` | `G` | `G` | mnemonico "poly**G**on" |
| 14 | ▸ Star | `tool_star` | `S` | `S` | |
| 15 | ▸ ——— | | | | gruppo testo |
| 16 | ▸ Text | `tool_text` | `T` | `T` | |
| 17 | ▸ Text Pencil | `tool_text_pencil` | — | — | |
| 18 | ▸ ——— | | | | gruppo utility |
| 19 | ▸ Eyedropper | `tool_eyedropper` | `I` | `I` | |
| 20 | ▸ Scissors | `tool_scissor` | `C` | `C` | |
| 21 | ▸ Measure | `tool_measure` | — | — | |
| 22 | ▸ Gradient | `tool_gradient` | — | — | La `G` è presa dal Polygon |
| 23 | ▸ ——— | | | | gruppo trasformazioni |
| 24 | ▸ Rotate | `tool_rotate` | — | — | R/S/O già usate |
| 25 | ▸ Scale | `tool_scale` | — | — | |
| 26 | ▸ Reflect | `tool_reflect` | — | — | |
| 27 | ▸ Shear | `tool_shear` | — | — | |
| 28 | ▸ ——— | | | | gruppo navigazione |
| 29 | ▸ Hand | `tool_hand` | `H` | `H` | |
| 30 | ▸ Zoom | `tool_zoom` | `Z` | `Z` | |

---

# 12. Tasti del canvas (non-menu)

**Provenienza:** `Reference/gpu-window-keymap.md` (520 righe), censimento a sua volta
ancorato a `drawmac/js/Keyboard.js` e `SkiaBridge/SVGESkiaView.mm`. Questi tasti **non
appartengono ai menu**: sono gestiti dalla vista canvas quando ha il fuoco. Su Windows
vanno implementati nel gestore tastiera della finestra documento, **non** come acceleratori
di menu, altrimenti verrebbero intercettati prima.

Il censimento classifica ogni binding in tre categorie (`gpu-window-keymap.md:128-133`):
**A** = già coperto dalla barra dei menu (~55 voci con key-equivalent), **B** = implementato
nativamente sulla selezione condivisa (~14), **C** = no-op finché il tool non è nativo (~45).

## 12.1 Movimento / selezione / eliminazione (`gpu-window-keymap.md:190-202`)

| Tasto Mac | Tasto Windows | Comportamento | Cat. |
|-----------|---------------|---------------|------|
| `← → ↑ ↓` | uguale | Nudge della selezione di **1 unità utente**; con "Snap to Grid" attivo il passo diventa `zoom × canvasSnapStep` (quirk da replicare 1:1). In path-edit muove i **nodi** selezionati | B |
| `⇧ + frecce` | `Shift+frecce` | "Jump": nudge di `canvasSnapStep` (default **10**, da `localStorage["md-canvasSnapStep"]`) | B |
| `⌘↑ / ⌘↓` | `Ctrl+↑ / Ctrl+↓` | Bring Forward / Send Backward | A (menu Object ▸ Arrange) |
| `⌘⇧↑ / ⌘⇧↓` | `Ctrl+Shift+↑ / ↓` | Bring to Front / Send to Back | A |
| `⌘] / ⌘[` | `Ctrl+] / Ctrl+[` | Bring Forward / Send Backward | A |
| `⌘⇧] / ⌘⇧[` | `Ctrl+Shift+] / [` | Bring to Front / Send to Back | A |
| `⌃← / ⌃→` | **non implementare** | Rotate ∓1° — **binding MORTO** anche su Mac: `editor.rotateSelected` non è definito in nessun file caricato (`gpu-window-keymap.md:437-444`, decisione Q2) | no-op |
| `⌃⇧← / ⌃⇧→` | **non implementare** | Rotate ∓5° — stesso binding morto | no-op |
| `Delete` / `Backspace` | `Canc` / `Backspace` | Elimina la selezione; in path-edit con nodi selezionati elimina i **nodi** (un passo d'undo "Delete node") | B |
| `Escape` | `Esc` | Esce dal mode / deseleziona; in path-edit **esce dal mode** | B |
| `Enter` | `Invio` | Come Escape (`escapeMode`) | B |
| `⇧O / ⇧P` | `Shift+O / Shift+P` | Cicla elemento successivo / precedente | C (non implementato) |

## 12.2 Zoom e navigazione (`gpu-window-keymap.md:225-231`, `:456-462`)

| Tasto Mac | Tasto Windows | Comportamento | Note |
|-----------|---------------|---------------|------|
| `⌘+` / `⌘⇧=` | `Ctrl++`, `Ctrl+=` | Zoom in (×1.5) sulla **camera** della finestra documento | Sulla finestra GPU agisce sulla camera, non sul canvas JS (decisione Q4/Q6) |
| `⌘-` | `Ctrl+-` | Zoom out | |
| `⌘0` / `⌘1` / `⌘=` | `Ctrl+0` | Actual size / reset camera (fit-and-center) | Su Mac `⌘1` è anche il toggle Toolbox: su Windows **usare solo `Ctrl+0`** per evitare la collisione |
| `⌥⌘0` | `Ctrl+Alt+0` | Fit in Window | anche voce di menu View |
| `Barra spaziatrice` + drag | uguale | Pan della camera (mano) | Durante l'editing testo lo **spazio digita** |
| `f` | `F` | Zoom sulla selezione | non implementato nella finestra nativa |
| `Tab` / `⇧Tab` | `Tab` / `Shift+Tab` | Mostra/nasconde tutte le palette | Su Mac è un monitor globale d'app, non un menu |

## 12.3 Tasti-tool a lettera singola (`gpu-window-keymap.md:233-246`)

Il fork mappa, oltre alle lettere già elencate in §11.1 (che su Mac sono **possedute dalla
voce di menu**), questi **alias** che esistono solo nel canvas:

`y` / `q` = Pencil · `n` / `o` = Ellipse · `r` = Rect · `e` = Eyedropper ·
`+` (`⇧+`, `⇧=`) = aggiungi anchor · `-` = elimina anchor · `⇧c` = converti anchor ·
`w` = wireframe/preview · `⇧r` = mostra/nasconde righelli · `1`–`9` = tool in ordine toolbox.

**Sotto-eccezione "paint"** (agiscono sulla selezione, non sul tool): `x` / `⇧x` = scambia
fill/stroke · `/` = paint none · `d` = colori di default.

Tutte lettere nude: su Windows **devono essere disattivate mentre un campo di testo o una
sessione di editing testo ha il fuoco** (su Mac il bail-out è in `Keyboard.js:858-912`).

## 12.4 Editing di testo sul canvas (`gpu-window-keymap.md:3-20`)

Con una sessione di text-edit attiva **tutti** i tasti vanno all'editor di testo:
carattere stampabile → inserisci · `⌫`/`⌦` → cancella indietro/avanti ·
`←`/`→` → sposta il caret (`⌘` = inizio/fine riga → su Windows `Home`/`End`;
`⌥` = per parola → `Ctrl`; `⇧` = estendi) · `↑`/`↓` e `Home`/`End` → inizio/fine riga ·
`⌘A` → seleziona tutto · `Esc`/`Invio` → esci dalla sessione.

Non replicati nemmeno su Mac: multi-riga (il newline), `⌘C`/`⌘X`/`⌘V` dentro la sessione, IME completo.

## 12.5 Conflitti noti già risolti su Mac (da non reintrodurre)

- **Delete non è una voce di menu** (`gpu-window-keymap.md:343-348`): l'unico proprietario è
  il canvas. Su Windows si può invece assegnare `Canc` a `Edit ▸ Clear` — ma allora il canvas
  non deve gestirlo una seconda volta.
- **⌘U doppio** (`:370-374`): `View ▸ Smart Guides` e `Object ▸ Ungroup` avevano lo stesso
  chord; risolto spostando Smart Guides su ⌃⌘U. Su Windows, se ⌃⌘U venisse degradato a
  `Ctrl+U`, **la collisione tornerebbe**: è il caso **AMB-1** più concreto.
- **⌘Z nella finestra GPU** (`:445-455`): deve fare l'undo del **documento**, mai un secondo
  stack nativo.

---

# 13. Conteggi

Conteggio di **voci reali** (separatori esclusi; escluse le voci `hidden` dello storyboard e
le liste dinamiche — font di sistema, script `.jsx`, finestre documento aperte).

| Menu | Voci 1º livello | Voci nei sottomenu | Totale | Separatori | Con scorciatoia |
|------|-----------------|--------------------|--------|-----------|-----------------|
| Applicazione (storyboard) | 7 | 0 | **7** | 4 | 4 |
| File | 17 | 3 (Scripts, esclusi i dinamici) | **20** | 5 + 1 | 10 |
| Edit | 16 | 12 (Select) | **28** | 5 + 3 | 21 |
| Object | 21 | 44 (Transform 9, Arrange 4, Path 13, Blend 3, Compound 2, Pathfinder 9, Clipping Mask 2, Crop Marks 2) | **65** | 4 + 6 | 40 |
| Font | 13 | 0 (All Fonts è dinamico) | **13** | 1 | 0 |
| Type | 12 | 27 (Size 13, Alignment 5, Change Case 4, Threaded Text 3, Wrap 2) | **39** | 1 | 11 |
| Filter | 6 | 19 (Colors 7, Create 3, Distort 6, Stylize 3) | **25** | 2 | 1 |
| View | 21 | 8 (Guides 5, Display Performance 3) | **29** | 7 | 17 |
| Window | 25 | 0 | **25** | 4 | 20 |
| Help | 4 | 24 (Tools) | **28** | 2 + 6 | 15 |
| **TOTALE** | **142** | **137** | **279** | **51** | **139** |

*Nota sul conteggio Object:* le 13 voci di `Path ▸` includono `Round Selected Corners…` e
`Reorient Path`; le 9 di `Pathfinder ▸` sono le operazioni booleane (5 + 4, separate da un
separatore).

## Scorciatoie: quante e quante ambigue

| Categoria | Quante | Dove |
|-----------|--------|------|
| **Totale scorciatoie dichiarate** | **139** | tutte le tabelle sopra |
| **AMB-1** — contengono ⌃ Mac (collide con ⌘→Ctrl) | **26** | Edit ▸ Select (10), Object ▸ Pathfinder (9), Type ▸ Change Case (3), View (⌃⌘T, ⌃⌘U), Object ▸ Path ▸ Subdivide (⌃⌥⌘D), File ▸ Set Page to Selection (⌃⇧⌘P) |
| **AMB-2** — ⌥⌘ → `Ctrl+Alt` = AltGr (senza ⌃) | **30** | App (1), Edit (1), File ▸ Scripts (1), View (5), Object (3), Object ▸ Path (11), Object ▸ Blend (2), Object ▸ Compound (1), Type (1), Window (4) |
| **AMB-3** — tasti funzione F5–F8 | **7** | Window: F5, F6, ⇧F6, F7, ⇧F7, F8, ⇧F8 |
| **AMB-4** — punteggiatura su layout europei | **14** | `] [` (Object ▸ Arrange, 4) · `;` (View ▸ Guides, 2) · `"` (View, 3) · `+ -` (View, 2) · `,` (App) · `?` (Help) · `\` (Help ▸ Tools) |
| **AMB-5** — già presa dal sistema/convenzione Windows | **~7** | `Ctrl+W` (File ▸ Close), `Ctrl+Q`→`Alt+F4` (Quit), `Ctrl+?`→`F1` (Help), `Ctrl+Shift+W` (View ▸ Hide Template, stub), `Ctrl+Y` (View ▸ Outline vs Redo), `Ctrl+B`/`Ctrl+U`/`Ctrl+F` (Paste In Back / Ungroup / Paste In Front vs Grassetto/Sottolineato/Trova) |
| **AMB-6** — la voce cambia menu (o sparisce) su Windows | **7 voci** | About, Preferences…, Services ▸, Hide, Hide Others, Show All, Quit — più il gruppo Window ▸ Minimize/Zoom/Bring All to Front |
| **Scorciatoie con almeno un'ambiguità** (unione, senza doppi conteggi) | **75** | 26 + 30 + 7 + 14 − 2 sovrapposizioni (⌥⌘; e ⌥⌘" stanno in AMB-2 **e** AMB-4) |
| **Scorciatoie traducibili meccanicamente, senza note** | **64** | 139 − 75 |

## Altre categorie da tenere d'occhio nel porting

| Categoria | Quante | Elenco |
|-----------|--------|--------|
| **Voci `action: nil`** — stub permanenti, sempre grigie | **6** | Edit ▸ Assign Profile… · View ▸ Hide Template · View ▸ Guides ▸ Release Guides · View ▸ New View… · View ▸ Edit Views… · Filter ▸ Create ▸ Trim Marks |
| **Voci disabilitate per costruzione** (etichette) | **1** | File ▸ Scripts ▸ "User Scripts" (`isEnabled = false`, builder :2165) |
| **Item di stato / checkmark** | **26** | 22 toggle di palette (Window) + 3 livelli di Display Performance + View ▸ Guides ▸ Lock Guides |
| **Voci col titolo che si inverte a runtime** | **8** | View: Outline↔Preview, Hide/Show Edges, Hide/Show Artboard, Hide/Show Page Tiling, Show/Hide Rulers, Hide/Show Bounding Box, Show/Hide Transparency Grid, Hide/Show Guides; più Filter ▸ Last Filter → "Apply *nome*" |
| **Liste dinamiche da ricostruire** | **5** | File ▸ Open Recent · File ▸ Scripts (demo + utente) · Font ▸ Recently Used · Font ▸ All Fonts · Window ▸ (finestre aperte) |
| **Voci aggiunte condizionalmente (`#if SVGE_DIRECT`)** | **0** | **Verificato**: `SVGE_DIRECT` non compare in `SVGEMenuBuilder.swift` e nessuna voce di menu è compilata condizionalmente. Il flag esiste solo in `Settings/SVGEProStore.swift`, `Start/SVGEUpdater.swift`, `Start/SVGEDistribution.swift`, `GUI/SUI/Panel/SVGESplashWindow.swift` — la barra dei menu è **identica** nei due target |

## Ordine reale della barra dei menu

Ricavato dalla sequenza di inserimenti (`SVGEMenuBuilder.swift:883` View a indice 3;
`:900-902` Filter, Type, Font a indice 3; `:920-923` Object a indice 3 — l'ultimo inserito
finisce più a sinistra):

```
[Vector Designer] · File · Edit · Object · Font · Type · Filter · View · (Format nascosto) · Window · Help
```

Confermato dal commento del codice a `:907-908`: «Edit(2) · Object(3) · Font(4) · Type(5) ·
Filter(6) · View(7)». Su Windows l'ordine va **rispettato**, sostituendo il menu applicazione
con la distribuzione di **AMB-6** e chiamando `Help` → `?`.
