Aller au contenu principal
Version: 3.2.1

Guide de Style

Aperçu

Ce document fournit un aperçu de l'approche de style utilisée dans le projet Optave ZCLI.

Architecture de Style

Le projet utilise une approche de style basée sur les composants avec ces technologies clés :

  • Styled Components : Solution de style principale utilisant CSS-in-JS
  • Système de Design Zendesk Garden : Fournit des composants UI cohérents et des thèmes
  • CSS Global : Styles globaux limités dans index.css

Intégration Zendesk Garden

Le projet s'appuie fortement sur les composants Zendesk Garden pour une UI cohérente :

import { ThemeProvider, PALETTE } from '@zendeskgarden/react-theming';
import { Grid, Row, Col } from '@zendeskgarden/react-grid';
import { LG, MD } from '@zendeskgarden/react-typography';
import { Button } from '@zendeskgarden/react-buttons';

Packages Garden clés utilisés :

  • @zendeskgarden/react-theming : Fournit les capacités de thématisation
  • @zendeskgarden/react-grid : Composants de mise en page (Grid, Row, Col)
  • @zendeskgarden/react-typography : Composants de style de texte
  • @zendeskgarden/react-buttons : Composants de boutons
  • @zendeskgarden/react-forms : Éléments de formulaire
  • @zendeskgarden/react-modals : Boîtes de dialogue modales
  • @zendeskgarden/react-tooltips : Composants d'info-bulles
  • @zendeskgarden/svg-icons : Iconographie

Système de Couleurs

PALETTE Garden

L'objet PALETTE de Garden fournit un système de couleurs standardisé :

import { PALETTE } from '@zendeskgarden/react-theming';

// Exemples
const darkText = PALETTE.grey[800];
const primaryBlue = PALETTE.blue[600];
const successGreen = PALETTE.green[600];

Couleurs Personnalisées

Les couleurs personnalisées sont définies dans src/constants/colours.ts :

// Constantes de couleurs personnalisées
export const AGENT_BAR_COLOUR = '#1F73B7';
export const AI_BAR_COLOUR = '#ADCCE4';
export const PIE_CHART_BLUE = '#349EFF';
export const PIE_CHART_GREEN = '#19b75e';
export const PIE_CHART_YELLOW = '#FFCE56';
export const PIE_CHART_BROWN = '#E09846';

Style des Composants

Les composants sont stylés en utilisant la bibliothèque styled-components :

import styled from 'styled-components';

const StyledContainer = styled.div`
display: flex;
flex-direction: column;
padding: 16px;
border-radius: 4px;
background-color: ${PALETTE.white};
`;

// Avec style conditionnel basé sur les props
const StyledButton = styled.button<{ isActive: boolean }>`
background-color: ${props => props.isActive ? PALETTE.blue[600] : PALETTE.grey[200]};
color: ${props => props.isActive ? PALETTE.white : PALETTE.grey[800]};
`;

Système de Mise en Page

Le projet utilise le système de grille de Zendesk Garden pour des mises en page responsives :

<ThemeProvider>
<Grid>
<Row>
<Col sm={12} md={6} lg={4}>
{/* Contenu */}
</Col>
<Col sm={12} md={6} lg={8}>
{/* Contenu */}
</Col>
</Row>
</Grid>
</ThemeProvider>

Typographie

Le style du texte est géré via les composants de typographie Garden :

import { LG, MD, SM, XL } from '@zendeskgarden/react-typography';

// Utilisation
<XL>Texte de titre</XL>
<LG>Texte de sous-titre</LG>
<MD>Texte normal</MD>
<SM>Petit texte</SM>

Styles Globaux

Des styles globaux limités sont définis dans src/app/index.css :

  • Styles des éléments HTML de base
  • Style de barre de défilement personnalisé
  • Préférences de schéma de couleurs
  • Styles de conteneur de layout racine

Bonnes Pratiques

  1. Utiliser les Composants Garden : Préférer les composants Garden aux implémentations personnalisées pour la cohérence
  2. Cohérence du Thème : Utiliser les couleurs PALETTE au lieu de valeurs hexadécimales codées en dur
  3. Encapsulation des Composants : Garder les styles limités à leurs composants en utilisant styled-components
  4. Design Responsif : Utiliser le système Grid de Garden et les media queries pour la responsivité
  5. Style Basé sur les Props : Utiliser les props des composants pour contrôler les variations de style

Utilisation des Icônes

Le projet utilise les icônes SVG de Zendesk Garden :

import PencilStroke from '@zendeskgarden/svg-icons/src/12/pencil-stroke.svg';
import InfoStroke from '@zendeskgarden/svg-icons/src/16/info-stroke.svg';

Exemples

Composant Modal

import { ThemeProvider } from '@zendeskgarden/react-theming';
import { Modal, Header, Body, Footer, Close } from '@zendeskgarden/react-modals';
import { Button } from '@zendeskgarden/react-buttons';
import styled from 'styled-components';

const StyledModalBody = styled(Body)`
padding: 24px;
max-height: 70vh;
overflow-y: auto;
`;

const StyledFooter = styled(Footer)`
justify-content: space-between;
`;

const CustomModal = ({ isOpen, onClose, title, children }) => (
<ThemeProvider>
<Modal isOpen={isOpen} onClose={onClose}>
<Header>{title}</Header>
<Close aria-label="Fermer la modale" />
<StyledModalBody>{children}</StyledModalBody>
<StyledFooter>
<Button onClick={onClose}>Annuler</Button>
<Button isPrimary>Sauvegarder</Button>
</StyledFooter>
</Modal>
</ThemeProvider>
);