Skip to content

Développement de Thème ​

Les thèmes mineproj sont des packages npm qui contrôlent l'apparence de votre site.

Contrat du Thème ​

Un thème est un objet avec les propriétés suivantes :

PropriétéTypeRequisDescription
namestring✅Nom unique du thème
layoutsRecord<string, Component>✅Mises en page pour chaque type de route
componentsRecord<string, Component>OptionnelComposants réutilisables
slotsstring[]OptionnelPoints d'insertion nommés
configSchemaZodSchemaOptionnelSchéma pour themeConfig
localesRecord<string, Record<string, string>>OptionnelDictionnaires de traduction UI
stylesstring[]OptionnelChaînes CSS intégrées dans chaque en-tête de page
headScriptsstring[]OptionnelScripts en ligne injectés dans l'en-tête de la page
islandsRecord<string, Component>OptionnelComposants interactifs hydratés côté client
extendsTheme | stringOptionnelThème parent à hériter

Exemple ​

ts
import { defineTheme } from '@mineproj/core';

const theme = defineTheme({
  name: 'mon-theme',
  layouts: {
    home: ({ data, config }) => (
      <main>
        <h1>{config.title}</h1>
        <ul>
          {data.projects.map(p => <li key={p.slug}>{p.name}</li>)}
        </ul>
      </main>
    ),
  },
  styles: [`:root { --mp-color-accent: #ff5500; }`],
});

export default theme;

Utiliser un thème local ​

Créez .mineproj/theme/index.mts :

ts
import { defineTheme } from '@mineproj/core';
export default defineTheme({ ... });

Puis définissez theme: '.mineproj/theme' dans votre configuration.

Mises en Page ​

Les sept types de mise en page requis :

Mise en PageRouteObjectif
home/Page d'accueil avec hero, projets vedettes, grille
list/projects/Grille de projets filtrable
detail/projects/<slug>/Détail du projet avec barre latérale
tag/tags/<name>/Projets filtrés par tag
collection/collections/<slug>/Collection organisée
about/about/Profil de l'auteur
notFound404.htmlPage 404 personnalisée

Îles ​

Les composants interactifs sont marqués comme des îles :

tsx
export function MonCompteur({ start }: { start: number }) {
  const [count, setCount] = useState(start);
  return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}

Enregistrez dans le thème :

ts
const theme = defineTheme({
  name: 'mon-theme',
  layouts: { ... },
  islands: { 'mon-compteur': MonCompteur },
  islandsImport: 'mon-theme/islands',
});

Test de Contrat ​

ts
import { runThemeContract } from '@mineproj/test-utils';
const result = runThemeContract(monTheme, { requireAllLayouts: true });
console.log(result.errors); // [] si valide

Publication ​

  1. Nommez votre package mineproj-theme-* ou @scope/mineproj-theme-*
  2. Ajoutez "keywords": ["mineproj-theme"] dans package.json
  3. Exécutez runThemeContract pour valider
  4. Publiez sur npm

Released under the Apache-2.0 License.