Sistema di componenti senza interfaccia · Nuova risorsa

Sistema di progettazione Kobalte.

Kobalte offre componenti headless per Solid, inclusi campi numerici con valori grezzi e formattati separati, l’anatomia composta delle checkbox e pulsanti con stato premuto. Questa guida collega le primitive ai segnali Solid attraverso uno scaler di ricette con quantità derivate e caselle degli ingredienti ripristinabili.

Guida OpenDesign9 capitoli29 voci di riferimentoGuida applicativa originale
01

Anteprima dell’interfaccia del sistema di progettazione sistema di design Kobalte

Ridimensiona le quantità degli ingredienti, raccogli gli elementi e fissa localmente una ricetta originale.

Scheda di ricetta reattivaApri l’esempio completo
Kobalte 0.13.14 con Solid 1.9.15; primitive headless native e CSS originale completa. · Riferimento per l’implementazione
02

Riferimento di progettazione del sistema di progettazione sistema di design Kobalte

Kobalte 0.13.14 fornisce primitive headless per Solid, non una scala visiva canonica. Ogni colore e dimensione recipe-* riportati di seguito costituisce la configurazione originale completa dell’applicazione. I nomi API e gli attributi di stato sono stati verificati nel pacchetto installato e nella documentazione ufficiale dei componenti.

Colori semantici originali

Fonte
Nome / regolaValore / configurazioneUtilizzo
--recipe-canvas#f6f2ec Area esterna
--recipe-surface#fffefa Pannelli della ricetta e delle porzioni
--recipe-ink#403a30 Testo principale
--recipe-muted#807465 Testo di supporto
--recipe-line#e6ded2 Separatori e bordi
--recipe-action#95612f Testo delle azioni e della casella selezionata
--recipe-on-action#fffPrimo piano dell’azione a tinta piena
--recipe-focus#b88955 Indicatore di focus da tastiera visibile
--recipe-soft#f1e4d3 Sfondo del controllo incrementale e del pulsante fissato premuto

Tipografia e dimensioni originali

Fonte
Nome / regolaValore / configurazioneUtilizzo
Bodysystem-ui, sans-serifNessun font da scaricare
Page heading34px / 1.15; 29px narrowGerarchia originale
Recipe titleGeorgia, serif; 30px / 1.2Accento editoriale originale
Ingredient copy13px / 1.5; 12px narrowEtichette leggibili su più righe
--recipe-space-1 / 2 / 34px / 8px / 12pxSpazi ridotti
--recipe-space-4 / 6 / 816px / 24px / 32pxSpaziatura di pannelli e pagina
Panel radius16pxGeometria originale delle superfici
Checkbox control21 × 21px; 5px radiusIndicatore visibile originale
Stepper trigger42px wideTrigger nativo con geometria originale
Layout breakpoint760pxDue colonne diventano una
Focus ring3px; 3px offsetTrattamento visibile originale per la tastiera

Contratto di stato del componente nativo

Fonte
Nome / regolaValore / configurazioneUtilizzo
NumberField.rawValuenumberStato aritmetico anziché testo formattato
NumberField.onRawValueChange(value: number) => voidAggiorna le quantità e azzera le selezioni non più valide
minValue / maxValue / step1 / 8 / 1Limiti dell’applicazione passati al campo numerico nativo
formatOptions.maximumFractionDigits0Visualizzazione delle porzioni intere
validationStatevalid | invalidLa validità dell’applicazione si riflette nel campo nativo
Checkbox.checked / onChangeboolean / callbackSelezione controllata degli ingredienti
Checkbox data attributesdata-checked; data-focus-visibleStilizza gli stati nativi di selezione e focus da tastiera
ToggleButton.pressed / onChangeboolean / callbackFissaggio locale controllato
ToggleButton data-pressedpresent when pressedStile a tinta piena per l’elemento fissato localmente
03

Guida completa del sistema di progettazione sistema di design Kobalte

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

DESIGN-kobalte.md

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

Scarica la guida

Sistema di progettazione sistema di design Kobalte: collega i componenti Kobalte ai segnali Solid

Collega i componenti Kobalte ai segnali Solid

Il componente usa i segnali Solid per le porzioni, gli ingredienti raccolti e l’elemento fissato. createMemo ricava la validità dal segnale numerico e For visualizza una raccolta stabile di ingredienti. Le proprietà controllate di Kobalte leggono direttamente questi segnali; gli aggiornamenti non richiedono un provider di moduli separato né un adattatore di stato in stile React.

Da questa guida su OpenDesign

NumberField, Checkbox e ToggleButton vengono importati dai rispettivi entry point dei componenti. Hanno funzioni diverse: il campo numerico gestisce l’input numerico modificabile, ogni casella di controllo rappresenta un ingrediente raccolto e il pulsante a commutazione mantiene lo stato dell’elemento fissato della ricetta. Le regole aritmetiche e di invalidazione restano nelle funzioni dell’applicazione, anziché essere incorporate nei selettori visivi.

Leggi la specifica di supporto

Sistema di progettazione sistema di design Kobalte: mantieni separati lo stato numerico e il testo formattato

Mantieni separati lo stato numerico e il testo formattato

NumberField riceve rawValue={portions()} e onRawValueChange={update}. Il segnale numerico alimenta direttamente la moltiplicazione, mentre il campo gestisce la formattazione e la modifica da parte dell’utente. Riutilizzare il testo formattato visualizzato nei calcoli introdurrebbe ipotesi di parsing relative ai separatori o alle impostazioni locali, già gestite dalla primitiva nativa.

L’esempio consente da una a otto porzioni intere, con un incremento di uno e maximumFractionDigits impostato a zero. Un predicato calcolato separato verifica comunque che il valore sia finito, intero e compreso nei limiti, perché un campo modificabile può contenere temporaneamente un valore incompleto o non valido. Se il valore non è valido, i totali mostrano un trattino lungo e le caselle degli ingredienti sono disabilitate. L’interfaccia non presenta una quantità plausibile ma errata come se fosse un input valido dell’utente.

Leggi la specifica di supporto

Sistema di progettazione sistema di design Kobalte: componi il campo con la relativa etichetta e i messaggi nativi

Componi il campo con la relativa etichetta e i messaggi nativi

Il campo numerico contiene Label, DecrementTrigger, Input, IncrementTrigger, Description ed ErrorMessage. La descrizione visibile spiega sia l’intervallo sia le conseguenze della modifica delle porzioni. I trigger hanno etichette significative, Meno porzioni e Più porzioni, così i simboli meno e più non devono costituire da soli l’intero nome accessibile.

validationState passa da valido a non valido in base al predicato dell’applicazione. ErrorMessage appartiene al campo nativo, non è un paragrafo separato collocato altrove nella pagina. Per un modulo inviato, Kobalte fornisce anche HiddenInput per la serializzazione del valore grezzo; questo esempio locale non lo include perché non dispone di un endpoint di invio né di un payload del modulo.

Leggi la specifica di supporto

Sistema di progettazione sistema di design Kobalte: gestisci la selezione degli ingredienti con un Set immutabile

Gestisci la selezione degli ingredienti con un Set immutabile

Ogni ingrediente usa l’anatomia completa di Checkbox: Input, Control, Indicator e Label. L’input effettivo mantiene la semantica e l’interazione da tastiera, mentre il controllo visibile mostra il segno di spunta e gli stili di stato originali. L’etichetta include sia il nome dell’ingrediente sia la quantità, così la quantità fa parte dell’elemento che l’utente sta raccogliendo.

mark crea un nuovo Set a partire dalla selezione precedente, prima di aggiungere o rimuovere un ID. Modificare soltanto il Set esistente non garantirebbe lo stesso aggiornamento affidabile del segnale. Il conteggio visualizzato legge la dimensione del Set e ogni Checkbox controlla l’appartenenza tramite l’ID stabile dell’ingrediente. Una variazione delle porzioni azzera l’intera selezione, perché aver raccolto 320 grammi non dimostra di aver soddisfatto il nuovo fabbisogno di 400 grammi.

  • Associa ogni nome di ingrediente visibile a Checkbox.Label.
  • Mantieni Checkbox.Input anche quando il quadrato visibile ha uno stile personalizzato.
  • Usa ID stabili per la selezione e crea un nuovo Set per ogni aggiornamento.

Leggi la specifica di supporto

Sistema di progettazione sistema di design Kobalte: usa un Toggle per una scelta locale persistente

Usa un Toggle per una scelta locale persistente

L’elemento da fissare è un ToggleButton con pressed e onChange, non un normale pulsante che cambia soltanto la didascalia. Il suo stato premuto si riflette nella semantica nativa e nel selettore data-pressed. L’etichetta diventa Fissata con un segno di spunta e lo stato vicino chiarisce che la modifica riguarda solo l’anteprima locale.

Fissare la ricetta non modifica le quantità degli ingredienti né la selezione. Cambiare le porzioni azzera le caselle degli ingredienti, ma mantiene l’elemento fissato perché la ricetta è la stessa. Ripristina la ricetta predefinita reimposta insieme tutti e tre gli aspetti del modello: quattro porzioni, un Set di ingredienti vuoto e un elemento non fissato. Questi diversi ambiti di ripristino seguono il significato dello stato, invece di azzerare tutto a ogni interazione.

Leggi la specifica di supporto

Sistema di progettazione sistema di design Kobalte: fornisci ai controlli headless una configurazione visiva riproducibile

Fornisci ai controlli headless una configurazione visiva riproducibile

Il foglio di stile della ricetta distingue la superficie di modifica dell’input numerico, i relativi trigger di incremento e decremento e il ruolo di selezione della casella di controllo. Il testo attenuato degli ingredienti viene applicato solo dopo la selezione; le quantità restano leggibili, così l’utente può confrontare gli importi raccolti con il numero attuale di porzioni.

La spaziatura usa quattro, otto, dodici, sedici, ventiquattro e trentadue pixel. La gerarchia tipografica originale abbina un sans serif di sistema per i controlli a Georgia per il titolo della ricetta. Una casella di controllo visiva di ventuno pixel è accanto a un’etichetta associata completa, che resta l’area di attivazione utile. Tutti questi valori esatti sono inclusi nel CSS completo, così chi legge può riprodurre l’esempio senza dover stimare le misure da uno screenshot.

Leggi la specifica di supporto

Sistema di progettazione sistema di design Kobalte: adatta la composizione senza nascondere informazioni

Adatta la composizione senza nascondere informazioni

Il layout ampio affianca una scheda della ricetta flessibile a un pannello delle porzioni di 280 pixel. A 760 pixel si dispone su un’unica colonna. L’intestazione della scheda può andare a capo, le etichette degli ingredienti possono continuare su un’altra riga e la quantità resta compatta e su una sola riga. Al punto di interruzione più stretto, la spaziatura interna dei pannelli e il carattere delle etichette si riducono leggermente, invece di nascondere le quantità.

L’illustrazione dell’insalata è originale CSS ed è contrassegnata come decorativa. Il nome della ricetta, il numero di porzioni e le quantità degli ingredienti comunicano le informazioni indipendentemente dall’immagine. Quando cambi l’illustrazione o riduci la larghezza della scheda, mantieni tutte le etichette complete degli ingredienti e le rispettive quantità: sono gli input effettivi dell’attività di raccolta.

Leggi la specifica di supporto

Sistema di progettazione sistema di design Kobalte: gestisci le variazioni di quantità come aggiornamenti di stati dipendenti

Gestisci le variazioni di quantità come aggiornamenti di stati dipendenti

Ogni porzione richiede 250 grammi complessivi dei cinque ingredienti. Passando da quattro a cinque porzioni, il totale visualizzato passa da 1.000 a 1.250 grammi e la quantità richiesta di arance da 320 a 400 grammi. Le caselle già selezionate vengono azzerate perché si riferivano alle quantità precedenti; l’elemento fissato resta invariato perché la ricetta è la stessa.

La funzione di aggiornamento confronta innanzitutto il valore in ingresso con il segnale corrente usando Object.is. Un callback che non comporta modifiche non deve azzerare la checklist né annunciare un cambio di quantità. I valori non validi escludono le quantità e disabilitano la raccolta; il messaggio di errore spiega quindi l’intervallo accettato. Queste regole rendono osservabili le modifiche intermedie senza consentire a un numero non valido di generare un totale fuorviante.

  1. Seleziona i segmenti di arancia per quattro porzioni.
  2. Aumenta a cinque e verifica che ci siano 400 g di arancia, 1.250 g in totale e zero elementi raccolti.
  3. Fissa la ricetta, quindi ripristina i valori predefiniti e verifica che tutto lo stato locale venga azzerato.

Leggi la specifica di supporto

Sistema di design Kobalte: usa una build Solid e includi l’intero foglio di stile

Usa una build Solid e includi l’intero foglio di stile

La configurazione usa il template Solid di Vite, blocca le versioni verificate di Solid e Kobalte e monta l’applicazione in un elemento radice esplicito. Il componente e il foglio di stile mostrati sopra sono file completi. Per questo esempio non servono un provider di temi, un pacchetto di icone, un font esterno o un backend.

Quando integri l’esempio in un’altra applicazione, mantieni allineati il compilatore del framework e la generazione dei componenti. Una trasformazione di React non convertirà JSX di Solid in un’applicazione Kobalte corretta. Analogamente, prima di sostituire la dipendenza bloccata, verifica un’eventuale versione principale futura di Kobalte API consultando la relativa documentazione. Le quantità della ricetta e la palette sono dati di esempio dell’applicazione: modificarli non richiede di cambiare il contratto delle primitive native.

Leggi la specifica di supporto

Kobalte Esempi di componenti del sistema di design

Componente reattivo completo per la ricetta

Campo numerico nativo, struttura della checkbox e pulsante di attivazione con gestione esplicita degli errori e del ripristino.

jsx
import {createSignal,createMemo,For} from 'solid-js';
import {NumberField} from '@kobalte/core/number-field';
import {Checkbox} from '@kobalte/core/checkbox';
import {ToggleButton} from '@kobalte/core/toggle-button';
export default function App(){
 const[portions,setPortions]=createSignal(4),[checked,setChecked]=createSignal(new Set()),[pinned,setPinned]=createSignal(false),[notice,setNotice]=createSignal('');
 const ingredients=[{id:'orange',name:'Orange segments',grams:80},{id:'beans',name:'Cooked white beans',grams:90},{id:'leaves',name:'Salad leaves',grams:25},{id:'fennel',name:'Thinly sliced fennel',grams:40},{id:'dressing',name:'Citrus dressing',grams:15}];
 const valid=createMemo(()=>Number.isFinite(portions())&&Number.isInteger(portions())&&portions()>=1&&portions()<=8);
 function update(value){if(Object.is(value,portions()))return;setPortions(value);setChecked(new Set());setNotice('Portions changed. Ingredient checks were cleared for the new quantities.')}
 function mark(id,value){setChecked(previous=>{const next=new Set(previous);value?next.add(id):next.delete(id);return next})}
 function reset(){setPortions(4);setChecked(new Set());setPinned(false);setNotice('Restored four portions and an unchecked ingredient list.')}
 return <main class="recipe-shell"><header><p class="eyebrow">KITCHEN NOTEBOOK · REACTIVE RECIPE CARD</p><h1>A brighter bowl, sized for your table.</h1><p>Change the portions, check the scaled ingredients and pin the recipe locally. The quantities are original sample data for this interface.</p></header><div class="recipe-layout"><section class="recipe-card"><div class="salad-art" aria-hidden="true"><div class="plate"><i/><b/><em/><span/><strong/></div></div><div class="recipe-heading"><div><p class="eyebrow">CITRUS & WHITE BEAN SALAD</p><h2>Fresh, crisp, generous.</h2></div><ToggleButton class="pin" pressed={pinned()} onChange={value=>{setPinned(value);setNotice(value?'Recipe pinned in this local preview.':'Recipe unpinned in this local preview.')}} aria-label="Pin recipe">{pinned()?'Pinned ✓':'Pin recipe'}</ToggleButton></div><p class="recipe-description">Sweet citrus, tender beans and crisp fennel. Use the checklist to gather the amounts for your chosen portion count.</p><div class="ingredient-title"><h3>Ingredients</h3><span>{checked().size} / 5 gathered</span></div><div class="ingredients"><For each={ingredients}>{ingredient=><Checkbox class="ingredient" checked={checked().has(ingredient.id)} onChange={value=>mark(ingredient.id,value)} disabled={!valid()}><Checkbox.Input/><Checkbox.Control class="check-control"><Checkbox.Indicator>✓</Checkbox.Indicator></Checkbox.Control><Checkbox.Label class="ingredient-label"><span>{ingredient.name}</span><strong>{valid()?ingredient.grams*portions()+' g':'—'}</strong></Checkbox.Label></Checkbox>}</For></div></section><aside class="portion-panel"><h2>Make it yours</h2><NumberField rawValue={portions()} onRawValueChange={update} minValue={1} maxValue={8} step={1} formatOptions={{maximumFractionDigits:0}} validationState={valid()?'valid':'invalid'} class="portion-field"><NumberField.Label class="field-label">Portions</NumberField.Label><div class="stepper"><NumberField.DecrementTrigger aria-label="Fewer portions">−</NumberField.DecrementTrigger><NumberField.Input/><NumberField.IncrementTrigger aria-label="More portions">+</NumberField.IncrementTrigger></div><NumberField.Description class="field-description">Choose 1–8 whole portions. Changing the quantity clears ingredient checks.</NumberField.Description><NumberField.ErrorMessage class="field-error">Enter a whole number from 1 to 8.</NumberField.ErrorMessage></NumberField><div class="portion-total"><span>Total ingredients</span><strong>{valid()?ingredients.reduce((s,x)=>s+x.grams,0)*portions()+' g':'—'}</strong></div><h3>A simple preparation order</h3><ol><li>Gather the scaled amounts and drain the cooked beans.</li><li>Combine the orange, fennel and leaves in a bowl.</li><li>Add the beans and dressing, then toss gently.</li></ol><button class="reset" onClick={reset}>Restore default recipe</button><p role="status" class="notice">{notice()||(pinned()?'Recipe pinned in this local preview.':'No shopping order or account update is created.')}</p></aside></div></main>
}

Riferimento del codice

  • Usa il template Solid di Vite, non un compilatore JSX di React.
  • rawValue contiene lo stato numerico; tutte le quantità degli ingredienti derivano da questo segnale.
  • Quando cambiano le porzioni, l’insieme checked viene svuotato perché le quantità precedenti non sono più aggiornate.

Configurazione visiva originale completa

Proprietà personalizzate semantiche, gerarchia tipografica, spaziatura, stili degli stati e illustrazione originale di CSS.

css
:root{--recipe-canvas:#f6f2ec;--recipe-surface:#fffefa;--recipe-ink:#403a30;--recipe-muted:#807465;--recipe-line:#e6ded2;--recipe-action:#95612f;--recipe-on-action:#fff;--recipe-focus:#b88955;--recipe-soft:#f1e4d3;--recipe-space-1:4px;--recipe-space-2:8px;--recipe-space-3:12px;--recipe-space-4:16px;--recipe-space-6:24px;--recipe-space-8:32px}html,body,#app{height:auto;min-height:0;margin:0}*{box-sizing:border-box}body{font-family:system-ui,sans-serif;color:var(--recipe-ink);background:var(--recipe-canvas)}button,input{font:inherit}button{cursor:pointer}button:disabled{opacity:.4;cursor:default}button:focus-visible,input:focus-visible{outline:3px solid var(--recipe-focus);outline-offset:3px}.recipe-shell{max-width:1090px;margin:auto;padding:32px}.eyebrow{font-size:10px;font-weight:700;letter-spacing:.13em;color:var(--recipe-muted)}h1{font-size:34px;line-height:1.15;max-width:700px;margin:12px 0}header>p:last-child{font-size:14px;line-height:1.7;color:var(--recipe-muted);max-width:630px}.recipe-layout{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:24px;margin-top:28px}.recipe-card,.portion-panel{background:var(--recipe-surface);border:1px solid var(--recipe-line);border-radius:16px;padding:24px;min-width:0}.portion-panel{align-self:start}.salad-art{height:180px;background:#e8e4d5;border-radius:10px;position:relative;overflow:hidden;margin-bottom:24px}.plate{position:absolute;width:210px;height:210px;left:50%;top:18px;transform:translateX(-50%);border:18px solid #faf8f0;border-radius:50%;background:#dedcbf;box-shadow:0 10px 25px #5e584b1c}.plate i,.plate b,.plate em,.plate span,.plate strong{position:absolute;display:block}.plate i{width:85px;height:42px;border-radius:0 0 85px 85px;background:#dc9658;border:6px solid #f7c888;left:14px;top:18px;transform:rotate(-23deg)}.plate b{width:72px;height:36px;border-radius:0 0 72px 72px;background:#dc9658;border:6px solid #f7c888;left:75px;top:83px;transform:rotate(28deg)}.plate em{width:50px;height:77px;background:#83976a;border-radius:80% 0 80% 0;left:108px;top:4px;transform:rotate(20deg)}.plate span{width:30px;height:50px;background:#667f56;border-radius:80% 0 80% 0;left:25px;top:88px;transform:rotate(-23deg)}.plate strong{width:24px;height:34px;background:#fff3d7;border-radius:50%;left:80px;top:46px;box-shadow:-34px 14px 0 #fff3d7,25px 28px 0 #fff3d7}.recipe-heading{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}.recipe-heading h2{font:400 30px/1.2 Georgia,serif;margin:8px 0}.pin{border:1px solid var(--recipe-line);background:white;border-radius:999px;padding:9px 13px;font-size:11px;color:var(--recipe-action)}.pin[data-pressed]{background:var(--recipe-soft);border-color:var(--recipe-action)}.recipe-description{font-size:13px;line-height:1.7;color:var(--recipe-muted)}.ingredient-title{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-top:24px}.ingredient-title h3{font-size:16px;margin:0}.ingredient-title span{font-size:11px;color:var(--recipe-muted)}.ingredients{margin-top:14px}.ingredient{display:flex;gap:12px;align-items:center;border-top:1px solid var(--recipe-line);padding:16px 0;cursor:pointer}.check-control{height:21px;width:21px;border:1px solid #b9ab98;border-radius:5px;flex-shrink:0;display:flex;justify-content:center;align-items:center;font-size:13px}.check-control[data-checked]{background:var(--recipe-action);color:white;border-color:var(--recipe-action)}.check-control[data-focus-visible]{outline:3px solid var(--recipe-focus);outline-offset:3px}.ingredient-label{display:flex;justify-content:space-between;gap:12px;width:100%;font-size:13px;line-height:1.5;cursor:pointer}.ingredient-label strong{white-space:nowrap;font-size:12px}.ingredient[data-checked] .ingredient-label>span{text-decoration:line-through;color:var(--recipe-muted)}.portion-panel>h2{font-size:20px;margin:0 0 24px}.field-label{font-size:13px;font-weight:600}.stepper{display:flex;margin-top:10px;border:1px solid var(--recipe-line);border-radius:8px;overflow:hidden}.stepper button{width:42px;flex-shrink:0;background:var(--recipe-soft);border:0;font-size:21px}.stepper input{width:100%;min-width:0;text-align:center;border:0;padding:12px 0;background:white;color:var(--recipe-ink)}.field-description{font-size:11px;line-height:1.7;color:var(--recipe-muted);margin:10px 0 0}.field-error{font-size:12px;color:#a73324}.portion-total{display:flex;justify-content:space-between;gap:12px;margin:24px 0;padding:18px 0;border-top:1px solid var(--recipe-line);border-bottom:1px solid var(--recipe-line);font-size:12px}.portion-total strong{font-size:19px;white-space:nowrap}.portion-panel h3{font-size:13px;line-height:1.6}.portion-panel ol{padding-left:18px;font-size:12px;line-height:1.7;color:var(--recipe-muted)}.portion-panel li{margin-bottom:12px}.reset{width:100%;padding:12px;border:1px solid var(--recipe-line);border-radius:8px;background:white;color:var(--recipe-action);font-size:12px;margin-top:16px}.notice{font-size:11px;line-height:1.7;color:var(--recipe-muted)}@media(max-width:760px){.recipe-layout{grid-template-columns:minmax(0,1fr)}.recipe-shell{padding:20px}h1{font-size:29px}}@media(max-width:360px){.recipe-shell{padding:14px}.recipe-card,.portion-panel{padding:16px}.ingredient-label{gap:8px;font-size:12px}.ingredient{gap:8px}.ingredient-label strong{font-size:11px}.recipe-heading h2{font-size:27px}}

Riferimento del codice

  • Questi valori recipe-* sono scelte originali dell’applicazione, non token ufficiali di Kobalte.
  • Il foglio di stile completo include una composizione adattabile e indicatori di focus visibili.
04

Kobalte Configurazione dell’agente per il sistema di design

Punto di partenza per l’implementazione

Il template Solid di Vite fornisce il compilatore JSX richiesto da Solid. Gli esempi completi di App.jsx e style.css riportati sopra contengono tutto il codice e gli stili dell’applicazione; non servono provider o servizi esterni.

javascript
// npm create vite@latest kobalte-recipe -- --template solid
// cd kobalte-recipe && npm install
// npm install [email protected] @kobalte/[email protected]
// Save the complete examples as src/App.jsx and src/style.css.
// src/index.jsx:
import {render} from 'solid-js/web';
import App from './App.jsx';
import './style.css';
render(() => <App />, document.getElementById('app'));
// index.html: <div id="app"></div><script type="module" src="/src/index.jsx"></script>
// npm run dev

Un prompt per il tuo progetto

Prompt per l’agente
Usa Kobalte 0.13.14 con Solid 1.9.15 per riprodurre la scheda della ricetta reattiva. Mantieni NumberField rawValue/onRawValueChange, i limiti da uno a otto, la convalida delle porzioni intere e la struttura completa Label/Description/ErrorMessage. Ricava i grammi degli ingredienti e i totali dal segnale delle porzioni; un effettivo cambio di quantità svuota l’insieme immutabile degli ID selezionati, ma mantiene la ricetta fissata. Mantieni le parti Checkbox native e ToggleButton pressed/onChange, disabilita la raccolta quando le quantità non sono valide e, al ripristino, imposta quattro porzioni, nessuna selezione e nessuna ricetta fissata. Includi la ricetta originale CSS completa; tutto lo stato rimane locale.
05

Kobalte Fonti e ambito del sistema di design

Verificato con Kobalte 0.13.14 e Solid 1.9.15. Tutti i token recipe-*, l’illustrazione CSS e le quantità degli ingredienti sono dati originali dell’esempio. Fissare la ricetta e raccogliere gli ingredienti modificano solo lo stato locale; non sono collegati account, servizi di acquisto o archivi persistenti di ricette.