Module 6 - Personnalisation et thèmes WikiJS

Créez une expérience visuelle unique pour votre WikiJS avec des thèmes personnalisés et du branding professionnel

Module 6

Introduction à la personnalisation WikiJS

WikiJS offre de nombreuses possibilités de personnalisation pour créer une identité visuelle unique et professionnelle. Ce module vous guide dans la création de thèmes, la personnalisation de l'interface et l'optimisation de l'expérience utilisateur.

Possibilités de personnalisation
  • Thèmes complets : Couleurs, typographie, layouts
  • CSS personnalisé : Styles sur mesure
  • Branding : Logo, couleurs d'entreprise
  • Templates : Structures de pages personnalisées
  • Responsive design : Adaptation mobile/tablette
  • Composants custom : Éléments spécifiques
  • Plugins visuels : Extensions d'interface
  • Performance UI : Optimisation de rendu
Bonnes pratiques design
  • Cohérence : Maintenir un style uniforme sur tout le site
  • Accessibilité : Respecter les standards WCAG
  • Performance : Optimiser le poids des assets
  • Mobile-first : Designer d'abord pour mobile

Thèmes prédéfinis et configuration

Bibliothèque de thèmes WikiJS

WikiJS propose plusieurs thèmes prêts à l'emploi que vous pouvez utiliser tels quels ou personnaliser selon vos besoins.

Thème par défaut
Thème moderne avec couleurs équilibrées, parfait pour la documentation technique.
Responsive Dark mode Print-friendly
Thème sombre
Interface sombre élégante, idéale pour réduire la fatigue oculaire lors de sessions longues.
Dark mode Contraste élevé Économie batterie
Thème corporate
Design professionnel avec couleurs d'entreprise, parfait pour les intranets et wikis d'équipe.
Professionnel Personnalisable Corporate
Thème nature
Couleurs inspirées de la nature, créant une atmosphère apaisante et organique.
Apaisant Vert Organique
Configuration des thèmes dans WikiJS
# Configuration des thèmes
theming:
  # Thème actif
  activeTheme: "default"
  
  # Thèmes disponibles
  availableThemes:
    - name: "default"
      displayName: "WikiJS Défaut"
      author: "WikiJS Team"
      version: "2.5.0"
      
    - name: "dark"
      displayName: "Mode Sombre"
      author: "WikiJS Community"
      version: "1.2.0"
      
    - name: "corporate"
      displayName: "Corporate Blue"
      author: "Custom"
      version: "1.0.0"
      
  # Permettre aux utilisateurs de choisir leur thème
  userThemeSelection: true
  
  # Thème par défaut pour nouveaux utilisateurs
  defaultUserTheme: "default"
  
  # Respect des préférences système
  respectSystemTheme: true  # Suit le dark/light mode du système
  
  # Transition entre thèmes
  themeTransition:
    enabled: true
    duration: "0.3s"
    easing: "ease-in-out"

Création de thèmes personnalisés

Architecture des thèmes WikiJS

Un thème WikiJS est composé de variables CSS, de templates Pug et de fichiers JavaScript qui définissent l'apparence et le comportement de l'interface.

Structure
Variables CSS
Création
Packaging
Structure d'un thème WikiJS
Arborescence d'un thème
mon-theme-custom/
├── theme.yml                 # Métadonnées du thème
├── assets/
│   ├── css/
│   │   ├── app.scss         # Styles principaux
│   │   ├── _variables.scss  # Variables de thème
│   │   ├── _components.scss # Composants
│   │   └── _responsive.scss # Media queries
│   ├── js/
│   │   ├── app.js          # JavaScript principal
│   │   └── components/     # Composants JS
│   └── images/
│       ├── logo.svg        # Logo du thème
│       └── icons/          # Icônes personnalisées
├── templates/
│   ├── layouts/
│   │   ├── default.pug     # Layout principal
│   │   ├── minimal.pug     # Layout minimal
│   │   └── fullwidth.pug   # Layout pleine largeur
│   ├── partials/
│   │   ├── header.pug      # En-tête
│   │   ├── footer.pug      # Pied de page
│   │   ├── sidebar.pug     # Barre latérale
│   │   └── navigation.pug  # Navigation
│   └── pages/
│       ├── home.pug        # Page d'accueil
│       ├── page.pug        # Page standard
│       └── search.pug      # Page de recherche
└── locales/
    ├── en.yml              # Traductions anglaises
    ├── fr.yml              # Traductions françaises
    └── es.yml              # Traductions espagnoles
Fichier theme.yml
# Métadonnées du thème
name: "mon-theme-custom"
displayName: "Mon Thème Personnalisé"
description: "Thème personnalisé pour notre organisation"
author: "Votre Nom"
version: "1.0.0"
license: "MIT"
website: "https://monsite.com"

# Compatibilité
minWikiVersion: "2.5.0"
maxWikiVersion: "3.0.0"

# Configuration
config:
  # Couleurs configurables
  primaryColor: "#0066cc"
  secondaryColor: "#004499"
  accentColor: "#ff6600"
  
  # Typographie
  fontFamily: "'Inter', sans-serif"
  headingFont: "'Poppins', sans-serif"
  codeFont: "'JetBrains Mono', monospace"
  
  # Layout
  sidebarWidth: "280px"
  contentMaxWidth: "1200px"
  headerHeight: "64px"
  
  # Fonctionnalités
  darkModeSupport: true
  printStyles: true
  responsiveDesign: true
  
  # Assets
  customLogo: true
  favicon: "favicon.ico"
  
# Dépendances (optionnel)
dependencies:
  - "font-awesome@6.0.0"
  - "highlight.js@11.0.0"
Variables CSS et système de couleurs
_variables.scss
// Variables de couleurs
:root {
  // Couleurs principales
  --color-primary: #{$primary-color};
  --color-primary-dark: #{darken($primary-color, 10%)};
  --color-primary-light: #{lighten($primary-color, 20%)};
  
  --color-secondary: #{$secondary-color};
  --color-accent: #{$accent-color};
  
  // Couleurs sémantiques
  --color-success: #22c55e;
  --color-warning: #f59e0b;
  --color-error: #ef4444;
  --color-info: #3b82f6;
  
  // Couleurs de fond
  --bg-primary: #ffffff;
  --bg-secondary: #f8fafc;
  --bg-tertiary: #f1f5f9;
  --bg-accent: #{rgba($primary-color, 0.05)};
  
  // Couleurs de texte
  --text-primary: #1f2937;
  --text-secondary: #6b7280;
  --text-tertiary: #9ca3af;
  --text-inverse: #ffffff;
  
  // Couleurs de bordure
  --border-light: #e5e7eb;
  --border-medium: #d1d5db;
  --border-dark: #9ca3af;
  
  // Ombres
  --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
  --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
  --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
  --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
  
  // Typographie
  --font-family-sans: #{$font-family};
  --font-family-heading: #{$heading-font};
  --font-family-mono: #{$code-font};
  
  // Tailles de police
  --font-size-xs: 0.75rem;
  --font-size-sm: 0.875rem;
  --font-size-base: 1rem;
  --font-size-lg: 1.125rem;
  --font-size-xl: 1.25rem;
  --font-size-2xl: 1.5rem;
  --font-size-3xl: 1.875rem;
  --font-size-4xl: 2.25rem;
  
  // Espacements
  --spacing-xs: 0.25rem;
  --spacing-sm: 0.5rem;
  --spacing-md: 1rem;
  --spacing-lg: 1.5rem;
  --spacing-xl: 2rem;
  --spacing-2xl: 3rem;
  
  // Rayons de bordure
  --radius-sm: 0.25rem;
  --radius-md: 0.375rem;
  --radius-lg: 0.5rem;
  --radius-xl: 0.75rem;
  --radius-2xl: 1rem;
  
  // Durées de transition
  --transition-fast: 150ms;
  --transition-normal: 300ms;
  --transition-slow: 500ms;
  
  // Z-index
  --z-dropdown: 1000;
  --z-sticky: 1020;
  --z-fixed: 1030;
  --z-modal: 1040;
  --z-popover: 1050;
  --z-tooltip: 1060;
}

// Variables spécifiques au thème sombre
[data-theme="dark"] {
  --bg-primary: #1f2937;
  --bg-secondary: #111827;
  --bg-tertiary: #0f172a;
  
  --text-primary: #f9fafb;
  --text-secondary: #d1d5db;
  --text-tertiary: #9ca3af;
  
  --border-light: #374151;
  --border-medium: #4b5563;
  --border-dark: #6b7280;
}

// Mixins utilitaires
@mixin button-variant($bg-color, $text-color: white) {
  background-color: $bg-color;
  color: $text-color;
  border: 1px solid $bg-color;
  
  &:hover {
    background-color: darken($bg-color, 5%);
    border-color: darken($bg-color, 5%);
  }
  
  &:active {
    background-color: darken($bg-color, 10%);
    border-color: darken($bg-color, 10%);
  }
}
Aperçu des couleurs
Processus de création étape par étape
Étapes de création d'un thème
  1. Planification : Définir l'identité visuelle et les couleurs
  2. Structure : Créer l'arborescence du thème
  3. Variables : Configurer les couleurs et espacements
  4. Composants : Styliser les éléments UI
  5. Layout : Adapter les templates
  6. Responsive : Optimiser pour mobile
  7. Test : Valider sur différents navigateurs
  8. Package : Créer le package final
Commandes de développement
# Créer un nouveau thème
wikijs theme:create mon-theme-custom

# Structure générée automatiquement
cd themes/mon-theme-custom

# Installer les dépendances
npm install

# Mode développement avec hot-reload
npm run dev

# Build du thème pour production
npm run build

# Validation du thème
wikijs theme:validate mon-theme-custom

# Installation du thème
wikijs theme:install ./mon-theme-custom

# Activation du thème
wikijs theme:activate mon-theme-custom
Configuration webpack personnalisée
// webpack.config.js pour le thème
const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');

module.exports = {
  entry: {
    app: './assets/js/app.js',
    theme: './assets/scss/app.scss'
  },
  
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'js/[name].min.js',
    publicPath: '/themes/mon-theme-custom/'
  },
  
  module: {
    rules: [
      {
        test: /\.scss$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader',
          {
            loader: 'sass-loader',
            options: {
              sassOptions: {
                includePaths: ['node_modules']
              }
            }
          }
        ]
      },
      {
        test: /\.(png|jpe?g|gif|svg)$/i,
        use: [
          {
            loader: 'file-loader',
            options: {
              outputPath: 'images',
            }
          }
        ]
      },
      {
        test: /\.(woff|woff2|eot|ttf|otf)$/,
        use: [
          {
            loader: 'file-loader',
            options: {
              outputPath: 'fonts',
            }
          }
        ]
      }
    ]
  },
  
  plugins: [
    new MiniCssExtractPlugin({
      filename: 'css/[name].min.css'
    })
  ],
  
  optimization: {
    minimizer: [
      new OptimizeCSSAssetsPlugin({
        cssProcessorOptions: {
          safe: true,
          discardComments: {
            removeAll: true
          }
        }
      })
    ]
  },
  
  devServer: {
    contentBase: './dist',
    hot: true,
    proxy: {
      '/': 'http://localhost:3000'  // Proxy vers WikiJS
    }
  }
};
Packaging et distribution
Script de packaging
{
  "name": "mon-theme-custom",
  "version": "1.0.0",
  "description": "Thème personnalisé pour WikiJS",
  "main": "theme.yml",
  "scripts": {
    "dev": "webpack --mode development --watch",
    "build": "webpack --mode production",
    "package": "npm run build && npm run package:zip",
    "package:zip": "zip -r mon-theme-custom.zip . -x node_modules/\\* .git/\\* *.log",
    "validate": "ajv validate -s theme-schema.json -d theme.yml",
    "test": "npm run validate && npm run build"
  },
  "devDependencies": {
    "webpack": "^5.0.0",
    "webpack-cli": "^4.0.0",
    "sass": "^1.35.0",
    "sass-loader": "^12.0.0",
    "css-loader": "^6.0.0",
    "mini-css-extract-plugin": "^2.0.0",
    "file-loader": "^6.2.0",
    "ajv-cli": "^5.0.0"
  },
  "peerDependencies": {
    "wiki.js": ">=2.5.0"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/moncompte/mon-theme-custom.git"
  },
  "keywords": ["wikijs", "theme", "corporate"],
  "author": "Votre Nom",
  "license": "MIT"
}
Checklist avant publication
  • Validation : Schema YAML validé
  • Performance : Assets optimisés et minifiés
  • Compatibilité : Testé sur versions supportées
  • Responsive : Fonctionnel mobile/tablette
  • Accessibilité : Respect des standards WCAG
  • Documentation : README et instructions