Skip to content

Desenvolvimento de Temas ​

Os temas do mineproj são pacotes npm que controlam a aparência do seu site.

Contrato do Tema ​

Um tema é um objeto com as seguintes propriedades:

PropriedadeTipoObrigatórioDescrição
namestring✅Nome único do tema
layoutsRecord<string, Component>✅Layouts para cada tipo de rota
componentsRecord<string, Component>OpcionalComponentes reutilizáveis
slotsstring[]OpcionalPontos de inserção nomeados
configSchemaZodSchemaOpcionalEsquema para themeConfig
localesRecord<string, Record<string, string>>OpcionalDicionários de tradução da interface
stylesstring[]OpcionalStrings CSS inline no cabeçalho de cada página
headScriptsstring[]OpcionalScripts inline injetados no cabeçalho da página
islandsRecord<string, Component>OpcionalComponentes interativos hidratados no cliente
extendsTheme | stringOpcionalTema pai do qual herdar

Exemplo ​

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

const theme = defineTheme({
  name: 'meu-tema',
  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;

Usando um tema local ​

Crie .mineproj/theme/index.mts:

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

Em seguida, defina theme: '.mineproj/theme' na sua configuração.

Layouts ​

Os sete tipos de layout obrigatórios:

LayoutRotaPropósito
home/Página inicial com hero, projetos em destaque, grade
list/projects/Grade de projetos filtrável
detail/projects/<slug>/Detalhe do projeto com barra lateral
tag/tags/<name>/Projetos filtrados por tag
collection/collections/<slug>/Coleção curada
about/about/Perfil do autor
notFound404.htmlPágina 404 personalizada

Islands ​

Componentes interativos são marcados como islands:

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

Registre no tema:

ts
const theme = defineTheme({
  name: 'meu-tema',
  layouts: { ... },
  islands: { 'meu-contador': MyCounter },
  islandsImport: 'meu-tema/islands',
});

Teste de Contrato ​

ts
import { runThemeContract } from '@mineproj/test-utils';
const result = runThemeContract(meuTema, { requireAllLayouts: true });
console.log(result.errors); // [] se válido

Publicação ​

  1. Nomeie seu pacote mineproj-theme-* ou @scope/mineproj-theme-*
  2. Adicione "keywords": ["mineproj-theme"] ao package.json
  3. Execute runThemeContract para validar
  4. Publique no npm

Released under the Apache-2.0 License.