# Sistema di design Esri Calcite

## Anteprima dell’interfaccia di sistema di design Esri Calcite

Seleziona un sito dall’elenco o dallo schema, filtra gli stati di revisione e convalida una nota che resta associata al sito fino al ricaricamento.

## Riferimento di design di sistema di design Esri Calcite

Token di design di Calcite 4.1.0 e API del componente attuale, verificati insieme a Components 5.1.2. Il pacchetto dei token e quello dei componenti hanno numeri di versione distinti. L’esempio incorporato è un’interpretazione originale di HTML/CSS; non ridistribuisce il runtime di Calcite né dichiara di riprodurne il comportamento nativo.

### Superfici, testo e interazioni del tema chiaro

| Nome / regola | Valore / configurazione | Utilizzo |
| --- | --- | --- |
| --calcite-color-surface-1 | #f7f7f7 | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
| --calcite-color-surface-2 | #ffffff | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
| --calcite-color-surface-3 | #f2f2f2 | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
| --calcite-color-surface-4 | #ebebeb | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
| --calcite-color-surface-highlight | #d6efff | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
| --calcite-color-text-1 | #141414 | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
| --calcite-color-text-2 | #4a4a4a | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
| --calcite-color-text-3 | #6b6b6b | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
| --calcite-color-text-inverse | #ffffff | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
| --calcite-color-text-link | #00619b | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
| --calcite-color-border-1 | #d4d4d4 | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
| --calcite-color-border-2 | #dedede | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
| --calcite-color-border-3 | #ebebeb | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
| --calcite-color-border-input | #949494 | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
| --calcite-color-brand | #007ac2 | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
| --calcite-color-brand-hover | #00619b | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
| --calcite-color-brand-press | #004874 | Riferimento semantico per il ruolo indicato dal token; la selezione e i bordi dei campi richiedono livelli di contrasto diversi. |
### Scala delle spaziature attuale

| Nome / regola | Valore / configurazione | Utilizzo |
| --- | --- | --- |
| --calcite-space-none | 0 | Famiglia attuale di token per la spaziatura. Gli incrementi in rem seguono la dimensione radice; evita di mescolarli con alias di spaziatura deprecati. |
| --calcite-space-px | 1px | Famiglia attuale di token per la spaziatura. Gli incrementi in rem seguono la dimensione radice; evita di mescolarli con alias di spaziatura deprecati. |
| --calcite-space-base | 2px | Famiglia attuale di token per la spaziatura. Gli incrementi in rem seguono la dimensione radice; evita di mescolarli con alias di spaziatura deprecati. |
| --calcite-space-2xs | 0.25rem | Famiglia attuale di token per la spaziatura. Gli incrementi in rem seguono la dimensione radice; evita di mescolarli con alias di spaziatura deprecati. |
| --calcite-space-xs | 0.375rem | Famiglia attuale di token per la spaziatura. Gli incrementi in rem seguono la dimensione radice; evita di mescolarli con alias di spaziatura deprecati. |
| --calcite-space-sm | 0.5rem | Famiglia attuale di token per la spaziatura. Gli incrementi in rem seguono la dimensione radice; evita di mescolarli con alias di spaziatura deprecati. |
| --calcite-space-sm-plus | 0.625rem | Famiglia attuale di token per la spaziatura. Gli incrementi in rem seguono la dimensione radice; evita di mescolarli con alias di spaziatura deprecati. |
| --calcite-space-md | 0.75rem | Famiglia attuale di token per la spaziatura. Gli incrementi in rem seguono la dimensione radice; evita di mescolarli con alias di spaziatura deprecati. |
| --calcite-space-md-plus | 0.875rem | Famiglia attuale di token per la spaziatura. Gli incrementi in rem seguono la dimensione radice; evita di mescolarli con alias di spaziatura deprecati. |
| --calcite-space-lg | 1rem | Famiglia attuale di token per la spaziatura. Gli incrementi in rem seguono la dimensione radice; evita di mescolarli con alias di spaziatura deprecati. |
| --calcite-space-xl | 1.25rem | Famiglia attuale di token per la spaziatura. Gli incrementi in rem seguono la dimensione radice; evita di mescolarli con alias di spaziatura deprecati. |
| --calcite-space-2xl | 1.5rem | Famiglia attuale di token per la spaziatura. Gli incrementi in rem seguono la dimensione radice; evita di mescolarli con alias di spaziatura deprecati. |
| --calcite-space-3xl | 2rem | Famiglia attuale di token per la spaziatura. Gli incrementi in rem seguono la dimensione radice; evita di mescolarli con alias di spaziatura deprecati. |
| --calcite-space-4xl | 2.75rem | Famiglia attuale di token per la spaziatura. Gli incrementi in rem seguono la dimensione radice; evita di mescolarli con alias di spaziatura deprecati. |
### Scala tipografica e dei raggi degli angoli

| Nome / regola | Valore / configurazione | Utilizzo |
| --- | --- | --- |
| --calcite-corner-radius-none | 0 | Valori pubblicati, non misure dedotte da uno screenshot. |
| --calcite-corner-radius-xs | 2px | Valori pubblicati, non misure dedotte da uno screenshot. |
| --calcite-corner-radius-sm | 4px | Valori pubblicati, non misure dedotte da uno screenshot. |
| --calcite-corner-radius-pill | 9999px | Valori pubblicati, non misure dedotte da uno screenshot. |
| --calcite-font-size-xs | 10px | Valori pubblicati, non misure dedotte da uno screenshot. |
| --calcite-font-size-sm | 12px | Valori pubblicati, non misure dedotte da uno screenshot. |
| --calcite-font-size | 14px | Valori pubblicati, non misure dedotte da uno screenshot. |
| --calcite-font-size-md | 16px | Valori pubblicati, non misure dedotte da uno screenshot. |
| --calcite-font-size-lg | 18px | Valori pubblicati, non misure dedotte da uno screenshot. |
| --calcite-font-size-xl | 20px | Valori pubblicati, non misure dedotte da uno screenshot. |
| --calcite-font-size-2xl | 24px | Valori pubblicati, non misure dedotte da uno screenshot. |
### Componente di input API

| Nome / regola | Valore / configurazione | Utilizzo |
| --- | --- | --- |
| scale | s / m / l; default m | Modifica intenzionalmente la scala del componente; non equivale a cambiare lo zoom della pagina. |
| status | idle / valid / invalid | Comunica la validità del campo con un messaggio, non solo con il colore. |
| labelText | string | Testo dell’etichetta visibile nell’attuale input API. |
| validationMessage | string | Spiega l’errore di inserimento accanto al controllo. |
| calciteInputInput | event | Leggi event.target.value mentre l’utente digita. |
| setFocus() | Promise<void> | Dopo un errore di convalida dell’applicazione, sposta il focus sul componente nativo. |
## Guida completa di sistema di design Esri Calcite

Una guida pratica per scegliere, applicare e valutare questo sistema in un’interfaccia reale.

Indicazioni complete, un punto di partenza per l’implementazione e link alle fonti.

## Architettura di sistema di design Esri Calcite per aree di lavoro e pannelli

### Mantieni visibile il contesto dell’oggetto

> Un’attività spaziale ha di solito almeno due contesti: l’area esaminata e l’oggetto selezionato. L’esempio affianca un piccolo elenco di siti a uno schema originale e a un pannello di ispezione. Selezionando una riga dell’elenco o un pin si imposta lo stesso ID stabile del sito, così il nome, lo stato e la nota non possono riferirsi per errore a oggetti diversi.

### Distingui l’illustrazione da una mappa reale

L’SVG mostra la relazione tra un elenco e una superficie spaziale. Non contiene proiezioni, coordinate, livelli, zoom, geocodifica né instradamento. La didascalia visibile lo definisce uno schema non in scala. Una vista ArcGIS di produzione richiede una propria integrazione con SDK, dati e interventi di accessibilità; un contenitore Calcite da solo non offre queste funzionalità.

## Ruoli semantici dei colori di sistema di design Esri Calcite

### Usa le superfici per separare gli strumenti senza ricorrere a riquadri marcati

Il riferimento distingue surface-1, surface-2, surface-3 e surface-4, riservando surface-highlight all’enfasi. L’esempio usa un pannello di ispezione bianco su uno sfondo bianco sporco, sobrio, e una riga selezionata azzurro pallido. Bordi neutri sottili delimitano i pannelli senza aggiungere un riquadro sospeso attorno a ogni campo.

### Attribuisci al blu un significato coerente nelle interazioni

I colori del brand, di hover e di pressione formano una sequenza progressivamente più scura: da #007ac2 a #00619b e #004874. Il pin selezionato e l’azione primaria di salvataggio usano questa famiglia per ruoli di interazione diversi. Gli stati di revisione testuali e il messaggio di convalida della nota restano comprensibili anche senza fare affidamento soltanto sul colore.

## Tipografia e densità informativa di sistema di design Esri Calcite

### Mantieni la gerarchia delle informazioni in formato ridotto

I riferimenti tipografici assoluti pubblicati includono testo piccolo da 12px, testo base da 14px, testo medio da 16px e testo extra-large da 20px. L’esempio abbina un titolo dell’area di lavoro da 20px a intestazioni dei pannelli da 16px e controlli da 14px. I metadati sono più piccoli, ma non sono mai l’unico elemento che identifica l’oggetto selezionato.

### Distingui un font di fallback da quello del brand

Questo esempio indipendente usa Arial e font di sistema di fallback. Non include font con il brand Esri né definisce Avenir tale font di fallback. Un’integrazione nativa autorizzata deve seguire le risorse e la configurazione del tema della versione di Calcite fissata. La modifica del font può influire sulle interruzioni di riga e sulla larghezza dei controlli: verifica quindi le risorse effettivamente distribuite.

## Token di spaziatura e pannelli adattivi di sistema di design Esri Calcite

### Scegli i nomi attuali dei token

Il riferimento usa la scala attuale --calcite-space-*, che combina valori in pixel per gli incrementi più piccoli e valori in rem per quelli più ampi. Per implementare un tema nativo, usa questi ruoli denominati in modo coerente. Il layout dell’applicazione in questo esempio usa valori CSS espliciti, così l’interpretazione può funzionare senza importare pacchetti con accesso limitato.

### Ridispone il pannello di ispezione prima di comprimere il campo

Al breakpoint originale dell’applicazione, il pannello di ispezione si sposta sotto l’elenco e l’illustrazione. Su un telefono stretto, le tre aree si dispongono in sequenza verticale. L’area di testo resta a larghezza intera, con etichetta, testo di supporto e azione di salvataggio. Questi breakpoint sono scelte di layout definite dall’applicazione, non valori attribuiti ai token di Calcite.

## Comportamento di selezione e filtraggio di sistema di design Esri Calcite

### Usa un unico identificatore per la selezione

L’elenco e lo schema condividono la selezione tramite A-01, B-02 e C-03, non in base alla posizione corrente negli array. Filtrando per Checked viene selezionato il sito corrispondente disponibile e il pannello di ispezione si aggiorna di conseguenza. Gli stati di pressione sono esposti sia sul pulsante della riga nell’elenco sia sul pin corrispondente.

### Tieni separate le note salvate dalle bozze non salvate

Una nota salvata viene archiviata in una Map indicizzata per ID del sito. Tornando al sito, la nota viene ripristinata; cambiando sito senza salvare, il testo non salvato viene sostituito. Il testo di supporto specifica esplicitamente che i dati sono locali. Un editor di produzione dovrebbe proteggere le modifiche non salvate se la perdita di una bozza comporta conseguenze rilevanti.

## Convalida dell’input e recupero in sistema di design Esri Calcite

### Quando adotti Calcite, usa l’effettivo input nativo API

L’esempio nativo usa labelText, value, status e validationMessage. L’evento calciteInputInput può rimuovere un errore non più attuale, mentre setFocus() riporta l’attenzione sul componente dopo l’esito negativo di una regola applicativa. Questi sono nomi pubblici di API, diversamente dall’accesso allo shadow root per trovare un input interno.

### Non confondere una conferma locale con la persistenza di un servizio

L’anteprima indipendente richiede almeno dieci caratteri dopo aver rimosso gli spazi iniziali e finali e limita il campo a 240 caratteri. La conferma identifica il sito e specifica che il salvataggio è locale. Ricaricando la pagina, le note vengono cancellate. Una versione connessa alla rete richiederebbe comportamenti per attesa, errore, nuovo tentativo e conflitti; il messaggio di salvataggio locale non ne implica nessuno.

1. Prova a salvare una nota vuota o breve e leggi l’errore.

2. Inserisci una nota più lunga, salvala, seleziona un altro sito e poi torna al precedente.

3. Ricarica la pagina per verificare che l’esempio non prometta la persistenza dei dati.

## Alternative spaziali accessibili in sistema di design Esri Calcite

### Fornisci un’alternativa in forma di elenco per ogni pin

Ogni pin interattivo ha un pulsante testuale nell’elenco dei siti. La mappa illustrata non è quindi l’unico modo per selezionare un oggetto. Il relativo SVG ha una descrizione concisa, mentre i controlli hanno nomi propri e indicatori di focus visibili. Una mappa reale richiede più di una semplice copia del testo alternativo dello schema.

### Posiziona la convalida accanto al campo

La textarea fa riferimento sia al testo di supporto sia all’errore tramite aria-describedby. In caso di errore, riceve aria-invalid e il focus; quando si modifica il testo, lo stato di errore obsoleto viene rimosso. La conferma usa un’area di stato. Gli utenti da tastiera possono selezionare un sito, inserire una nota e salvarla senza interagire con una forma geografica disegnata.

## Esri Calcite Versione del sistema di design e limiti di integrazione

### Blocca le versioni dei pacchetti e verifica i requisiti di licenza

Components 5.1.2 e design tokens 4.1.0 sono pacchetti distinti. La pagina delle licenze attuale descrive la disponibilità con un account ArcGIS Online, Enterprise o Location Platform. Non applicare al pacchetto attuale ipotesi basate su una precedente versione open source. Il codice sorgente nativo qui sotto è destinato a un progetto che soddisfa tali requisiti.

- Components: 5.1.2.

- Riferimento dei design token: 4.1.0.

- Anteprima: HTML, CSS e JavaScript indipendenti; nessun runtime Esri.

### Registra solo i componenti che utilizzi

L’esempio minimo del modulo importa i punti di ingresso dei componenti input e button, quindi ne usa proprietà ed eventi pubblici. L’esempio completo e indipendente HTML può essere eseguito da solo; il frammento nativo è un punto di ingresso alternativo per un progetto Vite con il pacchetto bloccato installato. È stato verificato rispetto alla API pubblica, ma non viene presentato come il runtime compilato alla base dello schema.

## Esri Calcite Esempi di componenti del sistema di design

### Esempio indipendente per l’ispezione dei siti

Esempio completo e autonomo di HTML, CSS e JavaScript utilizzato da questa anteprima. Salvalo come index.html e aprilo in un browser.

```
<!doctype html>
<html lang="en">
  <meta charset="utf-8" /><meta
    name="viewport"
    content="width=device-width,initial-scale=1"
  /><title>Site inspection panel</title
  ><style>
    * {
      box-sizing: border-box;
    }
    body {
      margin: 0;
      font:
        14px/1.5 Arial,
        sans-serif;
      color: #141414;
      background: #f7f7f7;
    }
    button,
    input,
    select,
    textarea {
      font: inherit;
    }
    button {
      cursor: pointer;
    }
    button:focus-visible,
    input:focus-visible,
    select:focus-visible,
    textarea:focus-visible {
      outline: 2px solid #007ac2;
      outline-offset: 3px;
    }
    header {
      padding: 20px 24px;
      background: #fff;
      border-bottom: 1px solid #d4d4d4;
      display: flex;
      justify-content: space-between;
      gap: 16px;
      align-items: center;
    }
    h1 {
      font-size: 20px;
      margin: 0;
    }
    header p {
      margin: 2px 0 0;
      color: #6b6b6b;
      font-size: 12px;
    }
    .badge {
      background: #d6efff;
      color: #004874;
      padding: 4px 8px;
      font-size: 12px;
    }
    .layout {
      display: grid;
      grid-template-columns: 240px minmax(0, 1fr) 280px;
      min-height: 510px;
    }
    .sites,
    .inspector {
      background: #fff;
      padding: 20px;
      border-right: 1px solid #d4d4d4;
    }
    .inspector {
      border-right: 0;
      border-left: 1px solid #d4d4d4;
    }
    h2 {
      font-size: 16px;
      margin: 0 0 16px;
    }
    label {
      display: block;
      font-weight: 600;
      margin: 12px 0 6px;
    }
    select,
    textarea {
      width: 100%;
      border: 1px solid #949494;
      background: #fff;
      padding: 8px;
      color: inherit;
    }
    textarea {
      resize: vertical;
      min-height: 96px;
    }
    .site {
      display: block;
      width: 100%;
      text-align: left;
      background: #fff;
      border: 1px solid #dedede;
      padding: 12px;
      margin-top: 8px;
    }
    .site[aria-pressed="true"] {
      border-left: 4px solid #007ac2;
      background: #d6efff;
    }
    .site small {
      display: block;
      color: #4a4a4a;
      margin-top: 3px;
    }
    .map {
      position: relative;
      overflow: hidden;
      min-height: 360px;
      background: #ebebe5;
    }
    .map svg {
      width: 100%;
      height: 100%;
      position: absolute;
      inset: 0;
    }
    .map-caption {
      position: absolute;
      bottom: 12px;
      left: 12px;
      padding: 4px 8px;
      background: #fff;
      font-size: 12px;
    }
    .pin {
      position: absolute;
      width: 36px;
      height: 36px;
      border-radius: 50%;
      border: 3px solid #fff;
      background: #007ac2;
      color: #fff;
      font-weight: bold;
      box-shadow: 0 2px 8px #0004;
    }
    .pin[aria-pressed="true"] {
      background: #004874;
      outline: 3px solid #007ac2;
      outline-offset: 3px;
    }
    .pin[hidden] {
      display: none;
    }
    dl {
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: 8px;
      font-size: 12px;
    }
    dt {
      color: #6b6b6b;
    }
    dd {
      margin: 0;
      text-align: right;
    }
    .primary {
      background: #007ac2;
      color: white;
      border: 0;
      width: 100%;
      padding: 10px;
      margin-top: 12px;
    }
    .primary:hover {
      background: #00619b;
    }
    .error {
      color: #a11b1b;
      font-size: 12px;
    }
    .saved {
      color: #237000;
      font-size: 12px;
    }
    footer {
      padding: 16px 24px;
      border-top: 1px solid #d4d4d4;
      color: #6b6b6b;
      font-size: 12px;
      background: #fff;
    }
    @media (max-width: 1000px) {
      .layout {
        grid-template-columns: 210px minmax(0, 1fr);
      }
      .inspector {
        grid-column: 1/-1;
        border-left: 0;
        border-top: 1px solid #d4d4d4;
      }
      .inspector form {
        max-width: 640px;
      }
    }
    @media (max-width: 550px) {
      header {
        align-items: flex-start;
        flex-direction: column;
      }
      .layout {
        display: flex;
        flex-direction: column;
      }
      .sites {
        border-right: 0;
      }
      .map {
        height: 300px;
        min-height: 300px;
      }
      .inspector {
        padding: 20px;
      }
      .site {
        display: inline-block;
        width: 100%;
      }
    }
  </style>
  <body>
    <header>
      <div>
        <h1>Field inspection workspace</h1>
        <p>Original Calcite-inspired layout study · fictional site data</p>
      </div>
      <span class="badge">Local notes only</span>
    </header>
    <main class="layout">
      <aside class="sites">
        <h2>Inspection sites</h2>
        <label for="filter">Show sites</label
        ><select id="filter">
          <option value="all">All sites</option>
          <option value="review">Needs review</option>
          <option value="checked">Checked</option>
        </select>
        <div id="site-list"></div>
        <p id="count" aria-live="polite"></p>
      </aside>
      <section class="map" aria-label="Illustrated site plan">
        <svg
          viewBox="0 0 700 510"
          preserveAspectRatio="xMidYMid slice"
          role="img"
          aria-label="Original schematic with a river, roads and three inspection sites; not a geographic map"
        >
          <rect width="700" height="510" fill="#e4e8db" />
          <path
            d="M480 -50Q230 110 440 260T360 570"
            fill="none"
            stroke="#b6dbe9"
            stroke-width="100"
          />
          <path
            d="M-20 150L720 280M160 -20L290 530M-20 400L720 80"
            stroke="#fff"
            stroke-width="22"
          />
          <path
            d="M-20 150L720 280M160 -20L290 530M-20 400L720 80"
            stroke="#c8c8bf"
            stroke-width="2"
          />
          <g fill="#c4cfb5">
            <rect x="50" y="50" width="100" height="70" />
            <rect x="510" y="340" width="130" height="80" />
            <rect x="80" y="260" width="70" height="60" />
          </g>
        </svg>
        <div id="pins"></div>
        <span class="map-caption">Schematic illustration · not to scale</span>
      </section>
      <aside class="inspector">
        <h2 id="site-title">North access</h2>
        <dl>
          <dt>Site ID</dt>
          <dd id="site-id"></dd>
          <dt>Review state</dt>
          <dd id="site-state"></dd>
        </dl>
        <form id="note-form" novalidate>
          <label for="note">Inspection note</label
          ><textarea
            id="note"
            aria-describedby="note-help error"
            maxlength="240"
          ></textarea>
          <p id="note-help">
            Add 10–240 characters. Notes stay in this page until reload.
          </p>
          <p id="error" class="error" hidden>
            Write at least 10 characters before saving.
          </p>
          <button class="primary" type="submit">Save local note</button>
          <p id="saved" class="saved" role="status"></p>
        </form>
      </aside>
    </main>
    <footer>
      Independent HTML/CSS interpretation by OpenDesign. No Calcite runtime,
      Esri fonts, ArcGIS map or service is loaded.
    </footer>
    <script>
      const sites = [
        { id: "A-01", name: "North access", state: "review", x: 29, y: 24 },
        { id: "B-02", name: "River crossing", state: "review", x: 62, y: 48 },
        { id: "C-03", name: "South garden", state: "checked", x: 34, y: 76 },
      ];
      let selected = "A-01";
      const notes = new Map(),
        list = document.querySelector("#site-list"),
        pins = document.querySelector("#pins"),
        filter = document.querySelector("#filter"),
        note = document.querySelector("#note"),
        error = document.querySelector("#error"),
        saved = document.querySelector("#saved");
      function render() {
        const visible = sites.filter(
          (s) => filter.value === "all" || s.state === filter.value,
        );
        if (!visible.some((s) => s.id === selected)) selected = visible[0]?.id;
        list.replaceChildren();
        pins.replaceChildren();
        for (const s of visible) {
          const b = document.createElement("button");
          b.type = "button";
          b.className = "site";
          b.setAttribute("aria-pressed", String(s.id === selected));
          b.textContent = s.name;
          const small = document.createElement("small");
          small.textContent =
            s.id + " · " + (s.state === "review" ? "Needs review" : "Checked");
          b.append(small);
          b.onclick = () => {
            selected = s.id;
            render();
          };
          list.append(b);
          const pin = document.createElement("button");
          pin.type = "button";
          pin.className = "pin";
          pin.style.left = s.x + "%";
          pin.style.top = s.y + "%";
          pin.textContent = s.id[0];
          pin.setAttribute("aria-label", "Select " + s.name);
          pin.setAttribute("aria-pressed", String(s.id === selected));
          pin.onclick = b.onclick;
          pins.append(pin);
        }
        const s = sites.find((s) => s.id === selected);
        document.querySelector("#count").textContent =
          visible.length + " sites shown";
        document.querySelector("#site-title").textContent = s.name;
        document.querySelector("#site-id").textContent = s.id;
        document.querySelector("#site-state").textContent =
          s.state === "review" ? "Needs review" : "Checked";
        note.value = notes.get(s.id) || "";
        error.hidden = true;
        note.removeAttribute("aria-invalid");
        saved.textContent = "";
      }
      filter.onchange = render;
      note.oninput = () => {
        error.hidden = true;
        note.removeAttribute("aria-invalid");
        saved.textContent = "";
      };
      document.querySelector("#note-form").onsubmit = (e) => {
        e.preventDefault();
        const value = note.value.trim();
        if (value.length < 10) {
          error.hidden = false;
          note.setAttribute("aria-invalid", "true");
          note.focus();
          return;
        }
        notes.set(selected, value);
        saved.textContent = "Note saved locally for " + selected + ".";
      };
      render();
    </script>
  </body>
</html>
```

Riferimento del codice

- Schema originale e comportamento dell’applicazione. Non sono inclusi SDK per mappe, dati remoti o runtime Esri.

### Alternativa nativa per Calcite Input

Sostituisci src/main.js in un progetto Vite vanilla il cui index.html contenga <div id="app"></div>.

```
import "@esri/calcite-components/components/calcite-input";
import "@esri/calcite-components/components/calcite-button";

document.querySelector("#app").innerHTML = `
  <calcite-input id="inspection-note" label-text="Inspection note"
    validation-message="Enter at least ten characters"></calcite-input>
  <calcite-button id="save-note">Validate note</calcite-button>
  <p id="result" role="status"></p>`;
const field = document.querySelector("#inspection-note");
const result = document.querySelector("#result");
field.addEventListener("calciteInputInput", () => {
  field.status = "idle";
  result.textContent = "";
});
document.querySelector("#save-note").addEventListener("click", async () => {
  if (field.value.trim().length < 10) {
    field.status = "invalid";
    await field.setFocus();
    return;
  }
  field.status = "valid";
  result.textContent = "The note passes the local rule. Nothing was sent.";
});
```

Riferimento del codice

- Installa @esri/calcite-components@5.1.2 dopo aver verificato i requisiti di licenza attuali. Questa alternativa è stata verificata con API; l’anteprima indipendente qui sopra è l’esempio testato nel browser.

## Esri Calcite Configurazione dell’agente per il sistema di design

### Punto di partenza per l’implementazione

Il pacchetto di componenti nativi richiede un account ArcGIS idoneo secondo le condizioni di licenza attuali. Se ospiti autonomamente le risorse dei componenti, verifica i requisiti relativi ai percorsi degli asset.

```
# Independent specimen: save the complete HTML example as index.html.
# Native alternative for an appropriately licensed project:
npm create vite@latest calcite-note -- --template vanilla
cd calcite-note
npm install
npm install @esri/calcite-components@5.1.2
# Replace src/main.js with the native input example.
npm run dev
```

### Un prompt per il tuo progetto

```
Crea un’area di lavoro mirata per l’ispezione spaziale usando i riferimenti Calcite. Mantieni coerente l’ID dell’oggetto selezionato tra l’elenco e il pannello di ispezione, rendi espliciti gli stati testuali e distingui le note locali dalla persistenza nel servizio. Parti dall’interpretazione autonoma oppure scegli consapevolmente il percorso con componenti nativi soggetto a licenza. Non descrivere lo schema originale come una mappa ArcGIS.
```

## Esri Calcite Fonti e ambito del sistema di design

Guida applicativa OpenDesign. L’esempio illustrato è realizzato in modo indipendente e usa dati di fantasia. L’uso attuale di Calcite è regolato dalle licenze Esri e richiede un account ArcGIS idoneo; l’esempio di integrazione nativa è un’alternativa per progetti con licenza appropriata, non il runtime di questa anteprima.

- Calcite Input API Proprietà del campo, eventi e metodo focus.

- Guida introduttiva a Calcite Registrazione dei componenti e configurazione degli asset.

- Licenze attuali Requisiti per l’account ArcGIS e per l’utilizzo.

- Design token pubblicati Riferimenti bloccati per caratteri, spaziatura e raggio.

## Esri Calcite Risorse correlate al sistema di design

### GitLab Pajamas

Una guida Pajamas per i flussi di lavoro tecnici: token semantici effettivi, tipografia e spaziatura fluide, un ispettore di pipeline a fasi, messaggi di errore leggibili e una simulazione esplicitamente locale dei nuovi tentativi.

### HPE Grommet

Modella una prenotazione di capacità con le primitive di layout, i campi modulo controllati e gli indicatori numerici di Grommet. Usa con criterio la scala del tema e mantieni distinto il tema base di Grommet dal tema HPE installato separatamente.

### Infor sistema di design

Componi un modulo aziendale di manutenzione con gli stati effettivi degli input IDS, gli alias del tema e un identificativo preciso dell’asset. Esamina i token pubblici correnti del tema, un pacchetto Web Components con versione bloccata e un flusso locale per le bozze con convalida e ripristino.


- [Riferimento per l’implementazione](https://developers.arcgis.com/calcite-design-system/)
- [Fonte](https://cdn.jsdelivr.net/npm/@esri/calcite-design-tokens@4.1.0/dist/css/light.css)
- [Fonte](https://cdn.jsdelivr.net/npm/@esri/calcite-design-tokens@4.1.0/dist/css/global.css)
- [Fonte](https://developers.arcgis.com/calcite-design-system/components/input/)
- [Riferimento del codice](https://cdn.jsdelivr.net/npm/@esri/calcite-design-tokens@4.1.0/dist/css/light.css)
- [Riferimento del codice](https://developers.arcgis.com/calcite-design-system/components/input/)
- [Calcite Input API Proprietà del campo, eventi e metodo focus.](https://developers.arcgis.com/calcite-design-system/components/input/)
- [Guida introduttiva a Calcite Registrazione dei componenti e configurazione degli asset.](https://developers.arcgis.com/calcite-design-system/get-started/)
- [Licenze attuali Requisiti per l’account ArcGIS e per l’utilizzo.](https://developers.arcgis.com/calcite-design-system/resources/licensing/)
- [Design token pubblicati Riferimenti bloccati per caratteri, spaziatura e raggio.](https://cdn.jsdelivr.net/npm/@esri/calcite-design-tokens@4.1.0/dist/css/global.css)
