BAAM! Design System by Cegid - Extension React du Cegid Design System
VSB CDS React est une bibliothèque de composants React spécialisée, extension du Cegid Design System. Elle fournit des composants UI optimisés pour les applications BIM! avec un thème VSB personnalisé et une architecture modulaire.
- Installation
- Configuration
- Composants disponibles
- Système de design
- Exemples d'utilisation
- Développement
- Scripts disponibles
- Architecture du projet
- Publication du package
- Conventions de commit
- Contribution
npm install @cegid/vsb-cds-reactnpm install react@^18.3.1 react-dom@^18.3.1 @mui/material@^5.0.0 @emotion/react@^11.0.0 @emotion/styled@^11.0.0 @cegid/cds-react@^3.26.1import '@cegid/vsb-cds-react/fonts.css';
import '@cegid/vsb-cds-react/icons.css';import React from 'react';
import { VSBThemeProvider } from '@cegid/vsb-cds-react';
import '@cegid/vsb-cds-react/fonts.css';
import '@cegid/vsb-cds-react/icons.css';
function App() {
return (
<VSBThemeProvider>
{/* Vos composants */}
</VSBThemeProvider>
);
}
export default App;// Import groupé
import { Button, TextField, Icon } from '@cegid/vsb-cds-react';
// Import individuel (tree-shaking optimisé)
import Button from '@cegid/vsb-cds-react/components/Button';
import TextField from '@cegid/vsb-cds-react/components/TextField';| Composant | Description |
|---|---|
TextField |
Champ de texte avec label, états d'erreur et debounce |
Select |
Liste déroulante de sélection |
AutoComplete |
Champ avec autocomplétion |
Checkbox |
Case à cocher |
Radio |
Bouton radio |
Switch |
Interrupteur toggle |
DatePicker |
Sélecteur de date (architecture modulaire) |
InputSearch |
Champ de recherche |
InputAdornment |
Décorateur pour inputs |
FormControl |
Wrapper de contrôle de formulaire |
FormControlLabel |
Label pour contrôles de formulaire |
FormGroup |
Groupe de contrôles |
SegmentedControl |
Contrôle segmenté |
| Composant | Description |
|---|---|
Button |
Bouton principal (4 variantes: contained, outlined, text, tonal) |
IconButton |
Bouton icône uniquement |
ButtonSplit |
Bouton avec menu déroulant |
| Composant | Description |
|---|---|
NavigationBar |
Barre de navigation responsive avec sidebar |
Header |
En-tête de page |
Breadcrumbs |
Fil d'Ariane |
Tabs / Tab |
Navigation par onglets |
Stack |
Layout flexbox empilé |
Box |
Conteneur générique |
Row |
Conteneur en ligne |
Column |
Conteneur en colonne |
| Composant | Description |
|---|---|
Table |
Tableau de données avec prop bordered |
TableHead / TableBody / TableFooter |
Sections de tableau |
TableRow / TableCell |
Ligne et cellule de tableau |
TableContainer |
Conteneur de tableau |
TableFilter |
Filtrage avancé pour tableaux |
List / ListItem / ListItemButton |
Listes |
Chart |
Graphiques (intégration Chart.js) |
Typography |
Composant typographique |
Icon |
Icônes (HugeIcons - 8 variantes) |
Avatar |
Avatar utilisateur |
Badge |
Badge/indicateur |
Chip / IAChip |
Étiquettes |
Status |
Indicateur de statut |
| Composant | Description |
|---|---|
Alert |
Alerte/notification |
Dialog |
Modal de dialogue |
Tooltip |
Info-bulle |
Snackbar |
Notification temporaire |
ToasterProvider |
Système de toast (avec hook useToaster) |
ProgressBar |
Barre de progression |
SystemBanner |
Bannière système |
Les couleurs sont importées depuis @cegid/vsb-cds-tokens avec 11 niveaux (10-99) :
import { colorPalettes } from '@cegid/vsb-cds-react';
const { primary, secondary, neutral, success, critical, warning, info } = colorPalettes;
// Utilisation
primary[50] // Couleur primaire niveau 50
neutral[10] // Gris foncé
critical[80] // Rouge erreur| Palette | Usage |
|---|---|
primary |
Bleu - Actions principales |
secondary |
Orange - Actions secondaires |
neutral |
Gris - Textes et bordures |
success |
Vert - Succès |
critical |
Rouge - Erreurs |
warning |
Jaune - Avertissements |
info |
Bleu clair - Information |
Police : DM Sans
import typography from '@cegid/vsb-cds-react/theme/typography';
// Variantes disponibles
typography.displayMRegular
typography.headlineMSemiBold
typography.bodyMRegular
typography.bodySMedium
typography.captionRegularBasé sur des multiples de 4px :
import { SPACING } from '@cegid/vsb-cds-react';
// 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 1288 variantes de style HugeIcons disponibles :
import { Icon } from '@cegid/vsb-cds-react';
<Icon size={24} color="primary/50" variant="stroke" style="rounded">
home-01
</Icon>
// Variantes: bulk, duotone, solid, stroke, twotone
// Styles: rounded, sharp, standardimport { Button, Icon } from '@cegid/vsb-cds-react';
<Button
variant="contained"
color="primary"
startIcon={<Icon>add-01</Icon>}
>
Ajouter
</Button>import { TextField } from '@cegid/vsb-cds-react';
<TextField
label="Recherche"
placeholder="Rechercher..."
value={query}
onChange={(e) => setQuery(e.target.value)}
onDebouncedChange={(e) => performSearch(e.target.value)}
debounceDelay={500}
/>import { Table, TableHead, TableBody, TableRow, TableCell } from '@cegid/vsb-cds-react';
<Table bordered>
<TableHead>
<TableRow>
<TableCell>Nom</TableCell>
<TableCell>Valeur</TableCell>
</TableRow>
</TableHead>
<TableBody>
<TableRow>
<TableCell>Item 1</TableCell>
<TableCell>100</TableCell>
</TableRow>
</TableBody>
</Table>import { ToasterProvider, useToaster } from '@cegid/vsb-cds-react';
// Dans App.tsx
<ToasterProvider>
<MyApp />
</ToasterProvider>
// Dans un composant
const MyComponent = () => {
const { showToast } = useToaster();
const handleSuccess = () => {
showToast('Opération réussie', { severity: 'success' });
};
return <Button onClick={handleSuccess}>Sauvegarder</Button>;
};import { NavigationBar } from '@cegid/vsb-cds-react';
<NavigationBar
headerNavItems={[
{ label: 'Accueil', href: '/', icon: 'home-01' },
{ label: 'Projets', href: '/projects', icon: 'folder-01' }
]}
bodyNavItems={[
{ label: 'Paramètres', href: '/settings', icon: 'settings-01' }
]}
userFirstName="Jean"
userLastName="Dupont"
userTrigram="JD"
onLogOut={() => logout()}
/>- Node.js >= 18
- npm >= 9
# Cloner le repo
git clone <repo-url>
cd vsb-cds-react
# Installer les dépendances
npm install
# Lancer Storybook
npm run storybookStorybook sera accessible sur http://localhost:6006
| Script | Description |
|---|---|
npm start |
Lance Storybook en développement |
npm run storybook |
Lance Storybook (port 6006) |
npm run build |
Build complet : clean + tsc + vite + optimize |
npm run build:dev |
Build développement |
npm run build:optimize |
Nettoyage post-build |
npm run clean |
Supprime le dossier dist |
npm run build-storybook |
Build Storybook statique |
npm run analyze |
Analyse de la taille du bundle |
npm run release-notes |
Génère les notes de release |
vsb-cds-react/
├── .github/
│ └── workflows/
│ ├── build-publish-package.yaml # CI/CD publication npm
│ └── build-app-deploy-infra.yaml # CI/CD déploiement Storybook
├── .storybook/ # Configuration Storybook
├── src/
│ ├── components/ # ~50 composants UI
│ │ ├── Button/
│ │ │ ├── Button.tsx
│ │ │ ├── Button.stories.tsx
│ │ │ └── index.ts
│ │ ├── DatePicker/
│ │ │ ├── components/ # Sous-composants modulaires
│ │ │ ├── hooks/ # Hooks personnalisés
│ │ │ └── DatePicker.tsx
│ │ ├── Table/
│ │ ├── TextField/
│ │ └── ...
│ ├── theme/
│ │ ├── colors.ts # Palettes de couleurs
│ │ ├── typography.ts # Système typographique
│ │ ├── spacing.ts # Échelle d'espacement
│ │ ├── shadows.ts # Élévations
│ │ ├── radius.ts # Border radius
│ │ ├── fonts/ # Fichiers DM Sans
│ │ ├── icons/ # Fichiers HugeIcons
│ │ └── theme.tsx # VSBThemeProvider
│ ├── stories/ # Documentation Storybook
│ └── index.ts # Point d'entrée principal
├── package.json
├── tsconfig.json
├── vite.config.ts
└── README.md
La publication est automatisée via GitHub Actions lors de la création d'une release.
# Mettre à jour la version dans package.json
npm version patch # ou minor / major
# Générer les notes de release
npm run release-notes
# Commit et push
git add .
git commit -m "chore: release v1.x.x"
git push origin main- Aller sur GitHub > Releases > Create a new release
- Créer un nouveau tag (ex:
v1.24.0) - Renseigner le titre et les notes de release
- Cliquer sur Publish release
Le workflow .github/workflows/build-publish-package.yaml s'exécute automatiquement :
# Déclencheurs
on:
release:
types: [created] # Automatique sur création de release
workflow_dispatch: # Déclenchement manuel possibleÉtapes du pipeline :
| Étape | Description |
|---|---|
| 1. Checkout | Récupération du code source |
| 2. Setup Node | Configuration Node.js 20 |
| 3. Install | Installation des dépendances |
| 4. Build | Build du package (npm run build) |
| 5. Pack | Création de l'archive (npm pack) |
| 6. Publish | Publication sur Artifactory |
Scan de sécurité (optionnel) :
Le job blackduck-scan analyse les vulnérabilités des dépendances. Il peut être activé via le paramètre ACTIVATE_BLACKDUCK_DETECT.
Si nécessaire, la publication peut être faite manuellement :
# 1. Build du package
npm run build
# 2. Créer l'archive
npm pack
# 3. Configurer l'authentification (.npmrc)
cat > .npmrc << EOF
email=votre@email.com
always-auth=true
registryCegid=https://cegid.jfrog.io/artifactory/api/npm/vsb-cds-react/
//cegid.jfrog.io/artifactory/api/npm/vsb-cds-react/:_authToken=VOTRE_TOKEN
EOF
# 4. Publier
npm publish --scope registryCegidPour que le pipeline fonctionne, les secrets suivants doivent être configurés dans GitHub :
| Secret | Description | Obligatoire |
|---|---|---|
VSB_NPM_AUTH_TOKEN |
Token d'authentification JFrog Artifactory | Oui |
VSB_NPM_AUTH_EMAIL |
Email associé au compte npm | Oui |
VSB_BLACKDUCK_API_TOKEN |
Token API BlackDuck | Non |
VSB_BLACKDUCK_URL |
URL du serveur BlackDuck | Non |
- Aller dans Settings > Secrets and variables > Actions
- Cliquer sur New repository secret
- Ajouter chaque secret avec son nom et sa valeur
| Paramètre | Valeur |
|---|---|
| URL | https://cegid.jfrog.io/artifactory/api/npm/vsb-cds-react/ |
| Scope | @cegid |
| Package | @cegid/vsb-cds-react |
Le Storybook est automatiquement déployé sur Azure via le workflow build-app-deploy-infra.yaml :
- Déclencheur : Push sur la branche
main - URL : https://my-storybook.chazam.tech/
- Infrastructure : Azure Container Registry + Azure Container Apps
Ce projet suit la spécification Conventional Commits.
<type>(<scope>): <description>
[corps optionnel]
[footer optionnel]
| Type | Description |
|---|---|
feat |
Nouvelle fonctionnalité |
fix |
Correction de bug |
style |
Changements de style (CSS, design) |
refactor |
Refactorisation sans changement fonctionnel |
perf |
Amélioration de performance |
test |
Ajout ou modification de tests |
docs |
Documentation |
build |
Changements du système de build |
ci |
Changements CI/CD |
chore |
Autres changements (maintenance) |
Le scope est le nom du composant en PascalCase :
feat(Button): add loading state
fix(TextField): fix debounce memory leak
style(Table): update bordered style
refactor(DatePicker): extract hooks# Nouvelle fonctionnalité
feat(TextField): add onDebouncedChange callback
# Correction de bug
fix(Table): fix border-radius on first/last row
# Refactorisation
refactor(DatePicker): modularize with sub-components
# Changement global (sans scope)
chore: update dependenciesLes commits sont validés automatiquement par commitlint via un hook git (husky). Un commit invalide sera rejeté avec un message d'erreur explicatif.
- Créer une branche :
git checkout -b feature/ma-fonctionnalite - Développer le composant avec TypeScript
- Ajouter des stories Storybook
- Tester dans Storybook :
npm run storybook - Vérifier le build :
npm run build - Commit avec convention :
git commit -m "feat(Component): description" - Push et créer une Pull Request
- Suivre les patterns existants
- TypeScript strict obligatoire
- Stories Storybook pour chaque variante
- Accessibilité (a11y) obligatoire
- Utiliser les design tokens VSB (
@cegid/vsb-cds-tokens) - Documenter les props avec JSDoc
# Génère automatiquement les notes depuis les commits
npm run release-notes
# Les notes sont mises à jour dans src/stories/ReleaseNotes.stories.tsx| Ressource | URL |
|---|---|
| Storybook live | https://my-storybook.chazam.tech/ |
| Cegid Design System | https://cds-website.azurewebsites.net/ |
| Design Tokens | @cegid/vsb-cds-tokens |
| Navigateur | Version minimum |
|---|---|
| Chrome | >= 88 |
| Firefox | >= 88 |
| Safari | >= 14 |
| Edge | >= 88 |
ISC © Cegid