Skip to content

republique-et-canton-de-geneve/ge-theme

Repository files navigation

🌟 Web Components GE Theme

Ce package fournit une bibliothèque de composants Web (Web Components) réutilisables construits avec Lit. Il inclut les composants suivants :

  • <ge-header> : En-tête avec gestion de l'utilisateur connecté.
  • <ge-header-public> : En-tête.
  • <ge-footer> : Pied de page avec liens utiles.

📦 Intégration des Web Components via Static

Cette procédure décrit comment intégrer directement les Web Components et les feuilles de style hébergés sur les serveurs static de l'État de Genève.


🔗 Intégration dans le <head>

✅ Références aux CSS

Ajoutez les feuilles de style suivantes dans la balise <head> de votre application :

par défaut

<link rel="stylesheet" href=https://static.app.ge.ch/theme/css/primitives.css />

si l'application supporte uniquement le thème clair (forcer le thème clair)

<link rel="stylesheet" href="https://static.app.ge.ch/theme/css/light.css" />

si l'application supporte l'affichage system clair et sombre

<link rel="stylesheet" href="https://static.app.ge.ch/theme/css/theme.css" />

si l'application propose une option d'affichage clair et sombre

<link rel="stylesheet" href="https://static.app.ge.ch/theme/css/dark.css" />
<link rel="stylesheet" href="https://static.app.ge.ch/theme/css/light.css" />

si l'application supporte uniquement le thème sombre (forcer le thème sombre)

<link rel="stylesheet" href="https://static.app.ge.ch/theme/css/dark.css" />

🔗 Ajoutez les Web Components nécessaires via des balises <script type="module">

Remarque :

Par défaut, les URL de production (sur static.app.ge.ch) sont à utiliser en DEV/REC et PRD Pour tester d'éventuelles montées de version, les URL de DEV ou REC peuvent être utilisées

DEV https://static.dev.etat-ge.ch REC https://static.rec.etat-ge.ch

<script type="module" src="https://static.app.ge.ch/webcomponents/ge-header/latest/ge-header.js"></script>
<script type="module" src="https://static.app.ge.ch/webcomponents/ge-header-public/latest/ge-header-public.js"></script>
<script type="module" src="https://static.app.ge.ch/webcomponents/ge-footer/latest/ge- footer.js"></script>

Intégration sur une page html

Pour les applications avec contenus pleine largeur (ex: Mon esapce e-démarches)

    <ge-header-public/>
    <ge-footer/>

Pour les applications avec marges sur le contenus (ex: Formulaires e-démarches, ... )

    <ge-header-public maxWidth="80%" />
    <ge-footer maxWidth="80%" />

📁 Installation

yarn install 

🚀 Démarer le projet

yarn start

🚀 Build

yarn build

📁 Création d'un composant web

Dans src/web-components/xxx, créez un répertoire contenant votre composant, où xxx est la catégorie du composant.

✉️ Liste des composants disponible

<ge-header>

  • Props disponibles :
    • userInfo: objet contenant nom, prenom, email, typeCompte (PP, PM, ADM)
    • isMenuOpen: booléen pour afficher/masquer le menu utilisateur
    • maxWidth: pourcentage ("80%" pour les contenus avec marges)
  • Événements personnalisés :
    • ge-toggle-app-menu
    • ge-manage-account
    • ge-logout

<ge-header-public>

  • Props disponibles :
    • maxWidth: pourcentage ("80%" pour les contenus avec marges)

<ge-footer>

  • Affiche automatiquement les liens d'aide, accessibilité, confidentialité et CGU ainsi que le logo de l'État de Genève.
  • Props disponibles :
    • maxWidth: pourcentage ("80%" pour les contenus avec marges)
    • links='[ {"title":"Support","href":"https://example.com/support"}, {"title":"Mentions légales","href":"https://example.com/legal"} ]'
  • Valeurs par défaut
    • maxWidth = "100%"
    • links =[ { title: "Contact", href: this.contactLink }, { title: "Accessibilité", href: this.accessibilityLink }, { title: "Politique de confidentialité", href: this.privacyLink }, { title: "Conditions générales", href: this.termsLink } ] @property({ type: String }) contactLink = "https://www.ge.ch/c/footer-edm-aide"; @property({ type: String }) accessibilityLink = "https://www.ge.ch/c/footer-edm-accessibilite"; @property({ type: String }) privacyLink = "https://www.ge.ch/c/footer-edm-confidentialite"; @property({ type: String }) termsLink = "https://www.ge.ch/c/footer-edm-cgu";

💚 Intégration dans les frameworks

⚠️ Important : Les composants Lit ne sont pas automatiquement réactifs aux changements de props dans certains frameworks comme Vue, React ou Angular. Il faut manuellement mettre à jour les propriétés et appeler requestUpdate() sur les composants concernés.

Vue 3

Dans un composant Vue :

📄 Installer la dépendence

yarn add @opf/ge-theme;

Importez le package dans votre projet :

<template>
  <ge-header
    :userInfo="userStore.getters.utilisateur()"
    :isMenuOpen="isMenuOpen"
    ref="headerRef"
    @ge-toggle-app-menu="miniVariant = !miniVariant"
  ></ge-header>
</template>

<script setup>
import { ref, watch } from 'vue';
import { userStore } from '@/stores/user';
import '@opf/ge-theme';

const headerRef = ref(null);
const isMenuOpen = ref(false);
const miniVariant = ref(false);

watch(
  () => userStore.getters.utilisateur(),
  (newUser) => {
    if (headerRef.value) {
      headerRef.value.userInfo = newUser;
      headerRef.value.requestUpdate(); // 🔁 Forcer la mise à jour
    }
  },
  { immediate: true, deep: true }
);
</script>

React

Pour utiliser des Web Components dans React :

  1. Ajoutez @opf/ge-theme dans le index.js ou App.js :
import '@opf/ge-theme';
  1. Utilisez-les dans votre JSX :
<ge-header ref={headerRef} isMenuOpen={true}></ge-header>
  1. Mettre à jour les props manuellement :
import { useEffect, useRef } from 'react';

const HeaderWrapper = ({ userInfo }) => {
  const headerRef = useRef(null);

  useEffect(() => {
    if (headerRef.current) {
      headerRef.current.userInfo = userInfo;
      headerRef.current.requestUpdate(); // 🔁 Forcer la mise à jour
    }
  }, [userInfo]);

  return <ge-header ref={headerRef}></ge-header>;
};

Angular

  1. Ajoutez @opf/ge-theme dans angular.json (scripts et styles si besoin).
  2. Activez les Custom Elements dans votre module :
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';

@NgModule({
  declarations: [...],
  imports: [...],
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
  1. Utilisation dans un template Angular :
<ge-header [attr.isMenuOpen]="true"></ge-header>
  1. Mise à jour manuelle des propriétés :
@ViewChild('headerRef') headerRef: ElementRef;

ngOnChanges() {
  if (this.headerRef?.nativeElement) {
    this.headerRef.nativeElement.userInfo = this.user;
    this.headerRef.nativeElement.requestUpdate(); // 🔁 Mise à jour forcée
  }
}

📆 prochaine étapes (proposée)

  • Ajout de tests unitaires avec Playwright ou Testing Library
  • Ajout d'un composant ge-breadcrumb ou lister les composants partagé
  • Storybook pour documentation interactive

⚖️ Licence

Ce projet est distribué selon les conditions de l'État de Genève. Veuillez contacter le support pour plus d'informations.


Pour toute question ou proposition, contactez l'équipe Cyberadministration à : ocsin.scli.design-system@etat.ge.ch

Badges

lastest release

About

Composants web pour les sites et les applications de l'État de Genève.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 6