Software aziendale · Nuova risorsa

Sistema di progettazione SAP Fiori.

Usa il tema Horizon di SAP Fiori tramite UI5 Web Components: parametri tema reali, densità dei contenuti esplicita, stati semantici dei valori e composizione di una richiesta d’acquisto con convalida locale.

Guida OpenDesign8 capitoli37 voci di riferimentoGuida applicativa originale
01

Anteprima dell’interfaccia del sistema di progettazione sistema di design SAP Fiori

Modifica una richiesta d’acquisto, convalida la quantità, cambia la densità e prepara un riepilogo locale.

Area di lavoro delle richieste d’acquistoApri l’esempio completo
Interpretazione offline HTML dei parametri Morning Horizon e della composizione dei moduli UI5. L’esempio del pacchetto nativo è incluso separatamente. · Riferimento per l’implementazione
02

Riferimento di progettazione del sistema di progettazione sistema di design SAP Fiori

Parametri sorgente di Morning Horizon (sap_horizon) e documentazione aggiornata di UI5 Web Components. I nomi @sap senza prefisso Less riportati di seguito sono parametri sorgente; gli stili del browser usano le corrispondenti proprietà personalizzate --sap. Le dimensioni protette sono valori osservati, non punti consigliati per la sovrascrittura.

Ruoli cromatici di Horizon

Fonte
Nome / regolaValore / configurazioneUtilizzo
@sapBrandColor#0070f2 Ruolo primario del brand.
@sapBackgroundColor#f5f6f7 Sfondo della pagina.
@sapBaseColor#ffffff Superficie di base.
@sapTextColor#131e29 Testo primario.
@sapNegativeColor#aa0808 Stato negativo.
@sapCriticalColor#e76500 Ruolo critico; il testo usa un ruolo derivato distinto.
@sapPositiveColor#256f3a Stato positivo.
@sapInformationBackground#e1f4ff Superficie dei messaggi informativi.
@sapWarningBackground#fff8d6 Superficie dei messaggi critici.

Tipografia e geometria

Fonte
Nome / regolaValore / configurazioneUtilizzo
@sapFontFamily"72", "72full", Arial, Helvetica, sans-serifStack di font pubblicato.
@sapFontSize0.875remDimensione di base.
@sapContent_LineHeight1.5Moltiplicatore dell’interlinea del contenuto.
@sapElement_Height2.25remDimensione regolare protetta.
@sapElement_Compact_Height1.625remDimensione compatta protetta.
@sapElement_LineHeight2.75remRiquadro di riga regolare protetto.
@sapElement_Compact_LineHeight2remRiquadro di riga compatto protetto.
@sapButton_BorderCornerRadius0.5remParametro di arrotondamento dei pulsanti.
@sapContent_FocusWidth0.125remLarghezza del focus.
@sapContent_FocusColor#0032a5 Colore del focus.

Configurazione di tema e densità

Fonte
Nome / regolaValore / configurazioneUtilizzo
sap_horizonMorning HorizonTema predefinito integrato nei componenti.
sap_horizon_darkEvening HorizonPer un tema aggiuntivo servono risorse.
sap_horizon_hcb / sap_horizon_hcwHigh contrast black / whiteTemi a contrasto elevato supportati e separati.
Assets.jsOne import per component library usedRegistra le risorse del tema aggiuntivo.
setTheme(name)@ui5/webcomponents-base/dist/config/Theme.jsCambia tema tramite l’API pubblica API.

Contratto di Select

Fonte
Nome / regolaValore / configurazioneUtilizzo
ui5-select valueMatches option value or textNon combinarlo con le flag selected delle opzioni.
selectedOptionRead-only IOptionLeggi l’oggetto dell’opzione selezionata.
changeevent.detail.selectedOptionModifica della selezione confermata.
live-changeNavigation previewNon considerarla una scelta aziendale confermata.
accessible-name-refID of visible labeling elementAssocia al controllo un’etichetta visibile.

Input e feedback

Fonte
Nome / regolaValore / configurazioneUtilizzo
valueStringConverti esplicitamente l’input numerico.
inputEach keystrokeUsalo per i totali stimati in tempo reale.
changeEnter or focusoutDiverso dall’input a ogni pressione di tasto.
value-stateNone / Negative / Critical / Information / PositiveNomi degli stati nell’attuale API.
slot="valueStateMessage"One root elementSpiegazione specifica del campo.

Message strip

Fonte
Nome / regolaValore / configurazioneUtilizzo
designInformation / Positive / Critical / NegativeMessaggio semantico dell’applicazione.
hide-close-buttonBoolean attributeMantieni visibile la spiegazione richiesta.
default slotPrefer text contentEvita di trasformare una strip in un pannello complesso.
03

Guida completa al sistema di progettazione sistema di design SAP Fiori

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

DESIGN-sap-fiori.md

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

Scarica la guida

Il design del sistema di progettazione sistema di design SAP Fiori e l’implementazione UI5 hanno ambiti diversi

Un punto di partenza concreto

SAP Fiori descrive un’esperienza utente aziendale. Questo riferimento sceglie UI5 Web Components per realizzare un esempio di richiesta d’acquisto. Ciò non significa che installando questi componenti si crei un’applicazione SAPUI5, un floorplan Fiori elements o una transazione aziendale SAP autorizzata.

Da questa guida su OpenDesign

Il pacchetto principale dei componenti fornisce Input, Select e Button. I componenti Fiori di livello superiore si trovano in un pacchetto separato. Importare solo i moduli usati in questo esempio rende esplicito il punto di ingresso ed evita di suggerire un CDN non supportato che includa tutti i componenti.

Leggi la specifica di supporto

Sistema di progettazione sistema di design SAP Fiori: usa i parametri Horizon con nome invece di una palette blu generica

Superficie e ruoli di stato

Morning Horizon imposta lo sfondo della pagina su una superficie grigio chiaro e usa una superficie di base bianca. Il blu del marchio e il colore del testo sono parametri distinti. I ruoli negativo, critico, positivo e informativo ne descrivono il significato, non costituiscono una lista di colori decorativi da alternare nelle schede.

L’anteprima usa una striscia informativa per il riepilogo preparato, perché la preparazione locale non equivale all’approvazione dell’acquisto. Il prezzo dell’articolo, i centri di costo e le annotazioni sull’approvazione sono dati di esempio originali. Non vanno mai interpretati come regole aziendali fornite da SAP.

Leggi la specifica di supporto

Sistema di progettazione sistema di design SAP Fiori: Compact è un’impostazione del componente, non uno screenshot rimpicciolito

Applica la densità a un’area significativa

UI5 supporta un marcatore compact applicabile all’elemento root, al body, a un’area o a un componente. L’attributo data-ui5-compact-size e la classe ui5-content-density-compact sono meccanismi pubblici. Cambiare dinamicamente il marcatore non richiede un API di densità separato.

Usa controlli compatti per un’attività desktop densa solo se l’interazione resta adeguata. L’interpretazione incorporata riduce la spaziatura dei controlli e delle righe, ma mantiene le stesse informazioni. Nel layout stretto, le aree vengono disposte in verticale invece di rimpicciolire tutte le etichette e i pulsanti.

html
<section data-ui5-compact-size>
  <ui5-input accessible-name="Request title"></ui5-input>
</section>

Riferimento del codice

Leggi la specifica di supporto

Sistema di progettazione sistema di design SAP Fiori: la famiglia 72 e il caricamento dei font

La disponibilità dei font fa parte della configurazione

Il tema Horizon specifica 72 e 72full prima dei font di fallback. UI5 documenta come disabilitare il caricamento predefinito dei font e come ospitare i font localmente. La voce di comodo FontFace.css è contrassegnata come sperimentale: se scegli questa soluzione, fissa il percorso e ricontrollalo.

L’anteprima autonoma usa Arial come fallback offline esplicito. L’esempio UI5 nativo usa la variabile font-family pubblicata. Questa distinzione evita di sostenere che uno screenshot con un fallback visivamente simile dimostri che le risorse dei font SAP siano state caricate.

Leggi la specifica di supporto

Sistema di progettazione sistema di design SAP Fiori: un Select presenta modifiche confermate e provvisorie

Scegli un’unica strategia controllata per la selezione

Il valore di Select corrisponde al valore o al testo di un’opzione. È sconsigliato combinare un valore Select con le flag selected sulle opzioni; un valore inesistente non seleziona alcuna opzione. L’esempio inizializza un’opzione reale per il centro di costo e legge il valore di Select quando prepara il risultato.

L’evento change contiene l’opzione selezionata. live-change viene attivato anche quando si scorrono le opzioni o si annulla con Esc. Usa la selezione confermata per i dati aziendali e riserva le modifiche provvisorie alle anteprime.

  • Importa le registrazioni di Select e Option prima di visualizzare i relativi tag.
  • Associa l’etichetta visibile del centro di costo tramite accessible-name-ref.
  • In questo esempio, mantieni value come unica strategia di selezione.

Leggi la specifica di supporto

Sistema di progettazione sistema di design SAP Fiori: l’input numerico richiede comunque la convalida dell’applicazione

Lo stato e il messaggio del valore devono essere coerenti

Il valore di Input è una stringa anche quando il tipo di input è Number. Converti il valore e verifica che sia un intero finito entro i limiti prima di moltiplicarlo per il prezzo di esempio. Un valore vuoto non deve essere accettato come zero. Lo stato semantico di errore corrente è Negative, non un enum Error inventato.

Lo slot valueStateMessage fornisce un elemento root con una spiegazione specifica. Il totale aggiornato in tempo reale ascolta input; il riepilogo preparato viene aggiornato solo quando l’utente attiva l’azione.

  1. Leggi il titolo e la stringa numerica dai rispettivi componenti.
  2. Per questo esempio, richiedi un titolo e una quantità intera compresa tra 1 e 20.
  3. Imposta su Negative i controlli interessati e mantieni i valori inseriti.
  4. Prepara il riepilogo solo quando entrambe le condizioni sono soddisfatte.

Leggi la specifica di supporto

Sistema di progettazione sistema di design SAP Fiori: descrivi il risultato senza uscire dal contesto locale

Usa una strip per comunicare un esito conciso

MessageStrip supporta design semantici e un controllo di chiusura. Se è necessaria una spiegazione, il pulsante di chiusura può essere nascosto per lasciarle spazio. È preferibile mantenere lo slot predefinito come testo, senza trasformarlo in un modulo o in un pannello.

Il riepilogo include titolo, quantità, totale stimato e centro di costo. La frase finale chiarisce che non è stato inviato nulla. In un servizio reale, questo passaggio locale sarebbe sostituito da una richiesta autorizzata e da una risposta con lo stato effettivo del backend.

Leggi la specifica di supporto

Tema del sistema di design SAP Fiori: risorse e registrazione dei moduli

La selezione del tema richiede le risorse corrispondenti

Morning Horizon è il tema predefinito documentato e integrato nei componenti. Per i temi aggiuntivi, serve il modulo Assets.js per ogni libreria utilizzata. Poi setTheme può scegliere Evening Horizon o una delle varianti ad alto contrasto. Scegliere un nome scuro senza verificare le risorse caricate non costituisce un'integrazione completa.

Il punto di ingresso fornito registra ogni elemento personalizzato prima di creare il markup. Vite gestisce le importazioni ES dinamiche e le risorse JSON. Compila il progetto nativo e verifica separatamente i font, il caricamento dei temi e il comportamento da tastiera rispetto all'esempio HTML offline.

Leggi la specifica di supporto

Esempi di componenti del sistema di design SAP Fiori

Esempio interattivo completo e autonomo

Salva il documento completo come index.html e aprilo in un browser. Interpretazione offline HTML dei parametri di Morning Horizon e della composizione dei moduli UI5. L'esempio del pacchetto nativo è incluso separatamente.

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Fiori purchase request</title><style>
*{box-sizing:border-box}body{margin:0;color:#131e29;background:#f5f6f7;font:14px/1.5 Arial,sans-serif}header{background:white;padding:12px 24px;display:flex;gap:16px;align-items:center;border-bottom:1px solid #d5dadd}.symbol{width:32px;height:32px;display:grid;place-items:center;background:#0070f2;color:white;border-radius:8px;font-weight:bold}header strong{font-size:16px}header span:last-child{margin-left:auto;color:#556b82;font-size:12px}main{max-width:1100px;margin:auto;padding:24px}.objecthead{display:flex;justify-content:space-between;gap:20px;align-items:start;margin-bottom:24px}h1{font-size:28px;line-height:36px;margin:0 0 6px}h2{font-size:18px;margin:0 0 16px}.subtitle{color:#556b82;margin:0}.draft{background:#e1f4ff;color:#0032a5;padding:6px 12px;border-radius:6px}.layout{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:24px}.panel{background:white;border-radius:12px;padding:24px;border:1px solid #d5dadd}label{display:block;margin-bottom:6px;color:#556b82}input,select{width:100%;height:44px;border:1px solid #758ca4;border-radius:8px;padding:8px 12px;background:#fff;font:inherit;color:inherit}input:focus,select:focus,button:focus-visible{outline:2px solid #0032a5;outline-offset:3px}.fields{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin-bottom:24px}.fields>div:first-child{grid-column:1/-1}.line{border-top:1px solid #d5dadd;padding-top:20px;display:grid;grid-template-columns:64px minmax(0,1fr) auto;gap:16px;align-items:center}.monitor{background:#e1f4ff;border:2px solid #556b82;height:42px;border-radius:4px;position:relative;margin-bottom:12px}.monitor:after{content:'';position:absolute;bottom:-12px;left:25%;width:50%;height:10px;border-bottom:3px solid #556b82;border-left:8px solid transparent;border-right:8px solid transparent}.line strong{display:block}.line small{color:#556b82}.money{font-size:24px;font-weight:600;white-space:nowrap}.unit{font-size:12px;color:#556b82}.total{display:flex;justify-content:space-between;padding-top:24px;font-weight:600}.controls{display:flex;gap:12px;flex-wrap:wrap;margin-top:24px}button{border:1px solid #0070f2;background:white;color:#0057b8;padding:10px 16px;border-radius:8px;font:600 14px/20px Arial;cursor:pointer}button.primary{background:#0070f2;color:white}button:hover{filter:brightness(.95)}.steps{list-style:none;padding:0;margin:0;counter-reset:step}.steps li{position:relative;padding:0 0 24px 36px;color:#556b82}.steps li:before{counter-increment:step;content:counter(step);position:absolute;left:0;top:0;border:1px solid #758ca4;border-radius:50%;width:24px;height:24px;text-align:center;background:white}.steps strong{display:block;color:#131e29}.steps li:first-child:before{background:#e1f4ff;color:#0057b8;border-color:#0070f2}.strip{margin-top:24px;background:#e1f4ff;border:1px solid #0070f2;padding:12px 16px;border-radius:8px}.strip.error{background:#ffeaf4;border-color:#aa0808;color:#aa0808}.foot{font-size:12px;color:#556b82;margin-top:24px}.compact input,.compact select{height:32px;padding:4px 8px}.compact .fields{gap:12px}.compact .panel{padding:16px}.compact .line{padding-top:12px}.compact button{padding:6px 12px}.hint{font-size:12px;color:#556b82;margin:6px 0 0}@media(max-width:700px){main{padding:20px 16px}.layout{grid-template-columns:1fr}.fields{grid-template-columns:1fr}.objecthead{display:block}.draft{display:inline-block;margin-top:12px}.line{grid-template-columns:48px minmax(0,1fr)}.line>.money{grid-column:2}.panel{padding:20px}header{padding:12px 16px}}
</style><header><span class="symbol">P</span><strong>Procurement workspace</strong><span>Sample environment</span></header><main><div class="objecthead"><div><h1>Purchase request</h1><p class="subtitle">PR-DRAFT · Workplace equipment</p></div><span class="draft">Draft · not submitted</span></div><div class="layout"><section class="panel"><h2>Request details</h2><form id="form" novalidate><div class="fields"><div><label for="title">Request title</label><input id="title" placeholder="e.g. Studio display upgrade" aria-describedby="notice"></div><div><label for="team">Cost center</label><select id="team"><option value="Design · CC-240">Design · CC-240</option><option value="Research · CC-360">Research · CC-360</option></select></div><div><label for="qty">Monitor quantity</label><input id="qty" type="number" min="1" max="20" step="1" value="2" aria-describedby="qty-help notice"><p id="qty-help" class="hint">Whole number from 1 to 20.</p></div></div><div class="line"><div class="monitor" aria-hidden="true"></div><div><strong>27-inch studio monitor</strong><small>Equipment · Item 100240</small></div><div class="money">€320 <span class="unit">/ unit</span></div></div><div class="total"><span>Estimated line total</span><output id="total">€640</output></div><div class="controls"><button class="primary">Prepare summary</button><button type="button" id="density" aria-pressed="false">Compact controls</button></div></form></section><aside class="panel"><h2>Request path</h2><ol class="steps"><li><strong>Prepare draft</strong>Check quantities and cost center.</li><li><strong>Review summary</strong>Confirm the local request details.</li><li><strong>Submit to service</strong>Not connected in this preview.</li></ol><p class="hint">The review path and price are illustrative application data.</p></aside></div><div class="strip" id="notice" role="status">Complete the draft before preparing the summary.</div><p class="foot">HTML interpretation of SAP Morning Horizon · UI5 native integration provided in guide · No SAP transaction created</p></main><script>
const $=id=>document.getElementById(id);function amount(){const n=Number($('qty').value);return Number.isInteger(n)&&n>=1&&n<=20?n:null}$('qty').oninput=()=>{$('total').textContent=amount()===null?'Invalid quantity':'€'+amount()*320};$('density').onclick=()=>{const active=document.body.classList.toggle('compact');$('density').setAttribute('aria-pressed',String(active));$('density').textContent=active?'Cozy controls':'Compact controls'};$('form').onsubmit=e=>{e.preventDefault();const title=$('title').value.trim(),n=amount();$('title').setAttribute('aria-invalid',String(!title));$('qty').setAttribute('aria-invalid',String(n===null));$('notice').classList.toggle('error',!title||n===null);if(!title||n===null){$('notice').textContent=!title?'Enter a title for this request.':'Use a whole quantity from 1 to 20.';(!title?$('title'):$('qty')).focus();return}$('notice').textContent='Local summary: '+title+' · '+n+' monitors · €'+n*320+' · '+$('team').value+'. Nothing submitted.'};
</script></html>

Riferimento del codice

  • L'interruttore della densità in questo documento HTML è un'interpretazione. L'esempio UI5 mostra l'indicatore compatto effettivo, gli elementi personalizzati registrati e le risorse Horizon.

Richiesta di acquisto Horizon con quantità validate

Input, Select/Option, Button e MessageStrip compongono un riepilogo locale della richiesta. I totali aggiornati a ogni pressione di tasto restano separati dal risultato preparato.

javascript
// main.js in a Vite vanilla project. index.html contains <div id="app"></div>.
import '@ui5/webcomponents/dist/Button.js';
import '@ui5/webcomponents/dist/Input.js';
import '@ui5/webcomponents/dist/Select.js';
import '@ui5/webcomponents/dist/Option.js';
import '@ui5/webcomponents/dist/MessageStrip.js';
import '@ui5/webcomponents/dist/Assets.js';
import {setTheme} from '@ui5/webcomponents-base/dist/config/Theme.js';
setTheme('sap_horizon');
document.querySelector('#app').innerHTML = `
  <main style="max-width:800px;margin:auto;padding:24px;font-family:var(--sapFontFamily)">
    <h1>Purchase request</h1>
    <p>Prepare a local requisition summary. No SAP transaction is created.</p>
    <p id="request-label">Request title</p>
    <ui5-input id="title" accessible-name-ref="request-label" required>
      <span slot="valueStateMessage">Enter a title for this request.</span>
    </ui5-input>
    <p id="team-label">Cost center</p>
    <ui5-select id="team" accessible-name-ref="team-label" value="design">
      <ui5-option value="design">Design · CC-240</ui5-option>
      <ui5-option value="research">Research · CC-360</ui5-option>
    </ui5-select>
    <p id="qty-label">Monitor quantity</p>
    <ui5-input id="qty" type="Number" accessible-name-ref="qty-label" value="2">
      <span slot="valueStateMessage">Use a whole number from 1 to 20.</span>
    </ui5-input>
    <p id="total">Estimated line total: €640</p>
    <ui5-button id="prepare" design="Emphasized">Prepare summary</ui5-button>
    <ui5-button id="density">Toggle compact controls</ui5-button>
    <ui5-message-strip id="notice" design="Information" hide-close-button style="display:block;margin-top:24px">
      Complete the draft before preparing the summary.
    </ui5-message-strip>
  </main>`;
const title=document.querySelector('#title'),qty=document.querySelector('#qty');
qty.addEventListener('input',()=>{
  const n=Number(qty.value);
  document.querySelector('#total').textContent=Number.isInteger(n)&&n>=1&&n<=20
    ? `Estimated line total: €${n*320}` : 'Enter a valid quantity to calculate the total.';
});
document.querySelector('#prepare').addEventListener('click',()=>{
  const n=Number(qty.value), validTitle=!!title.value.trim(), validQty=Number.isInteger(n)&&n>=1&&n<=20;
  title.valueState=validTitle?'None':'Negative';qty.valueState=validQty?'None':'Negative';
  const notice=document.querySelector('#notice');
  if(!validTitle||!validQty){notice.design='Negative';notice.textContent='Correct the request title or quantity before continuing.';return;}
  notice.design='Information';
  notice.textContent=`Local summary: ${title.value.trim()}, ${n} monitors, €${n*320}, ${document.querySelector('#team').value}. Nothing submitted.`;
});
document.querySelector('#density').addEventListener('click',()=>document.body.toggleAttribute('data-ui5-compact-size'));

Riferimento del codice

  • La regola sulla quantità, il prezzo unitario di 320 € e i centri di costo sono dati applicativi inventati, non policy SAP.
  • UI5 Web Components è una delle implementazioni dei modelli Fiori; non si tratta di un'applicazione SAPUI5 completa né di un floorplan Fiori elements.
  • Non viene creata alcuna transazione SAP. La convalida dell'anteprima offline non implica la compilazione delle dipendenze native.
04

Configurazione dell'agente del sistema di design SAP Fiori

Punto di partenza per l’implementazione

Sostituisci main.js di Vite con l'esempio completo. La documentazione UI5 prevede un bundler di moduli ES; non fornisce un CDN ufficiale con tutti i componenti.

bash
npm create vite@latest fiori-request -- --template vanilla
cd fiori-request
npm install
npm install @ui5/webcomponents @ui5/webcomponents-base
npm run dev

Un prompt per il tuo progetto

Prompt per l’agente
Componi una richiesta di acquisto Fiori usando Input, Select, Button e MessageStrip di UI5 Web Components con il tema Horizon. Mantieni la convalida numerica, lo stato del valore Negative corretto, la densità compatta esplicita e un comportamento onesto del riepilogo locale.
05

Fonti e ambito del sistema di design SAP Fiori

Riferimento indipendente OpenDesign. Esempio con UI5 Web Components, non una transazione SAP distribuita né un'applicazione Fiori elements completa.