JSPM

  • Created
  • Published
  • Downloads 2302
  • Score
    100M100P100Q99547F
  • License MIT

Une bibliothèque de thèmes React moderne avec support Tailwind CSS

Package Exports

  • chromatic-ui-themes
  • chromatic-ui-themes/dist/index.cjs.js
  • chromatic-ui-themes/dist/index.esm.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (chromatic-ui-themes) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

Chromatic UI Themes

Une librairie de thèmes React moderne et flexible avec support TypeScript, conçue pour créer des interfaces utilisateur cohérentes et accessibles.

Fonctionnalités

  • 5 thèmes lumineux + 1 thème sombre (extensible)
  • Système de couleurs complet (primaire, secondaire, accent, états, etc.)
  • Hooks React intuitifs pour une intégration facile
  • Classes CSS automatiques prêtes à l'emploi
  • Basculement light/dark en un clic
  • Outils d'accessibilité intégrés
  • Variables CSS personnalisées pour une flexibilité maximale
  • TypeScript support complet

Installation

npm install chromatic-ui-themes
# ou
yarn add chromatic-ui-themes
# ou
pnpm add chromatic-ui-themes

Utilisation de base

1. Configuration initiale

Importez le CSS et configurez le ThemeProvider dans votre application :

import React from 'react';
import { ThemeProvider } from 'chromatic-ui-themes';
import 'chromatic-ui-themes/dist/themes.css'; // ⚠️ IMPORTANT : N'oubliez pas cette ligne !

function App() {
  return (
    <ThemeProvider defaultTheme="oceanic-light">
      <div className="min-h-screen bg-background text">
        <h1 className="text-2xl font-bold primary">
          Bienvenue dans Chromatic UI !
        </h1>
        <p className="text-secondary">
          Votre interface avec des thèmes magnifiques.
        </p>
      </div>
    </ThemeProvider>
  );
}

export default App;

2. Utilisation des hooks

import React from 'react';
import { useTheme, useThemeColors } from 'chromatic-ui-themes';

function MyComponent() {
  const { currentTheme, setTheme, availableThemes } = useTheme();
  const colors = useThemeColors();

  return (
    <div className="p-6">
      <h2 className="text-xl font-semibold primary mb-4">
        Thème actuel : {currentTheme.displayName}
      </h2>
      
      {/* Utilisation directe des couleurs */}
      <div 
        style={{ 
          backgroundColor: colors.primary, 
          color: colors.textInverse 
        }}
        className="p-4 rounded-lg mb-4"
      >
        Boîte avec couleur primaire
      </div>

      {/* Utilisation des classes CSS */}
      <div className="bg-secondary text-inverse p-4 rounded-lg">
        Boîte avec classes CSS automatiques
      </div>
    </div>
  );
}

Thèmes disponibles

Thèmes lumineux

  • Oceanic Light (oceanic-light) - Bleu océan rafraîchissant
  • Sakura Light (sakura-light) - Rose cerisier délicat
  • Forest Light (forest-light) - Vert nature apaisant
  • Sunset Light (sunset-light) - Orange coucher de soleil chaleureux
  • Arctic Light (arctic-light) - Bleu glaciaire cristallin

Thèmes sombres

  • Arctic Dark (arctic-dark) - Nuit polaire profonde

Exemples avancés

Sélecteur de thèmes simple

import React from 'react';
import { useTheme } from 'chromatic-ui-themes';

function ThemeSelector() {
  const { currentTheme, setTheme, availableThemes } = useTheme();

  return (
    <div className="p-4">
      <label className="block text-sm font-medium text-secondary mb-2">
        Choisir un thème :
      </label>
      <select 
        value={currentTheme.name}
        onChange={(e) => setTheme(e.target.value)}
        className="bg-surface border border-color rounded-md px-3 py-2 text focus:outline-none focus:ring-2 focus:ring-primary"
      >
        {availableThemes.map((theme) => (
          <option key={theme.name} value={theme.name}>
            {theme.displayName}
          </option>
        ))}
      </select>
    </div>
  );
}

Basculement Light/Dark avec Arctic

import React from 'react';
import { useTheme } from 'chromatic-ui-themes';

function ArcticThemeToggle() {
  const { currentTheme, setTheme, isDarkMode } = useTheme();

  const toggleArcticTheme = () => {
    if (isDarkMode) {
      setTheme('arctic-light');
    } else {
      setTheme('arctic-dark');
    }
  };

  return (
    <button
      onClick={toggleArcticTheme}
      className="bg-primary hover:bg-primary-dark text-inverse px-4 py-2 rounded-lg transition-colors"
    >
      {currentTheme.name === 'arctic-light' ? '🌙' : '☀️'} 
      {currentTheme.name === 'arctic-light' ? ' Mode Sombre' : ' Mode Clair'}
    </button>
  );
}

Sélecteur de thèmes avec aperçu

import React from 'react';
import { useTheme } from 'chromatic-ui-themes';

function ThemeGrid() {
  const { currentTheme, setTheme, availableThemes } = useTheme();

  return (
    <div className="p-6">
      <h3 className="text-xl font-semibold text mb-4">Choisir votre thème</h3>
      <div className="grid grid-cols-2 md:grid-cols-3 gap-4">
        {availableThemes.map((theme) => (
          <div
            key={theme.name}
            onClick={() => setTheme(theme.name)}
            className={`
              cursor-pointer p-4 rounded-lg border-2 transition-all
              ${currentTheme.name === theme.name 
                ? 'border-primary bg-primary-light' 
                : 'border-light hover:border-primary'
              }
            `}
          >
            {/* Aperçu des couleurs */}
            <div className="flex space-x-1 mb-2">
              <div 
                className="w-4 h-4 rounded-full"
                style={{ backgroundColor: theme.colors.primary }}
              />
              <div 
                className="w-4 h-4 rounded-full"
                style={{ backgroundColor: theme.colors.secondary }}
              />
              <div 
                className="w-4 h-4 rounded-full"
                style={{ backgroundColor: theme.colors.accent }}
              />
            </div>
            
            <h4 className="font-medium text-sm text">
              {theme.displayName}
            </h4>
            <p className="text-xs text-muted mt-1">
              {theme.category === 'light' ? ' Clair' : ' Sombre'}
            </p>
          </div>
        ))}
      </div>
    </div>
  );
}

Basculement automatique Light/Dark

import React from 'react';
import { useTheme, useToggleDarkMode, useIsDarkMode } from 'chromatic-ui-themes';

function AutoThemeToggle() {
  const toggleDarkMode = useToggleDarkMode();
  const isDark = useIsDarkMode();

  return (
    <button
      onClick={toggleDarkMode}
      className="bg-accent hover:bg-accent-dark text-inverse px-4 py-2 rounded-full transition-all duration-300"
    >
      {isDark ? ' Mode Clair' : ' Mode Sombre'}
    </button>
  );
}

Classes CSS disponibles

Couleurs de texte

.primary { color: var(--theme-primary); }
.secondary { color: var(--theme-secondary); }
.accent { color: var(--theme-accent); }
.text { color: var(--theme-text); }
.text-secondary { color: var(--theme-textSecondary); }
.text-muted { color: var(--theme-textMuted); }
.success { color: var(--theme-success); }
.warning { color: var(--theme-warning); }
.error { color: var(--theme-error); }
.info { color: var(--theme-info); }

Couleurs de fond

.bg-primary { background-color: var(--theme-primary); }
.bg-secondary { background-color: var(--theme-secondary); }
.bg-accent { background-color: var(--theme-accent); }
.bg-background { background-color: var(--theme-background); }
.bg-surface { background-color: var(--theme-surface); }
/* ... et toutes les variantes light/dark */

Boutons pré-stylés

.btn-primary /* Bouton primaire avec hover */
.btn-secondary /* Bouton secondaire avec hover */
.btn-outline-primary /* Bouton outline avec hover */

États hover

.hover-primary:hover /* Change la couleur au survol */
.hover-bg-primary:hover /* Change le fond au survol */

🛠 Hooks disponibles

useTheme()

Hook principal pour gérer les thèmes :

const {
  currentTheme,      // Thème actuel
  setTheme,         // Fonction pour changer de thème
  availableThemes,  // Liste des thèmes disponibles
  isDarkMode,       // Boolean : mode sombre actif ?
  toggleDarkMode    // Basculer entre le premier light/dark
} = useTheme();

useThemeColors()

Accès direct aux couleurs du thème actuel :

const colors = useThemeColors();
// colors.primary, colors.secondary, colors.background, etc.

useIsDarkMode()

Vérifier si le mode sombre est actif :

const isDark = useIsDarkMode();

useToggleDarkMode()

Basculer entre light/dark :

const toggleDarkMode = useToggleDarkMode();

Utilitaires

Génération de CSS personnalisé

import { generateCSSVariables, generateTailwindConfig } from 'chromatic-ui-themes';

// Générer les variables CSS pour un thème
const cssVars = generateCSSVariables(myTheme);

// Générer la config Tailwind
const tailwindConfig = generateTailwindConfig(myTheme);

Outils d'accessibilité

import { getContrastRatio, isAccessible } from 'chromatic-ui-themes';

// Vérifier le contraste entre deux couleurs
const contrast = getContrastRatio('#000000', '#FFFFFF'); // 21

// Vérifier l'accessibilité WCAG
const accessible = isAccessible('#000000', '#FFFFFF', 'AA'); // true

Personnalisation

Créer un thème personnalisé

import { Theme } from 'chromatic-ui-themes';

const myCustomTheme: Theme = {
  name: 'my-theme',
  displayName: 'Mon Thème',
  category: 'light',
  colors: {
    primary: '#FF6B6B',
    primaryLight: '#FF8E8E',
    primaryDark: '#E55555',
    // ... toutes les autres couleurs
  }
};

// Utiliser avec le provider
<ThemeProvider themes={[myCustomTheme]} defaultTheme="my-theme">
  <App />
</ThemeProvider>

Utilisation avec Tailwind CSS

Dans votre tailwind.config.js :

module.exports = {
  content: ['./src/**/*.{js,jsx,ts,tsx}'],
  theme: {
    extend: {
      colors: {
        // Variables CSS personnalisées disponibles
        'theme-primary': 'var(--theme-primary)',
        'theme-secondary': 'var(--theme-secondary)',
        'theme-accent': 'var(--theme-accent)',
        // etc.
      }
    }
  }
}

🔧 Configuration avancée

Props du ThemeProvider

interface ThemeProviderProps {
  children: React.ReactNode;
  defaultTheme?: string;           // Thème par défaut
  themes?: Theme[];               // Thèmes personnalisés
}

Exemple complet

import React from 'react';
import { ThemeProvider, useTheme } from 'chromatic-ui-themes';
import 'chromatic-ui-themes/dist/themes.css';

function App() {
  return (
    <ThemeProvider defaultTheme="oceanic-light">
      <div className="min-h-screen bg-background">
        <Header />
        <Main />
        <Footer />
      </div>
    </ThemeProvider>
  );
}

function Header() {
  return (
    <header className="bg-surface border-b border-color p-4">
      <div className="flex justify-between items-center max-w-6xl mx-auto">
        <h1 className="text-xl font-bold primary">Mon App</h1>
        <ThemeControls />
      </div>
    </header>
  );
}

function ThemeControls() {
  const { setTheme, toggleDarkMode, isDarkMode } = useTheme();
  
  return (
    <div className="flex space-x-2">
      <button
        onClick={() => setTheme('sakura-light')}
        className="btn-outline-primary"
      >
        🌸 Sakura
      </button>
      <button
        onClick={() => setTheme('forest-light')}
        className="btn-outline-primary"
      >
        🌲 Forest
      </button>
      <button
        onClick={toggleDarkMode}
        className="btn-primary"
      >
        {isDarkMode ? '☀️' : '🌙'}
      </button>
    </div>
  );
}

🤝 Contribution

Les contributions sont les bienvenues ! N'hésitez pas à :

  • Proposer de nouveaux thèmes
  • Améliorer l'accessibilité
  • Corriger des bugs
  • Améliorer la documentation

📄 Licence

MIT License - voir le fichier LICENSE pour plus de détails.