Files

1645 lines
85 KiB
Python

"""
Generate PromptStyler style packs.
This creates JSON files under styles/packs/*.json. We keep packs split by category
so the library can scale without a single giant file becoming unmanageable.
"""
from __future__ import annotations
import json
import os
import sys
from dataclasses import dataclass
from typing import Dict, Iterable, List, Optional, Sequence
ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
if ROOT not in sys.path:
sys.path.insert(0, ROOT)
from style_library import write_legacy_snapshot
PACKS_DIR = os.path.join(ROOT, "styles", "packs")
Z_SEP = ", "
# Base prompt fragments per category. These are intentionally short and "model-agnostic"
# so they help both SD-like and Flux-like text encoders without drowning the user prompt.
CATEGORY_BASE_PREFIX = {
"Cinema": (
"cinematic film still",
"professional cinematography",
"cinematic framing",
"carefully composed shot",
"atmospheric depth",
"realistic lighting",
),
"Photography": (
"professional photography",
"realistic lighting",
"natural color rendition",
"coherent shadows",
"true-to-life textures",
),
"Product": (
"commercial product photography",
"controlled studio lighting",
"minimal background",
"controlled reflections",
"clean composition",
),
"Fashion": (
"fashion editorial photography",
"magazine look",
"high-end styling",
"clean composition",
"stylized studio lighting",
),
"Architecture/Interior": (
"architectural photography",
"straight verticals",
"clean geometry",
"wide field of view",
"realistic materials",
"balanced natural light",
),
"Nature": (
"nature photography",
"natural light",
"atmospheric depth",
"fine detail",
"realistic textures",
"environmental realism",
),
"3D/CG": (
"3d render",
"high quality render",
"clean geometry",
"global illumination",
"studio lighting",
"soft shadows",
),
"Graphic Design": (
"graphic design",
"poster-like composition",
"clear hierarchy",
"bold shapes",
"limited palette",
"print-ready layout",
),
"Illustration": (
"detailed illustration",
"cohesive style",
"readable shapes",
"intentional composition",
"handcrafted look",
),
"Anime/Manga": (
"anime/manga illustration",
"clean linework",
"cel shading",
"expressive character design",
"vibrant palette",
),
"Pixel Art": ("pixel art", "16-bit", "limited palette", "pixel-perfect"),
"Vector": ("vector illustration", "flat colors", "clean shapes", "crisp edges", "smooth curves"),
"Technical": ("technical illustration", "clean lines", "diagrammatic layout", "precise geometry", "labels and callouts"),
"Printmaking": ("printmaking", "ink on paper", "handcrafted texture", "carved lines", "high contrast"),
"Experimental": ("experimental aesthetic", "bold composition", "graphic lighting", "textural detail"),
"Color Grade": ("intentional color grade", "filmic tone mapping"),
"Fine Art": ("fine art", "museum-quality", "traditional techniques", "gallery piece", "handcrafted"),
"Mixed Media": ("mixed media artwork", "layered textures", "handcrafted marks", "tactile surface"),
"Street Art": ("street art mural", "spray paint texture", "urban wall", "bold graphic shapes"),
}
CATEGORY_BASE_SUFFIX = {
"Cinema": (
"filmic color science",
"smooth highlight rolloff",
"deep blacks",
"subtle film grain",
"soft halation",
"high dynamic range",
),
"Photography": (
"sharp focus",
"high detail",
"balanced exposure",
"fine texture detail",
"natural contrast",
"clean highlights",
),
"Product": (
"crisp edges",
"clean specular highlights",
"premium look",
"high detail",
"minimal clutter",
),
"Fashion": (
"editorial color grade",
"sharp focus",
"skin texture",
"catchlights",
"high detail",
),
"Architecture/Interior": (
"crisp lines",
"balanced exposure",
"clean shadows",
"high detail",
"material realism",
),
"Nature": (
"natural color",
"clean contrast",
"high detail",
"fine microtexture",
"realistic atmosphere",
),
"3D/CG": (
"clean render",
"high detail",
"sharp edges",
"high resolution",
"clean shading",
),
"Graphic Design": (
"crisp edges",
"high contrast",
"clean alignment",
"balanced negative space",
"print texture",
),
"Illustration": ("cohesive palette", "clean composition", "high detail", "believable texture"),
"Anime/Manga": ("high clarity", "crisp edges", "clean gradients", "sharp eyes"),
"Pixel Art": ("crisp pixels", "dithered shading", "readable silhouette", "sprite-like clarity"),
"Vector": ("clean layout", "consistent stroke weight", "crisp edges", "smooth curves"),
"Technical": ("high legibility", "crisp lines", "precise layout", "flat lighting"),
"Printmaking": ("paper texture", "ink texture", "rough edges", "high contrast"),
"Experimental": ("intentional design", "high contrast", "tactile texture", "coherent palette"),
"Color Grade": ("smooth highlight rolloff", "clean shadows", "color separation", "balanced contrast"),
"Fine Art": ("high detail", "handcrafted surface texture", "gallery lighting", "balanced composition"),
"Mixed Media": ("high detail", "tactile texture", "paper grain", "layered depth", "cohesive composition"),
"Street Art": ("bold color", "high contrast", "wall texture", "urban grit", "spray paint overspray"),
}
@dataclass(frozen=True)
class StyleSpec:
id: str
name: str
category: str
tags: Sequence[str]
z_prefix: Sequence[str]
z_suffix: Sequence[str]
flux_suffix_sentences: Sequence[str]
def z_join(parts: Sequence[str]) -> str:
parts2 = [p.strip() for p in parts if (p or "").strip()]
# Stable de-dupe (case-insensitive) so base fragments don't create repeats.
seen = set()
out: List[str] = []
for p in parts2:
k = p.casefold()
if k in seen:
continue
seen.add(k)
out.append(p)
return Z_SEP.join(out)
def flux_join_sentences(parts: Sequence[str]) -> str:
# Keep Flux guidance in mind: prose works well, and the model doesn't support negative prompts.
parts2 = [p.strip().rstrip(".") for p in parts if (p or "").strip()]
return ". ".join(parts2).strip() + ("." if parts2 else "")
def to_style_dict(s: StyleSpec) -> Dict:
base_prefix = CATEGORY_BASE_PREFIX.get(s.category, ())
base_suffix = CATEGORY_BASE_SUFFIX.get(s.category, ())
flux_sentences = list(s.flux_suffix_sentences)
# Reinforce each style with explicit cues (keep it style-only; avoid gear words).
z_prefix_hint = z_join(tuple(s.z_prefix)[:8])
z_suffix_hint = z_join(tuple(s.z_suffix)[:8])
if z_prefix_hint:
flux_sentences.append(f"Key cues: {z_prefix_hint}")
if z_suffix_hint:
flux_sentences.append(f"Finish cues: {z_suffix_hint}")
flux_sentences.append("Instruction: preserve the user prompt subject and add only stylistic cues")
d = {
"id": s.id,
"name": s.name,
"category": s.category,
"default": {
"prefix": z_join(tuple(base_prefix) + tuple(s.z_prefix)),
"suffix": z_join(tuple(s.z_suffix) + tuple(base_suffix)),
},
"models": {
# For FLUX 2 Klein, we keep style annotations at the end so the user's prompt
# can still lead with the subject/action (word order matters).
"flux_2_klein": {"prefix": "", "suffix": flux_join_sentences(flux_sentences)},
},
"tags": list(s.tags),
}
return d
def write_pack(filename: str, styles: Iterable[StyleSpec]) -> None:
os.makedirs(PACKS_DIR, exist_ok=True)
path = os.path.join(PACKS_DIR, filename)
payload = {"version": 1, "styles": [to_style_dict(s) for s in styles]}
with open(path, "w", encoding="utf-8") as f:
json.dump(payload, f, indent=2, ensure_ascii=True)
f.write("\n")
def _make_id(prefix: str, name: str) -> str:
base = "".join(ch.lower() if (ch.isalnum()) else "_" for ch in name).strip("_")
while "__" in base:
base = base.replace("__", "_")
return f"{prefix}_{base}"
def _uniq(specs: List[StyleSpec]) -> List[StyleSpec]:
seen = set()
out: List[StyleSpec] = []
for s in specs:
if s.id in seen:
raise ValueError(f"duplicate style id: {s.id}")
seen.add(s.id)
out.append(s)
return out
def build() -> None:
# Shared, reusable FLUX lighting phrases (keep them positive and concrete).
flux_light_soft_window = (
"Lighting: soft, diffused key light from viewer-left, gentle shadows"
)
flux_light_dramatic_side = "Lighting: dramatic side lighting with deep shadows and bright highlights"
flux_light_golden_back = "Lighting: golden hour backlight with warm rim light and gentle bloom"
flux_light_overcast = "Lighting: overcast daylight, even illumination, soft shadow transitions"
flux_light_studio_softbox = "Lighting: large diffused key light with clean specular highlights"
flux_light_neon = "Lighting: mixed neon and streetlight sources, colored rim light, reflective surfaces"
def _flux_style_label(name: str) -> str:
"""
Convert UI-facing style names into gear-neutral prose for Flux guidance.
Goal: keep the style intent, but avoid explicit photo/cinema equipment words
that can accidentally bias the model into adding objects/props.
"""
n = (name or "").strip().casefold()
overrides = {
"on-camera flash": "direct flash snapshot",
"ring flash portrait": "on-axis circular flash portrait",
"tilt-shift miniature": "miniature diorama perspective effect",
"aerial drone photo": "aerial top-down photograph",
}
return overrides.get(n, n)
# A small seed set that we can scale via curated variations.
cinema: List[StyleSpec] = []
photo: List[StyleSpec] = []
illustration: List[StyleSpec] = []
graphic: List[StyleSpec] = []
cg3d: List[StyleSpec] = []
experimental: List[StyleSpec] = []
arch: List[StyleSpec] = []
fashion: List[StyleSpec] = []
product: List[StyleSpec] = []
nature: List[StyleSpec] = []
grades: List[StyleSpec] = []
fine_art: List[StyleSpec] = []
mixed_media: List[StyleSpec] = []
street_art: List[StyleSpec] = []
def illustration_category(style_name: str) -> str:
"""Small UX win: split illustration-heavy styles into browsable buckets."""
n = (style_name or "").casefold()
if any(k in n for k in ("anime", "manga", "chibi", "mecha")):
return "Anime/Manga"
if "pixel" in n:
return "Pixel Art"
if any(k in n for k in ("diagram", "blueprint", "technical")):
return "Technical"
if any(k in n for k in ("linocut", "woodcut", "engraving", "etching", "ukiyo", "stippling")):
return "Printmaking"
if any(k in n for k in ("vector", "isometric")):
return "Vector"
return "Illustration"
# --- Cinema / film looks ---
cinema.append(
StyleSpec(
id="cinematic_anamorphic",
name="Cinematic Anamorphic",
category="Cinema",
tags=("cinematic", "film", "anamorphic"),
z_prefix=("cinematic", "anamorphic look", "shallow depth of field", "dramatic lighting"),
z_suffix=("film grain", "subtle halation", "rich contrast", "color graded"),
flux_suffix_sentences=(
"Style: cinematic anamorphic film still, shallow depth of field",
flux_light_dramatic_side,
"Mood: tense, grounded, realistic",
"Texture: subtle film grain and halation",
),
)
)
cinema_core = [
("Film Noir", ("film noir", "high contrast", "hard shadows", "black and white"), flux_light_dramatic_side),
("Neo Noir", ("neo-noir", "moody contrast", "deep shadows", "night scene"), flux_light_neon),
("Gritty Crime Thriller", ("gritty crime thriller", "handheld feel", "muted colors"), flux_light_dramatic_side),
("Dreamy Romance", ("dreamy cinematic", "soft focus", "warm tones"), flux_light_golden_back),
("Sci-Fi Neon", ("sci-fi cinematic", "neon glow", "wet reflective surfaces", "atmospheric haze"), flux_light_neon),
("Epic Fantasy", ("epic cinematic", "volumetric light rays", "dramatic scale"), "Lighting: god rays through haze, high dynamic range"),
("Documentary Handheld", ("documentary", "handheld framing", "natural light", "authentic moments"), flux_light_overcast),
("Vintage 16mm", ("16mm film look", "visible grain", "soft contrast"), "Lighting: practical tungsten lamps, warm falloff"),
("Vintage 35mm", ("35mm film look", "gentle grain", "natural color"), flux_light_soft_window),
("IMAX Blockbuster", ("large format cinema", "crisp detail", "dramatic composition"), "Lighting: high-impact key light with controlled fill"),
("Horror Suspense", ("cinematic horror", "low key lighting", "ominous atmosphere"), flux_light_dramatic_side),
("Cozy Slice-of-Life", ("warm cinematic", "intimate framing", "soft contrast"), flux_light_soft_window),
]
for name, ztags, flux_light in cinema_core:
cinema.append(
StyleSpec(
id=_make_id("cin", name),
name=name,
category="Cinema",
tags=("cinema", "film"),
z_prefix=ztags,
z_suffix=("cinematic color grade", "subtle film grain"),
flux_suffix_sentences=(
f"Style: {name.lower()}, cinematic film still",
flux_light,
"Mood: cohesive, story-driven",
),
)
)
cinema_more = [
("Desert Western", ("cinematic western", "wide landscape", "dusty atmosphere"), "Lighting: harsh sun with long shadows, heat haze"),
("Cold War Spy Thriller", ("spy thriller", "moody interiors", "controlled palette"), flux_light_dramatic_side),
("Post-Apocalyptic", ("post-apocalyptic cinematic", "weathered textures", "dusty haze"), "Lighting: harsh daylight filtered through dust and smoke"),
("Space Opera", ("space opera cinematic", "high contrast", "dramatic scale"), "Lighting: bright rim light against deep space, high contrast"),
("Underwater Drama", ("underwater cinematic", "caustics", "floating particles"), "Lighting: underwater caustic patterns, shafts of light through water"),
("Candlelit Period Drama", ("period drama", "candlelit", "warm shadows"), "Lighting: warm candlelight with soft falloff and deep shadows"),
("Rainy Night Alley", ("cinematic night scene", "rainy street", "wet reflections"), flux_light_neon),
("Bright Day Comedy", ("bright cinematic", "clean colors", "lighthearted tone"), "Lighting: bright daylight with soft fill, cheerful contrast"),
("Mystery Thriller", ("mystery thriller", "moody", "subtle haze"), flux_light_dramatic_side),
("High-Speed Action", ("action blockbuster", "dynamic framing", "sharp highlights"), "Lighting: high-impact lighting, crisp highlights, controlled motion blur"),
("Courtroom Drama", ("dramatic courtroom scene", "serious tone", "clean framing"), flux_light_soft_window),
("Coming-of-Age", ("warm cinematic", "naturalistic", "gentle grain"), flux_light_golden_back),
("Slow Cinema", ("slow cinema", "minimalist framing", "quiet atmosphere"), flux_light_overcast),
("Surreal Dream Sequence", ("surreal cinematic", "soft diffusion", "dreamlike haze"), "Lighting: ethereal soft light with gentle bloom and haze"),
("War Documentary", ("war documentary", "gritty realism", "handheld"), flux_light_overcast),
("Sports Broadcast Cinematic", ("sports cinematic", "compressed perspective", "fast shutter feel"), "Lighting: stadium lights, crisp highlights, dynamic contrast"),
("Retro Futurism", ("retro futurism", "clean shapes", "neon accents"), flux_light_neon),
("Urban Nightscape", ("urban night cinematic", "city lights", "bokeh"), flux_light_neon),
("Snowstorm Survival", ("cinematic survival", "snowstorm", "cold palette"), "Lighting: cold overcast light with blowing snow and low visibility"),
("Tropical Heat", ("cinematic tropical", "humid atmosphere", "vibrant greens"), "Lighting: bright sun filtered through foliage, humid haze"),
("Firelit Camp Scene", ("cinematic firelight", "warm glow", "night ambience"), "Lighting: warm firelight with flicker and soft smoke haze"),
("Neon Club Scene", ("cinematic club", "colored lights", "smoke haze"), "Lighting: saturated neon lights, moving beams, haze in the air"),
("Foggy Harbor", ("cinematic fog", "dock lights", "atmospheric depth"), "Lighting: fog diffusion around practical lights, soft silhouettes"),
("Vintage Home Video", ("retro home video", "soft focus", "analog feel"), "Lighting: simple indoor practical lights, gentle falloff"),
("Coastal Road Trip", ("cinematic road trip", "sunlit coastline", "nostalgic tone"), flux_light_golden_back),
("Subway Platform", ("urban cinematic", "subway platform", "gritty realism"), "Lighting: practical fluorescent lights with mixed color temperature"),
("Rainy Car Interior", ("cinematic car interior", "rain streaks", "reflections"), "Lighting: streetlights and dashboard glow, rain reflections on glass"),
("Desaturated War Film", ("war film look", "desaturated palette", "gritty texture"), flux_light_overcast),
("Bright Musical Number", ("classic musical", "clean stage lighting", "bold colors"), "Lighting: bright stage key light with clean fill and saturated colors"),
("Sunlit Kitchen Scene", ("slice-of-life cinematic", "sunlit interior", "warm realism"), flux_light_soft_window),
("Neon Diner", ("retro diner cinematic", "neon accents", "night scene"), flux_light_neon),
("Storm Chase", ("cinematic storm", "dramatic clouds", "high tension"), "Lighting: storm light with dramatic contrast and wind-driven rain"),
("Quiet Library Mystery", ("mystery cinematic", "dusty light beams", "quiet tension"), "Lighting: soft window beams through dust, warm practical accents"),
]
for name, ztags, flux_light in cinema_more:
cinema.append(
StyleSpec(
id=_make_id("cin", name),
name=name,
category="Cinema",
tags=("cinema", "film"),
z_prefix=ztags,
z_suffix=("cinematic color grade", "subtle film grain"),
flux_suffix_sentences=(
f"Style: {name.lower()}, cinematic film still",
flux_light,
"Mood: cinematic, cohesive, story-driven",
),
)
)
# --- Color grades (category-agnostic) ---
grade_specs = [
("Teal and Orange", ("cinematic color grade", "teal and orange", "rich contrast"), "Color grade: teal shadows and warm highlights, cinematic contrast"),
("Muted Pastels", ("muted pastel palette", "soft contrast", "gentle highlights"), "Color palette: muted pastels with soft contrast"),
("High Contrast Monochrome", ("black and white", "high contrast", "deep blacks"), "Color grade: monochrome with deep blacks and bright whites"),
("Warm Vintage", ("warm vintage grade", "slightly faded", "soft highlights"), "Color grade: warm vintage tones with gentle fade"),
("Cool Desaturated", ("cool tones", "desaturated palette", "clean contrast"), "Color palette: cool and slightly desaturated"),
("Bleach Bypass Look", ("bleach bypass look", "desaturated", "high contrast"), "Color grade: desaturated high-contrast bleach-bypass look"),
("Soft Cinematic Pastel", ("soft cinematic", "pastel grade", "subtle bloom"), "Color grade: soft cinematic pastel with gentle bloom"),
("Vibrant Pop", ("vibrant colors", "punchy saturation", "crisp contrast"), "Color grade: vibrant, punchy saturation with crisp contrast"),
("Earthy Documentary", ("earthy tones", "natural contrast", "subtle grain"), "Color palette: earthy documentary tones, natural contrast"),
("Neon Night Grade", ("neon grade", "deep shadows", "bright neon"), "Color grade: deep shadows with bright neon highlights"),
("Golden Hour Warmth", ("golden hour grade", "warm highlights", "soft shadows"), "Color grade: golden-hour warmth with soft shadow rolloff"),
("Cold Winter Blues", ("cold winter grade", "blue shadows", "crisp air"), "Color palette: cold winter blues with crisp contrast"),
("Sepia Tone", ("sepia tone", "vintage print", "soft contrast"), "Color grade: sepia tone with vintage print feel"),
("Film Grain Matte", ("matte grade", "lifted blacks", "film grain"), "Color grade: matte look with lifted blacks and fine grain"),
("Clean Commercial", ("clean commercial grade", "neutral whites", "natural color"), "Color grade: clean commercial neutrality with accurate whites"),
("Moody Low Saturation", ("moody", "low saturation", "deep shadows"), "Color palette: low saturation with deep shadows and moody contrast"),
("Bright Airy", ("bright airy", "high key", "soft highlights"), "Color grade: bright airy look with soft highlights"),
("Vintage Slide Look", ("vintage slide look", "rich reds", "crisp contrast"), "Color grade: rich reds and crisp contrast, vintage slide feel"),
("Cyanotype Look", ("cyanotype look", "blue monochrome", "paper texture"), "Color grade: blue monochrome cyanotype print feel"),
("Duotone Blue/Red", ("duotone", "blue and red", "graphic contrast"), "Color grade: duotone blue and red with graphic contrast"),
]
for name, ztags, flux_line in grade_specs:
grades.append(
StyleSpec(
id=_make_id("grade", name),
name=f"Color Grade: {name}",
category="Color Grade",
tags=("grade", "color"),
z_prefix=ztags,
z_suffix=("clean tones",),
flux_suffix_sentences=(
"Style: realistic image with an intentional color grade",
flux_line,
"Tone mapping: smooth highlights and coherent shadows",
),
)
)
# --- Photography ---
photo.append(
StyleSpec(
id="clean_product_photo",
name="Clean Product Photo",
category="Product",
tags=("product", "studio", "commercial"),
z_prefix=("studio product photography", "clean background", "diffused studio lighting", "sharp focus"),
z_suffix=("high detail", "minimal reflections", "crisp edges"),
flux_suffix_sentences=(
"Style: professional studio product photograph on a clean minimal background",
flux_light_studio_softbox,
"Composition: centered, clean silhouette, crisp edges",
),
)
)
portrait_light_setups = [
("Rembrandt Portrait", ("portrait photography", "Rembrandt lighting", "portrait compression", "shallow depth of field"), flux_light_soft_window),
("Butterfly Lighting Portrait", ("portrait photography", "butterfly lighting", "centered key light", "clean catchlights"), "Lighting: centered overhead key light with soft fill, clean shadows under cheekbones"),
("Split Lighting Portrait", ("portrait photography", "split lighting", "high contrast"), flux_light_dramatic_side),
("High Key Studio Portrait", ("high key portrait", "bright background", "soft shadows"), "Lighting: broad soft key, high fill ratio, bright seamless background"),
("Low Key Studio Portrait", ("low key portrait", "deep shadows", "dramatic contrast"), flux_light_dramatic_side),
("Golden Hour Portrait", ("golden hour portrait", "warm backlight", "natural skin tones"), flux_light_golden_back),
("Street Portrait", ("street portrait", "candid", "natural light"), flux_light_overcast),
("Editorial Portrait", ("editorial portrait", "stylized lighting", "clean composition"), flux_light_studio_softbox),
("Rim Light Portrait", ("portrait photography", "rim light", "dark background", "subject separation"), "Lighting: strong rim light from behind, soft key, deep background"),
("Broad Lighting Portrait", ("portrait photography", "broad lighting", "soft shadows"), "Lighting: key light on the near side of the face, soft fill"),
("Short Lighting Portrait", ("portrait photography", "short lighting", "sculpted face"), "Lighting: key light on the far side of the face, controlled fill"),
]
for name, ztags, flux_light in portrait_light_setups:
photo.append(
StyleSpec(
id=_make_id("photo", name),
name=name,
category="Photography",
tags=("photo", "portrait"),
z_prefix=ztags,
z_suffix=("natural skin texture", "sharp eyes", "subtle background blur"),
flux_suffix_sentences=(
f"Style: {name.lower()}, realistic photograph",
flux_light,
"Focus: sharp eyes, natural skin texture, gentle background blur",
),
)
)
photo_genres = [
("Street Photography", ("street photography", "candid moment", "natural light"), flux_light_overcast),
("Travel Documentary", ("travel documentary photography", "authentic details", "natural color"), flux_light_soft_window),
("Food Photography", ("food photography", "shallow depth of field", "appetizing lighting"), flux_light_soft_window),
("Macro Photography", ("macro photography", "extreme close-up", "micro texture", "shallow depth of field"), "Lighting: diffused macro lighting, controlled reflections, crisp microtexture"),
("Wildlife Photography", ("wildlife photography", "compressed perspective", "natural habitat"), flux_light_golden_back),
("Architecture Photography", ("architecture photography", "straight lines", "clean geometry"), flux_light_overcast),
("Interior Photography", ("interior photography", "wide field of view", "soft natural light"), flux_light_soft_window),
("Aerial Drone Photo", ("aerial photography", "top-down view", "sharp detail"), "Lighting: clear daylight with defined but soft shadows"),
("Long Exposure", ("long exposure photography", "motion blur trails", "locked-off frame"), "Lighting: dusk ambient with long exposure light trails"),
("Black and White", ("black and white photography", "strong tonal range", "fine grain"), flux_light_dramatic_side),
("Infrared", ("infrared photography", "surreal foliage tones", "high contrast"), "Lighting: bright midday sun, strong infrared contrast"),
("Tilt-Shift Miniature", ("miniature perspective effect", "selective focus", "diorama-like scale"), "Lighting: daylight with crisp miniature-scale shadows"),
("Night Street Photo", ("night street photography", "city lights", "bokeh", "wet reflections"), flux_light_neon),
("Concert Photography", ("concert photography", "stage lights", "dynamic contrast"), "Lighting: dramatic stage lighting with colored highlights"),
("Automotive Photo", ("automotive photography", "clean reflections", "sharp lines"), "Lighting: controlled reflections, crisp highlights, studio or golden hour"),
("Wedding Photo", ("wedding photography", "soft romantic light", "candid moments"), flux_light_golden_back),
("Still Life Photo", ("still life photography", "careful composition", "soft shadows"), flux_light_soft_window),
("Flat Lay", ("flat lay photography", "top-down", "organized composition"), "Lighting: soft overhead diffused light, minimal harsh shadows"),
("On-Camera Flash", ("direct flash photography", "hard shadows", "party snapshot"), "Lighting: direct on-axis flash, hard shadows, punchy contrast"),
("Ring Flash Portrait", ("on-axis circular flash portrait", "crisp catchlight", "high clarity"), "Lighting: on-axis circular flash with crisp shadows and clean contrast"),
("Cinematic Backlight", ("backlit photography", "rim light", "atmospheric haze"), flux_light_golden_back),
("Silhouette", ("silhouette photography", "strong backlight", "clean outline"), "Lighting: strong backlight creating a crisp silhouette"),
("Rainy Window", ("moody window scene", "raindrops on glass", "soft bokeh"), flux_light_soft_window),
("Astrophotography", ("astrophotography", "night sky", "stars", "clean exposure"), "Lighting: moonless night, crisp stars, low noise look"),
("Milky Way Landscape", ("milky way", "night landscape", "wide field of view", "stars"), "Lighting: starlight and faint airglow, crisp night contrast"),
("Underwater Photo", ("underwater photography", "clear water", "floating particles", "blue tones"), "Lighting: underwater light beams and caustics, soft particulate haze"),
("Real Estate Photo", ("real estate photography", "wide field of view", "clean lines", "bright interior"), flux_light_soft_window),
("Sports Action Freeze", ("sports photography", "fast shutter", "sharp action", "compressed perspective"), "Lighting: stadium lighting, crisp highlights, frozen motion"),
("Motion Blur Action", ("motion blur", "panning shot", "dynamic movement"), "Lighting: controlled highlights supporting motion blur and panning"),
]
for name, ztags, flux_light in photo_genres:
photo.append(
StyleSpec(
id=_make_id("photo", name),
name=name,
category="Photography",
tags=("photo",),
z_prefix=ztags,
z_suffix=("realistic detail", "clean color", "natural contrast"),
flux_suffix_sentences=(
f"Style: {_flux_style_label(name)}, realistic photograph",
flux_light,
"Mood: grounded, natural, believable",
),
)
)
# Film / color processes (generic look descriptors, not brand names)
film_looks = [
("Soft 35mm Film Look", ("35mm film look", "soft contrast", "gentle grain"), flux_light_soft_window),
("Vibrant Slide Film Look", ("slide film look", "punchy colors", "crisp contrast"), "Lighting: bright daylight with saturated color separation"),
("Muted Documentary Film", ("documentary film look", "muted palette", "fine grain"), flux_light_overcast),
("Warm Tungsten Film", ("warm tungsten film look", "practical lights", "soft glow"), "Lighting: warm practical lamps, gentle falloff, cozy ambience"),
("Cool Blue Hour Film", ("blue hour film look", "cool tones", "city lights"), "Lighting: blue hour ambient mixed with warm practicals, subtle glow"),
]
for name, ztags, flux_light in film_looks:
photo.append(
StyleSpec(
id=_make_id("film", name),
name=name,
category="Photography",
tags=("film", "photo"),
z_prefix=ztags,
z_suffix=("natural skin tones", "subtle halation", "film grain"),
flux_suffix_sentences=(
f"Style: {name.lower()}, realistic photograph",
flux_light,
"Texture: subtle grain and gentle halation",
),
)
)
# Technique-focused photo styles.
photo_techniques = [
("Deep Focus", ("deep focus", "sharp foreground and background", "clean optics"), "Lighting: even controlled light supporting deep focus clarity"),
("Shallow DOF Bokeh", ("shallow depth of field", "creamy bokeh", "subject isolation"), flux_light_soft_window),
("High Dynamic Range", ("high dynamic range", "balanced highlights and shadows", "realistic tones"), "Lighting: naturalistic scene lighting with preserved highlights"),
("Soft Diffusion Glow", ("soft diffusion", "gentle glow", "dreamy highlights"), "Lighting: soft diffused key light with gentle bloom"),
("Hard Flash Shadow", ("hard flash", "sharp shadows", "crisp contrast"), "Lighting: hard flash with sharp shadows and specular highlights"),
("Moody Window Light", ("window light", "soft shadows", "intimate mood"), flux_light_soft_window),
("Backlit Rim Light", ("backlit", "rim light", "atmospheric haze"), flux_light_golden_back),
("Volumetric Light Beams", ("volumetric light", "god rays", "haze"), "Lighting: strong directional light creating volumetric beams through haze"),
("Rain Reflections", ("wet reflective surfaces", "reflections", "night bokeh"), flux_light_neon),
("Minimalist Studio", ("minimalist studio photo", "clean seamless", "controlled reflections"), flux_light_studio_softbox),
("Close-Up Texture Study", ("close-up photo", "micro texture", "tactile detail"), "Lighting: raking light to reveal texture and surface detail"),
("Soft Overcast Natural", ("soft overcast", "even skin tones", "gentle contrast"), flux_light_overcast),
("High Key Commercial", ("high key commercial", "clean whites", "soft shadows"), "Lighting: large soft sources with high fill for clean whites"),
("Low Key Dramatic", ("low key", "deep shadows", "controlled highlights"), flux_light_dramatic_side),
("Specular Highlight Study", ("specular highlights", "controlled reflections", "shiny surfaces"), "Lighting: small hard sources for crisp specular highlights with controlled fill"),
]
for name, ztags, flux_light in photo_techniques:
photo.append(
StyleSpec(
id=_make_id("tech", name),
name=name,
category="Photography",
tags=("photo", "technique"),
z_prefix=ztags,
z_suffix=("realistic detail", "natural contrast"),
flux_suffix_sentences=(
f"Style: {name.lower()}, realistic photograph",
flux_light,
"Focus: clear subject, believable materials, coherent lighting",
),
)
)
# Lens / camera vibes (helpful shorthand; keep it generic).
lens_vibes = [
("24mm Wide Angle", ("wide field of view", "24mm perspective", "strong perspective"), "Composition: wide field of view with strong leading lines"),
("35mm Documentary", ("35mm perspective", "documentary framing", "natural perspective"), "Composition: documentary framing with natural perspective"),
("50mm Natural", ("50mm perspective", "natural perspective", "balanced framing"), "Composition: balanced perspective and natural proportions"),
("85mm Portrait", ("85mm portrait perspective", "portrait compression", "shallow depth of field"), "Composition: flattering compression with shallow depth of field"),
("135mm Telephoto", ("strong compression", "135mm compressed perspective", "compressed background"), "Composition: strong compression and layered background"),
]
for name, ztags, flux_comp in lens_vibes:
photo.append(
StyleSpec(
id=_make_id("lens", name),
name=f"Lens Vibe: {name}",
category="Photography",
tags=("photo", "lens"),
z_prefix=ztags,
z_suffix=("clean optics", "natural contrast"),
flux_suffix_sentences=(
"Style: realistic photograph with a specific perspective and field of view",
flux_comp,
flux_light_overcast,
),
)
)
# --- Illustration ---
illustration.append(
StyleSpec(
id="ink_wash_illustration",
name="Ink Wash Illustration",
category="Illustration",
tags=("ink", "wash", "illustration"),
z_prefix=("ink wash illustration", "expressive brushwork", "paper texture"),
z_suffix=("soft diffusion", "monochrome ink tones", "subtle bleeding edges"),
flux_suffix_sentences=(
"Style: ink wash illustration on textured paper",
"Lighting: soft ambient light emphasizing paper texture and brush edges",
"Mood: calm, minimal, expressive",
),
)
)
illustration.append(
StyleSpec(
id="anime_style",
name="Anime Style",
category="Anime/Manga",
tags=("anime", "manga", "illustration"),
z_prefix=("anime style", "clean line art", "cel shading", "vibrant colors"),
z_suffix=("sharp eyes", "expressive face", "crisp edges", "detailed background"),
flux_suffix_sentences=(
"Style: anime illustration with clean linework and cel shading",
"Lighting: clear, readable key light with soft fill",
"Mood: vibrant, expressive, high clarity",
),
)
)
art_media = [
("Watercolor Illustration", ("watercolor illustration", "translucent washes", "soft edges", "granulation", "textured paper")),
("Gouache Painting", ("gouache painting", "opaque matte paint", "bold shapes", "flat color blocks", "brush strokes")),
("Oil Painting", ("oil painting", "painterly", "rich brush strokes", "impasto texture", "canvas texture")),
("Acrylic Painting", ("acrylic painting", "bold brushwork", "layered paint", "matte finish", "clean edges")),
("Colored Pencil Drawing", ("colored pencil drawing", "fine hatching", "paper grain", "soft shading", "hand-drawn texture")),
("Graphite Pencil Sketch", ("graphite pencil sketch", "linework", "shaded rendering", "paper texture", "loose sketch")),
("Charcoal Drawing", ("charcoal drawing", "smudged shading", "dusty texture", "high contrast", "paper grain")),
("Pastel Drawing", ("soft pastel drawing", "powdery texture", "blended gradients", "soft edges", "paper tooth")),
("Ink Line Art", ("ink line art", "clean linework", "high contrast", "minimal shading", "smooth contours")),
("Marker Illustration", ("marker illustration", "smooth gradients", "bold shapes", "clean outlines", "paper texture")),
("Children's Book Illustration", ("children's book illustration", "storybook style", "soft shapes", "warm palette", "gentle shading")),
("Graphic Novel Panel", ("graphic novel panel", "dramatic inking", "heavy shadows", "panel composition", "high contrast")),
("Manga Panel", ("manga panel", "black ink", "screentones", "dynamic paneling", "clean linework")),
("Anime Keyframe", ("anime key visual", "clean lineart", "cel shading", "expressive faces", "vibrant colors")),
("Pixel Art", ("pixel art", "16-bit", "limited palette", "dithering", "crisp pixels")),
("Vector Flat", ("vector illustration", "flat colors", "clean shapes", "minimal shading", "crisp edges")),
("Isometric Vector", ("isometric vector illustration", "clean geometry", "consistent shadows", "flat colors", "crisp lines")),
("Technical Diagram", ("technical illustration", "clean lines", "diagrammatic layout", "labeled parts", "flat lighting")),
("Linocut Print", ("linocut print", "carved line texture", "rough edges", "high contrast", "ink on paper")),
("Woodcut Print", ("woodcut print", "carved texture", "bold lines", "high contrast", "ink on paper")),
("Engraving", ("engraving", "fine hatching", "crosshatching", "vintage print", "antique paper")),
("Etching", ("etching", "crosshatching", "fine lines", "paper texture", "vintage print")),
("Stippling", ("stippling", "ink dots", "dot shading", "high detail", "paper texture")),
("Pointillism", ("pointillism", "tiny color dots", "optical blending", "painterly", "soft edges")),
("Ukiyo-e Woodblock", ("ukiyo-e woodblock print", "flat color areas", "stylized linework", "traditional print texture", "limited palette")),
("Impressionist Painting", ("impressionist painting", "broken brush strokes", "soft edges", "painterly light", "colorful palette")),
("Expressionist Painting", ("expressionist painting", "bold color", "emotional brushwork", "strong shapes", "high contrast")),
("Minimal Line Illustration", ("minimal line illustration", "single line drawing", "clean negative space", "simple forms", "minimal shading")),
("Sticker Illustration", ("sticker illustration", "thick outline", "flat colors", "simple shading", "die-cut sticker")),
("Chalkboard Sketch", ("chalkboard drawing", "chalk texture", "hand-drawn", "dusty strokes", "blackboard background")),
("Blueprint Drawing", ("blueprint drawing", "white lines on blue", "technical diagram", "schematic layout", "clean labels")),
("Paper Cutout", ("paper cutout illustration", "layered paper", "handcrafted", "soft cast shadows", "cut edges")),
("Collage Illustration", ("collage illustration", "torn paper edges", "mixed media", "layered textures", "paper grain")),
]
for name, ztags in art_media:
illustration.append(
StyleSpec(
id=_make_id("illu", name),
name=name,
category=illustration_category(name),
tags=("illustration",),
z_prefix=ztags,
z_suffix=("clean composition", "cohesive palette"),
flux_suffix_sentences=(
f"Style: {name.lower()}",
"Lighting: soft even light that supports the medium",
"Mood: consistent, intentional, cohesive",
),
)
)
illustration_movements = [
("Art Nouveau", ("art nouveau illustration", "ornamental lines", "flowing forms")),
("Art Deco Illustration", ("art deco illustration", "geometric elegance", "stylized forms")),
("Surrealism", ("surreal illustration", "dream logic", "unexpected juxtapositions")),
("Cubism", ("cubist painting style", "geometric planes", "fragmented forms")),
("Fauvism", ("fauvist colors", "bold palette", "simplified shapes")),
("Minimalist Illustration", ("minimalist illustration", "simple forms", "strong negative space")),
("Retro 1950s Illustration", ("retro 1950s illustration", "mid-century shapes", "limited palette")),
("Vintage Scientific Plate", ("vintage scientific illustration", "fine lines", "paper texture")),
("Fantasy Map", ("fantasy map illustration", "ink lines", "parchment texture")),
("Isometric Pixel Art", ("isometric pixel art", "limited palette", "crisp pixels")),
("Chibi Character", ("chibi style", "cute proportions", "clean outlines")),
("Mecha Blueprint", ("mecha blueprint", "technical drawing", "clean labels")),
("Storybook Pencil", ("storybook pencil drawing", "soft shading", "gentle lines")),
("Painterly Concept Art", ("painterly concept art", "loose brushwork", "atmospheric perspective")),
]
for name, ztags in illustration_movements:
illustration.append(
StyleSpec(
id=_make_id("illu", name),
name=name,
category=illustration_category(name),
tags=("illustration", "movement"),
z_prefix=ztags,
z_suffix=("cohesive palette", "clean composition"),
flux_suffix_sentences=(
f"Style: {name.lower()} illustration",
"Lighting: soft even light appropriate to the medium",
"Mood: cohesive and intentional",
),
)
)
# --- Fine art / artistic styles ---
flux_light_gallery = "Lighting: soft gallery spotlights with gentle falloff and controlled highlights"
def add_art_style(
bucket: List[StyleSpec],
id_prefix: str,
name: str,
category: str,
z_prefix: Sequence[str],
z_suffix: Sequence[str],
flux_suffix_sentences: Sequence[str],
tags: Sequence[str],
) -> None:
bucket.append(
StyleSpec(
id=_make_id(id_prefix, name),
name=name,
category=category,
tags=tuple(tags),
z_prefix=z_prefix,
z_suffix=z_suffix,
flux_suffix_sentences=flux_suffix_sentences,
)
)
fine_art_specs = [
(
"Old Master Chiaroscuro",
("old master painting", "baroque chiaroscuro", "tenebrism", "oil on canvas"),
("warm highlights", "deep shadows", "classical composition"),
(
"Style: old master oil painting with dramatic chiaroscuro",
flux_light_dramatic_side,
"Texture: rich brushwork and subtle canvas grain",
),
),
(
"Dutch Golden Age Still Life",
("dutch golden age still life", "oil on canvas", "dramatic light", "rich materials"),
("realistic textures", "careful composition", "deep shadows"),
(
"Style: Dutch golden age still life oil painting",
flux_light_dramatic_side,
"Texture: fine brushwork, varnished depth, canvas grain",
),
),
(
"Baroque Religious Painting",
("baroque painting", "dramatic composition", "chiaroscuro", "oil on canvas"),
("smoke haze", "golden highlights", "deep shadows"),
(
"Style: baroque religious painting, dramatic and monumental",
flux_light_dramatic_side,
"Mood: solemn, powerful, cinematic",
),
),
(
"Renaissance Fresco",
("renaissance fresco", "classical anatomy", "balanced composition", "plaster wall texture"),
("muted pigments", "aged patina", "architectural framing"),
(
"Style: Renaissance fresco painting on plaster",
"Lighting: soft ambient daylight like a museum interior",
"Texture: subtle plaster grain and aged pigment",
),
),
(
"Rococo Pastel Elegance",
("rococo painting", "pastel palette", "ornate details", "soft romantic light"),
("delicate brushwork", "silky fabrics", "light airy mood"),
(
"Style: rococo fine art painting with pastel colors and ornate detail",
flux_light_soft_window,
"Mood: elegant, playful, airy",
),
),
(
"Neoclassical Painting",
("neoclassical painting", "clean forms", "classical composition", "marble-like skin tones"),
("precise edges", "balanced lighting", "restrained palette"),
(
"Style: neoclassical fine art painting with clean forms and balanced composition",
flux_light_soft_window,
"Mood: calm, disciplined, timeless",
),
),
(
"Romantic Sublime Landscape",
("romantic landscape painting", "dramatic sky", "atmospheric perspective", "sublime scale"),
("mist", "light rays", "painterly clouds"),
(
"Style: romantic landscape oil painting with sublime atmosphere",
"Lighting: dramatic breaks in cloud cover with volumetric rays",
"Mood: awe, grandeur, nature overpowering",
),
),
(
"Symbolist Dream Painting",
("symbolist painting", "mystical symbolism", "dreamlike atmosphere", "soft haze"),
("muted jewel tones", "ornamental motifs", "surreal calm"),
(
"Style: symbolist fine art painting, dreamlike and mystical",
"Lighting: soft diffuse light with gentle glow",
"Mood: enigmatic, poetic, symbolic",
),
),
(
"Pre-Raphaelite Detail",
("pre-raphaelite painting", "intricate detail", "luminous color", "naturalistic textures"),
("delicate florals", "sharp detail", "storybook realism"),
(
"Style: pre-raphaelite inspired fine art painting with meticulous detail",
flux_light_soft_window,
"Texture: fine brushwork with luminous color",
),
),
(
"Academic Realism",
("academic realism", "oil painting", "realistic anatomy", "studio composition"),
("controlled edges", "subtle gradients", "natural skin tones"),
(
"Style: academic realism oil painting with controlled edges",
flux_light_soft_window,
"Mood: refined, realistic, classical",
),
),
(
"Classical Portrait Painting",
("classical portrait painting", "oil on canvas", "soft modeling", "elegant pose"),
("subtle skin shading", "rich fabrics", "balanced composition"),
(
"Style: classical portrait oil painting",
flux_light_soft_window,
"Mood: dignified, timeless, refined",
),
),
(
"Icon Painting with Gold Leaf",
("icon painting", "gold leaf", "flat stylization", "ornamental halo"),
("tempera", "aged varnish", "ornate border"),
(
"Style: traditional icon painting with gold leaf accents",
flux_light_gallery,
"Texture: gilded highlights, painted tempera surface",
),
),
(
"Illuminated Manuscript",
("illuminated manuscript", "gold leaf", "vellum parchment", "ornate border"),
("medieval miniature", "fine ink lines", "decorative motifs"),
(
"Style: illuminated manuscript on parchment with ornate borders",
flux_light_gallery,
"Texture: vellum grain, gold leaf shine, ink linework",
),
),
(
"Persian Miniature Painting",
("persian miniature painting", "intricate detail", "flat perspective", "ornate patterns"),
("bright pigments", "gold accents", "decorative motifs"),
(
"Style: Persian miniature painting with intricate detail and flat perspective",
flux_light_gallery,
"Mood: ornate, delicate, storybook",
),
),
(
"Mughal Miniature Painting",
("mughal miniature painting", "fine detail", "flat perspective", "ornamental patterns"),
("jewel tones", "gold accents", "delicate linework"),
(
"Style: Mughal miniature painting with fine detail and ornate motifs",
flux_light_gallery,
"Mood: refined, decorative, historical",
),
),
(
"Japanese Sumi-e Ink Painting",
("sumi-e ink painting", "expressive brush strokes", "rice paper texture", "minimal composition"),
("monochrome ink", "negative space", "soft ink bleed"),
(
"Style: Japanese sumi-e ink painting on rice paper",
"Lighting: soft ambient light emphasizing paper texture",
"Mood: calm, minimal, expressive",
),
),
(
"Chinese Ink Landscape (Shan Shui)",
("shan shui ink painting", "mountain landscape", "mist", "rice paper texture"),
("monochrome ink", "atmospheric depth", "soft ink wash"),
(
"Style: Chinese ink landscape painting with misty mountains",
"Lighting: soft diffuse light, gentle contrast",
"Mood: serene, expansive, meditative",
),
),
(
"Stained Glass Art",
("stained glass", "lead outlines", "translucent colored glass", "ornamental pattern"),
("glowing light", "high contrast shapes", "jewel tones"),
(
"Style: stained glass artwork with bold lead lines",
"Lighting: backlit translucent glass with glowing color",
"Mood: luminous, ornate, sacred",
),
),
(
"Mosaic Tile Art",
("mosaic art", "tesserae", "stone tiles", "handcrafted texture"),
("tactile surface", "irregular pieces", "historic feel"),
(
"Style: mosaic tile artwork made from small tesserae",
flux_light_gallery,
"Texture: tactile tile surface with irregular pieces",
),
),
(
"Fresco Mural",
("fresco mural", "plaster wall texture", "pigment", "large-scale composition"),
("aged patina", "subtle cracks", "historic atmosphere"),
(
"Style: large fresco mural on plaster wall",
"Lighting: soft ambient light revealing wall texture and patina",
"Mood: monumental, historical, timeless",
),
),
(
"Encaustic Wax Painting",
("encaustic painting", "wax medium", "layered translucency", "tactile texture"),
("subtle cracks", "surface depth", "handmade feel"),
(
"Style: encaustic wax painting with layered translucency",
flux_light_gallery,
"Texture: tactile wax surface with depth and subtle cracking",
),
),
(
"Tempera Painting",
("tempera painting", "matte surface", "fine detail", "egg tempera"),
("clean edges", "layered strokes", "historic palette"),
(
"Style: egg tempera fine art painting with a matte surface",
flux_light_gallery,
"Texture: fine layered strokes, crisp detail",
),
),
(
"Impressionism (Plein Air)",
("plein air painting", "impressionist brushwork", "broken color", "sunlit atmosphere"),
("visible strokes", "soft edges", "light-filled palette"),
(
"Style: impressionist plein-air oil painting with broken brushwork",
flux_light_golden_back,
"Mood: lively, light-filled, outdoors",
),
),
(
"Post-Impressionist Bold Brushwork",
("post-impressionist painting", "bold brushwork", "strong outlines", "rich color"),
("textured paint", "expressive strokes", "vivid palette"),
(
"Style: post-impressionist painting with bold brushwork and rich color",
flux_light_soft_window,
"Mood: expressive, vibrant, painterly",
),
),
(
"Expressionism (Emotive)",
("expressionist painting", "emotive color", "exaggerated forms", "energetic brushwork"),
("strong contrast", "painterly texture", "raw emotion"),
(
"Style: expressionist painting with emotive color and energetic brushwork",
"Lighting: dramatic but painterly, emphasizing form and color",
"Mood: intense, emotional, raw",
),
),
(
"Cubist Still Life",
("cubist still life", "geometric planes", "fragmented forms", "muted palette"),
("hard edges", "abstracted shapes", "structured composition"),
(
"Style: cubist still life painting with geometric planes",
flux_light_gallery,
"Mood: analytical, structured, modernist",
),
),
(
"Surreal Oil Painting",
("surreal oil painting", "dreamlike realism", "unexpected juxtapositions", "soft haze"),
("smooth gradients", "quiet atmosphere", "symbolic imagery"),
(
"Style: surreal oil painting with dreamlike realism",
"Lighting: soft controlled light with subtle shadows",
"Mood: uncanny, calm, symbolic",
),
),
(
"Abstract Expressionism (Gestural)",
("abstract expressionism", "gestural brushstrokes", "paint splatter", "dynamic composition"),
("thick paint", "high energy", "raw texture"),
(
"Style: abstract expressionist painting with gestural brushstrokes",
flux_light_gallery,
"Texture: thick paint, visible strokes, energetic marks",
),
),
(
"Color Field Painting",
("color field painting", "large color blocks", "soft edges", "minimal forms"),
("smooth gradients", "subtle texture", "meditative mood"),
(
"Style: color field painting with large blocks of color",
flux_light_gallery,
"Mood: calm, meditative, minimal",
),
),
(
"Geometric Abstraction",
("geometric abstraction", "clean shapes", "balanced composition", "flat color planes"),
("crisp edges", "minimal texture", "modern palette"),
(
"Style: geometric abstract painting with clean shapes and balanced composition",
flux_light_gallery,
"Mood: modern, designed, calm",
),
),
(
"Suprematist Composition",
("suprematism", "geometric forms", "minimal palette", "floating shapes"),
("flat colors", "strong negative space", "bold composition"),
(
"Style: suprematist abstract composition with floating geometric forms",
flux_light_gallery,
"Mood: minimal, bold, abstract",
),
),
(
"De Stijl Composition",
("de stijl", "primary colors", "black lines", "grid composition"),
("flat color blocks", "clean geometry", "balanced layout"),
(
"Style: De Stijl composition with primary colors and black grid lines",
"Lighting: flat graphic lighting with minimal shading",
"Mood: clean, rational, designed",
),
),
(
"Op Art Illusion",
("op art", "optical illusion pattern", "high contrast geometry", "repeating lines"),
("sharp edges", "bold contrast", "graphic rhythm"),
(
"Style: op art optical illusion with high-contrast repeating geometry",
"Lighting: flat even lighting, emphasis on contrast and pattern",
"Mood: energetic, vibrating, graphic",
),
),
(
"Hard-Edge Painting",
("hard-edge painting", "flat color areas", "crisp boundaries", "minimal texture"),
("clean shapes", "bold palette", "precise edges"),
(
"Style: hard-edge painting with crisp boundaries and flat color areas",
flux_light_gallery,
"Mood: clean, modern, precise",
),
),
(
"Minimalist Painting",
("minimalist painting", "simple forms", "strong negative space", "restrained palette"),
("quiet composition", "subtle texture", "calm mood"),
(
"Style: minimalist painting with simple forms and strong negative space",
flux_light_gallery,
"Mood: calm, quiet, minimal",
),
),
(
"Neo-Expressionist Canvas",
("neo-expressionism", "bold brushwork", "raw texture", "intense color"),
("aggressive strokes", "high contrast", "emotive forms"),
(
"Style: neo-expressionist painting with bold brushwork and intense color",
flux_light_gallery,
"Mood: raw, energetic, contemporary",
),
),
(
"Art Brut / Outsider Art",
("outsider art", "raw naive style", "bold lines", "textured paint"),
("handmade imperfections", "vivid color", "childlike forms"),
(
"Style: outsider art with raw naive forms and bold lines",
flux_light_gallery,
"Mood: raw, honest, handmade",
),
),
(
"Naive Folk Painting",
("naive folk art painting", "flat perspective", "bright colors", "simple forms"),
("hand-painted texture", "decorative motifs", "cheerful mood"),
(
"Style: naive folk painting with simple forms and bright color",
flux_light_soft_window,
"Mood: charming, playful, handmade",
),
),
]
for name, zpre, zsu, flux_sents in fine_art_specs:
add_art_style(
fine_art,
id_prefix="fine",
name=name,
category="Fine Art",
z_prefix=zpre,
z_suffix=zsu,
flux_suffix_sentences=flux_sents,
tags=("fine_art",),
)
mixed_media_specs = [
(
"Paper Collage (Mixed Media)",
("paper collage", "torn paper edges", "layered textures", "cutout shapes"),
("glue marks", "paper grain", "handmade feel"),
(
"Style: mixed media paper collage with torn edges and layered shapes",
flux_light_gallery,
"Texture: paper grain, glue marks, layered cutouts",
),
),
(
"Photomontage Collage",
("photomontage", "cutout photo fragments", "layered collage", "high contrast"),
("paper texture", "rough edges", "analog zine aesthetic"),
(
"Style: photomontage collage made from cutout photo fragments",
flux_light_gallery,
"Mood: bold, surreal, graphic",
),
),
(
"Mixed Media Acrylic + Ink",
("mixed media", "acrylic paint", "ink linework", "layered marks"),
("texture paste", "splatter", "handmade imperfections"),
(
"Style: mixed media artwork combining acrylic paint and ink linework",
flux_light_gallery,
"Texture: layered paint, ink marks, tactile surface",
),
),
(
"Gel Plate Monoprint",
("gel plate monoprint", "ink layers", "brayer texture", "printmaking"),
("paper grain", "ink transfer artifacts", "handmade print"),
(
"Style: gel plate monoprint with layered ink textures",
flux_light_gallery,
"Texture: ink transfer artifacts, paper grain, layered prints",
),
),
(
"Cyanotype Print (Analog)",
("cyanotype print", "blue monochrome", "sun print", "paper texture"),
("grain", "chemical texture", "vintage print"),
(
"Style: analog cyanotype print on paper",
flux_light_gallery,
"Mood: minimal, photographic, deep blue",
),
),
(
"Assemblage Artwork",
("assemblage", "found objects", "mixed materials", "handcrafted"),
("tactile texture", "rough surfaces", "layered depth"),
(
"Style: assemblage artwork built from found objects and mixed materials",
flux_light_gallery,
"Texture: rough surfaces, layered depth, tactile materials",
),
),
(
"Textured Impasto Mixed Media",
("impasto texture", "palette knife marks", "thick paint", "mixed media"),
("surface relief", "paint ridges", "tactile depth"),
(
"Style: textured mixed media with thick impasto paint and palette knife marks",
flux_light_gallery,
"Texture: surface relief, paint ridges, tactile depth",
),
),
]
for name, zpre, zsu, flux_sents in mixed_media_specs:
add_art_style(
mixed_media,
id_prefix="mixed",
name=name,
category="Mixed Media",
z_prefix=zpre,
z_suffix=zsu,
flux_suffix_sentences=flux_sents,
tags=("mixed_media",),
)
street_art_specs = [
(
"Graffiti Wildstyle Lettering",
("graffiti", "wildstyle lettering", "spray paint", "urban wall"),
("paint drips", "overspray", "high contrast"),
(
"Style: graffiti wildstyle lettering on an urban wall",
"Lighting: harsh streetlight with strong highlights and deep shadows",
"Texture: spray paint overspray, drips, wall grit",
),
),
(
"Stencil Street Art",
("stencil street art", "spray paint", "sharp cutout shapes", "wall texture"),
("paint bleed", "rough edges", "high contrast"),
(
"Style: stencil street art sprayed on a textured wall",
"Lighting: streetlight with strong contrast",
"Texture: wall grit, paint bleed, sharp stencil edges",
),
),
(
"Spray Paint Mural",
("spray paint mural", "bold color", "large shapes", "urban wall"),
("overspray", "wall texture", "vibrant palette"),
(
"Style: large spray paint mural with bold color and clean shapes",
"Lighting: daylight or streetlight depending on scene, crisp contrast",
"Texture: subtle overspray and wall grain",
),
),
(
"Wheatpaste Poster Wall",
("wheatpaste poster wall", "layered posters", "torn paper", "street texture"),
("paper wrinkles", "glue stains", "gritty wall"),
(
"Style: wheatpaste posters layered on a city wall",
"Lighting: overcast daylight for clear texture",
"Texture: torn paper, wrinkles, glue stains, wall grit",
),
),
(
"Sticker Slap Wall",
("sticker slap wall", "sticker collage", "layered decals", "urban grit"),
("scratches", "torn stickers", "street texture"),
(
"Style: sticker slap wall covered in layered decals",
"Lighting: overcast daylight with even illumination",
"Texture: scratches, torn stickers, adhesive residue",
),
),
]
for name, zpre, zsu, flux_sents in street_art_specs:
add_art_style(
street_art,
id_prefix="street",
name=name,
category="Street Art",
z_prefix=zpre,
z_suffix=zsu,
flux_suffix_sentences=flux_sents,
tags=("street_art",),
)
# --- Graphic / print design ---
print_styles = [
("Risograph Print", ("risograph print", "misregistration", "paper texture", "limited inks")),
("Screen Print Poster", ("screen print", "bold shapes", "ink texture", "poster design")),
("Halftone Comic", ("halftone dots", "comic print texture", "high contrast")),
("Duotone Poster", ("duotone", "bold contrast", "graphic poster")),
("Swiss Design", ("international typographic style", "grid layout", "minimal poster")),
("Bauhaus", ("bauhaus design", "geometric shapes", "primary colors")),
("Constructivist Poster", ("constructivist poster", "bold diagonals", "limited palette")),
("Art Deco", ("art deco poster", "ornamental geometry", "luxury vibe")),
("Pop Art", ("pop art", "bold outlines", "saturated colors")),
("Psychedelic Poster", ("psychedelic poster", "wavy typography", "vibrant gradients")),
("Vintage Travel Poster", ("vintage travel poster", "flat illustration", "retro palette")),
("Brutalist Graphic", ("brutalist graphic design", "raw typography", "high contrast layout")),
("Memphis Pattern", ("memphis design", "playful shapes", "bold colors", "pattern")),
("Y2K Graphic", ("y2k design", "chrome gradients", "tech vibes", "glossy")),
("Vaporwave Poster", ("vaporwave aesthetic", "neon gradients", "retro futurism")),
("Grunge Flyer", ("grunge design", "rough texture", "photocopy noise")),
("Newspaper Collage", ("newspaper collage", "cutout typography", "paper texture")),
("Minimal Poster", ("minimal poster", "simple shapes", "strong negative space")),
("Geometric Pattern", ("geometric pattern", "repeating shapes", "clean layout")),
("Retro Pixel UI", ("retro pixel ui", "8-bit interface", "limited palette")),
("Sticker Bomb", ("sticker bomb", "busy collage", "bold outlines")),
("Isometric Infographic", ("isometric infographic", "icons", "clean labels")),
("Editorial Layout", ("editorial layout", "clean typography", "grid composition")),
("Monochrome Typography", ("monochrome typography", "bold type", "high contrast")),
("Holographic Chrome", ("holographic chrome", "iridescent gradient", "glossy")),
("Liquid Gradient", ("liquid gradient", "smooth color blends", "modern poster")),
("Sticker Sheet", ("sticker sheet", "die-cut outlines", "playful icons")),
("Packaging Label", ("packaging label design", "clean hierarchy", "print-ready")),
("Blueprint Poster", ("blueprint poster", "technical lines", "clean labels")),
]
for name, ztags in print_styles:
graphic.append(
StyleSpec(
id=_make_id("gfx", name),
name=name,
category="Graphic Design",
tags=("graphic", "print"),
z_prefix=ztags,
z_suffix=("clean edges", "intentional composition"),
flux_suffix_sentences=(
f"Style: {name.lower()}, graphic print aesthetic",
"Lighting: flat even light, minimal shading",
"Mood: bold, designed, poster-like",
),
)
)
# --- 3D / CG ---
cg_modes = [
("Photoreal 3D Render", ("photorealistic 3d render", "physically based materials", "global illumination")),
("Stylized 3D Toon", ("stylized 3d", "toon shading", "soft gradients")),
("Clay Render", ("clay render", "matte material", "soft studio lighting")),
("Wireframe Overlay", ("wireframe overlay", "technical render", "clean topology")),
("Low Poly", ("low poly 3d", "faceted geometry", "flat shading")),
("Isometric 3D Room", ("isometric 3d room", "miniature diorama", "clean lighting")),
("Subsurface Skin Render", ("3d render", "subsurface scattering", "realistic skin shader")),
("Hard Surface Sci-Fi", ("hard surface 3d", "sci-fi details", "panel lines", "clean bevels")),
("Miniature Diorama", ("miniature diorama", "tiny details", "tilt-shift feel")),
("Stop Motion Look", ("stop motion aesthetic", "handmade texture", "slight imperfections")),
("Plastic Toy Render", ("toy photography look", "plastic materials", "clean highlights")),
("Glass and Caustics", ("glass render", "caustics", "refractive highlights")),
("Subtle Stylized PBR", ("stylized pbr", "clean shapes", "soft materials")),
("CAD Product Render", ("cad render", "clean surfaces", "studio reflections")),
("Neon Cyber Render", ("3d render", "neon emissive", "wet reflections", "fog")),
("Stylized Miniature Set", ("miniature set", "tiny props", "diorama lighting")),
("Paper Craft 3D", ("paper craft", "folded paper", "layered cutouts")),
("Wax Subsurface Render", ("subsurface scattering", "wax material", "soft translucency")),
]
for name, ztags in cg_modes:
cg3d.append(
StyleSpec(
id=_make_id("cg", name),
name=name,
category="3D/CG",
tags=("3d", "cg"),
z_prefix=ztags,
z_suffix=("high detail", "clean render", "sharp edges"),
flux_suffix_sentences=(
f"Style: {name.lower()}, clean 3D render",
flux_light_studio_softbox,
"Materials: physically based, realistic roughness and specular response",
),
)
)
# --- Architecture / interior ---
arch_styles = [
("Minimalist Interior", ("minimalist interior", "clean lines", "neutral palette", "natural light"), flux_light_soft_window),
("Scandinavian Interior", ("scandinavian interior", "light wood", "cozy minimalism"), flux_light_soft_window),
("Brutalist Architecture", ("brutalist architecture", "raw concrete", "monolithic forms"), flux_light_overcast),
("Art Deco Lobby", ("art deco interior", "geometric ornament", "luxury materials"), "Lighting: warm art deco sconces and soft ambient glow"),
("Modern Glass Tower", ("modern architecture", "glass facade", "clean geometry"), flux_light_overcast),
("Cozy Cabin Interior", ("rustic cabin interior", "wood textures", "warm practical lights"), "Lighting: warm fireplace glow mixed with soft lamp light"),
("Industrial Loft", ("industrial loft", "exposed brick", "steel beams", "large windows"), flux_light_soft_window),
("Mid-Century Modern", ("mid-century modern interior", "clean lines", "warm wood", "retro furniture"), flux_light_soft_window),
("Japanese Wabi-Sabi", ("wabi-sabi interior", "natural materials", "imperfection", "calm minimalism"), flux_light_soft_window),
("Mediterranean Villa", ("mediterranean architecture", "stucco walls", "arched openings", "sunlit"), "Lighting: warm sun, sharp but pleasing shadows, bright highlights"),
("Gothic Cathedral", ("gothic architecture", "tall arches", "stained glass", "dramatic scale"), "Lighting: colored light beams through stained glass, dust in the air"),
("Futurist Interior", ("futurist interior", "sleek curves", "clean materials", "ambient light"), "Lighting: soft ambient strips with crisp accent highlights"),
("Moroccan Riad", ("moroccan architecture", "tile patterns", "courtyard light", "arched doorways"), "Lighting: warm sun filtering into courtyard, soft bounce light"),
("Tropical Modern", ("tropical modern architecture", "open air", "natural materials", "lush greenery"), "Lighting: bright sun with soft shade from overhangs, humid ambience"),
("Victorian Parlor", ("victorian interior", "ornate details", "rich textures"), "Lighting: warm practical lamps with soft ambient fill"),
("Concrete Minimalism", ("concrete interior", "minimalism", "soft light", "clean geometry"), flux_light_soft_window),
]
for name, ztags, flux_light in arch_styles:
arch.append(
StyleSpec(
id=_make_id("arch", name),
name=name,
category="Architecture/Interior",
tags=("architecture", "interior"),
z_prefix=ztags,
z_suffix=("realistic materials", "clean perspective"),
flux_suffix_sentences=(
f"Style: {name.lower()}, realistic architectural photograph",
flux_light,
"Composition: clean verticals, strong geometry, intentional lines",
),
)
)
# --- Fashion / editorial ---
fashion_styles = [
("Glossy Fashion Editorial", ("fashion editorial", "studio lighting", "high contrast", "clean backdrop"), flux_light_studio_softbox),
("Streetwear Lookbook", ("streetwear lookbook", "candid pose", "urban backdrop"), flux_light_overcast),
("Runway Backstage", ("backstage fashion", "documentary feel", "available light"), flux_light_soft_window),
("High Fashion Beauty Shot", ("beauty shot", "clean skin", "beauty lighting", "sharp eyes"), "Lighting: centered beauty lighting with soft fill, clean catchlights, smooth gradients"),
("Minimal Editorial", ("minimal fashion editorial", "neutral palette", "clean composition"), flux_light_studio_softbox),
("Vintage Editorial", ("vintage fashion editorial", "film grain", "muted palette"), flux_light_soft_window),
("Outdoor Editorial", ("fashion editorial outdoors", "wind", "natural light"), flux_light_golden_back),
("Street Style Snapshot", ("street style", "candid", "natural color"), flux_light_overcast),
("Luxury Beauty Macro", ("beauty macro", "skin texture", "cosmetic detail"), "Lighting: soft macro beauty light, clean specular highlights"),
("Athleisure Campaign", ("athleisure campaign", "clean energy", "natural light"), flux_light_overcast),
("Couture Runway", ("couture runway", "runway lights", "dramatic pose"), "Lighting: runway spotlights with controlled haze and crisp highlights"),
("Vintage Street Fashion", ("vintage street fashion", "film grain", "candid"), flux_light_soft_window),
]
for name, ztags, flux_light in fashion_styles:
fashion.append(
StyleSpec(
id=_make_id("fash", name),
name=name,
category="Fashion",
tags=("fashion", "editorial"),
z_prefix=ztags,
z_suffix=("sharp focus", "editorial color grade"),
flux_suffix_sentences=(
f"Style: {name.lower()}, fashion photograph",
flux_light,
"Mood: confident, curated, magazine-ready",
),
)
)
# --- Product ---
product_styles = [
("Luxury Watch Ad", ("luxury product shot", "watch photography", "controlled reflections"), flux_light_studio_softbox),
("Cosmetics Packshot", ("cosmetics product shot", "clean studio setup", "soft reflections"), flux_light_studio_softbox),
("Food Packshot", ("food packshot", "studio tabletop", "appetizing highlights"), flux_light_soft_window),
("Perfume Ad", ("perfume product shot", "glass bottle", "luxury lighting"), flux_light_studio_softbox),
("Tech Gadget Shot", ("tech product photography", "clean highlights", "premium materials"), flux_light_studio_softbox),
("Jewelry Macro", ("jewelry macro photography", "sparkle highlights", "shallow depth of field"), "Lighting: small hard highlights for sparkle, controlled fill, clean reflections"),
("Skincare Bottle Ad", ("skincare product shot", "clean studio", "dewy highlights"), flux_light_studio_softbox),
("Sneaker Product Shot", ("sneaker photography", "clean background", "sharp detail"), flux_light_studio_softbox),
("Beverage Splash", ("beverage ad", "splash photography", "frozen droplets"), "Lighting: hard backlight with crisp droplets, high-speed flash feel"),
]
for name, ztags, flux_light in product_styles:
product.append(
StyleSpec(
id=_make_id("prod", name),
name=name,
category="Product",
tags=("product",),
z_prefix=ztags,
z_suffix=("crisp edges", "high detail", "clean background"),
flux_suffix_sentences=(
f"Style: {name.lower()}, commercial product photograph",
flux_light,
"Composition: clean silhouette, premium materials, crisp details",
),
)
)
# --- Nature ---
nature_styles = [
("Misty Forest", ("nature photography", "misty forest", "atmospheric depth"), "Lighting: diffused fog light, soft beams through trees"),
("Mountain Vista", ("landscape photography", "mountain vista", "wide field of view"), flux_light_golden_back),
("Seascape", ("seascape photography", "waves", "horizon line"), "Lighting: soft overcast coastal light, subtle specular highlights"),
("Desert Dunes", ("desert landscape", "sand dunes", "ripples", "wide field of view"), "Lighting: low sun casting long shadows across dune ridges"),
("Autumn Leaves", ("nature close-up", "autumn leaves", "rich colors", "bokeh"), flux_light_soft_window),
("Rainforest", ("rainforest", "lush greens", "humid haze", "detailed foliage"), "Lighting: filtered sunlight through canopy, humid atmosphere"),
("Aurora Night", ("aurora", "night sky", "wide field of view", "stars"), "Lighting: moonless night with aurora glow, crisp stars"),
("Stormy Coast", ("stormy seascape", "dramatic clouds", "waves"), "Lighting: storm light with high contrast clouds, moody atmosphere"),
("Wildflower Meadow", ("wildflower meadow", "soft bokeh", "pastel colors"), flux_light_golden_back),
("Snowy Pines", ("snowy forest", "cold palette", "fine detail"), "Lighting: bright overcast snow light, soft shadow transitions"),
("Waterfall Mist", ("waterfall", "mist", "long exposure feel", "lush rocks"), "Lighting: overcast forest light with mist diffusion"),
("Volcanic Landscape", ("volcanic landscape", "black rocks", "dramatic sky"), "Lighting: dramatic overcast with breaks of sunlight"),
("Coral Reef", ("coral reef", "underwater", "colorful fish", "clear water"), "Lighting: underwater caustics with clear blue light"),
("Savanna Sunset", ("savanna", "sunset", "dust haze", "warm tones"), flux_light_golden_back),
]
for name, ztags, flux_light in nature_styles:
nature.append(
StyleSpec(
id=_make_id("nature", name),
name=name,
category="Nature",
tags=("nature", "landscape"),
z_prefix=ztags,
z_suffix=("natural color", "fine detail", "realistic texture"),
flux_suffix_sentences=(
f"Style: {name.lower()}, nature photograph",
flux_light,
"Mood: calm, immersive, natural",
),
)
)
# --- Experimental / abstract ---
exp_styles = [
("Glitch Art", ("glitch art", "digital distortion", "chromatic aberration", "scanlines")),
("Double Exposure", ("double exposure", "layered silhouettes", "surreal composition")),
("Light Painting", ("light painting", "long exposure trails", "dark background")),
("Prismatic Refraction", ("prismatic refraction", "rainbow dispersion", "glass texture")),
("Abstract Geometry", ("abstract geometric", "clean shapes", "bold composition")),
("Minimal Monochrome", ("minimal monochrome", "high contrast", "negative space")),
("Analog Photocopy", ("photocopy aesthetic", "paper noise", "high contrast", "xerox texture")),
("Datamosh", ("datamosh", "compression artifacts", "blocky smears")),
("Liquid Marble", ("liquid marble", "swirling ink", "organic patterns")),
("Neon Wireframe", ("neon wireframe", "glowing lines", "dark background")),
("Kaleidoscope", ("kaleidoscope", "symmetry", "prismatic pattern")),
("Minimal Gradient", ("minimal gradient", "soft color field", "smooth transitions")),
("Paper Grain Texture", ("paper grain", "subtle texture", "soft noise")),
("Chromatic Prism", ("chromatic prism", "color separation", "light leaks")),
("Mirror Kaleidoscope", ("mirror kaleidoscope", "fragmented reflections", "symmetry")),
("Thermal Vision", ("thermal vision", "false color", "heat map look")),
]
for name, ztags in exp_styles:
experimental.append(
StyleSpec(
id=_make_id("exp", name),
name=name,
category="Experimental",
tags=("experimental", "abstract"),
z_prefix=ztags,
z_suffix=("clean composition", "intentional design"),
flux_suffix_sentences=(
f"Style: {name.lower()}, experimental visual aesthetic",
"Lighting: intentional and graphic, emphasizing form and contrast",
"Mood: bold, modern, designed",
),
)
)
# Finalize packs.
write_pack("10_cinema.json", _uniq(cinema))
write_pack("20_photography.json", _uniq(photo))
write_pack("30_illustration.json", _uniq(illustration))
write_pack("35_fine_art.json", _uniq(fine_art))
write_pack("36_mixed_media.json", _uniq(mixed_media))
write_pack("37_street_art.json", _uniq(street_art))
write_pack("40_graphic_design.json", _uniq(graphic))
write_pack("50_3d_cg.json", _uniq(cg3d))
write_pack("60_architecture_interior.json", _uniq(arch))
write_pack("70_fashion.json", _uniq(fashion))
write_pack("80_product.json", _uniq(product))
write_pack("90_nature.json", _uniq(nature))
write_pack("95_experimental.json", _uniq(experimental))
write_pack("96_color_grades.json", _uniq(grades))
total = sum(
len(x)
for x in (
cinema,
photo,
illustration,
fine_art,
mixed_media,
street_art,
graphic,
cg3d,
arch,
fashion,
product,
nature,
experimental,
grades,
)
)
snapshot_total = write_legacy_snapshot()
print(f"Wrote style packs: {total} styles -> {PACKS_DIR}")
print(f"Updated legacy snapshot: {snapshot_total} styles -> {os.path.join(ROOT, 'styles', 'styles_v1.json')}")
if __name__ == "__main__":
build()