Sistema di componenti senza interfaccia · Nuova risorsa

Sistema di progettazione Melt UI.

I builder di store e azioni di Melt UI aggiungono comportamenti accessibili al markup Svelte che gestisci direttamente. Questa guida usa @melt-ui/svelte 0.86.6 per collegare i builder radio, slider e switch tramite attributi, azioni e store scrivibili; è distinto dal più recente API basato sulle runes.

Guida OpenDesign9 capitoli30 voci di riferimentoGuida applicativa originale
01

Anteprima dell'interfaccia del sistema di progettazione sistema di design Melt UI

Modifica l'allineamento, sposta lo slider della spaziatura tra lettere e attiva o disattiva la griglia: il poster originale si aggiorna usando gli store dei builder.

Studio di composizione tipograficaApri l’esempio completo
Builder di @melt-ui/svelte 0.86.6 con Svelte 5.57.1; attributi e azioni espliciti, senza bisogno del preprocessore Melt. · Riferimento per l’implementazione
02

Riferimento di progettazione del sistema di progettazione sistema di design Melt UI

Builder di store/azioni verificati di @melt-ui/svelte 0.86.6 in esecuzione con Svelte 5.57.1. Questo è il builder API documentato, non il separato API di nuova generazione basato su runes. Melt è headless; tutti i valori visivi --study-* qui sotto sono configurazioni originali dell'applicazione, riportate integralmente.

Configurazione visiva semantica originale

Fonte
Nome / regolaValore / configurazioneUtilizzo
--study-canvas#f3f0e9 Pagina esterna.
--study-surface#fffdf8 Pannello dei controlli.
--study-ink#32352e Testo principale.
--study-muted#77796a Testo di supporto.
--study-line#dbdece Bordi della traccia e del pannello.
--study-action#486348 Radio selezionato e intervallo attivo.
--study-on-action#fffTesto sull'azione.
--study-focus#8aa77c Anello di focus da tastiera.
--study-poster#e0e8bb Carta originale del poster.
--study-accent#d68f57 Forma orbitale decorativa.

Scale originali di spaziatura e tipografia

Fonte
Nome / regolaValore / configurazioneUtilizzo
--study-space-14pxSpaziatura dell'applicazione definita per nome; non è un valore predefinito di Melt.
--study-space-28pxSpaziatura dell'applicazione definita per nome; non è un valore predefinito di Melt.
--study-space-312pxSpaziatura dell'applicazione definita per nome; non è un valore predefinito di Melt.
--study-space-416pxSpaziatura dell'applicazione definita per nome; non è un valore predefinito di Melt.
--study-space-624pxSpaziatura dell'applicazione definita per nome; non è un valore predefinito di Melt.
--study-space-832pxSpaziatura dell'applicazione definita per nome; non è un valore predefinito di Melt.
Text familysystem-ui, sans-serifNessuna dipendenza da font remoti.
Page title34px / 1.15; 29px narrowGerarchia originale dei titoli.
Poster titleclamp(28px,5.5vw,64px); 28px below 360pxScala originale e responsiva del testo in evidenza.
Poster tracking0–8px, step 1; default 2pxSpaziatura tra lettere controllata dallo slider effettivo.
Grid spacing24px × 24pxGuide decorative attivate o disattivate dallo switch nativo.
Focus ring3px solid #8aa77c; 4px offsetStile esplicito per :focus-visible.

Contratti nativi dei builder

Fonte
Nome / regolaValore / configurazioneUtilizzo
createRadioGroup.defaultValueleftUn solo allineamento selezionato.
Radio orientation / loophorizontal / trueLa navigazione con i tasti freccia segue un gruppo orizzontale e ricomincia dal primo elemento.
createSlider.defaultValue[2]Lo store contiene un array anche per un solo cursore.
Slider min / max / step0 / 8 / 1Tracciamento di interi entro limiti definiti.
Slider elements.thumbsArray-producing builder storeLa versione 0.86.6 restituisce i cursori, non un singolo elemento cursore.
createSwitch.defaultCheckedtrueLe guide sono visibili inizialmente.
Builder attributes + action{...$builder} use:builderLa sintassi esplicita funziona senza il preprocessore Melt opzionale.
Thumb attributes + action{...thumb} use:thumb.actionOgni cursore generato include i propri attributi e la propria azione.
03

Guida completa al sistema di progettazione sistema di design Melt UI

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

DESIGN-melt-ui.md

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

Scarica la guida

Sistema di progettazione sistema di design Melt UI: Melt applica comportamenti al markup che gestisci

Melt applica comportamenti al markup che gestisci

Questo esempio usa i builder API di store/azioni di @melt-ui/svelte 0.86.6. createRadioGroup, createSlider e createSwitch restituiscono builder di elementi e store di stato. I normali button, span e div ricevono gli attributi e le azioni che li collegano al comportamento dei controlli nativi.

Da questa guida su OpenDesign

Il pacchetto non fornisce la carta verde, la tipografia del poster o la geometria del pannello. Queste scelte sono definite nel foglio di stile originale completo. La documentazione rimanda anche a un API più recente, separato e basato su runes; questa pagina indica deliberatamente la versione verificata dei builder, senza mescolare esempi incompatibili delle due generazioni.

Leggi la specifica di supporto

Sistema di progettazione sistema di design Melt UI: applica gli attributi e installa le azioni insieme

Applica gli attributi e installa le azioni insieme

Un elemento ha bisogno sia degli attributi del builder sia della sua azione. L'esempio usa forme come {...$alignRoot} use:alignRoot e {...$alignItem(value)} use:alignItem. Gli attributi definiscono ruoli, stato e posizionamento; l'azione installa il comportamento interattivo e la relativa pulizia.

La sintassi più breve use:melt richiede il preprocessore opzionale di Melt. Senza, il runtime genera un errore specifico invece di applicare silenziosamente il builder. Il codice corretto usa ovunque la sintassi esplicita, quindi la configurazione Vite qui sotto non omette alcuna dipendenza di preprocessing nascosta. Anche ogni cursore dello slider espande gli attributi restituiti e richiama thumb.action.

Leggi la specifica di supporto

Sistema di progettazione sistema di design Melt UI: definisci il sistema visivo headless nell'applicazione CSS

Definisci il sistema visivo headless nell'applicazione CSS

I ruoli --study-* distinguono la tela esterna, la superficie dei controlli, il testo, il divisore, l'azione, il focus, la carta del poster e l'accento decorativo. I sei valori di spaziatura definiti per nome vanno da quattro a trentadue pixel. Sono scelte originali che rendono riproducibile questa specifica composizione, non un catalogo di token gestito da Melt.

I radio button selezionati e lo switch usano data-state=checked, mentre le posizioni inline restituite dallo slider determinano la posizione del cursore e dell'intervallo selezionato. Il foglio di stile aggiunge solo geometria e colori. Sostituire queste posizioni native con percentuali calcolate a mano significherebbe duplicare la logica e rischiare di compromettere il supporto all'orientamento o alla direzione.

Leggi la specifica di supporto

Sistema di progettazione sistema di design Melt UI: mantieni un solo allineamento selezionato con la navigazione nativa del gruppo

Mantieni un solo allineamento selezionato con la navigazione nativa del gruppo

createRadioGroup parte da left, con orientamento orizzontale e navigazione circolare abilitati. Ogni elemento radio ha un valore stabile: left, center o right. text-align del poster legge direttamente il valore selezionato, quindi la navigazione da tastiera e la selezione con il puntatore modificano la stessa composizione visibile.

Il gruppo riceve l'etichetta accessibile «Allineamento del testo». Le tre opzioni sono controlli radio nativi gestiti dai builder, non normali pulsanti con classi attivate manualmente. Lo stato selezionato è rappresentato sia nella semantica sia dal selettore data-state, usato per applicare il trattamento visivo di riempimento.

  1. Scegli Centro e controlla l'allineamento del poster.
  2. Porta il focus sullo slider Spaziatura tra lettere e premi End per raggiungere 8px.
  3. Disattiva la griglia di layout e salva la composizione locale risultante.

Leggi la specifica di supporto

Sistema di progettazione sistema di design Melt UI: usa un array come valore anche con un solo cursore

Usa un array come valore anche con un solo cursore

Lo slider inizia con defaultValue:[2], non con un valore scalare. Il builder installato della versione 0.86.6 espone elements.thumbs, uno store che genera un array, e il template visualizza ogni cursore restituito. Il poster legge $tracking[0] e applica il valore alla spaziatura tra lettere in pixel.

I limiti vanno da zero a otto, con incrementi di uno. Home ed End raggiungono i limiti; i tasti freccia spostano il cursore secondo l'incremento definito. Leggi $tracking[0] per questa composizione con un solo cursore e mantieni il modello basato su array quando ne aggiungi un altro, invece di introdurre un secondo stato scalare indipendente.

Leggi la specifica di supporto

Sistema di progettazione sistema di design Melt UI: tieni la guida visiva separata dai valori di progettazione

Tieni la guida visiva separata dai valori di progettazione

createSwitch inizia attivato e il suo stato controlla una classe guides sul poster. Questa classe disegna due gradienti ripetuti e discreti, a intervalli di ventiquattro pixel. Disattivandola, i gradienti scompaiono senza modificare l'allineamento o la spaziatura tra lettere.

L'etichetta visibile «Mostra griglia di layout» è associata all'ID stabile dello switch. Il movimento del cursore usa una transizione CSS, con una regola per la riduzione del movimento. L'illustrazione orbitale decorativa è aria-hidden e non è interattiva; non interferisce con la semantica effettiva dei controlli.

Leggi la specifica di supporto

Sistema di progettazione sistema di design Melt UI: coordina gli store scrivibili senza duplicare lo stato dei controlli

Coordina gli store scrivibili senza duplicare lo stato dei controlli

Allineamento, tracciamento e visibilità della griglia restano gli store scrivibili dei builder. Il poster renderizzato legge direttamente questi store: text-align usa l'allineamento, letter-spacing usa il primo valore dello slider e una classe CSS usa il valore checked dello switch. Un modello applicativo separato per le stesse tre impostazioni richiederebbe una sincronizzazione superflua.

Lo snapshot salvato deriva da una firma di questi valori. Ogni modifica annulla la conferma e il ripristino reimposta negli store left, [2] e true. L'array con un solo elemento è importante: assegnare il valore scalare 2 non rispetterebbe il contratto dello slider, anche se è visibile un solo cursore.

Leggi la specifica di supporto

Sistema di progettazione sistema di design Melt UI: assegna a ogni builder i suoi attributi, la sua azione e il suo nome

Assegna a ogni builder i suoi attributi, la sua azione e il suo nome

Il gruppo di radio button riceve l'etichetta «Allineamento del testo», il cursore dello slider fa riferimento al testo visibile «Spaziatura tra lettere» e lo switch è associato alla sua etichetta visibile. Questi nomi vanno assegnati agli elementi effettivi gestiti dai builder, non ai wrapper decorativi circostanti.

La sintassi esplicita dei template associa attributi e azioni. Per gli indicatori dello slider, l’elemento restituito include la relativa azione: il ciclo distribuisce quindi gli attributi dell’indicatore e richiama thumb.action. Quando applichi stili alla traccia e all’intervallo, conserva i valori di posizionamento generati dal builder: descrivono lo stato numerico effettivo e la direzione, mentre il foglio di stile definisce il colore e la geometria.

  • Verifica il risultato calcolato effettivo, non solo l’etichetta numerica.
  • Mantieni le etichette sugli elementi nativi generati dal builder.
  • Rispetta la preferenza per la riduzione del movimento nelle transizioni visive personalizzate.

Leggi la specifica di supporto

Sistema di design Melt UI Usa il builder verificato API in un normale progetto Svelte

Usa il builder API verificato in un normale progetto Svelte

Il componente completo usa le sottoscrizioni agli store di Svelte con $alignment, $tracking e $grid. Svelte 5 può compilare questa sintassi consolidata per i componenti; il punto di ingresso usa la funzione mount corrente. Non servono librerie di icone personalizzate né pacchetti di fogli di stile, perché l’intero livello visivo è fornito sopra.

La configurazione standard di Vite con Svelte riportata sotto fissa @melt-ui/svelte 0.86.6 e Svelte 5.57.1. Non installa il preprocessore Melt, perché il componente usa già la sintassi esplicita equivalente. Quando passi al pacchetto runes più recente, riscrivi intenzionalmente API invece di modificare soltanto la versione della dipendenza.

Leggi la specifica di supporto

Melt UI Esempi di componenti del sistema di design

Composizione completa di builder, store e azioni

createRadioGroup, createSlider e createSwitch associano semantica e comportamento nativi al markup ordinario.

svelte
<script>
import {createRadioGroup,createSlider,createSwitch} from '@melt-ui/svelte';
const {elements:{root:alignRoot,item:alignItem},states:{value:alignment}}=createRadioGroup({defaultValue:'left',orientation:'horizontal',loop:true});
const {elements:{root:trackingRoot,range:trackingRange,thumbs},states:{value:tracking}}=createSlider({defaultValue:[2],min:0,max:8,step:1});
const {elements:{root:gridRoot},states:{checked:grid}}=createSwitch({defaultChecked:true});
let saved='';let previous='';
$: current=`${$alignment}|${$tracking[0]}|${$grid}`;
$: if(current!==previous){saved='';previous=current}
function save(){saved=`Saved locally: ${$alignment} aligned, ${$tracking[0]}px tracking, grid ${$grid?'on':'off'}.`}
function reset(){alignment.set('left');tracking.set([2]);grid.set(true);saved=''}
</script>
<main class="poster-shell"><header><p class="eyebrow">TYPE COMPOSITION · LIVE STUDY</p><h1>A small change. A different rhythm.</h1><p>Use native Melt UI builders to change the alignment, tracking and guide visibility of an original typographic poster.</p></header><div class="poster-layout"><section class="controls"><h2>Composition</h2><p class="control-label" id="alignment-label">Text alignment</p><div {...$alignRoot} use:alignRoot aria-labelledby="alignment-label" class="alignment">{#each ['left','center','right'] as value}<button {...$alignItem(value)} use:alignItem class="align-option">{value[0].toUpperCase()+value.slice(1)}</button>{/each}</div><div class="tracking-control"><p class="control-label" id="tracking-label">Letter spacing <strong>{$tracking[0]}px</strong></p><div {...$trackingRoot} use:trackingRoot class="slider"><div {...$trackingRange} use:trackingRange class="slider-range"></div>{#each $thumbs as thumb}<span {...thumb} use:thumb.action aria-labelledby="tracking-label" class="slider-thumb"></span>{/each}</div><div class="scale"><span>0px</span><span>8px</span></div></div><div class="grid-control"><label for="show-grid">Show layout grid</label><button id="show-grid" {...$gridRoot} use:gridRoot class="switch"><span></span></button></div><p class="hint">The grid is a visual aid. It does not change the poster’s text or spacing.</p><button class="primary" on:click={save} disabled={!!saved}>Save composition</button><button class="reset" on:click={reset}>Restore initial settings</button><p class="result" role="status">{saved||'This study changes only the local preview.'}</p></section><section class="poster" class:guides={$grid} style:text-align={$alignment} aria-label="Live typographic poster"><div class="poster-top"><span>TYPE / 2026</span><span>STUDY 04</span></div><div class="poster-orbit" aria-hidden="true"><i></i><b></b></div><div class="poster-title" style:letter-spacing={`${$tracking[0]}px`}><span>SPACE</span><span>TO</span><span>THINK.</span></div><div class="poster-bottom"><p>A pause between<br/>one idea and the next.</p><span>Original type study<br/>{$alignment} · {$tracking[0]}px</span></div></section></div></main>

Riferimento del codice

  • Il valore dello slider è un array; il poster legge il primo elemento.
  • Il codice usa la distribuzione esplicita degli attributi e le azioni, senza presupporre un preprocessore.
  • Lo stato salvato scade quando cambia uno qualsiasi degli store del builder.

Stili originali completi per poster e controlli

Variabili CSS semantiche, selettori data-state per i controlli, indicatori di focus e poster tipografico adattivo.

css
:root{--study-canvas:#f3f0e9;--study-surface:#fffdf8;--study-ink:#32352e;--study-muted:#77796a;--study-line:#dbdece;--study-action:#486348;--study-on-action:#fff;--study-focus:#8aa77c;--study-poster:#e0e8bb;--study-accent:#d68f57;--study-space-1:4px;--study-space-2:8px;--study-space-3:12px;--study-space-4:16px;--study-space-6:24px;--study-space-8:32px}html,body,#app{height:auto;min-height:0;margin:0}*{box-sizing:border-box}body{background:var(--study-canvas);color:var(--study-ink);font-family:system-ui,sans-serif}button{font:inherit;cursor:pointer}button:focus-visible,[role=slider]:focus-visible{outline:3px solid var(--study-focus);outline-offset:4px}button:disabled{opacity:.45;cursor:default}.poster-shell{max-width:1060px;margin:auto;padding:32px}.eyebrow{font-size:10px;font-weight:700;letter-spacing:.14em;color:var(--study-muted)}h1{font-size:34px;line-height:1.15;max-width:650px;margin:12px 0}header>p:last-child{font-size:14px;line-height:1.7;color:var(--study-muted);max-width:620px}.poster-layout{display:grid;grid-template-columns:300px minmax(0,1fr);gap:24px;margin-top:28px}.controls{padding:24px;background:var(--study-surface);border:1px solid var(--study-line);border-radius:14px;align-self:start;min-width:0}.controls h2{font-size:20px;margin:0 0 24px}.control-label{font-size:12px;font-weight:600;margin:0 0 12px}.control-label strong{float:right;color:var(--study-action)}.alignment{display:flex;border:1px solid var(--study-line);padding:4px;border-radius:8px;gap:4px}.align-option{border:0;flex:1;padding:9px 4px;border-radius:5px;font-size:12px;background:transparent;color:var(--study-muted)}.align-option[data-state=checked]{background:var(--study-action);color:var(--study-on-action)}.tracking-control{margin-top:26px}.slider{position:relative;height:24px;display:flex;align-items:center;touch-action:none}.slider:before{content:'';height:4px;background:var(--study-line);position:absolute;inset:10px 0;border-radius:4px}.slider-range{height:4px;position:absolute;background:var(--study-action);border-radius:4px}.slider-thumb{height:20px;width:20px;border:2px solid var(--study-action);background:white;border-radius:50%;cursor:grab}.scale{display:flex;justify-content:space-between;font-size:10px;color:var(--study-muted);margin-top:8px}.grid-control{display:flex;align-items:center;justify-content:space-between;gap:12px;border-top:1px solid var(--study-line);padding-top:22px;margin-top:24px;font-size:13px}.switch{width:42px;height:24px;padding:3px;border:0;border-radius:999px;background:#b7beaf;flex-shrink:0}.switch span{display:block;width:18px;height:18px;border-radius:50%;background:white;transition:transform .15s}.switch[data-state=checked]{background:var(--study-action)}.switch[data-state=checked] span{transform:translateX(18px)}.hint{font-size:11px;line-height:1.7;color:var(--study-muted);margin:12px 0 24px}.primary{display:block;width:100%;padding:12px;border:0;border-radius:7px;background:var(--study-action);color:white;font-size:13px;font-weight:600}.reset{width:100%;padding:12px 0;border:0;background:transparent;color:var(--study-muted);font-size:11px}.result{font-size:11px;line-height:1.7;color:var(--study-muted);margin:8px 0 0}.poster{background:var(--study-poster);padding:28px;border-radius:14px;min-width:0;overflow:hidden;position:relative}.poster.guides{background-image:linear-gradient(#6680561c 1px,transparent 1px),linear-gradient(90deg,#6680561c 1px,transparent 1px);background-size:24px 24px}.poster-top{display:flex;justify-content:space-between;gap:12px;font-size:9px;font-weight:700;letter-spacing:.1em;position:relative;z-index:1}.poster-orbit{height:130px;position:relative;margin:10px 0 20px}.poster-orbit i{display:block;position:absolute;width:140px;height:140px;background:var(--study-accent);border-radius:50%;right:10%;top:0}.poster-orbit b{display:block;position:absolute;width:140px;height:140px;border:2px solid #617748;border-radius:50%;right:27%;top:0}.poster-title{font-size:clamp(28px,5.5vw,64px);line-height:1.08;font-weight:800;position:relative}.poster-title span{display:block}.poster-bottom{display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap;border-top:1px solid #9fac7c;margin-top:26px;padding-top:18px;font-size:11px;line-height:1.7}.poster-bottom p{margin:0}.poster-bottom>span{font-size:9px;color:#627046}@media(max-width:740px){.poster-layout{grid-template-columns:minmax(0,1fr)}.poster-shell{padding:20px}h1{font-size:29px}.poster-title{font-size:clamp(30px,9vw,56px)}}@media(max-width:360px){.poster-shell{padding:14px}.controls,.poster{padding:16px}.poster-title{font-size:28px}.poster-orbit{height:110px}.poster-orbit i,.poster-orbit b{width:115px;height:115px}.poster-top{font-size:8px}}@media(prefers-reduced-motion:reduce){.switch span{transition:none}}

Riferimento del codice

  • Tutti i token visivi sono originali, non impostazioni predefinite ufficiali di Melt.
  • Le posizioni dell’indicatore e dell’intervallo dello slider provengono dagli attributi nativi del builder.
  • La visibilità della griglia decorativa è indipendente dalla spaziatura.
04

Melt UI Configurazione dell’agente del sistema di design

Punto di partenza per l’implementazione

Builder verificati di store/azioni API di @melt-ui/svelte 0.86.6 in Svelte 5.57.1. La sintassi esplicita del builder evita di richiedere il preprocessore Melt facoltativo. Non si tratta del pacchetto runes di nuova generazione API.

javascript
// npm create vite@latest melt-type-study -- --template svelte
// cd melt-type-study && npm install
// npm install [email protected] @melt-ui/[email protected]
// Save the complete examples as src/App.svelte and src/style.css.
// src/main.js:
import {mount} from 'svelte';
import App from './App.svelte';
import './style.css';
mount(App, {target:document.querySelector('#app')});
// index.html: <div id="app"></div><script type="module" src="/src/main.js"></script>
// npm run dev

Un prompt per il tuo progetto

Prompt per l’agente
Usa i builder di store/azioni di @melt-ui/svelte 0.86.6 con Svelte 5 per lo studio di composizione tipografica. Associa sia gli attributi sia le azioni agli elementi createRadioGroup, createSlider e createSwitch; usa la sintassi esplicita fornita, senza richiedere un preprocessore non dichiarato. Mantieni il contratto dello slider con array di un elemento ed elements.thumbs, i valori di allineamento e la visibilità della griglia. Collega gli stili calcolati del poster direttamente a questi store, invalida i feedback salvati dopo ogni modifica e ripristina left, [2] e true. Non mescolare le nuove runes API né un modello di appuntamenti.
05

Melt UI Fonti e ambito del sistema di design

Builder di store/azioni di @melt-ui/svelte 0.86.6 con Svelte 5.57.1. Tutti i token visivi e i contenuti del poster sono originali. Il salvataggio registra soltanto lo stato dell’anteprima locale e non esporta né pubblica un design.