Logiciels d’entreprise · Nouvelle ressource

Système de design Arco Design.

Créez un sélecteur de sections de rapport avec le composant Transfer contrôlé d’Arco. Découvrez ses véritables échelles d’espacement et de taille, ses conventions de variables CSS, ses surfaces sémantiques et la différence entre sélectionner des lignes et les déplacer.

Guide OpenDesign8 chapitres37 entrées de référenceGuide de l’application d’origine
01

Système de design Arco Design — aperçu de l’interface

Recherchez, sélectionnez, incluez ou supprimez des sections du rapport, puis préparez un plan local indépendant.

Transfert des sections du rapportOuvrir l’exemple complet
Interprétation autonome du comportement de Transfer HTML et des points d’ancrage du thème vérifiés ; exemple natif React fourni séparément. · Référence de mise en œuvre
02

Système de design Arco Design — référence de conception

Source amont d’Arco React. Les constantes Less sont préfixées par @ ; les variables CSS à l’exécution utilisent --. Les espacements de l’aperçu et la disposition des panneaux sont des choix originaux pour l’application, fondés sur ces échelles.

Dimensions et espacements

Source
Nom / règleValeur / configurationUtilisation
@size-mini24pxAlias de hauteur compacte du composant.
@size-small28pxHauteur réduite du composant.
@size-default32pxHauteur par défaut du composant.
@size-large36pxGrande hauteur du composant.
@spacing-1 … @spacing-62, 4, 6, 8, 10, 12pxPetits intervalles d’espacement.
@spacing-7 … @spacing-1016, 20, 24, 32pxIntervalles de regroupement.
@border-radius-small2pxPetits arrondis.
@border-radius-medium4pxArrondis moyens.
@border-radius-large8pxGrands arrondis.

Typographie et mouvement

Source
Nom / règleValeur / configurationUtilisation
@font-size-body14pxTaille globale du texte courant.
@line-height-base1.5715Boîte de ligne d’environ 22 px pour un texte de 14 px.
@font-familyInter, system and CJK fallbacksMentionner Inter ne le télécharge pas.
@code-familyConsolas, MenloPile orientée code.
@transition-duration-1 / 2 / 30.1s / 0.2s / 0.3sTrois premières constantes de durée.
@transition-timing-function-standardcubic-bezier(.34,.69,.1,1)Courbe standard publiée.

Repères de la palette

Source
Nom / règleValeur / configurationUtilisation
@arcoblue-6#165dff Repère du bleu Arco.
@gray-1#f7f8fa Neutre clair.
@gray-2#f2f3f5 Neutre pour le remplissage secondaire.
@gray-3#e5e6eb Neutre pour les bordures.
@gray-8#4e5969 Neutre pour le texte secondaire.
@gray-10#1d2129 Neutre pour le texte principal.
@red-6#f53f3f Repère du rouge ; ne présumez pas qu’il offre un contraste suffisant pour les petits caractères.
@green-6#00b42a Repère du vert.

Conventions des variables à l’exécution

Source
Nom / règleValeur / configurationUtilisation
--color-text-1Primary text rolePar défaut, le préfixe des variables n’est pas arco.
--color-fill-2Secondary fill roleÀ utiliser à la place d’un gris codé en dur dans les zones adaptées au thème.
--border-radius-mediumMedium corner roleExposé à l’exécution.
body[arco-theme="dark"]Dark theme selectorDéfinissez ou supprimez l’attribut du body.
--color-bg-2Container surfaceSa valeur diffère en mode sombre.

Transmettre l’état et les événements

Source
Nom / règleValeur / configurationUtilisation
dataSource{key:string,value:string,disabled?:boolean}[]Des clés stables identifient les sections.
targetKeysstring[]Appartenance à la colonne cible.
selectedKeysstring[]Sélection par case à cocher, et non appartenance à la cible.
onChange(newTargetKeys,direction,moveKeys)Validez le nouveau tableau d’appartenance.
onSelectChange(leftSelectedKeys,rightSelectedKeys)Combinez les deux tableaux pour contrôler selectedKeys.
filterOption(inputValue,item) => booleanPar défaut, la recherche utilise une correspondance partielle sensible à la casse.
showSearchBoolean or per-list configurationL’exemple active la recherche dans les deux colonnes.
oneWayBooleanÀ utiliser uniquement si le retrait de la cible n’est pas souhaité.
simpleBoolean or retainSelectedItems optionsLa sélection peut déclencher le déplacement ; ce comportement n’équivaut pas à des actions de transfert explicites.
03

Arco Design Guide complet du système de design

Un guide pratique pour choisir, appliquer et évaluer ce système dans une interface réelle.

DESIGN-arco-design.md

Des conseils complets, un point de départ pour la mise en œuvre et des liens vers les sources.

Télécharger le guide

Arco Design Dans le système de design, Transfer représente l’appartenance, pas simplement une liste de cases à cocher

Choisissez soigneusement les sections du rapport

Arco Transfer est utile lorsqu’un opérateur doit comparer deux ensembles : les sections disponibles et celles incluses dans un rapport. Cocher une ligne la marque pour une opération ultérieure ; la section n’est pas déplacée immédiatement, sauf si le mode simple est activé.

Extrait de ce guide OpenDesign

L’exemple conserve l’action explicite en deux étapes. L’utilisateur sélectionne « Canaux d’acquisition », active « Inclure », puis prépare un plan. Ce plan constitue un instantané distinct : les modifications ultérieures dans l’éditeur ne modifient pas silencieusement la version préparée.

Consultez la spécification associée

Arco Design Dans le système de design, utilisez séparément les échelles de tailles et d’espacements

Une même valeur peut désigner des dimensions différentes

Les constantes de taille d’Arco augmentent par incréments de quatre pixels, tandis que l’échelle d’espacement commence par 2, 4, 6, 8, 10 et 12, avant de passer à des incréments plus grands. La taille par défaut du composant correspond à 32 px. Supposer que chaque suffixe de taille ou d’espacement désigne la même valeur entraînerait des contrôles incohérents.

Dans cette composition d’origine, les deux panneaux de transfert ont des coins moyennement arrondis et la marge de page est de 24 px. Les petites cases à cocher et les séparateurs de ligne facilitent les sélections denses ; les grandes zones de la page assurent une séparation sans remplacer le contenu utile par des cartes surdimensionnées.

Consultez la spécification associée

Système de design Arco Design Conservez les rôles sémantiques dans le style de l’application

Les variables CSS ont leurs propres conventions de nommage

Le thème par défaut expose des variables telles que --color-text-1 et --color-fill-2, sans préfixe arco. Les compilations personnalisées peuvent modifier ce préfixe ; vérifiez donc le thème compilé lors de son intégration dans une application utilisant son propre espace de noms. Les variables de la palette principale contiennent des canaux RVB : il faut utiliser rgb(var(--primary-6)) plutôt que de les traiter comme une couleur hexadécimale complète.

L’aperçu utilise le repère bleu Arco vérifié pour l’action principale et les lignes sélectionnées. Pour une section restreinte, une case à cocher désactivée et un texte explicatif sont préférables à une couleur rouge, qui pourrait laisser croire à une erreur que l’opérateur peut corriger.

Consultez la spécification associée

Système de design Arco Design Prévoyez les libellés denses et les noms de section longs

Une échelle pratique pour le texte courant

La taille par défaut du texte courant est de 14 px, avec un interligne de 1.5715. La famille publiée commence par Inter et comprend des polices de remplacement système et CJK. Il s’agit d’une pile CSS, et non de la preuve qu’un fichier de police Inter a été chargé.

Le libellé d’une section de rapport peut être plus long que l’exemple. La version hors ligne répartit le texte des lignes sur plusieurs lignes et empile les panneaux sur les petits écrans, afin que les libellés « Inclure » et « Retirer » restent lisibles. Elle ne réduit pas l’ensemble du composant de transfert au point de rendre le texte illisible.

Consultez la spécification associée

Système de design Arco Design Deux tableaux contrôlés évitent les comportements ambigus

L’appartenance et la sélection ont des sens différents

targetKeys indique quels éléments figurent dans le rapport. selectedKeys indique quelles cases à cocher sont actuellement activées dans les deux listes. onSelectChange fournit les tableaux de gauche et de droite ; concaténez-les pour contrôler selectedKeys. onChange fournit la nouvelle appartenance, la direction et les clés déplacées.

  1. Conservez une clé stable pour chaque élément source, même si son libellé change.
  2. Combinez les tableaux de sélection de gauche et de droite dans onSelectChange.
  3. Remplacez targetKeys par le nouveau tableau fourni par onChange.
  4. Effacez la sélection temporaire après un déplacement et indiquez son effet local.

Consultez la spécification associée

Système de design Arco Design Le mode sombre modifie les surfaces autant que le texte

Définissez le sélecteur publié

Arco publie ses règles de remplacement pour le mode sombre sous la balise du thème, avec arco-theme="dark". Dans la compilation par défaut, cette balise est body. Supprimer cet attribut rétablit les règles normales ; ajouter une classe sans rapport appelée dark ne revient pas au même API.

Pour ajouter un aperçu sombre, adaptez ensemble le conteneur et les rôles du texte. L’exemple hors ligne reste volontairement clair, tandis que l’exemple natif peut utiliser le thème CSS déjà importé. N’inversez pas les vignettes de rapport ni les illustrations au moyen d’un filtre global.

js
document.body.setAttribute('arco-theme', 'dark');
// Restore default:
document.body.removeAttribute('arco-theme');

Référence du code

Consultez la spécification associée

Système de design Arco Design Package, feuille de style et limites réelles

Un plan de rapport n’exporte pas les données du rapport

Le package React est @arco-design/web-react et sa feuille de style complète CSS est dist/css/arco.css. L’exemple importe Transfer et Button depuis la racine du package et utilise un état contrôlé, plutôt que d’inventer une API de création de rapports.

L’aperçu autonome interprète le comportement de sélection à l’aide de cases à cocher et de boutons natifs, afin de fonctionner hors ligne. Il valide la logique d’interaction et la composition adaptative ; il ne prouve pas que le package natif a été compilé dans un projet utilisateur. Un exportateur destiné à la production nécessiterait un backend et des vérifications des autorisations allant au-delà d’une ligne d’exemple désactivée.

Consultez la spécification associée

Arco Design Exemples de composants du système de design

Exemple interactif autonome complet

Enregistrez le document complet sous le nom index.html, puis ouvrez-le dans un navigateur. Interprétation autonome HTML du comportement d’Arco Transfer et repères de thème vérifiés ; exemple natif React fourni séparément.

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Arco report section transfer</title><style>
*{box-sizing:border-box}body{margin:0;color:#1d2129;background:#f7f8fa;font:14px/22px Arial,sans-serif}header{padding:20px 28px;background:white;border-bottom:1px solid #e5e6eb;display:flex;justify-content:space-between}.logo{font-size:18px;font-weight:bold;letter-spacing:-.02em}.logo i{font-style:normal;color:#165dff;margin-right:8px}header small{color:#4e5969}main{max-width:1050px;padding:28px;margin:auto}h1{font-size:24px;line-height:32px;margin:0 0 8px}.lead{color:#4e5969;margin:0 0 24px}.transfer{display:grid;grid-template-columns:minmax(0,1fr) 106px minmax(0,1fr);align-items:stretch}.list{border:1px solid #e5e6eb;background:white;border-radius:4px;min-width:0}.head{padding:16px;background:#f2f3f5;display:flex;gap:8px;justify-content:space-between}.head h2{font-size:14px;margin:0}.count{font-size:12px;color:#4e5969}.search{padding:12px;border-bottom:1px solid #e5e6eb}.search label{font-size:12px;display:block;margin-bottom:4px;color:#4e5969}.search input{height:32px;width:100%;border:1px solid transparent;background:#f2f3f5;padding:4px 12px;font:inherit;border-radius:2px}input:focus,button:focus-visible{outline:2px solid #165dff;outline-offset:2px}.items{min-height:290px;padding:8px}.item{display:flex;gap:10px;padding:12px 8px;border-radius:2px;align-items:start;cursor:pointer}.item:has(input:checked){background:#e8f3ff}.item input{width:16px;height:16px;accent-color:#165dff;margin-top:3px;flex-shrink:0}.item small{display:block;color:#4e5969;font-size:12px}.item:has(input:disabled){color:#86909c;cursor:not-allowed}.ops{padding:16px 12px;display:flex;flex-direction:column;gap:12px;justify-content:center}button{font:14px/22px Arial;border:1px solid #e5e6eb;background:white;color:#1d2129;border-radius:2px;padding:5px 12px;cursor:pointer}.ops button{padding:5px 4px}.primary{background:#165dff;border-color:#165dff;color:#fff}button:disabled{background:#f2f3f5;color:#86909c;border-color:#e5e6eb;cursor:not-allowed}.footer{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:20px 0}.footer p{font-size:12px;color:#4e5969;margin:0}.outline{background:white;border:1px solid #e5e6eb;border-radius:4px;padding:24px}.outline h2{font-size:16px;margin:0 0 12px}.outline ol{margin:0;padding-left:20px}.note{color:#4e5969;font-size:12px;margin-top:20px}.empty{padding:20px 8px;color:#4e5969}.selection{font-size:12px;color:#4e5969;padding:10px 16px;border-top:1px solid #e5e6eb}@media(max-width:650px){main{padding:24px 16px}.transfer{grid-template-columns:1fr}.ops{flex-direction:row;padding:12px}.ops button{padding:6px 16px}.items{min-height:160px}.footer{align-items:start;flex-direction:column}header{padding:16px}}
</style><header><span class="logo"><i>A /</i> Analytics workspace</span><small>Report studio</small></header><main><h1>Choose report sections</h1><p class="lead">Build an outline from the sections available to this workspace.</p><div class="transfer"><section class="list"><div class="head"><h2>Available sections</h2><span id="left-count" class="count"></span></div><div class="search"><label for="left-search">Find available section</label><input id="left-search" type="search" placeholder="Search by section name"></div><div class="items" id="left"></div><div class="selection" id="left-selected"></div></section><div class="ops"><button class="primary" id="include" disabled>Include →</button><button id="remove" disabled>← Remove</button></div><section class="list"><div class="head"><h2>Included in report</h2><span id="right-count" class="count"></span></div><div class="search"><label for="right-search">Find included section</label><input id="right-search" type="search" placeholder="Search included sections"></div><div class="items" id="right"></div><div class="selection" id="right-selected"></div></section></div><div class="footer"><p id="status" role="status">Select a section, then choose Include or Remove.</p><button id="prepare" class="primary">Prepare outline</button></div><section class="outline"><h2>Prepared outline</h2><div id="snapshot">No outline prepared yet.</div></section><p class="note">HTML interpretation of Arco Transfer · Original sample sections · Local outline only, no analytics data exported</p></main><script>
const data=[{key:'overview',value:'Executive overview',detail:'A concise summary of the reporting period'},{key:'traffic',value:'Acquisition channels',detail:'How people arrive at your product'},{key:'retention',value:'Retention cohorts',detail:'Returning usage by cohort'},{key:'revenue',value:'Revenue breakdown',detail:'Revenue categories and trends'},{key:'raw',value:'Raw event export',detail:'Restricted · unavailable in this specimen',disabled:true}];const $=id=>document.getElementById(id);let target=new Set(['overview']),selected=new Set();
function render(){for(const side of ['left','right']){const items=data.filter(x=>target.has(x.key)===(side==='right')),query=$(side+'-search').value.toLowerCase(),host=$(side);host.replaceChildren();$(side+'-count').textContent=items.length+' sections';const visible=items.filter(x=>x.value.toLowerCase().includes(query));if(!visible.length){const p=document.createElement('p');p.className='empty';p.textContent=query?'No matching sections.':'No sections in this column.';host.append(p)}for(const item of visible){const label=document.createElement('label');label.className='item';const input=document.createElement('input');input.type='checkbox';input.id='check-'+item.key;input.checked=selected.has(item.key);input.disabled=!!item.disabled;input.setAttribute('aria-label',item.value);input.onchange=()=>{input.checked?selected.add(item.key):selected.delete(item.key);render();$('check-'+item.key)?.focus()};const text=document.createElement('span'),small=document.createElement('small');text.textContent=item.value;small.textContent=item.detail;text.append(small);label.append(input,text);host.append(label)}$(side+'-selected').textContent=items.filter(x=>selected.has(x.key)).length+' selected'}$('include').disabled=!data.some(x=>selected.has(x.key)&&!target.has(x.key)&&!x.disabled);$('remove').disabled=!data.some(x=>selected.has(x.key)&&target.has(x.key)&&!x.disabled);$('prepare').disabled=!target.size}
function move(toTarget){const moved=data.filter(x=>selected.has(x.key)&&target.has(x.key)!==toTarget&&!x.disabled);for(const item of moved)toTarget?target.add(item.key):target.delete(item.key);selected.clear();render();$('status').textContent=moved.length+' section(s) '+(toTarget?'included in':'removed from')+' the local draft.';$(toTarget?'right-search':'left-search').focus()}
$('include').onclick=()=>move(true);$('remove').onclick=()=>move(false);for(const side of ['left','right'])$(side+'-search').oninput=render;$('prepare').onclick=()=>{const ol=document.createElement('ol');for(const item of data.filter(x=>target.has(x.key))){const li=document.createElement('li');li.textContent=item.value;ol.append(li)}$('snapshot').replaceChildren(ol);$('status').textContent='Local report outline prepared. No data exported.'};render();
</script></html>

Référence du code

  • La section restreinte du rapport ne peut pas être déplacée. Les lignes sélectionnées et les sections incluses correspondent à des états distincts, conformément à la distinction expliquée pour Transfer natif.

Transfert contrôlé des sections du rapport

Transfer gère les éléments présents dans les listes source et cible, tandis que l’état de l’application stocke un plan préparé séparément. Une ligne restreinte illustre une option désactivée sans prétendre imposer une autorisation côté serveur.

jsx
// npm install @arco-design/web-react react react-dom
import React,{useState} from 'react';
import {createRoot} from 'react-dom/client';
import {Transfer,Button} from '@arco-design/web-react';
import '@arco-design/web-react/dist/css/arco.css';
const data = [
 {key:'overview',value:'Executive overview'},
 {key:'traffic',value:'Acquisition channels'},
 {key:'retention',value:'Retention cohorts'},
 {key:'revenue',value:'Revenue breakdown'},
 {key:'raw',value:'Raw event export (restricted)',disabled:true}
];
function ReportBuilder(){
 const [target,setTarget]=useState(['overview']);
 const [selected,setSelected]=useState([]);
 const [snapshot,setSnapshot]=useState([]);
 const [status,setStatus]=useState('Choose sections for a local report.');
 return <main style={{padding:24,maxWidth:960,margin:'auto'}}>
  <h1>Report sections</h1>
  <Transfer dataSource={data} targetKeys={target} selectedKeys={selected}
   titleTexts={['Available sections','Included in report']}
   operationTexts={['Include','Remove']}
   showSearch searchPlaceholder={['Find available section','Find included section']}
   filterOption={(query,item)=>item.value.toLowerCase().includes(query.toLowerCase())}
   onSelectChange={(left,right)=>setSelected([...left,...right])}
   onChange={(keys,direction,moved)=>{
    setTarget(keys);setSelected([]);
    setStatus(`${moved.length} section(s) moved to ${direction}. Draft only.`);
   }} />
  <p role="status">{status}</p>
  <Button type="primary" disabled={!target.length} onClick={()=>{
   setSnapshot([...target]);setStatus('Local report outline prepared. No data exported.');
  }}>Prepare outline</Button>
  <h2>Prepared outline</h2>
  {snapshot.length ? <ol>{snapshot.map(key=><li key={key}>{data.find(item=>item.key===key).value}</li>)}</ol> : <p>No outline prepared yet.</p>}
 </main>;
}
createRoot(document.getElementById('root')).render(<ReportBuilder />);

Référence du code

  • La sélection des cases à cocher et l’appartenance au rapport sont gérées dans des tableaux distincts.
  • Le filtre personnalisé ne tient pas compte de la casse.
  • Les données d’exemple sont originales ; aucune donnée analytique n’est chargée ni exportée. La compilation native reste une vérification d’intégration distincte.
04

Arco Design Configuration de l’agent du système de design

Point de départ de l’implémentation

Importez une seule fois la feuille de style complète arco.css et montez l’exemple React dans un élément racine. Ne mélangez pas ce package React avec les imports d’Arco Vue.

bash
npm install @arco-design/web-react react react-dom

Un prompt pour votre projet

Prompt pour l’agent IA
Utilisez Arco React Transfer avec des clés stables dans dataSource, ainsi que targetKeys et selectedKeys contrôlés séparément. Fournissez un filtre insensible à la casse, des actions explicites Inclure/Retirer et un instantané du plan préparé. Respectez la syntaxe des variables CSS d’Arco et indiquez clairement qu’il s’agit d’une interprétation hors ligne.
05

Arco Design Sources et périmètre du système de design

Référence OpenDesign indépendante. Données de rapport originales et aperçu local uniquement ; les lignes désactivées ne constituent pas une limite d’autorisation.