Skip to content

Pengembangan Tema ​

Tema mineproj adalah paket npm yang mengontrol tampilan dan nuansa situs Anda.

Kontrak Tema ​

Tema adalah objek dengan properti berikut:

PropertiTipeWajibDeskripsi
namestring✅Nama tema unik
layoutsRecord<string, Component>✅Layout untuk setiap tipe rute
componentsRecord<string, Component>OpsionalKomponen yang dapat digunakan kembali
slotsstring[]OpsionalTitik penyisipan bernama
configSchemaZodSchemaOpsionalSkema untuk themeConfig
localesRecord<string, Record<string, string>>OpsionalKamus terjemahan UI
stylesstring[]OpsionalString CSS yang disisipkan ke setiap halaman head
headScriptsstring[]OpsionalSkrip inline yang disuntikkan ke halaman head
islandsRecord<string, Component>OpsionalKomponen interaktif yang dihidrasi di klien
extendsTheme | stringOpsionalTema induk untuk diwarisi

Contoh ​

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

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

Menggunakan tema lokal ​

Buat .mineproj/theme/index.mts:

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

Kemudian atur theme: '.mineproj/theme' di konfigurasi Anda.

Layout ​

Tujuh jenis layout yang wajib:

LayoutRuteTujuan
home/Halaman arahan dengan hero, proyek unggulan, grid
list/projects/Grid proyek yang dapat difilter
detail/projects/<slug>/Detail proyek dengan sidebar
tag/tags/<name>/Proyek yang difilter berdasarkan tag
collection/collections/<slug>/Koleksi yang dikurasi
about/about/Profil penulis
notFound404.htmlHalaman 404 kustom

Islands ​

Komponen interaktif ditandai sebagai islands:

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

Daftarkan di tema:

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

Pengujian Kontrak ​

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

Publikasi ​

  1. Beri nama paket Anda mineproj-theme-* atau @scope/mineproj-theme-*
  2. Tambahkan "keywords": ["mineproj-theme"] ke package.json
  3. Jalankan runThemeContract untuk memvalidasi
  4. Publikasikan ke npm

Released under the Apache-2.0 License.