Aller au contenu principal

Theming et personnalisation

Theming et personnalisation

Un chat générique ne s’intègre pas dans votre produit. ChatKit offre un système de theming complet pour adapter chaque aspect visuel à votre charte graphique : couleurs, typographie, espacement, coins arrondis, et animations.

Le système de thème

ChatKit utilise un objet de thème qui contrôle tous les aspects visuels :

import { ChatProvider, ChatWindow, MessageInput } from "@openai/chatkit/react";

const monTheme = {
  colors: {
    primary: "#2563EB",        // Bleu principal
    primaryHover: "#1D4ED8",   // Bleu au survol
    background: "#0F172A",     // Fond sombre
    surface: "#1E293B",        // Surface des messages
    text: "#F8FAFC",           // Texte principal
    textSecondary: "#94A3B8",  // Texte secondaire
    border: "#334155",         // Bordures
    userBubble: "#2563EB",     // Bulle utilisateur
    agentBubble: "#1E293B",    // Bulle agent
    inputBackground: "#1E293B",
    inputBorder: "#475569",
  },
  typography: {
    fontFamily: "'Inter', sans-serif",
    fontSize: "14px",
    lineHeight: "1.6",
    messageFontSize: "15px",
  },
  spacing: {
    messagePadding: "12px 16px",
    messageGap: "8px",
    containerPadding: "16px",
  },
  borders: {
    radius: "12px",
    messageRadius: "16px",
    inputRadius: "24px",
  },
};

function ChatDeProduit() {
  return (
    <ChatProvider endpoint="/api/chat" theme={monTheme}>
      <div style={{ height: "100vh", display: "flex", flexDirection: "column" }}>
        <ChatWindow />
        <MessageInput placeholder="Comment puis-je vous aider ?" />
      </div>
    </ChatProvider>
  );
}

Personnaliser les messages

Vous pouvez personnaliser le rendu de chaque message avec des composants custom :

import { ChatProvider, ChatWindow, MessageInput } from "@openai/chatkit/react";

function MessagePersonnalise({ message, isUser }) {
  return (
    <div
      style={{
        display: "flex",
        justifyContent: isUser ? "flex-end" : "flex-start",
        marginBottom: "8px",
      }}
    >
      {!isUser && (
        <div style={{
          width: "32px",
          height: "32px",
          borderRadius: "50%",
          background: "#2563EB",
          display: "flex",
          alignItems: "center",
          justifyContent: "center",
          marginRight: "8px",
          fontSize: "14px",
        }}>
          AI
        </div>
      )}
      <div
        style={{
          maxWidth: "70%",
          padding: "12px 16px",
          borderRadius: "16px",
          background: isUser ? "#2563EB" : "#1E293B",
          color: "#F8FAFC",
        }}
      >
        {message.content}
      </div>
    </div>
  );
}

function Chat() {
  return (
    <ChatProvider endpoint="/api/chat">
      <ChatWindow renderMessage={(msg) => (
        <MessagePersonnalise message={msg} isUser={msg.role === "user"} />
      )} />
      <MessageInput />
    </ChatProvider>
  );
}

Mode sombre et mode clair

ChatKit supporte les thèmes dynamiques :

import { useState } from "react";

const themeSombre = {
  colors: {
    background: "#0F172A",
    surface: "#1E293B",
    text: "#F8FAFC",
    primary: "#3B82F6",
  },
};

const themeClair = {
  colors: {
    background: "#FFFFFF",
    surface: "#F1F5F9",
    text: "#0F172A",
    primary: "#2563EB",
  },
};

function ChatAvecTheme() {
  const [modeNuit, setModeNuit] = useState(true);

  return (
    <ChatProvider endpoint="/api/chat" theme={modeNuit ? themeSombre : themeClair}>
      <button onClick={() => setModeNuit(!modeNuit)}>
        {modeNuit ? "Mode clair" : "Mode sombre"}
      </button>
      <ChatWindow />
      <MessageInput />
    </ChatProvider>
  );
}

Personnaliser la zone de saisie

La zone de saisie est souvent le premier point de contact visuel :

<MessageInput
  placeholder="Posez votre question sur nos services..."
  maxLength={2000}
  showCharCount={true}
  submitOnEnter={true}
  showAttachButton={false}
  style={{
    borderTop: "1px solid #334155",
    padding: "16px",
  }}
/>

CSS personnalisé

Pour un contrôle total, utilisez les classes CSS de ChatKit :

/* styles/chatkit-custom.css */

/* Conteneur principal */
.chatkit-container {
  font-family: 'Inter', sans-serif;
}

/* Messages de l'agent */
.chatkit-message--agent {
  background: linear-gradient(135deg, #1E293B, #0F172A);
  border: 1px solid rgba(59, 130, 246, 0.1);
}

/* Messages de l'utilisateur */
.chatkit-message--user {
  background: #2563EB;
  border-radius: 16px 16px 4px 16px;
}

/* Zone de saisie */
.chatkit-input {
  background: #1E293B;
  border: 1px solid #475569;
  border-radius: 24px;
  transition: border-color 0.2s;
}

.chatkit-input:focus-within {
  border-color: #3B82F6;
  box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
}

/* Indicateur de chargement */
.chatkit-typing-indicator {
  color: #94A3B8;
}

/* Bouton d'envoi */
.chatkit-send-button {
  background: #2563EB;
  border-radius: 50%;
  width: 36px;
  height: 36px;
}

Points clés à retenir

  • Le système de thème contrôle couleurs, typographie, espacement et bordures
  • Les composants de message personnalisés permettent un rendu sur mesure
  • Le thème peut changer dynamiquement (mode sombre/clair)
  • Les classes CSS de ChatKit permettent un contrôle fin au pixel
  • Adaptez le placeholder et les options de la zone de saisie à votre contexte