Bibliothèque de composants Angular moderne et complète avec 28 composants standalone, système de thèmes, internationalisation et accessibilité optimale.
- Vue d'ensemble
- Structure du projet
- Fonctionnalités principales
- Prérequis
- Installation et développement
- Architecture technique
- Composants disponibles
- Services
- Système de thèmes
- Internationalisation
- Scripts disponibles
- Documentation
- Contribution
- Licence
Helix est un design system professionnel construit avec Angular 21+, offrant une collection complète de composants réutilisables pour créer des applications web modernes et accessibles.
PACK Solutions
- 28 composants standalone prêts à l'emploi
- Architecture basée sur les signals Angular
- Conformité WCAG 2.1 AA pour l'accessibilité
- Support complet TypeScript en mode strict
- Système de thèmes personnalisable (clair/sombre)
- Internationalisation intégrée avec ngx-translate
- 6000+ icônes Phosphor avec variantes de poids
- Design responsive mobile-first
- Aucun module NgModule requis
Le projet est organisé en deux parties principales :
helix-design-system/
├── projects/ps-helix/ # Bibliothèque de composants (npm package)
│ ├── src/
│ │ ├── lib/
│ │ │ ├── components/ # 28 composants standalone
│ │ │ ├── services/ # Services (Theme, Translation, Toast, Scroll)
│ │ │ └── styles/ # Tokens CSS, thèmes et utilitaires
│ │ └── public-api.ts # Exports publics de la bibliothèque
│ ├── package.json # Configuration npm de la lib
│ ├── README.md # Documentation de la bibliothèque
│ └── THEME.md # Guide de personnalisation des thèmes
│
└── src/ # Application de démonstration
├── app/
│ ├── demo/ # Pages de démo pour chaque composant
│ │ ├── components/ # Composants de démo réutilisables
│ │ ├── layout/ # Layouts de l'app de démo
│ │ ├── pages/ # Pages pour chaque composant
│ │ ├── services/ # Services de navigation et raccourcis
│ │ └── shared/ # Composants partagés (code snippet, search)
│ ├── home/ # Page d'accueil
│ └── i18n/ # Traductions pour la démo
└── index.html
La bibliothèque contient tous les composants, services et styles réutilisables. Elle est publiée sur npm et peut être installée dans n'importe quel projet Angular.
L'application de démonstration présente tous les composants avec :
- Exemples d'utilisation interactifs
- Documentation de chaque composant
- Snippets de code copiables
- Navigation entre composants
- Recherche rapide avec raccourcis clavier (Ctrl+K)
- Support multilingue (EN/FR/ES/DE)
- Toggle thème clair/sombre
- Formulaires : Button, Input, Checkbox, Radio, Select, Switch
- Layout : Card, Modal, Sidebar, Collapse, Tabs, TabBar
- Feedback : Alert, Toast, Spinloader, Progressbar, Tooltip
- Données : Table, Badge, Tag, Avatar, StatCard, InfoCard, HorizontalCard
- Navigation : Menu, Pagination, Stepper, Dropdown
- ThemeService : Gestion des thèmes clair/sombre et couleurs personnalisées
- ToastService : Notifications toast avec file d'attente
- TranslationService : Wrapper pour ngx-translate
- ScrollService : Utilitaires de scroll et gestion du défilement
- Système d'espacement cohérent (8px base)
- Palette de couleurs avec rampes complètes
- Typographie responsive
- Animations et transitions
- Breakpoints responsive
- Variables CSS personnalisables
- Navigation clavier complète
- Support lecteurs d'écran
- Gestion du focus visible
- Rôles ARIA appropriés
- Contraste de couleurs conforme
- Labels et descriptions accessibles
- Node.js : 18.x ou supérieur
- npm : 9.x ou supérieur
- Angular : 21.0.3 ou supérieur
- Angular CLI : 21.0.3 ou supérieur
- TypeScript : 5.9.0 ou supérieur
{
"@angular/common": "^21.0.3",
"@angular/core": "^21.0.3",
"@angular/forms": "^21.0.3",
"@ngx-translate/core": "^15.0.0",
"rxjs": "^7.8.0"
}- @phosphor-icons/web : 2.0.3 - Bibliothèque d'icônes
- date-fns : ^3.3.1 - Utilitaires de dates
- tslib : ^2.6.0 - Runtime TypeScript
git clone <repository-url>
cd helix-design-systemnpm installnpm run devL'application sera accessible sur http://localhost:4200
npm run build:libLa bibliothèque sera générée dans dist/ps-helix/
npm run watch:libReconstruction automatique à chaque modification
npm run publish:libPublie la bibliothèque sur npm (nécessite les droits d'accès)
Tous les composants sont standalone (pas de NgModules) :
import { Component } from '@angular/core';
import { PshButtonComponent, PshCardComponent } from 'ps-helix';
@Component({
selector: 'app-example',
imports: [PshButtonComponent, PshCardComponent],
template: `
<psh-card>
<psh-button variant="primary">Action</psh-button>
</psh-card>
`
})
export class ExampleComponent {}Utilisation des signals Angular pour une performance optimale :
import { Component, signal } from '@angular/core';
import { PshModalComponent } from 'ps-helix';
@Component({
selector: 'app-example',
imports: [PshModalComponent],
template: `
<button (click)="isOpen.set(true)">Ouvrir</button>
<psh-modal [(open)]="isOpen" title="Confirmation">
<p>Êtes-vous sûr ?</p>
</psh-modal>
`
})
export class ExampleComponent {
isOpen = signal(false);
}Tous les types sont exportés pour un développement type-safe :
import { ButtonVariant, ButtonSize, AlertType } from 'ps-helix';
const variant: ButtonVariant = 'primary'; // Type-safe
const size: ButtonSize = 'medium'; // Type-safe
const alertType: AlertType = 'success'; // Type-safeLes composants de formulaire (input, checkbox, select, switch) supportent nativement les Signal Forms d'Angular 21 via les interfaces FormValueControl et FormCheckboxControl, tout en conservant la rétrocompatibilité avec les Reactive Forms classiques via ControlValueAccessor.
Trois modes d'utilisation sont supportés :
// 1. Signal Forms (recommandé pour les nouveaux projets)
import { signal } from '@angular/core';
import { form, FormField, required, email } from '@angular/forms/signals';
model = signal({ email: '', password: '' });
loginForm = form(this.model, (p) => {
required(p.email);
email(p.email);
});
// Template : <psh-input [formField]="loginForm.email" />
// 2. Reactive Forms (rétrocompatible)
// Template : <psh-input [formControl]="emailControl" />
// 3. Two-way binding
// Template : <psh-input [(value)]="myValue" />Utilisation de inject() au lieu du constructeur :
import { Component, inject } from '@angular/core';
import { ThemeService, ToastService } from 'ps-helix';
@Component({
selector: 'app-example',
template: `<button (click)="afficherToast()">Toast</button>`
})
export class ExampleComponent {
private themeService = inject(ThemeService);
private toastService = inject(ToastService);
afficherToast() {
this.toastService.success('Message envoyé !');
}
}Angular 21 introduit la détection de changement zoneless par défaut, ce qui représente une amélioration majeure des performances. Cette application utilise provideZonelessChangeDetection() au lieu de zone.js pour la détection des changements.
Avantages :
- Performance améliorée : Pas de surcharge liée à zone.js qui intercepte toutes les opérations asynchrones
- Bundle plus léger : Réduction de la taille du bundle en éliminant zone.js de la production
- Modèle mental simplifié : La détection de changement est déclenchée explicitement via les signals et les événements Angular
- Meilleure prévisibilité : Contrôle plus fin sur le moment où la détection de changement se produit
Configuration :
// main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import { provideZonelessChangeDetection } from '@angular/core';
import { AppComponent } from './app/app.component';
bootstrapApplication(AppComponent, {
providers: [
provideZonelessChangeDetection()
]
});Note : zone.js reste dans les devDependencies uniquement pour les tests unitaires avec Jest, mais n'est pas utilisé en production.
Bouton versatile avec variantes, tailles et états multiples.
<psh-button
variant="primary"
size="medium"
[disabled]="false"
(clicked)="handleClick()">
Cliquez ici
</psh-button>Champ de saisie avec validation, messages d'erreur et intégration FormControl.
<psh-input
label="Email"
type="email"
[formControl]="emailControl"
[required]="true">
</psh-input>Case à cocher avec états personnalisables.
Bouton radio pour sélection unique.
Menu déroulant avec recherche, filtrage et rendu personnalisé.
Interrupteur bascule avec états on/off.
Conteneur de contenu flexible avec header, body et footer.
Dialogue modal avec overlay et navigation clavier.
Barre latérale pliable avec comportement responsive.
Section de contenu extensible/réductible avec animation.
Organisation de contenu par onglets avec navigation clavier.
Barre de navigation inférieure pour applications mobile-first.
Messages d'alerte avec niveaux de gravité.
<psh-alert
type="success"
message="Opération réussie !">
</psh-alert>Système de notifications toast avec gestion de file.
Spinner de chargement avec différentes tailles.
Indicateur de progression avec affichage du pourcentage.
Info-bulles contextuelles avec positions multiples.
Tableau de données avec tri, pagination et rendu personnalisé.
Badges et indicateurs de statut avec couleurs variées.
Tags supprimables pour labels et filtres.
Avatar utilisateur avec image, initiales ou icône de secours.
Carte statistique pour tableaux de bord.
Carte d'information avec icône et contenu.
Composant de carte à disposition horizontale.
Menu déroulant avec éléments imbriqués.
Contrôles de pagination avec numéros de page.
Navigation wizard étape par étape avec validation.
Conteneur de déclencheur et contenu déroulant.
Gestion des thèmes d'application et couleurs de marque personnalisées.
Méthodes :
setDarkTheme(isDark: boolean)- Définir le mode thèmetoggleTheme()- Basculer entre clair et sombreupdateTheme(name: 'light' | 'dark')- Mettre à jour le thème par nomapplyInsurerTheme()- Appliquer les couleurs de marque personnalisées
Signals calculés :
themeName()- Retourne le nom du thème actuelisDarkTheme()- Retourne un booléen pour le mode sombrethemeInfo()- Retourne les informations complètes du thème
Exemple :
import { Component, inject } from '@angular/core';
import { ThemeService } from 'ps-helix';
@Component({
template: `
<button (click)="themeService.toggleTheme()">
Thème : {{ themeService.themeName() }}
</button>
`
})
export class ExempleComponent {
themeService = inject(ThemeService);
}Affichage de messages de notification temporaires.
Méthodes :
success(message: string, options?)- Toast de succèserror(message: string, options?)- Toast d'erreurwarning(message: string, options?)- Toast d'avertissementinfo(message: string, options?)- Toast d'information
Options :
duration?: number- Durée d'affichage en millisecondes (défaut: 3000)position?: ToastPosition- Position du toast
Exemple :
import { Component, inject } from '@angular/core';
import { ToastService } from 'ps-helix';
@Component({
template: `<button (click)="sauvegarder()">Sauvegarder</button>`
})
export class ExempleComponent {
private toastService = inject(ToastService);
sauvegarder() {
this.toastService.success('Données sauvegardées avec succès !');
}
}Service utilitaire pour la gestion du scroll.
Méthodes :
scrollToTop()- Scroll vers le haut de pagescrollToElement(selector: string)- Scroll vers un élément spécifiquedisableScroll()- Désactiver le scroll (utile pour les modales)enableScroll()- Réactiver le scroll
Service wrapper pour la fonctionnalité ngx-translate.
Méthodes :
setLanguage(lang: string)- Changer la langue de l'applicationgetTranslation(key: string)- Obtenir une traductioninstant(key: string)- Obtenir une traduction instantanée (synchrone)
- Couleur primaire :
#0F02C4(Bleu profond) - Couleur secondaire :
#7B3AEC(Violet)
Le système utilise un système d'injection token pour la personnalisation :
// 1. Créer un service de contexte thème
import { Injectable, signal } from '@angular/core';
import { InsurerContextService } from 'ps-helix';
@Injectable({
providedIn: 'root'
})
export class AppThemeContextService implements InsurerContextService {
private primaryColorSignal = signal('#FF0000');
private secondaryColorSignal = signal('#00AA00');
primaryColor = this.primaryColorSignal.asReadonly();
secondaryColor = this.secondaryColorSignal.asReadonly();
}
// 2. Fournir le service avec le token
import { INSURER_CONTEXT_SERVICE } from 'ps-helix';
export const appConfig: ApplicationConfig = {
providers: [
{
provide: INSURER_CONTEXT_SERVICE,
useExisting: AppThemeContextService
}
]
};Le système génère automatiquement des variables CSS :
Couleur primaire :
--primary-color--primary-color-light--primary-color-lighter--primary-color-dark--primary-color-darker--primary-color-text--primary-color-rgb
Couleur secondaire :
--secondary-color--secondary-color-light--secondary-color-lighter--secondary-color-dark--secondary-color-darker--secondary-color-text--secondary-color-rgb
Pour plus de détails, consultez THEME.md
Le système utilise ngx-translate pour l'internationalisation :
// main.ts
import { TranslateModule } from '@ngx-translate/core';
bootstrapApplication(AppComponent, {
providers: [
provideHttpClient(),
...TranslateModule.forRoot({
defaultLanguage: 'fr',
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
}).providers || []
]
});import { Component, inject } from '@angular/core';
import { TranslationService } from 'ps-helix';
@Component({
template: `
<select (change)="changerLangue($event)">
<option value="fr">Français</option>
<option value="en">English</option>
<option value="es">Español</option>
</select>
`
})
export class SelecteurLangueComponent {
private translationService = inject(TranslationService);
changerLangue(event: Event) {
const langue = (event.target as HTMLSelectElement).value;
this.translationService.setLanguage(langue);
}
}- Français (fr)
- Anglais (en)
- Espagnol (es)
- Allemand (de)
npm run dev # Lancer l'application de démonstration
npm run build # Construire l'application de démonstration
npm test # Lancer les testsnpm run build:lib # Construire la bibliothèque
npm run watch:lib # Mode watch (reconstruction auto)
npm run publish:lib # Publier sur npm- README principal : projects/ps-helix/README.md
- Guide des thèmes : projects/ps-helix/THEME.md
Chaque composant possède sa propre documentation dans son dossier :
- Fichiers
.mddansprojects/ps-helix/src/lib/components/[composant]/
L'application de démonstration est la meilleure source d'exemples :
- Exemples interactifs pour chaque composant
- Code source complet dans
src/app/demo/pages/ - Snippets de code copiables
- Documentation visuelle
- Icônes Phosphor : https://phosphoricons.com/
- Documentation Angular : https://angular.dev/
- Documentation TypeScript : https://www.typescriptlang.org/
- ngx-translate : https://github.com/ngx-translate/core
Les contributions sont les bienvenues ! Pour contribuer :
- Forkez le dépôt
- Créez une branche feature :
git checkout -b feature/ma-feature - Committez vos changements :
git commit -am 'Ajout nouvelle feature' - Poussez vers la branche :
git push origin feature/ma-feature - Soumettez une pull request
- Suivre le guide de style Angular
- Utiliser TypeScript en mode strict
- Écrire des tests pour les nouveaux composants
- Documenter toutes les APIs publiques
- Assurer la conformité accessibilité (WCAG 2.1 AA)
- Garder les composants petits et focalisés
- Utiliser les signals pour l'état réactif
Le design system supporte :
- Chrome : 2 dernières versions
- Firefox : 2 dernières versions
- Safari : 2 dernières versions
- Edge : 2 dernières versions
- Mobile : iOS Safari 14+, Chrome Android dernière version
Note : Internet Explorer n'est pas supporté.
MIT License
Copyright (c) 2025 PACK Solutions
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Version : 4.1.1 Construit avec : Angular 21.0.3, TypeScript 5.9.0, Phosphor Icons 2.0.3 Auteur : Fabrice PEREZ | Product Designer chez PACK Solutions Dernière mise à jour : Janvier 2026