summaryrefslogtreecommitdiff
path: root/internal/image
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-01 14:42:00 +0300
committerPaul Buetow <paul@buetow.org>2026-04-01 14:42:00 +0300
commita63552412e1bca0c742dcc4deafa86d14393d3e0 (patch)
tree208e2496e6bbb923ca8c0629a4e6aa2b34942208 /internal/image
parent4b57c9e959a280da7b16779ab1931f8c95a868c7 (diff)
refactor(z5): extract shared artistic styles
Diffstat (limited to 'internal/image')
-rw-r--r--internal/image/openai.go74
-rw-r--r--internal/image/styles.go74
-rw-r--r--internal/image/styles_test.go27
3 files changed, 103 insertions, 72 deletions
diff --git a/internal/image/openai.go b/internal/image/openai.go
index f2db41d..1df6eb7 100644
--- a/internal/image/openai.go
+++ b/internal/image/openai.go
@@ -244,78 +244,8 @@ func (c *OpenAIClient) createEducationalPrompt(ctx context.Context, bulgarianWor
scene = ""
}
- // Define artistic styles
- styles := []string{
- "Photorealism", "Hyperrealism", "Surrealism", "Impressionism",
- "Minimalism", "Pop Art", "Art Nouveau", "Digital Art",
- "Watercolor", "Oil Painting", "Pencil Sketch", "Ink Drawing",
- "3D Rendering", "Low Poly Art", "Pixel Art", "Vector Art",
- "Collage", "Mixed Media", "Contemporary Art", "Abstract Expressionism",
- "Cubism", "Pointillism", "Fauvism", "Art Deco",
- "Baroque", "Renaissance", "Romanticism", "Realism",
- "Post-Impressionism", "Expressionism", "Constructivism", "Suprematism",
- "Dadaism", "Futurism", "Op Art", "Kinetic Art",
- "Street Art", "Graffiti Art", "Installation Art", "Land Art",
- "Conceptual Art", "Performance Art", "Video Art", "Net Art",
- "Generative Art", "Algorithmic Art", "Fractal Art", "Glitch Art",
- "Vaporwave", "Synthwave", "Cyberpunk", "Steampunk",
- "Fantasy Art", "Science Fiction Art", "Horror Art", "Gothic Art",
- "Anime", "Manga", "Comic Book Art", "Cartoon",
- "Caricature", "Editorial Illustration", "Children's Book Illustration", "Fashion Illustration",
- "Architectural Rendering", "Technical Illustration", "Scientific Illustration", "Medical Illustration",
- "Botanical Illustration", "Zoological Illustration", "Astronomical Art", "Paleoart",
- "Infographic", "Data Visualization", "Typography Art", "Calligraphy",
- "Mosaic", "Stained Glass", "Tapestry", "Embroidery",
- "Sculpture", "Ceramics", "Pottery", "Glass Art",
- "Metalwork", "Jewelry Design", "Woodcarving", "Paper Art",
- "Origami", "Kirigami", "Quilling", "Book Art",
- "Photography", "Documentary Photography", "Portrait Photography", "Landscape Photography",
- "Macro Photography", "Aerial Photography", "Underwater Photography", "Astrophotography",
- "Film Noir", "Vintage Photography", "Polaroid", "Double Exposure",
- "HDR Photography", "Long Exposure", "Tilt-Shift", "Infrared Photography",
- "Monochrome", "Sepia Tone", "Cross-Processing", "Cyanotype",
- "Folk Art", "Outsider Art", "Naive Art", "Aboriginal Art",
- "African Art", "Asian Art", "Islamic Art", "Celtic Art",
- "Byzantine Art", "Medieval Art", "Pre-Columbian Art", "Ancient Egyptian Art",
- "Ancient Greek Art", "Ancient Roman Art", "Cave Painting", "Petroglyphs",
- "Bauhaus", "De Stijl", "Vienna Secession", "Arts and Crafts Movement",
- "Prairie School", "International Style", "Brutalism", "Deconstructivism",
- "Parametric Design", "Biomimicry", "Sustainable Design", "Universal Design",
- "Retro Futurism", "Dieselpunk", "Atompunk", "Biopunk",
- "Afrofuturism", "Solarpunk", "Post-Apocalyptic", "Dystopian Art",
- "Psychedelic Art", "Visionary Art", "Lowbrow Art", "Outsider Art",
- "Trompe-l'oeil", "Anamorphic Art", "Optical Illusion", "Impossible Objects",
- "Sacred Geometry", "Mandala", "Yantra", "Celtic Knots",
- "Stippling", "Hatching", "Cross-Hatching", "Scumbling",
- "Impasto", "Glazing", "Scumbling", "Sgraffito",
- "Encaustic", "Fresco", "Tempera", "Gouache",
- "Pastel", "Charcoal", "Conte", "Silverpoint",
- "Linocut", "Woodcut", "Etching", "Lithography",
- "Screen Printing", "Monotype", "Collagraph", "Digital Print",
- "Augmented Reality Art", "Virtual Reality Art", "Interactive Art", "Projection Mapping",
- "Light Art", "Neon Art", "Holographic Art", "Laser Art",
- "Sound Art", "Bio Art", "Eco Art", "Social Practice Art",
- "Relational Aesthetics", "Participatory Art", "Community Art", "Activist Art",
- "Feminist Art", "Queer Art", "Postcolonial Art", "Decolonial Art",
- "Metamodernism", "Post-Internet Art", "Post-Digital Art", "New Aesthetic",
- "Speculative Design", "Critical Design", "Design Fiction", "Adversarial Design",
- "Transitional Design", "Transformation Design", "Service Design", "Experience Design",
- "Slow Design", "Emotional Design", "Inclusive Design", "Regenerative Design",
- "Biophilic Design", "Cradle to Cradle", "Circular Design", "Zero Waste Design",
- "Modular Design", "Open Design", "Co-Design", "Participatory Design",
- "Flat Design", "Material Design", "Neumorphism", "Glassmorphism",
- "Maximalism", "Eclecticism", "Kitsch", "Camp",
- "Wabi-Sabi", "Hygge", "Lagom", "Ikigai",
- "Feng Shui", "Vastu Shastra", "Sacred Architecture", "Organic Architecture",
- "Vernacular Architecture", "Adaptive Reuse", "Green Architecture", "Living Architecture",
- "Kinetic Architecture", "Responsive Architecture", "Parametric Architecture", "Algorithmic Architecture",
- "Blob Architecture", "Deconstructivist Architecture", "High-Tech Architecture", "Neo-Futurism",
- "Critical Regionalism", "Tropical Modernism", "Desert Modernism", "Scandinavian Design",
- "Japanese Design", "Italian Design", "German Design", "Dutch Design",
- "Memphis Group", "Radical Design", "Anti-Design", "Superstudio",
- "Archigram", "Metabolism", "Structuralism", "Postmodernism",
- "Minimalist Photography", "Conceptual Photography", "Staged Photography", "Candid Photography",
- }
+ // Copy the shared styles before shuffling so the package-level list stays stable.
+ styles := append([]string(nil), ArtisticStyles...)
// Shuffle the styles to avoid bias
rand.Shuffle(len(styles), func(i, j int) {
diff --git a/internal/image/styles.go b/internal/image/styles.go
new file mode 100644
index 0000000..a88bb69
--- /dev/null
+++ b/internal/image/styles.go
@@ -0,0 +1,74 @@
+package image
+
+// ArtisticStyles contains the shared pool of artistic styles used for image prompts.
+var ArtisticStyles = []string{
+ "Photorealism", "Hyperrealism", "Surrealism", "Impressionism",
+ "Minimalism", "Pop Art", "Art Nouveau", "Digital Art",
+ "Watercolor", "Oil Painting", "Pencil Sketch", "Ink Drawing",
+ "3D Rendering", "Low Poly Art", "Pixel Art", "Vector Art",
+ "Collage", "Mixed Media", "Contemporary Art", "Abstract Expressionism",
+ "Cubism", "Pointillism", "Fauvism", "Art Deco",
+ "Baroque", "Renaissance", "Romanticism", "Realism",
+ "Post-Impressionism", "Expressionism", "Constructivism", "Suprematism",
+ "Dadaism", "Futurism", "Op Art", "Kinetic Art",
+ "Street Art", "Graffiti Art", "Installation Art", "Land Art",
+ "Conceptual Art", "Performance Art", "Video Art", "Net Art",
+ "Generative Art", "Algorithmic Art", "Fractal Art", "Glitch Art",
+ "Vaporwave", "Synthwave", "Cyberpunk", "Steampunk",
+ "Fantasy Art", "Science Fiction Art", "Horror Art", "Gothic Art",
+ "Anime", "Manga", "Comic Book Art", "Cartoon",
+ "Caricature", "Editorial Illustration", "Children's Book Illustration", "Fashion Illustration",
+ "Architectural Rendering", "Technical Illustration", "Scientific Illustration", "Medical Illustration",
+ "Botanical Illustration", "Zoological Illustration", "Astronomical Art", "Paleoart",
+ "Infographic", "Data Visualization", "Typography Art", "Calligraphy",
+ "Mosaic", "Stained Glass", "Tapestry", "Embroidery",
+ "Sculpture", "Ceramics", "Pottery", "Glass Art",
+ "Metalwork", "Jewelry Design", "Woodcarving", "Paper Art",
+ "Origami", "Kirigami", "Quilling", "Book Art",
+ "Photography", "Documentary Photography", "Portrait Photography", "Landscape Photography",
+ "Macro Photography", "Aerial Photography", "Underwater Photography", "Astrophotography",
+ "Film Noir", "Vintage Photography", "Polaroid", "Double Exposure",
+ "HDR Photography", "Long Exposure", "Tilt-Shift", "Infrared Photography",
+ "Monochrome", "Sepia Tone", "Cross-Processing", "Cyanotype",
+ "Folk Art", "Outsider Art", "Naive Art", "Aboriginal Art",
+ "African Art", "Asian Art", "Islamic Art", "Celtic Art",
+ "Byzantine Art", "Medieval Art", "Pre-Columbian Art", "Ancient Egyptian Art",
+ "Ancient Greek Art", "Ancient Roman Art", "Cave Painting", "Petroglyphs",
+ "Bauhaus", "De Stijl", "Vienna Secession", "Arts and Crafts Movement",
+ "Prairie School", "International Style", "Brutalism", "Deconstructivism",
+ "Parametric Design", "Biomimicry", "Sustainable Design", "Universal Design",
+ "Retro Futurism", "Dieselpunk", "Atompunk", "Biopunk",
+ "Afrofuturism", "Solarpunk", "Post-Apocalyptic", "Dystopian Art",
+ "Psychedelic Art", "Visionary Art", "Lowbrow Art", "Outsider Art",
+ "Trompe-l'oeil", "Anamorphic Art", "Optical Illusion", "Impossible Objects",
+ "Sacred Geometry", "Mandala", "Yantra", "Celtic Knots",
+ "Stippling", "Hatching", "Cross-Hatching", "Scumbling",
+ "Impasto", "Glazing", "Scumbling", "Sgraffito",
+ "Encaustic", "Fresco", "Tempera", "Gouache",
+ "Pastel", "Charcoal", "Conte", "Silverpoint",
+ "Linocut", "Woodcut", "Etching", "Lithography",
+ "Screen Printing", "Monotype", "Collagraph", "Digital Print",
+ "Augmented Reality Art", "Virtual Reality Art", "Interactive Art", "Projection Mapping",
+ "Light Art", "Neon Art", "Holographic Art", "Laser Art",
+ "Sound Art", "Bio Art", "Eco Art", "Social Practice Art",
+ "Relational Aesthetics", "Participatory Art", "Community Art", "Activist Art",
+ "Feminist Art", "Queer Art", "Postcolonial Art", "Decolonial Art",
+ "Metamodernism", "Post-Internet Art", "Post-Digital Art", "New Aesthetic",
+ "Speculative Design", "Critical Design", "Design Fiction", "Adversarial Design",
+ "Transitional Design", "Transformation Design", "Service Design", "Experience Design",
+ "Slow Design", "Emotional Design", "Inclusive Design", "Regenerative Design",
+ "Biophilic Design", "Cradle to Cradle", "Circular Design", "Zero Waste Design",
+ "Modular Design", "Open Design", "Co-Design", "Participatory Design",
+ "Flat Design", "Material Design", "Neumorphism", "Glassmorphism",
+ "Maximalism", "Eclecticism", "Kitsch", "Camp",
+ "Wabi-Sabi", "Hygge", "Lagom", "Ikigai",
+ "Feng Shui", "Vastu Shastra", "Sacred Architecture", "Organic Architecture",
+ "Vernacular Architecture", "Adaptive Reuse", "Green Architecture", "Living Architecture",
+ "Kinetic Architecture", "Responsive Architecture", "Parametric Architecture", "Algorithmic Architecture",
+ "Blob Architecture", "Deconstructivist Architecture", "High-Tech Architecture", "Neo-Futurism",
+ "Critical Regionalism", "Tropical Modernism", "Desert Modernism", "Scandinavian Design",
+ "Japanese Design", "Italian Design", "German Design", "Dutch Design",
+ "Memphis Group", "Radical Design", "Anti-Design", "Superstudio",
+ "Archigram", "Metabolism", "Structuralism", "Postmodernism",
+ "Minimalist Photography", "Conceptual Photography", "Staged Photography", "Candid Photography",
+}
diff --git a/internal/image/styles_test.go b/internal/image/styles_test.go
new file mode 100644
index 0000000..8eeb7c1
--- /dev/null
+++ b/internal/image/styles_test.go
@@ -0,0 +1,27 @@
+package image
+
+import "testing"
+
+func TestArtisticStyles(t *testing.T) {
+ if len(ArtisticStyles) == 0 {
+ t.Fatal("ArtisticStyles should not be empty")
+ }
+
+ if !hasStyle(ArtisticStyles, "Photorealism") {
+ t.Fatal(`ArtisticStyles should include "Photorealism"`)
+ }
+
+ if !hasStyle(ArtisticStyles, "Candid Photography") {
+ t.Fatal(`ArtisticStyles should include "Candid Photography"`)
+ }
+}
+
+func hasStyle(styles []string, want string) bool {
+ for _, style := range styles {
+ if style == want {
+ return true
+ }
+ }
+
+ return false
+}