@nodaro/prompts 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +105 -0
- package/README.md +27 -0
- package/dist/index.cjs +21240 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +3599 -0
- package/dist/index.d.ts +3599 -0
- package/dist/index.js +20854 -0
- package/dist/index.js.map +1 -0
- package/package.json +49 -0
- package/src/__tests__/__snapshots__/prompt-builder-segments.test.ts.snap +65 -0
- package/src/__tests__/action-fx.test.ts +155 -0
- package/src/__tests__/apply-picker-json.test.ts +50 -0
- package/src/__tests__/assemble-image-input.test.ts +248 -0
- package/src/__tests__/assemble-suno-input.test.ts +283 -0
- package/src/__tests__/brand-tokens.test.ts +81 -0
- package/src/__tests__/build-image-prompt-element-injection.test.ts +118 -0
- package/src/__tests__/build-image-prompt-hybrid-format.test.ts +131 -0
- package/src/__tests__/build-image-prompt-mentions.test.ts +809 -0
- package/src/__tests__/build-image-prompt-reference-cap.test.ts +57 -0
- package/src/__tests__/build-image-prompt-reference-numbering.test.ts +237 -0
- package/src/__tests__/build-image-prompt-reference-order.test.ts +313 -0
- package/src/__tests__/camera-motions-from-connections.test.ts +71 -0
- package/src/__tests__/catalog-gapfill.test.ts +53 -0
- package/src/__tests__/character-convergence-image.test.ts +217 -0
- package/src/__tests__/character-default-role-image.test.ts +167 -0
- package/src/__tests__/character-default-role-video.test.ts +168 -0
- package/src/__tests__/character-default-role.test.ts +70 -0
- package/src/__tests__/character-fx.test.ts +200 -0
- package/src/__tests__/entity-prompts-location.test.ts +97 -0
- package/src/__tests__/entity-prompts.test.ts +240 -0
- package/src/__tests__/expand-extra-refs-role.test.ts +50 -0
- package/src/__tests__/factory-presets.test.ts +1045 -0
- package/src/__tests__/factory-snippets.test.ts +68 -0
- package/src/__tests__/framing-multi.test.ts +71 -0
- package/src/__tests__/framing-vantage.test.ts +39 -0
- package/src/__tests__/i18n-entry-completeness.test.ts +269 -0
- package/src/__tests__/identity-lock.test.ts +46 -0
- package/src/__tests__/instrumentation.test.ts +68 -0
- package/src/__tests__/lighting-multi.test.ts +68 -0
- package/src/__tests__/location-convergence-image.test.ts +124 -0
- package/src/__tests__/mention-lock-flag.test.ts +499 -0
- package/src/__tests__/multi-picker-spec.test.ts +71 -0
- package/src/__tests__/music-genre.test.ts +103 -0
- package/src/__tests__/music-mood.test.ts +87 -0
- package/src/__tests__/object-creature-convergence-image.test.ts +105 -0
- package/src/__tests__/parameter-prompt-hint.test.ts +270 -0
- package/src/__tests__/parameter-registry-sync.test.ts +243 -0
- package/src/__tests__/person-age.test.ts +80 -0
- package/src/__tests__/person-analyzer-invariants.test.ts +47 -0
- package/src/__tests__/person-body-axes.test.ts +67 -0
- package/src/__tests__/person-facial-geometry.test.ts +156 -0
- package/src/__tests__/person-regional-aesthetic.test.ts +161 -0
- package/src/__tests__/person-sections.test.ts +18 -0
- package/src/__tests__/picker-analyzer-registry.test.ts +108 -0
- package/src/__tests__/picker-catalogs-project.test.ts +85 -0
- package/src/__tests__/picker-catalogs.test.ts +53 -0
- package/src/__tests__/picker-limits.test.ts +20 -0
- package/src/__tests__/prompt-builder-segments.test.ts +183 -0
- package/src/__tests__/prompt-builder-structured-fields.test.ts +40 -0
- package/src/__tests__/prompt-builder.test.ts +1773 -0
- package/src/__tests__/prompt-wizard-categories.test.ts +31 -0
- package/src/__tests__/provider-prompt-doctrine.test.ts +49 -0
- package/src/__tests__/resolve-prompt-append.test.ts +58 -0
- package/src/__tests__/resolve-prompt.test.ts +44 -0
- package/src/__tests__/role-picker-shared.test.ts +208 -0
- package/src/__tests__/seedance-2-inputs.test.ts +173 -0
- package/src/__tests__/seedance-extend.test.ts +44 -0
- package/src/__tests__/sound-aggregator.test.ts +350 -0
- package/src/__tests__/style-presets.test.ts +34 -0
- package/src/__tests__/temporal-multi.test.ts +74 -0
- package/src/__tests__/transitions.test.ts +213 -0
- package/src/__tests__/video-reference-features.test.ts +41 -0
- package/src/__tests__/video-reference-leading-refs.test.ts +90 -0
- package/src/__tests__/video-reference-resolver.test.ts +233 -0
- package/src/__tests__/video-reference-roles.test.ts +96 -0
- package/src/__tests__/voice-character.test.ts +48 -0
- package/src/__tests__/voice-delivery.test.ts +41 -0
- package/src/__tests__/wardrobe.test.ts +25 -0
- package/src/action-fx.ts +255 -0
- package/src/aesthetic.ts +435 -0
- package/src/assemble-image-input.ts +236 -0
- package/src/assemble-suno-input.ts +147 -0
- package/src/atmosphere.ts +104 -0
- package/src/backdrop.ts +131 -0
- package/src/brand-tokens.ts +154 -0
- package/src/camera-format.ts +76 -0
- package/src/camera-motions.ts +615 -0
- package/src/character-fx.ts +274 -0
- package/src/color-look.ts +103 -0
- package/src/composition-effects.ts +67 -0
- package/src/entity-prompts.ts +231 -0
- package/src/era.ts +292 -0
- package/src/exposure-settings.ts +142 -0
- package/src/factory-presets/generate-image.ts +1644 -0
- package/src/factory-presets/generate-video.ts +1116 -0
- package/src/factory-presets/index.ts +46 -0
- package/src/factory-presets/lottie-overlay.ts +166 -0
- package/src/factory-presets/motion-graphics.ts +350 -0
- package/src/factory-presets/music.ts +734 -0
- package/src/factory-presets/sfx.ts +136 -0
- package/src/factory-presets/shared-image.ts +207 -0
- package/src/factory-presets/switchx.ts +65 -0
- package/src/factory-presets/text.ts +292 -0
- package/src/factory-presets/types.ts +51 -0
- package/src/factory-presets/video-edit.ts +136 -0
- package/src/factory-presets/voice.ts +172 -0
- package/src/factory-presets.ts +2 -0
- package/src/factory-snippets/catalog.ts +105 -0
- package/src/factory-snippets/index.ts +16 -0
- package/src/factory-snippets/types.ts +33 -0
- package/src/framing.ts +634 -0
- package/src/held-prop.ts +187 -0
- package/src/identity-lock.ts +213 -0
- package/src/index.ts +66 -0
- package/src/instrumentation.ts +337 -0
- package/src/lens.ts +59 -0
- package/src/lighting.ts +229 -0
- package/src/loop-subject.ts +276 -0
- package/src/materials.ts +184 -0
- package/src/mood.ts +186 -0
- package/src/music-genre.ts +662 -0
- package/src/music-mood.ts +137 -0
- package/src/object-asset-presets.ts +81 -0
- package/src/parameter-prompt-hint.ts +281 -0
- package/src/person.ts +1368 -0
- package/src/photo-genre.ts +151 -0
- package/src/photographer.ts +612 -0
- package/src/picker-analyzer-registry.ts +374 -0
- package/src/picker-catalogs.ts +858 -0
- package/src/pose.ts +246 -0
- package/src/post-process-effects.ts +94 -0
- package/src/prompt-builder-structured-fields.ts +116 -0
- package/src/prompt-builder.ts +2964 -0
- package/src/prompt-templates.ts +50 -0
- package/src/prompt-wizard-categories.ts +334 -0
- package/src/provider-prompt-doctrine.ts +85 -0
- package/src/render-quality.ts +89 -0
- package/src/resolve-prompt.ts +120 -0
- package/src/seedance-2-inputs.ts +100 -0
- package/src/setting.ts +130 -0
- package/src/sound-aggregator.ts +241 -0
- package/src/style-presets.ts +162 -0
- package/src/style.ts +99 -0
- package/src/styling.ts +585 -0
- package/src/temporal.ts +151 -0
- package/src/transitions.ts +333 -0
- package/src/video-reference-resolver.ts +823 -0
- package/src/voice-character.ts +237 -0
- package/src/voice-delivery.ts +142 -0
- package/src/wardrobe.ts +179 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import type { StyleDirectives } from "@nodaro/shared"
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Style Gallery presets (north-star §6 ①).
|
|
5
|
+
*
|
|
6
|
+
* Each preset is a named "look" the user picks at Start. Picking one sets the
|
|
7
|
+
* pipeline's `style_directives`, which the Showrunner folds into the plan's
|
|
8
|
+
* `global_style` — and from there it propagates into every entity reference
|
|
9
|
+
* sheet, scene keyframe, and shot prompt, plus the image/location critics. So
|
|
10
|
+
* the whole film stays visually consistent in the chosen style.
|
|
11
|
+
*
|
|
12
|
+
* The catalog is intentionally style/genre-agnostic (not just "cinematic"):
|
|
13
|
+
* films, explainers, animated ads, kids' content, education. A per-shot style
|
|
14
|
+
* override lives in the Focus composer (follow-up).
|
|
15
|
+
*
|
|
16
|
+
* `swatch` is a CSS gradient used as a lightweight thumbnail until real sample
|
|
17
|
+
* images ship — it gives each look a recognizable visual without bundling
|
|
18
|
+
* assets.
|
|
19
|
+
*/
|
|
20
|
+
export interface StylePreset {
|
|
21
|
+
/** Stable id stored on the pipeline (do not rename — breaks recall). */
|
|
22
|
+
id: string
|
|
23
|
+
label: string
|
|
24
|
+
/** One-line description shown under the label. */
|
|
25
|
+
description: string
|
|
26
|
+
/** CSS `background` value for the card's thumbnail swatch. */
|
|
27
|
+
swatch: string
|
|
28
|
+
/** Conditioning fed to the Showrunner → plan.global_style → all generation. */
|
|
29
|
+
directives: StyleDirectives
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export const STYLE_PRESETS: readonly StylePreset[] = [
|
|
33
|
+
{
|
|
34
|
+
id: "cinematic",
|
|
35
|
+
label: "Cinematic Photography",
|
|
36
|
+
description: "Photoreal film look, shallow depth, filmic grade.",
|
|
37
|
+
swatch: "linear-gradient(135deg,#1b2a4a,#c97b4a)",
|
|
38
|
+
directives: {
|
|
39
|
+
visualStyle:
|
|
40
|
+
"photorealistic cinematic film still, 35mm anamorphic, shallow depth of field, subtle film grain",
|
|
41
|
+
colorPalette: "rich natural tones with a teal-and-orange grade",
|
|
42
|
+
lighting: "dramatic motivated lighting, soft key with rim light",
|
|
43
|
+
cameraLanguage: "cinematic composition, smooth dolly and crane moves",
|
|
44
|
+
avoid: "cartoon, illustration, flat shading, low detail",
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: "flat2d",
|
|
49
|
+
label: "Modern Flat 2D",
|
|
50
|
+
description: "Bold flat vector shapes, clean outlines.",
|
|
51
|
+
swatch: "linear-gradient(135deg,#ff6b6b,#ffd93d)",
|
|
52
|
+
directives: {
|
|
53
|
+
visualStyle:
|
|
54
|
+
"modern flat 2D vector illustration, bold geometric shapes, clean outlines",
|
|
55
|
+
colorPalette: "bright saturated flat colors",
|
|
56
|
+
lighting: "even flat lighting, no gradients",
|
|
57
|
+
cameraLanguage: "straight-on framing, simple pans and cuts",
|
|
58
|
+
avoid: "photorealism, 3D render, gradients, texture noise",
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: "clay3d",
|
|
63
|
+
label: "Soft 3D Clay",
|
|
64
|
+
description: "Rounded claymation forms, matte texture.",
|
|
65
|
+
swatch: "linear-gradient(135deg,#f5b5c8,#a8d8c0)",
|
|
66
|
+
directives: {
|
|
67
|
+
visualStyle:
|
|
68
|
+
"soft 3D claymation look, rounded forms, matte clay texture, fingerprint detail",
|
|
69
|
+
colorPalette: "warm pastel palette",
|
|
70
|
+
lighting: "soft studio lighting with gentle shadows",
|
|
71
|
+
cameraLanguage: "playful slow orbits and push-ins",
|
|
72
|
+
avoid: "photorealism, harsh shadows, flat 2D",
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
id: "lineart",
|
|
77
|
+
label: "Minimal Line-Art",
|
|
78
|
+
description: "Single-weight black strokes, one accent.",
|
|
79
|
+
swatch: "linear-gradient(135deg,#ffffff,#111111)",
|
|
80
|
+
directives: {
|
|
81
|
+
visualStyle: "minimal black line-art on white, single-weight strokes",
|
|
82
|
+
colorPalette: "monochrome with a single accent color",
|
|
83
|
+
lighting: "no rendered lighting, line only",
|
|
84
|
+
cameraLanguage: "static, centered compositions",
|
|
85
|
+
avoid: "color fills, shading, photorealism, 3D",
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: "papercut",
|
|
90
|
+
label: "Paper-Cut",
|
|
91
|
+
description: "Layered construction-paper collage.",
|
|
92
|
+
swatch: "linear-gradient(135deg,#e8a87c,#85cdca)",
|
|
93
|
+
directives: {
|
|
94
|
+
visualStyle:
|
|
95
|
+
"layered paper-cut collage, stacked construction-paper layers with soft drop shadows",
|
|
96
|
+
colorPalette: "warm crafted paper tones",
|
|
97
|
+
lighting: "soft layered shadows between paper planes",
|
|
98
|
+
cameraLanguage: "gentle parallax between paper layers",
|
|
99
|
+
avoid: "photorealism, smooth gradients, 3D render",
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
id: "isometric",
|
|
104
|
+
label: "Isometric",
|
|
105
|
+
description: "Clean 2:1 axonometric diorama.",
|
|
106
|
+
swatch: "linear-gradient(135deg,#6a82fb,#a6c1ee)",
|
|
107
|
+
directives: {
|
|
108
|
+
visualStyle: "clean isometric 3D, 2:1 axonometric, miniature diorama",
|
|
109
|
+
colorPalette: "soft uniform palette",
|
|
110
|
+
lighting: "even ambient occlusion, no harsh shadows",
|
|
111
|
+
cameraLanguage: "fixed isometric angle with smooth pans",
|
|
112
|
+
avoid: "perspective distortion, photorealism, hand-drawn lines",
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
id: "tiltshift",
|
|
117
|
+
label: "Tilt-Shift Miniature",
|
|
118
|
+
description: "Toy-scale hyperreal, shifted focus.",
|
|
119
|
+
swatch: "linear-gradient(135deg,#43cea2,#185a9d)",
|
|
120
|
+
directives: {
|
|
121
|
+
visualStyle: "tilt-shift miniature photography, hyperreal toy-like scale",
|
|
122
|
+
colorPalette: "vivid high-saturation",
|
|
123
|
+
lighting: "bright midday daylight",
|
|
124
|
+
cameraLanguage: "top-down tilt-shift angle, slow push-ins",
|
|
125
|
+
avoid: "flat illustration, low saturation, line-art",
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
id: "anime",
|
|
130
|
+
label: "Anime / Cel",
|
|
131
|
+
description: "Cel-shaded, crisp lines, expressive.",
|
|
132
|
+
swatch: "linear-gradient(135deg,#ff9a9e,#fad0c4)",
|
|
133
|
+
directives: {
|
|
134
|
+
visualStyle:
|
|
135
|
+
"anime cel-shaded illustration, crisp linework, expressive characters",
|
|
136
|
+
colorPalette: "vibrant cel colors",
|
|
137
|
+
lighting: "stylized cel shading with bold highlights",
|
|
138
|
+
cameraLanguage: "dynamic anime framing with occasional speed lines",
|
|
139
|
+
avoid: "photorealism, 3D render, muted colors",
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
id: "watercolor",
|
|
144
|
+
label: "Watercolor Storybook",
|
|
145
|
+
description: "Soft washes, paper texture, bleeding edges.",
|
|
146
|
+
swatch: "linear-gradient(135deg,#cfd9df,#e2ebf0)",
|
|
147
|
+
directives: {
|
|
148
|
+
visualStyle:
|
|
149
|
+
"soft watercolor storybook painting, visible paper texture, bleeding edges",
|
|
150
|
+
colorPalette: "muted pastel washes",
|
|
151
|
+
lighting: "soft diffuse light",
|
|
152
|
+
cameraLanguage: "gentle, slow movements",
|
|
153
|
+
avoid: "hard edges, photorealism, 3D render",
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
] as const
|
|
157
|
+
|
|
158
|
+
/** Resolve a preset by id. Returns undefined for the "Auto" / unknown case. */
|
|
159
|
+
export function getStylePreset(id: string | undefined): StylePreset | undefined {
|
|
160
|
+
if (!id) return undefined
|
|
161
|
+
return STYLE_PRESETS.find((s) => s.id === id)
|
|
162
|
+
}
|
package/src/style.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical catalog of image style presets.
|
|
3
|
+
*
|
|
4
|
+
* Style dimension of an image/video — the overall artistic rendering or
|
|
5
|
+
* medium (anime, oil painting, photorealistic, etc.). Independent of
|
|
6
|
+
* lighting (direction/color of light), color/look (post-processing grade),
|
|
7
|
+
* atmosphere (environmental effects), lens (focal length distortion), and
|
|
8
|
+
* framing (composition). Two shots with identical lighting, lens and
|
|
9
|
+
* framing still look radically different when one is "Oil Painting" and
|
|
10
|
+
* the other is "Pixel Art".
|
|
11
|
+
*
|
|
12
|
+
* Shared between the picker UI, the standalone Style parameter node, the
|
|
13
|
+
* inline Style dropdown in image config panels (backward-compat), and the
|
|
14
|
+
* prompt-hint injection on both the frontend DAG executor and the backend
|
|
15
|
+
* orchestrator.
|
|
16
|
+
*
|
|
17
|
+
* The `id` values are kept in sync with `IMAGE_STYLE_PRESETS` in
|
|
18
|
+
* `frontend/src/components/editor/config-panels/model-options.ts` so the
|
|
19
|
+
* inline dropdown and the Style node resolve to the same richer promptHint
|
|
20
|
+
* at execution time.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export interface Style {
|
|
24
|
+
readonly id: string
|
|
25
|
+
readonly label: string
|
|
26
|
+
readonly description: string
|
|
27
|
+
readonly promptHint: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const STYLES: ReadonlyArray<Style> = [
|
|
31
|
+
{ id: "3d-render", label: "3D Render", description: "Modern CGI render with clean shading", promptHint: "3D rendered style, modern CGI aesthetic with clean shading, subtle ambient occlusion and crisp materials" },
|
|
32
|
+
{ id: "anime", label: "Anime", description: "Japanese animation look", promptHint: "anime style, Japanese animation aesthetic with bold cel-shaded lines, expressive eyes and saturated colors" },
|
|
33
|
+
{ id: "children-book", label: "Children's Book", description: "Warm illustrated storybook", promptHint: "children's book illustration style, warm hand-drawn storybook look with soft shapes, friendly characters and inviting colors" },
|
|
34
|
+
{ id: "cinematic", label: "Cinematic", description: "Film-grade dramatic image", promptHint: "cinematic film style, dramatic lighting with cinematic color grading, widescreen aesthetic and film-like depth of field" },
|
|
35
|
+
{ id: "comic-book", label: "Comic Book", description: "Inked panels with flat color", promptHint: "comic book style, bold inked outlines, halftone shading and flat saturated comic panel colors" },
|
|
36
|
+
{ id: "digital-art", label: "Digital Art", description: "Polished digital illustration", promptHint: "digital art style, polished digital painting with smooth brushwork, vibrant colors and clean rendering" },
|
|
37
|
+
{ id: "fantasy", label: "Fantasy", description: "Epic high-fantasy illustration", promptHint: "fantasy art style, epic high-fantasy illustration with painterly detail, magical atmosphere and rich lore-driven mood" },
|
|
38
|
+
{ id: "minimalist", label: "Minimalist", description: "Simple shapes, lots of whitespace", promptHint: "minimalist style, reduced composition with simple shapes, limited palette and generous negative space" },
|
|
39
|
+
{ id: "noir", label: "Noir", description: "High-contrast B&W film noir", promptHint: "film noir style, high-contrast black-and-white imagery, deep shadows, venetian-blind lighting and moody 1940s cinema feel" },
|
|
40
|
+
{ id: "oil-painting", label: "Oil Painting", description: "Thick brush strokes, classical canvas", promptHint: "oil painting style, visible thick brush strokes on canvas with rich pigment, classical painterly texture and warm tonal blending" },
|
|
41
|
+
{ id: "pencil-sketch", label: "Pencil Sketch", description: "Hand-drawn graphite drawing", promptHint: "pencil sketch style, hand-drawn graphite drawing with visible hatching, soft smudges and raw paper texture" },
|
|
42
|
+
{ id: "photorealistic", label: "Photorealistic", description: "Indistinguishable from a photograph", promptHint: "photorealistic style, high-fidelity photographic realism with natural lighting, accurate materials and DSLR-grade detail" },
|
|
43
|
+
{ id: "pixel-art", label: "Pixel Art", description: "Retro game-style pixel grid", promptHint: "pixel art style, retro low-resolution pixel grid aesthetic with limited palette and hard-edged chunky sprites" },
|
|
44
|
+
{ id: "pop-art", label: "Pop Art", description: "Bold colors, Warhol/Lichtenstein", promptHint: "pop art style, bold saturated colors, Ben-Day dots and high-contrast Warhol/Lichtenstein-inspired graphic look" },
|
|
45
|
+
{ id: "retro-vintage", label: "Retro / Vintage", description: "Faded nostalgic film look", promptHint: "retro vintage style, faded nostalgic film look with muted colors, subtle grain and old-photograph warmth" },
|
|
46
|
+
{ id: "watercolor", label: "Watercolor", description: "Soft transparent washes", promptHint: "watercolor style, soft transparent washes with bleeding edges, paper grain and delicate pigment pooling" },
|
|
47
|
+
{ id: "concept-art", label: "Concept Art", description: "Film/game pre-production painting", promptHint: "concept art style, painterly film and game pre-production illustration with dramatic lighting, moody atmosphere and loose brushwork emphasizing scale and storytelling" },
|
|
48
|
+
{ id: "impressionism", label: "Impressionism", description: "Monet-style dabbed brushwork", promptHint: "impressionist style, Monet-inspired visible dabbed brush strokes, soft natural light, pastel palette and loose color mixing that captures atmosphere over detail" },
|
|
49
|
+
{ id: "surrealism", label: "Surrealism", description: "Dreamlike Dalí-inspired", promptHint: "surrealist style, Dalí-inspired dreamlike imagery with impossible geometry, melting forms, floating elements and uncanny color combinations" },
|
|
50
|
+
{ id: "cyberpunk", label: "Cyberpunk", description: "Neon-lit dystopian future", promptHint: "cyberpunk style, neon-lit dystopian future aesthetic with magenta and cyan glow, rain-slick reflections, high-tech low-life mood and dense urban detail" },
|
|
51
|
+
{ id: "steampunk", label: "Steampunk", description: "Victorian brass + machinery", promptHint: "steampunk style, Victorian-era brass and copper machinery, exposed gears and pipes, sepia tones and retrofuturistic mechanical detail" },
|
|
52
|
+
{ id: "vaporwave", label: "Vaporwave", description: "80s pastel digital retro", promptHint: "vaporwave style, 1980s digital retro aesthetic with pastel pink and teal palette, chrome text, glitch artifacts, palm silhouettes and dreamlike sunset grids" },
|
|
53
|
+
{ id: "low-poly", label: "Low Poly", description: "Faceted geometric 3D", promptHint: "low poly style, faceted geometric 3D aesthetic with visible flat triangular faces, simplified forms and crisp shadow edges between facets" },
|
|
54
|
+
{ id: "ink-wash", label: "Ink Wash", description: "East-Asian sumi-e brush", promptHint: "ink wash sumi-e style, East-Asian brush painting on rice paper with bold gestural black brush strokes, soft ink bleeding and generous negative space" },
|
|
55
|
+
{ id: "isometric", label: "Isometric", description: "3/4 axonometric view", promptHint: "isometric style, 3/4 axonometric projection with clean geometric forms, bright saturated flat colors and uniform lighting like a tile-based game or architectural diagram" },
|
|
56
|
+
{ id: "flat-vector", label: "Flat Vector", description: "Modern flat illustration", promptHint: "flat vector illustration style, modern SaaS-style flat shapes with bright solid colors, no gradients or shadows, clean geometry and friendly simplified forms" },
|
|
57
|
+
{ id: "ukiyo-e", label: "Ukiyo-e", description: "Japanese woodblock print", promptHint: "ukiyo-e style, traditional Japanese woodblock print with bold outlined flat color planes, Hokusai-inspired palette and stylized natural elements" },
|
|
58
|
+
{ id: "graffiti", label: "Graffiti", description: "Street-art spray paint", promptHint: "graffiti street art style, vivid urban spray-paint aesthetic with bold tag lettering, drip textures, stencil edges and gritty wall surfaces" },
|
|
59
|
+
{ id: "claymation", label: "Claymation", description: "Tactile stop-motion clay", promptHint: "claymation stop-motion style, tactile handcrafted clay figures with visible fingerprints, rounded plasticine forms and warm diorama lighting reminiscent of Aardman productions" },
|
|
60
|
+
{ id: "glitch-art", label: "Glitch Art", description: "Digital corruption + datamosh", promptHint: "glitch art style, digital corruption aesthetic with chromatic aberration, RGB channel shifts, horizontal scanline tearing, pixel sorting and datamoshed compression artifacts" },
|
|
61
|
+
{ id: "ascii-art", label: "ASCII Art", description: "Monochrome terminal characters", promptHint: "ASCII art style, monochrome terminal aesthetic built from text characters (@ # %, . :) forming the image, green-on-black old-computer vibe, monospace typography and character-grid rendering" },
|
|
62
|
+
{ id: "blueprint", label: "Blueprint", description: "Technical drawing on blue", promptHint: "blueprint technical drawing style, white line work on deep cyan-blue paper with dimension lines, annotations, orthographic projections and engineering-schematic precision" },
|
|
63
|
+
{ id: "stained-glass", label: "Stained Glass", description: "Leaded colored glass mosaic", promptHint: "stained glass window style, tessellated colored glass panels separated by thick black lead lines, luminous backlit jewel tones and church-window composition" },
|
|
64
|
+
{ id: "chalkboard", label: "Chalkboard", description: "White chalk on slate", promptHint: "chalkboard style, white and pastel chalk on dark slate with smudged edges, visible chalk dust, hand-drawn marks and classroom-lecture feel" },
|
|
65
|
+
{ id: "paper-cutout", label: "Paper Cutout", description: "Layered cut paper + shadows", promptHint: "paper cutout papercraft style, Matisse-inspired layered cut paper shapes with visible paper texture, clean scissor edges and soft drop shadows between layered planes" },
|
|
66
|
+
{ id: "illuminated", label: "Illuminated Manuscript", description: "Gold leaf + calligraphy", promptHint: "illuminated manuscript style, medieval parchment with gold leaf accents, ornate decorative borders with vines and creatures, calligraphic script and jewel-toned miniature paintings" },
|
|
67
|
+
{ id: "pixar-3d", label: "Pixar 3D", description: "Polished character animation CG", promptHint: "Pixar-style 3D character animation, polished CG with appealing rounded character design, soft subsurface skin shading, cinematic key lighting and expressive animated feature-film quality" },
|
|
68
|
+
{ id: "caricature", label: "Caricature", description: "Exaggerated stylized portrait", promptHint: "caricature illustration style, an exaggerated stylized portrait with a comically oversized head on a small body, amplified signature features — large nose, wide grin, oversized eyes — drawn with confident ink lines and watery color washes in the tradition of street-fair sketch artists" },
|
|
69
|
+
{ id: "fresco", label: "Fresco", description: "Renaissance plaster wall painting", promptHint: "rendered as a fresco painting in the style of a Renaissance ceiling, mineral pigments soaked into wet lime plaster with a chalky matte surface, softly weathered tonal range, faint craquelure and warm earthen palette reminiscent of Michelangelo's Sistine Chapel" },
|
|
70
|
+
{ id: "mosaic", label: "Mosaic", description: "Byzantine tessera tile composition", promptHint: "rendered as a mosaic composed of small hand-cut tesserae in stone, ceramic and gilded glass, visible grout lines between every tile, faceted highlights catching the light and a Byzantine / ancient-Roman aesthetic with stylized figures on a shimmering gold ground" },
|
|
71
|
+
{ id: "woodcut", label: "Woodcut", description: "Dürer-era relief print woodblock", promptHint: "rendered as a woodcut relief print, bold stark black ink on cream paper with assertive carved lines, parallel hatching for tonal shading, high-contrast graphic shapes and the wiry expressive line-work of Dürer-era Northern Renaissance prints" },
|
|
72
|
+
{ id: "etching", label: "Etching", description: "Rembrandt-style intaglio print", promptHint: "rendered as an intaglio etching, dense fine cross-hatched lines bitten into a copper plate, rich velvety blacks against warm cream paper, delicate tonal gradations and the introspective chiaroscuro of a Rembrandt print" },
|
|
73
|
+
{ id: "lithograph", label: "Lithograph", description: "Toulouse-Lautrec stone-printed poster", promptHint: "rendered as a stone lithograph, soft graphite-like tonal range with grainy crayon textures, flat areas of limited spot color, slightly off-register edges and the bold poster-art sensibility of a Toulouse-Lautrec belle-époque print" },
|
|
74
|
+
{ id: "charcoal", label: "Charcoal Drawing", description: "Smudgeable black tonal study", promptHint: "rendered as a charcoal drawing on toothy paper, soft black and grey tonal masses with smudged blended midtones, sharp accented darks, expressive gestural strokes and the raw immediacy of a fine-art figure study" },
|
|
75
|
+
{ id: "pastel", label: "Pastel", description: "Degas-era soft chalk pastel", promptHint: "rendered as a soft chalk pastel drawing, dry powdery pigment laid in feathered strokes on tinted paper with luminous dusty colors, gently blended edges and the dreamy Degas-era atmosphere of dancers in stage light" },
|
|
76
|
+
{ id: "acrylic-paint", label: "Acrylic Paint", description: "Fast-drying opaque acrylic on canvas", promptHint: "rendered as an acrylic painting on canvas, fast-drying opaque pigment with crisp sharp edges, confident quick brush strokes, high-key saturated color and a flatter more graphic finish than traditional oil paint" },
|
|
77
|
+
{ id: "mixed-media", label: "Mixed Media", description: "Collage + paint + ink hybrid", promptHint: "rendered as a mixed-media artwork combining torn paper collage, acrylic paint, ink and graphite on a layered substrate, heterogeneous textures, visible tape and stitching, and an exuberant hand-assembled studio-art quality" },
|
|
78
|
+
{ id: "manga", label: "Manga", description: "Inked B&W Japanese comic panel", promptHint: "rendered as inked manga panel art, crisp black ink on white with confident line weight variation, screen-tone dot patterns for shading, dramatic speed lines and the distinctly Japanese black-and-white comic aesthetic — separate from full-color anime" },
|
|
79
|
+
] as const
|
|
80
|
+
|
|
81
|
+
const styleById = new Map<string, Style>(STYLES.map((s) => [s.id, s]))
|
|
82
|
+
|
|
83
|
+
export function getStyle(id: string | undefined | null): Style | undefined {
|
|
84
|
+
if (!id) return undefined
|
|
85
|
+
return styleById.get(id)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function getStyleLabel(id: string | undefined | null, fallback?: string): string {
|
|
89
|
+
const s = getStyle(id)
|
|
90
|
+
if (s) return s.label
|
|
91
|
+
if (fallback !== undefined) return fallback
|
|
92
|
+
return (id ?? "").replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase())
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function getStylePromptHint(id: string | undefined | null): string {
|
|
96
|
+
return getStyle(id)?.promptHint ?? ""
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export const STYLE_IDS: ReadonlyArray<string> = STYLES.map((s) => s.id)
|