# Simboli SVG portabili

> Comporre e condividere simboli SVG statici con collegamenti Ganter sicuri e morsetti di collegamento tipizzati.

I simboli Ganter tengono separati il disegno e i dati vivi. Il disegno è normale SVG statico. Ganter
Lab possiede ogni corrispondenza di valore e ogni animazione, quindi un file importato non può
eseguire script, gestori di evento, codice di animazione incorporato o richieste di rete. Questa
pagina è il riferimento completo del modello di composizione: che cosa dichiara un simbolo, che cosa
l'importazione accetta e rifiuta, e come i simboli viaggiano tra le stazioni.

Un simbolo dichiara tre cose oltre al suo disegno:

- **Zone attive di ingresso**, ingressi con nome (riempimento, contorno, movimento, testo, visibilità) che
  un'istanza posata su una [dashboard](home) alimenta poi da un indirizzo di Logic o da un valore
  fisso.
- **Morsetti**, punti di collegamento tipizzati sul perimetro, così la dashboard può instradare
  tubi, condotte, cavi e alberi tra i simboli.
- **Suggerimenti**, composizioni con altri simboli, facoltative e con la posa dichiarata.

## Simboli di sistema e I miei simboli {#system-symbols-and-my-symbols}

Il catalogo ha due origini, filtrabili ovunque i simboli siano elencati:

| Origine | Riferimento | Che cos'è |
| --- | --- | --- |
| Sistema | `system:<stable-key>` | Le librerie incluse che arrivano con l'applicazione. Ispezionabili ed esportabili, mai modificabili sul posto. |
| Miei | `user:<guid>` | I simboli creati, importati o duplicati dall'operatore. Modificabili ed eliminabili. |

Ogni simbolo di sistema offre **Duplica in I miei simboli**: la copia è una risorsa utente congelata
e di proprietà dell'operatore (disegno, riquadro di visualizzazione, adattamento, ingombro, zone attive,
configurazioni di tipo, morsetti e suggerimenti copiati insieme), così continua a comportarsi come
è stata scelta anche quando un aggiornamento successivo cambia l'originale. Eliminare un simbolo
utente chiede conferma; le dashboard che lo referenziano ancora mostrano un segnaposto invece di
rompersi.

## Modi per creare un simbolo {#ways-to-create-a-symbol}

- **Importare un file.** **Logic > Assets > Symbols > Importa simbolo** accetta un `.svg` semplice
  o un pacchetto `.ganter-symbol.json` completo. Ogni importazione crea una risorsa **nuova** con
  una sua identità; non sovrascrive mai un simbolo esistente, e una collisione di nomi si risolve
  con un suffisso (« 2 », « 3 »…) invece di fallire. Il selettore rifiuta i file oltre **1 MB**
  prima di leggerne i byte. Dopo l'importazione di un SVG semplice l'applicazione riferisce quanti
  elementi non sicuri ha rimosso, se ce n'erano.
- **Comporre nell'applicazione.** **Nuovo simbolo utente** apre un editor per il nome, il markup
  SVG, l'impaginazione sulla dashboard (adattamento e ingombro iniziale) e le zone attive; una volta
  che il simbolo esiste, le modifiche valide si salvano da sole. La geometria dei morsetti
  deliberatamente **non** si modifica nell'applicazione: i morsetti tipizzati possono arrivare solo
  da un pacchetto, e i morsetti scritti nel pacchetto restano conservati in sola lettura attraverso
  le modifiche successive.
- **Chiedere a un'IA.** Due strade condividono esattamente lo stesso contratto. Tramite
  l'[endpoint MCP](agent) integrato, lo strumento `symbol_validate` esegue l'importazione a vuoto e
  `symbol_import` salva una nuova risorsa; entrambi portano il contratto completo nelle loro
  descrizioni. Da una chat esterna che non ha accesso all'applicazione, **Copia l'istruzione per la
  chat** nel pannello Simboli copia una richiesta autosufficiente; salva l'SVG o il pacchetto
  restituito come file e importalo qui.

Vedi [Logic](logic) per lo spazio di lavoro delle risorse che sta attorno.

## Preparare un SVG semplice {#prepare-a-plain-svg}

Si dà un `id` SVG stabile a ogni parte da collegare. Dopo l'importazione, quegli id compaiono
nei selettori di destinazione delle zone attive. Gli id e i nomi delle zone attive condividono una
sola grammatica: cominciano con una lettera o `_`, proseguono con lettere, cifre, `_`, `.`, `:` o
`-`, e sono lunghi al massimo 128 caratteri.

Gli attributi facoltativi `data-ganter-*` sono l'unico markup specifico di Ganter che un simbolo può
portare:

| Attributo | Su | Che cosa dichiara |
| --- | --- | --- |
| `data-ganter-pivot="x y"` | qualunque elemento collegabile | Il punto di rotazione esatto (coordinate del riquadro di visualizzazione) per le zone attive di rotazione, scala e rotazione continua. Obbligatorio sull'elemento di destinazione di quelle tre nature. |
| `data-ganter-spin-ratio` | un figlio di un elemento che ruota | La velocità relativa di un rotore figlio visibile. Finita, diversa da zero, di modulo al massimo 100; se negativa ruota nel senso opposto. Rimosso se l'elemento non dichiara anche il proprio punto di rotazione. |
| `data-ganter-role` | qualunque elemento | Un ruolo semantico stabile per gli strumenti di composizione. Solo informativo. |
| `data-ganter-fit-width` | `<text>` / `<tspan>` | Lettura contenuta, da attivare, per una zona attiva Text: quando il testo collegato misura più di questo numero di unità del riquadro di visualizzazione, il carattere si rimpicciolisce per stare dentro. |
| `data-ganter-fit-min-font-size` | `<text>` / `<tspan>` | La dimensione di carattere più piccola a cui l'adattamento può scendere. Sotto quella, l'elemento mostra il ripiego mentre il valore intero resta nel nome accessibile e nel suggerimento. |
| `data-ganter-fit-fallback` | `<text>` / `<tspan>` | Il testo mostrato quando nemmeno la dimensione di carattere minima riesce a contenere il valore. |

I morsetti di collegamento non vivono nell'SVG e non puntano a id di elementi SVG. Gli attributi
chiamati `data-ganter-port` o `data-ganter-port-*` non fanno parte del formato: l'importazione di un
SVG semplice li rimuove; un pacchetto severo che li contiene viene respinto.

L'importazione di un SVG semplice dà sempre un simbolo valido **solo visivo**: zero morsetti, zero
zone attive. L'ispettore riferisce che non esiste alcun morsetto collegabile perché ruolo, tipo,
direzione esterna e percorso interno non erano dichiarati. Ganter non deduce quei campi dal nome del
file, dalla categoria o dal disegno, e non apre alcun editor interno di morsetti o di percorsi.

## Che cosa accetta il depuratore {#what-the-sanitizer-accepts}

La stessa politica SVG vale per ogni strada (importazione di file, editor nell'applicazione, MCP,
pacchetto). È deliberatamente più stretta dell'SVG:

- **Conservato**: geometria e struttura inerti: `svg`, `g`, `defs`, `symbol`, `use`, `path`,
  `rect`, `circle`, `ellipse`, `line`, `polyline`, `polygon`, `text`, `tspan`, `title`,
  `desc`, `clipPath`, `mask`, `linearGradient`, `radialGradient`, `stop`, `pattern`, `marker`,
  con gli attributi di presentazione (riempimento, contorno, opacità, trasformazione, stile) e le
  etichette ARIA.
- **Rimosso o rifiutato**: `<script>`, `<style>`, `<foreignObject>`, i gestori di evento,
  l'animazione incorporata e qualunque URL esterno o `data:`/`file:`/`http(s)`. Sopravvivono solo i
  riferimenti interni `url(#id)` e `href="#id"`.
- **Limiti**: il markup può essere al massimo di **512 KB** e **4096 elementi**.

I colori sicuri sono i valori esadecimali, i colori CSS con nome, `rgb()`/`rgba()`/`hsl()`/`hsla()`
e i token di tema dell'applicazione `var(--color-<name>)` (per esempio `var(--color-success)`,
`var(--color-symbol-off)`). I token di tema sono il modo in cui un solo disegno si adatta al chiaro
e allo scuro: fornisci un disegno solo, che referenzia i token, mai due varianti di tema.

Come vengono trattate le violazioni dipende dalla strada: un **SVG semplice** viene corretto (gli
elementi non sicuri sono rimossi e ogni rimozione è segnalata come avviso); un **pacchetto** è
severo e viene respinto nominando le prime violazioni, invece di essere corretto in silenzio.

## Pacchetto portabile v2 {#portable-package-v2}

Esportare un simbolo crea un file `.ganter-symbol.json`. Ogni campo dell'involucro è obbligatorio; i
tre elenchi del contratto possono essere vuoti ma devono esserci:

| Campo | Requisito |
| --- | --- |
| `$schema` | Esattamente `https://ganterlab.com/schemas/ganter-symbol-v2.schema.json`. |
| `format` | Esattamente `ganter-symbol`. |
| `version` | Esattamente `2`. I pacchetti in versione 1 vengono respinti, non passati a un lettore di formato vecchio. |
| `name` | Il nome visualizzato. Un'importazione può sovrascriverlo, e una collisione riceve un suffisso automatico. |
| `svg` | SVG statico depurato la cui radice porta un `viewBox` uguale al campo `viewBox`. |
| `viewBox` | `minX minY width height`: quattro numeri finiti con larghezza e altezza positive. |
| `fit` | `contain`, `stretch`, `stretch-x` o `stretch-y`. |
| `footprint` | `{ "width": 1..24, "height": 1..12 }`, le celle di dashboard consigliate. |
| `slots` | Elenco di dichiarazioni di zona attiva (qui sotto). |
| `typeConfigurations` | Elenco di scelte di tipo condivise tra morsetti (qui sotto). |
| `terminals` | Elenco di massimo 16 morsetti completi (qui sotto). |
| `suggestions` | Elenco ordinato di composizioni dichiarate (qui sotto). |

Il [JSON Schema pubblico di Ganter symbol v2](/schemas/ganter-symbol-v2.schema.json) convalida
l'involucro di trasporto. L'importatore esegue poi i controlli semantici che il JSON Schema non può
esprimere: l'esistenza delle destinazioni nell'SVG, la geometria del percorso interno, la
compatibilità dei suggerimenti. Un pacchetto è severo su ogni fronte: markup non sicuro, campi
sconosciuti, voci nulle negli elenchi e i vecchi contratti `ports[]`, `anchors[]`, `profile` e
`connectionStyle` vengono respinti invece che corretti.

Il pacchetto non contiene mai un indirizzo di stazione, un collegamento di dashboard, una scelta di
tipo di una singola istanza, un GUID di database o l'identità di un utente. Una zona attiva che
porta un indirizzo di Logic non si può nemmeno esportare: l'indirizzo appartiene all'istanza posata,
non al simbolo riutilizzabile.

## Dimensione, riquadro di visualizzazione e adattamento {#size-view-box-and-fit}

Il **riquadro di visualizzazione** è lo spazio di coordinate naturale del simbolo. Morsetti e
percorsi interni sono dichiarati al suo interno, e deve corrispondere esattamente al `viewBox` della
radice SVG; un pacchetto i cui due riquadri non concordano viene respinto. I riquadri non quadrati
sono pienamente supportati, così un nastro trasportatore lungo non deve vivere dentro un quadrato.

Il **modo di adattamento** dice come il disegno usa il rettangolo di dashboard che l'operatore
traccia:

| Adattamento | Comportamento |
| --- | --- |
| `contain` | Mantiene le proporzioni; il disegno lascia bande vuote dentro il rettangolo di celle. È il predefinito. |
| `stretch` | Riempie il rettangolo nei due assi, deformando se serve. |
| `stretch-x` | Estende in orizzontale, mantiene la proporzione verticale naturale. |
| `stretch-y` | Estende in verticale, mantiene la proporzione orizzontale naturale. |

L'**ingombro** è la dimensione iniziale in celle della griglia di dashboard quando il simbolo viene
posato la prima volta: larghezza da 1 a 24, altezza da 1 a 12 (l'editor parte da 4 × 4). È un
suggerimento, non un vincolo; l'operatore poi ridimensiona liberamente.

Due controlli distinti limitano la dimensione di un'importazione: il selettore di file rifiuta
qualunque cosa superi **1 MB** prima di leggerla, e il depuratore rifiuta un markup oltre **512 KB**
o **4096 elementi**.

## Zone attive: la superficie di collegamento {#slots--the-binding-surface}

Una zona attiva dichiara un ingresso: quale elemento comanda, che cosa gli fa e come i valori di
ingresso si trasformano in uscita. L'istanza posata sulla dashboard sceglie poi la sorgente di ogni
zona attiva (un indirizzo di Logic o un valore fisso); il simbolo in sé non conserva mai una
sorgente.

Ogni zona attiva porta:

| Campo | Significato |
| --- | --- |
| `name` | Il nome del parametro mostrato a chi compone la dashboard. Grammatica di identificatore descritta sopra; univoco tra le zone attive del simbolo. |
| `elementId` | L'`id` di un elemento SVG esistente. Un elemento accetta al massimo una zona attiva per canale, così due zone attive non possono contendersi il riempimento dello stesso elemento. |
| `kind` | Una delle tredici nature qui sotto. |
| `inMin`, `inMax` | L'intervallo di ingresso: i due valori che corrispondono a `outMin`/`outMax`. Numeri finiti; usati dalle nature continue e come punto di commutazione da `fill`/`stroke`. |
| `outMin`, `outMax` | L'intervallo di uscita nell'unità della natura (gradi, unità del riquadro di visualizzazione, 0..1, gradi al secondo). Numeri finiti. |
| `outMinSecondary`, `outMaxSecondary` | Secondo asse di uscita facoltativo, solo per `translate` e `scale`: l'uscita primaria è X e quella secondaria è Y. O entrambi o nessuno. |
| `onColor`, `offColor` | Colori sicuri per `fill`/`stroke` (i due stati di commutazione). Per `fillColor`/`strokeColor`, `onColor` è il colore di anteprima dell'ispettore. |

Le tredici nature di zona attiva:

| Natura | Che cosa comanda | Note |
| --- | --- | --- |
| `rotate` | Ruota l'elemento; l'ingresso si trasforma linearmente in gradi. | La destinazione deve dichiarare `data-ganter-pivot`. |
| `opacity` | L'opacità dell'elemento; l'ingresso si trasforma in 0..1. | |
| `fill` | Dipinge il riempimento con `offColor` sotto la metà dell'intervallo di ingresso e con `onColor` a partire da essa. Un ingresso Bool commuta direttamente. | Punta alle forme riempibili (non a `<line>`). |
| `visible` | Mostra o nasconde l'elemento secondo la verità del valore. | |
| `text` | Sostituisce il contenuto testuale dell'elemento con il valore formattato. | Punta solo a `<text>`/`<tspan>`; da combinare con gli attributi `data-ganter-fit-*` per una lettura contenuta. |
| `translate` | Sposta l'elemento in unità del riquadro di visualizzazione; l'uscita primaria è X, quella secondaria facoltativa è Y. | |
| `scale` | Scala l'elemento; l'uscita primaria è X, la secondaria è Y (se omessa, la scala è uniforme). | La destinazione deve dichiarare `data-ganter-pivot`. |
| `stroke` | Dipinge il contorno con la stessa regola di soglia di `fill`. | |
| `spin` | Rotazione continua nel tempo; l'ingresso si trasforma in velocità angolare in gradi al secondo. I figli con `data-ganter-spin-ratio` ruotano insieme al rapporto dichiarato. | La destinazione deve dichiarare `data-ganter-pivot`. Il movimento è temporizzato dall'applicazione e indipendente dalle preferenze di animazione del sistema operativo. |
| `spinEnabled` | Mette in pausa o riprende la zona attiva `spin` sullo stesso elemento senza nasconderlo. | Richiede una zona attiva `spin` che punti allo stesso elemento. |
| `fillColor` | Imposta il riempimento direttamente dal valore di colore collegato (una risorsa Colore, una variabile Colore o un colore CSS sicuro). | |
| `strokeColor` | Imposta il contorno direttamente dal valore di colore collegato. | |
| `strokeWidth` | Imposta direttamente la larghezza del contorno, in unità utente SVG da **0.5 a 32**; nessun suffisso di unità e nessun CSS accettati. | Un ingresso non valido, non risolto o di cattiva qualità ripristina lo `stroke-width` dichiarato; lo stesso fanno l'azzeramento, il rimontaggio e la dismissione. |

Queste zone attive danno stile al disegno; non danno mai stile ai tratti di collegamento delle
dashboard, il cui colore e la cui larghezza sono globali per tipo di tratto.

## A chi appartiene il collegamento {#binding-ownership}

Il simbolo dichiara i parametri e le scelte di tipo permesse, non le sorgenti vive né la selezione
di un'istanza. Dopo aver posato un componente Simbolo, l'operatore associa ogni zona attiva a un
indirizzo di Logic o a un valore fisso e sceglie ogni tipo di tratto configurabile su quell'istanza.
Quelle scelte restano dentro la stazione e non vengono mai esportate con il simbolo riutilizzabile.
Le zone attive non associate restano neutre: l'elemento conserva l'aspetto con cui è stato disegnato.

## Posizioni globali e tipi di tratto {#global-positions-and-connection-types}

Ogni morsetto fa riferimento a una posizione del catalogo fisso di sedici ancoraggi sul perimetro.
Un pacchetto salva solo `anchorId`; non ripete né sovrascrive mai delle coordinate. Le posizioni,
come frazioni normalizzate del riquadro di visualizzazione:

- in alto: `top-left` (0, 0), `top-25` (0.25, 0), `top-50` (0.5, 0), `top-75` (0.75, 0),
  `top-right` (1, 0);
- a destra: `right-25` (1, 0.25), `right-50` (1, 0.5), `right-75` (1, 0.75);
- in basso, in senso orario: `bottom-right` (1, 1), `bottom-75` (0.75, 1),
  `bottom-50` (0.5, 1), `bottom-25` (0.25, 1), `bottom-left` (0, 1);
- a sinistra, proseguendo in senso orario: `left-75` (0, 0.75), `left-50` (0, 0.5),
  `left-25` (0, 0.25).

Queste sono posizioni sul perimetro, non una griglia 5×5. Un simbolo non può aggiungere un'altra
posizione né salvare coordinate di ancoraggio proprie.

Gli otto tipi di tratto globali sono `liquid`, `gas`, `air-duct`, `electrical`, `signal`,
`network`, `material` e `mechanical-shaft`. Usa **Logic > Assets > Connection types** per configurare
il colore e la larghezza visiva del contorno associati a ogni tipo. Simboli e tratti conservano l'id
stabile del tipo, quindi un cambiamento globale ridisegna ogni percorso che lo usa. Un pacchetto non
copia mai il colore o la larghezza e non ha varianti di percorso piccole, normali o grandi.

Due estremità formano un tratto definito quando si risolvono nello stesso tipo. Il ruolo del
morsetto aiuta la composizione e la revisione, ma da solo non vieta una disposizione di rete.

## Scelte di tipo condivise {#shared-type-choices}

Un simbolo che può lavorare con più di un fluido dichiara una configurazione di tipo condivisa
invece di duplicare il proprio disegno:

```json
{
  "id": "process-type",
  "name": "Process type",
  "allowedTypes": ["liquid", "gas"],
  "defaultType": "liquid"
}
```

L'`id` è una chiave stabile: lettere minuscole e cifre con trattini singoli, che comincia e finisce
con un carattere alfanumerico (le maiuscole vengono rifiutate). `allowedTypes` non è vuoto e
contiene id di tipo globale univoci; `defaultType` deve appartenergli; `name` è obbligatorio. Ogni
morsetto che fa riferimento a `process-type` segue l'unica scelta fatta sull'istanza posata sulla
dashboard. Una definizione può portare più configurazioni indipendenti, per esempio il fluido di
processo e quello di sfiato, mentre altri morsetti restano fissi.

## Morsetti completi {#complete-terminals}

Ogni morsetto collegabile dichiara una posizione globale, un ruolo, esattamente un tipo fisso
**oppure** una configurazione condivisa, una direzione verso l'esterno nell'orientamento originale e
un percorso interno di arrivo:

```json
{
  "anchorId": "left-50",
  "role": "input",
  "typeConfiguration": "process-type",
  "direction": "west",
  "internalPath": [
    { "x": 18, "y": 50 },
    { "x": 36, "y": 50 },
    { "x": 48, "y": 62 }
  ]
}
```

Le regole, tutte applicate all'importazione:

- Al massimo **16** morsetti, e ogni id di ancoraggio usato al massimo una volta.
- `role` è `input`, `output` o `bidirectional`; `direction` è `north`, `east`, `south` o
  `west`.
- Esattamente uno tra `type` (un tipo di tratto globale) e `typeConfiguration` (l'id di una
  configurazione dichiarata), mai entrambi, mai nessuno dei due.
- L'ancoraggio globale convertito nel riquadro di visualizzazione naturale dell'SVG è l'inizio
  implicito di `internalPath`; non ripeterlo come primo punto. Le coordinate sono valori assoluti
  del riquadro, non frazioni normalizzate, e il percorso ha almeno un punto.
- Ogni segmento resta dentro il riquadro di visualizzazione, ha lunghezza diversa da zero ed è
  orizzontale, verticale o esattamente a 45°; due segmenti consecutivi girano al massimo di 90°.
- I morsetti richiedono che l'SVG porti un riquadro di visualizzazione.

La dashboard disegna il percorso interno sotto il disegno dell'apparecchiatura, lo trasforma con il
ridimensionamento, la rotazione di un quarto di giro e i ribaltamenti, e mantiene la larghezza
visiva del tipo di tratto globale invece di scalarla con il simbolo, così un solo tratto continuo
corre dall'interno di un corpo all'interno dell'altro.

Un morsetto è tutto o niente. Un pacchetto severo con un morsetto parziale non è valido; un
pacchetto solo visivo usa invece un elenco `terminals` vuoto. Nulla viene mai dedotto per riempire
un vuoto.

## Suggerimenti ordinati {#ordered-suggestions}

Un suggerimento registra una composizione voluta, compresa la posa esatta della destinazione:

```json
{
  "sourceAnchorId": "right-75",
  "targetSymbol": "system:capping-station",
  "targetAnchorId": "left-75",
  "targetRotationDegrees": 0,
  "targetFlipHorizontal": false,
  "targetFlipVertical": false,
  "connectionType": "material"
}
```

Convalida: `sourceAnchorId` deve essere uno dei morsetti di questo simbolo; `targetSymbol` deve
essere un riferimento qualificato dall'origine, e in un pacchetto portabile può essere solo
`system:<stable-key>` (un GUID utente ha senso solo dentro la stazione che lo possiede) e deve
nominare un simbolo che esiste nel catalogo di sistema con un morsetto in `targetAnchorId`; la
rotazione è `0`, `90`, `180` o `270` e i due contrassegni di ribaltamento sono obbligatori; ogni
suggerimento deve essere univoco. `connectionType` si può omettere solo quando i tipi fissi uguali
alle due estremità risolvono la situazione senza ambiguità; è obbligatorio quando una delle due
estremità è configurabile, e allora deve essere ammesso da entrambe.

I suggerimenti hanno un verso e l'ordine dell'elenco stabilisce la priorità, ma non sono mai un
elenco di permessi per i tratti ordinari della dashboard. Con un elenco `suggestions` vuoto
l'ispettore riferisce che non esiste alcuna composizione suggerita, invece di inventarsi un partner
di catalogo.

## Che cosa rifiuta l'importazione {#what-the-import-refuses}

Un elenco rapido dei rifiuti, così un'importazione fallita si legge invece di doverla indovinare.
Per un SVG semplice vale solo il primo gruppo, e al suo interno rifiutano l'importazione solo i
limiti di dimensione, l'XML malformato e la mancanza della radice `<svg>`: il markup non ammesso
viene invece corretto con un avviso. Per un pacchetto, tutto quello che segue è un rifiuto netto.

**Disegno**

- Un file oltre 1 MB, un markup oltre 512 KB, o più di 4096 elementi.
- XML malformato, o una radice che non è un `<svg>` depurato.
- In un pacchetto: qualunque markup che l'elenco delle cose ammesse avrebbe dovuto rimuovere
  (script, gestori di evento, riferimenti esterni, elementi o attributi non ammessi).
- Un `viewBox` che non sia quattro numeri finiti con larghezza e altezza positive, o che differisca
  da quello della radice SVG; un pacchetto senza alcun riquadro di visualizzazione alla radice.

**Involucro**

- Uno schema, un formato o una versione diversi dal contratto v2; campi sconosciuti in qualunque
  punto; un `name`, un `fit`, un `footprint` o uno dei tre elenchi mancante; una voce nulla dentro
  un elenco.
- Un `fit` fuori dai quattro modi; un ingombro fuori da 1..24 × 1..12.

**Zone attive di ingresso**

- Un nome o un id di elemento fuori dalla grammatica degli identificatori; un nome di zona attiva
  duplicato; un id di destinazione che l'SVG non contiene; una natura che l'elemento di destinazione
  non può accettare (testo su un elemento non testuale, riempimento su una `<line>`).
- Una zona attiva `rotate`, `spin` o `scale` la cui destinazione non ha un `data-ganter-pivot`
  finito; una zona attiva `spinEnabled` senza una zona attiva `spin` sullo stesso elemento.
- Due zone attive sullo stesso canale di un elemento. Ogni natura è un canale a sé, salvo che
  `fill` e `fillColor` condividono il canale del riempimento e `stroke` e `strokeColor` quello del
  contorno, quindi un elemento non può prendere due rotazioni più di quanto possa prendere due
  riempimenti.
- Numeri di intervallo non finiti; un'uscita secondaria con una sola estremità, o su una natura
  diversa da `translate`/`scale`; un colore non sicuro; una zona attiva che porta un indirizzo di
  Logic.

**Tratti**

- Più di 16 morsetti; un id di ancoraggio ripetuto o sconosciuto; un morsetto con entrambi o con
  nessuno tra `type` e `typeConfiguration`; un id di tipo o di configurazione sconosciuto; un
  percorso interno non valido (fuori dal riquadro di visualizzazione, segmenti di lunghezza zero o
  con angoli non ammessi, una svolta oltre 90°).
- Una configurazione di tipo con un id non valido, senza nome, con tipi ammessi duplicati o
  sconosciuti, oppure con un valore predefinito fuori dal proprio elenco.
- Un suggerimento il cui morsetto di partenza non esiste, la cui destinazione non è un simbolo di
  sistema con il morsetto nominato, la cui posa non è un quarto di giro, o il cui tipo di tratto non
  è accettato da entrambe le estremità.

`symbol_validate` sull'[endpoint MCP](agent) esegue esattamente questa importazione a vuoto e
riferisce ogni errore, avviso e nota senza salvare nulla.

## Impacchettare e condividere {#packaging-and-sharing}

**Esporta il pacchetto** (disponibile allo stesso modo per i simboli di sistema e per quelli dell'operatore) scarica
`<name>.ganter-symbol.json` con il disegno depurato e il contratto completo: `$schema`,
`format`, `version`, `name`, `svg`, `viewBox`, `fit`, `footprint`, `slots[]`,
`typeConfigurations[]`, `terminals[]` e `suggestions[]`, con i tre elenchi di collegamento
presenti anche quando sono vuoti.
Che cosa non viaggia mai: gli indirizzi di stazione, le scelte di tipo delle singole istanze,
l'identità nel database, l'identità dell'utente, e i colori e le larghezze dei tipi di tratto della
stazione.

Sulla stazione che riceve, lo stesso file passa da **Importa simbolo** (o da `symbol_import` via
MCP) e arriva come nuovo simbolo utente, morsetti compresi. Poiché l'identità del tipo è un id
stabile e l'aspetto è globale, i percorsi di un simbolo importato seguono subito lo stile dei tipi
di tratto della stazione che lo riceve.
