import { FontName, actionman, komika, vtc } from "@/lib/fonts" import { pick } from "@/lib/pick" import { NextFontWithVariable } from "next/dist/compiled/@next/font" export type ComicFamily = | "american" | "asian" | "european" export type ComicColor = | "color" | "grayscale" | "monochrome" export interface Preset { id: string label: string family: ComicFamily color: ComicColor font: FontName llmPrompt: string imagePrompt: (prompt: string) => string[] negativePrompt: (prompt: string) => string[] } // ATTENTION!! negative prompts are not supported by the VideoChain API yet export const presets: Record = { random: { id: "random", label: "Random style", family: "european", color: "color", font: "actionman", llmPrompt: "", imagePrompt: (prompt: string) => [], negativePrompt: () => [], }, neutral: { id: "neutral", label: "Neutral (no style)", family: "american", color: "color", font: "actionman", llmPrompt: "", imagePrompt: (prompt: string) => [ prompt, ], negativePrompt: () => [ ], }, japanese_manga: { id: "japanese_manga", label: "Japanese", family: "asian", color: "grayscale", font: "actionman", llmPrompt: "japanese manga", imagePrompt: (prompt: string) => [ `grayscale`, `detailed drawing`, `japanese manga`, prompt, // "single panel", // "manga", // "japanese", // "intricate", // "detailed", // "drawing" ], negativePrompt: () => [ "franco-belgian comic", "color album", "color", "american comic", "photo", "painting", "3D render" ], }, nihonga: { id: "nihonga", label: "Nihonga", family: "asian", color: "color", font: "actionman", llmPrompt: "japanese manga", imagePrompt: (prompt: string) => [ `japanese nihonga painting about ${prompt}`, "Nihonga", "ancient japanese painting", "intricate", "detailed", "detailed painting" // "drawing" ], negativePrompt: () => [ "franco-belgian comic", "color album", "color", "manga", "comic", "american comic", "photo", "painting", "3D render" ], }, franco_belgian: { id: "franco_belgian", label: "Franco-Belgian", family: "european", color: "color", font: "actionman", llmPrompt: "Franco-Belgian comic (a \"bande dessinée\"), in the style of Franquin, Moebius etc", imagePrompt: (prompt: string) => [ "bande dessinée", "franco-belgian comic", `franco-belgian color comic about ${prompt}`, "comic album", "detailed drawing" // "color drawing" ], negativePrompt: () => [ "manga", "anime", "american comic", "grayscale", "monochrome", "photo", "painting", "3D render" ], }, american_comic_90: { id: "american_comic_90", label: "American (modern)", family: "american", color: "color", font: "actionman", llmPrompt: "american comic", imagePrompt: (prompt: string) => [ "digital color comicbook style", `modern american comic about ${prompt}`, "detailed drawing" //"single panel", // "2010s", // "digital print", // "color comicbook", // "color drawing" ], negativePrompt: () => [ "manga", "anime", "american comic", "action", "grayscale", "monochrome", "photo", "painting", "3D render" ], }, /* american_comic_40: { label: "American (1940)", family: "american", color: "color", font: "actionman", llmPrompt: "american comic", imagePrompt: (prompt: string) => [ `american comic about ${prompt}`, "single panel", "american comic", "comicbook style", "1940", "40s", "color comicbook", "color drawing" ], negativePrompt: () => [ "manga", "anime", "american comic", "action", "grayscale", "monochrome", "photo", "painting", "3D render" ], }, */ american_comic_50: { id: "american_comic_50", label: "American (1950)", family: "american", color: "color", font: "actionman", llmPrompt: "american comic", imagePrompt: (prompt: string) => [ "1950", "50s", `vintage american color comic about ${prompt}`, "detailed drawing" // "single panel", // "comicbook style", // "color comicbook", // "color drawing" ], negativePrompt: () => [ "manga", "anime", "american comic", "action", "grayscale", "monochrome", "photo", "painting", "3D render" ], }, /* american_comic_60: { label: "American (1960)", family: "american", color: "color", font: "actionman", llmPrompt: "american comic", imagePrompt: (prompt: string) => [ `american comic about ${prompt}`, "single panel", "american comic", "comicbook style", "1960", "60s", "color comicbook", "color drawing" ], negativePrompt: () => [ "manga", "anime", "american comic", "action", "grayscale", "monochrome", "photo", "painting", "3D render" ], }, */ flying_saucer: { id: "flying_saucer", label: "Flying saucer", family: "european", color: "color", font: "actionman", llmPrompt: "new pulp science fiction", imagePrompt: (prompt: string) => [ `vintage science fiction`, // "40s", "color pulp comic panel", "1940", `${prompt}`, "detailed drawing" // "single panel", // "comic album" ], negativePrompt: () => [ "manga", "anime", "american comic", "grayscale", "monochrome", "photo", "painting", "3D render" ], }, humanoid: { id: "humanoid", label: "Humanoid", family: "european", color: "color", font: "actionman", llmPrompt: "comic books by Moebius", imagePrompt: (prompt: string) => [ `color comic panel`, "style of Moebius", `${prompt}`, "detailed drawing", "french comic panel", "franco-belgian style", "bande dessinée", "single panel", // "comic album" ], negativePrompt: () => [ "manga", "anime", "american comic", "grayscale", "monochrome", "photo", "painting", "3D render" ], }, haddock: { id: "haddock", label: "Haddock", family: "european", color: "color", font: "actionman", llmPrompt: "writing Tintin comic books", imagePrompt: (prompt: string) => [ `color comic panel`, "style of Hergé", "tintin style", `${prompt}`, "by Hergé", "french comic panel", "franco-belgian style", // "color panel", // "bande dessinée", // "single panel", // "comic album" ], negativePrompt: () => [ "manga", "anime", "american comic", "grayscale", "monochrome", "photo", "painting", "3D render" ], }, /* lurid: { id: "lurid", label: "Lurid", family: "american", color: "color", font: "actionman", llmPrompt: "1970s satirical and alternative underground comics", imagePrompt: (prompt: string) => [ `satirical color comic`, `underground comix`, `1970`, `${prompt}`, ], negativePrompt: () => [ "manga", "anime", "american comic", "grayscale", "monochrome", "painting" ], }, */ armorican: { id: "armorican", label: "Armorican", family: "european", color: "monochrome", font: "actionman", llmPrompt: "french style comic books set in ancient Rome and Gaul", imagePrompt: (prompt: string) => [ `color comic panel`, "romans", "gauls", "french comic panel", "franco-belgian style", `about ${prompt}`, "bande dessinée", "single panel", // "comical", // "comic album", // "color drawing" ], negativePrompt: () => [ "manga", "anime", "american comic", "grayscale", "monochrome", "photo", "painting", "3D render" ], }, render: { id: "render", label: "3D Render", family: "european", color: "color", font: "actionman", llmPrompt: "new movie", imagePrompt: (prompt: string) => [ `3D render animation`, `Pixar`, `cute`, `funny`, `Unreal engine`, `${prompt}`, `crisp`, `sharp` ], negativePrompt: () => [ "manga", "anime", "american comic", "grayscale", "monochrome", "painting" ], }, klimt: { id: "klimt", label: "Klimt", family: "european", color: "color", font: "actionman", llmPrompt: "Gustav Klimt art pieces.", imagePrompt: (prompt: string) => [ `golden`, `patchwork`, `style of Gustav Klimt`, `Gustav Klimt painting`, `${prompt}`, `detailed painting`, `intricate details` ], negativePrompt: () => [ "manga", "anime", "american comic", "grayscale", "monochrome", "painting" ], }, medieval: { id: "medieval", label: "Medieval", family: "european", color: "color", font: "actionman", llmPrompt: "medieval story (write in this style)", imagePrompt: (prompt: string) => [ `medieval illuminated manuscript`, `illuminated manuscript of`, `medieval`, // `medieval color engraving`, `${prompt}`, `intricate details`, // `medieval` ], negativePrompt: () => [ "manga", "anime", "american comic", "grayscale", "monochrome", "painting" ], }, /* glass: { id: "glass", label: "Glass", family: "european", color: "color", font: "actionman", llmPrompt: "new movie", imagePrompt: (prompt: string) => [ `stained glass`, `vitrail`, `stained glass`, // `medieval color engraving`, `${prompt}`, `medieval`, ], negativePrompt: () => [ "manga", "anime", "american comic", "grayscale", "monochrome", "painting" ], }, */ /* voynich: { id: "voynich", label: "Voynich", family: "european", color: "color", font: "actionman", llmPrompt: "new movie", imagePrompt: (prompt: string) => [ `voynich`, `voynich page`, // `medieval color engraving`, `${prompt}`, `medieval`, ], negativePrompt: () => [ "manga", "anime", "american comic", "grayscale", "monochrome", "painting" ], }, */ egyptian: { id: "egyptian", label: "Egyptian", family: "european", color: "color", font: "actionman", llmPrompt: "ancient egyptian stories.", imagePrompt: (prompt: string) => [ `ancient egyptian wall painting`, `ancient egypt`, // `medieval color engraving`, `${prompt}`, ], negativePrompt: () => [ "manga", "anime", "american comic", "grayscale", "monochrome", "painting" ], }, /* psx: { label: "PSX", family: "european", color: "color", font: "actionman", llmPrompt: "new movie", imagePrompt: (prompt: string) => [ `videogame screenshot`, `3dfx`, `3D dos game`, `software rendering`, `${prompt}`, ], negativePrompt: () => [ "manga", "anime", "american comic", "grayscale", "monochrome", "painting" ], }, */ /* pixel: { label: "Pixel", family: "european", color: "color", font: "actionman", llmPrompt: "new movie", imagePrompt: (prompt: string) => [ `pixelart`, `isometric`, `pixelated`, `low res`, `${prompt}`, ], negativePrompt: () => [ "manga", "anime", "american comic", "grayscale", "monochrome", "painting" ], }, */ photonovel: { id: "photonovel", label: "Vintage photonovel", family: "european", color: "color", font: "actionman", llmPrompt: "new movie", imagePrompt: (prompt: string) => [ `vintage photo`, `1950`, `1960`, `french new wave`, `faded colors`, `color movie screencap`, `${prompt}`, ], negativePrompt: () => [ "manga", "anime", "american comic", "grayscale", "monochrome", "painting" ], }, stockphoto: { id: "stockphoto", label: "Stock photo", family: "european", color: "color", font: "actionman", llmPrompt: "new movie", imagePrompt: (prompt: string) => [ `cinematic`, `hyperrealistic`, `footage`, `sharp 8k`, `analog`, `instagram`, `photoshoot`, `${prompt}`, `crisp details` ], negativePrompt: () => [ "manga", "anime", "american comic", "grayscale", "monochrome", "painting" ], }, } export type PresetName = keyof typeof presets export const defaultPreset: PresetName = "american_comic_90" export const nonRandomPresets = Object.keys(presets).filter(p => p !== "random") export const getPreset = (preset?: PresetName): Preset => presets[preset || defaultPreset] || presets[defaultPreset] export const getRandomPreset = (): Preset => { const presetName = pick(Object.keys(presets).filter(preset => preset !== "random")) as PresetName return getPreset(presetName) }