Všetky projekty

PayloadCMS Template

Druhá generácia mojej vlastnej štartovacej šablóny pre Next.js a Payload CMS. Poskytuje základ pre ďalšie projekty a AI asistenta na tvorbu, preklad, preformulovanie obsahu a generovanie blokov na požiadanie.

Payload CMS Template Hero

Pre koho je projekt

Vývojári začínajúci nové webové projekty a redakčné tímy pracujúce s obsahom v Payload CMS.

Výsledky a prínos

  • Šablóna bola opakovane použitá ako základ klientskych projektov.

  • AI asistent poskytuje nástroje na tvorbu a úpravu obsahu priamo v rámci riešenia.

Vlastný nástroj využitý v klientskych projektoch

Táto šablóna je druhou iteráciou môjho vlastného základu pre webové projekty. Cieľom je mať pripravenú spoločnú funkcionalitu a pri ďalšom projekte ju prispôsobiť konkrétnemu zadaniu. Podľa existujúcich podkladov bola šablóna použitá vo viacerých klientskych projektoch.

Výzva

Pripraviť opakovane použiteľný základ pre nové projekty a doplniť redakčné prostredie o nástroje na tvorbu a úpravu obsahu.

Riešenie

Šablóna kombinuje Next.js 16, Payload CMS 3, TypeScript a PostgreSQL. Integrovaný AI asistent podporuje tvorbu textov, preklady, preformulovanie a generovanie obsahových blokov na požiadanie.

AI ako súčasť správy obsahu

Rozšírenie o AI asistenta zahŕňa tvorbu textov, preklad, preformulovanie aj generovanie blokov na požiadanie. Projekt tým prepája vývojársku infraštruktúru s nástrojmi pre redakciu. Stack uvádza aj Playwright a Vitest; bez výsledkov testov však neuvádzam pokrytie ani garancie kvality.

Môj prínos

Vývoj druhej generácie vlastnej štartovacej šablóny Next.js a Payload CMS.

Rozšírenie šablóny o integrovaného AI asistenta pre prácu s obsahom.

Opakované využitie šablóny ako základu klientskych projektov.

Jednotné zadanie obsahovej operácie

Príklad ukazuje typovo rozlíšené požiadavky na asistenta. Každá operácia nesie iba údaje, ktoré potrebuje. Skutočná integrácia modelu, validácia vstupov a ukladanie obsahu tu nie sú implementované.

illustrative-content-task.ts
type ContentTask =
  | { action: "compose"; brief: string }
  | { action: "translate"; text: string; locale: "sk" | "en" }
  | { action: "rephrase"; text: string }
  | { action: "generate-block"; brief: string; blockType: string };

function taskSource(task: ContentTask): string {
  switch (task.action) {
    case "compose":
    case "generate-block":
      return task.brief;
    case "translate":
    case "rephrase":
      return task.text;
  }
}