@nodaro/prompts 1.7.3 → 1.8.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/dist/index.cjs +5443 -4295
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1202 -61
- package/dist/index.d.ts +1202 -61
- package/dist/index.js +5357 -4297
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/b7-person-pack-e2e.test.ts +37 -0
- package/src/__tests__/catalog-funnel-ratchet.test.ts +97 -0
- package/src/__tests__/catalog-packs.test.ts +130 -0
- package/src/__tests__/catalog-sidecar-coverage.test.ts +27 -0
- package/src/__tests__/catalog-terms.test.ts +162 -0
- package/src/__tests__/character-default-role.test.ts +3 -2
- package/src/__tests__/content-free-contract.test.ts +45 -0
- package/src/__tests__/dod-replace-pack-acceptance.test.ts +41 -0
- package/src/__tests__/fixtures/parameter-hint-golden.json +2959 -0
- package/src/__tests__/fixtures/person-sector-pack.ts +27 -0
- package/src/__tests__/i18n-entry-completeness.test.ts +5 -2
- package/src/__tests__/parameter-hint-mode.test.ts +385 -0
- package/src/__tests__/parameter-prompt-hint-pack-fallback.test.ts +25 -0
- package/src/__tests__/person-packs.test.ts +166 -0
- package/src/__tests__/project-all-catalogs.test.ts +26 -0
- package/src/__tests__/prompt-builder.test.ts +53 -0
- package/src/__tests__/provider-prompt-doctrine.test.ts +18 -0
- package/src/__tests__/registered-catalogs-funnel.test.ts +30 -0
- package/src/__tests__/registered-catalogs-guard.test.ts +11 -0
- package/src/__tests__/term.test.ts +104 -0
- package/src/__tests__/transitions.test.ts +8 -5
- package/src/__tests__/upstream-immutability.test.ts +23 -0
- package/src/action-fx.ts +67 -17
- package/src/aesthetic.ts +54 -6
- package/src/atmosphere.ts +64 -23
- package/src/backdrop.ts +44 -30
- package/src/camera-format.ts +33 -11
- package/src/camera-motions.ts +89 -0
- package/src/catalog-packs.ts +125 -0
- package/src/catalog-sidecar-coverage.ts +36 -0
- package/src/character-fx.ts +112 -39
- package/src/color-look.ts +44 -27
- package/src/composition-effects.ts +21 -7
- package/src/era.ts +24 -0
- package/src/exposure-settings.ts +76 -18
- package/src/framing.ts +102 -10
- package/src/held-prop.ts +125 -63
- package/src/identity-lock.ts +12 -5
- package/src/image-reference-doctrine.ts +55 -0
- package/src/index.ts +5 -0
- package/src/instrumentation.ts +148 -57
- package/src/lens.ts +31 -15
- package/src/lighting.ts +120 -59
- package/src/loop-subject.ts +27 -1
- package/src/materials.ts +123 -69
- package/src/mood.ts +123 -51
- package/src/music-genre.ts +171 -67
- package/src/music-mood.ts +85 -17
- package/src/parameter-prompt-hint.ts +168 -56
- package/src/person-packs.ts +182 -0
- package/src/person.ts +506 -408
- package/src/photo-genre.ts +37 -22
- package/src/photographer.ts +138 -1
- package/src/picker-catalogs.ts +86 -40
- package/src/pose.ts +105 -40
- package/src/post-process-effects.ts +51 -8
- package/src/prompt-builder.ts +16 -1
- package/src/provider-prompt-doctrine.ts +12 -5
- package/src/render-quality.ts +25 -7
- package/src/setting.ts +30 -14
- package/src/style.ts +33 -15
- package/src/styling.ts +155 -94
- package/src/temporal.ts +80 -18
- package/src/term.ts +155 -0
- package/src/transitions.ts +73 -26
- package/src/voice-character.ts +190 -90
- package/src/voice-delivery.ts +83 -12
package/src/atmosphere.ts
CHANGED
|
@@ -11,54 +11,62 @@
|
|
|
11
11
|
* frontend DAG executor and the backend orchestrator.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
+
import { resolveTerm, type PickerHintMode } from "./term.js"
|
|
15
|
+
|
|
14
16
|
export interface Atmosphere {
|
|
15
17
|
readonly id: string
|
|
16
18
|
readonly label: string
|
|
17
19
|
readonly description: string
|
|
18
20
|
readonly promptHint: string
|
|
21
|
+
/**
|
|
22
|
+
* Compact professional term for this atmosphere ("dense fog", "sparks and
|
|
23
|
+
* embers") — authored only where the lowercased label is not what a DP or
|
|
24
|
+
* VFX supervisor would write in a prompt. See `term.ts`.
|
|
25
|
+
*/
|
|
26
|
+
readonly term?: string
|
|
19
27
|
}
|
|
20
28
|
|
|
21
29
|
export const ATMOSPHERES: ReadonlyArray<Atmosphere> = [
|
|
22
|
-
{ id: "clear", label: "Clear", description: "Clean, no atmospheric effect", promptHint: "clear atmosphere, clean visibility with no fog or particles" },
|
|
23
|
-
{ id: "cloudy", label: "Cloudy", description: "Partial cloud cover, mixed light", promptHint: "cloudy atmosphere, partial cloud cover with mixed direct and diffused light, soft contrast and intermittent shadows" },
|
|
24
|
-
{ id: "overcast", label: "Overcast", description: "Uniform gray cloud cover", promptHint: "overcast atmosphere, uniform gray cloud cover with diffused flat light" },
|
|
25
|
-
{ id: "fog", label: "Fog", description: "Dense low-visibility fog", promptHint: "dense fog atmosphere, thick low-visibility moisture obscuring all but the nearest subject, muted desaturated tones" },
|
|
26
|
-
{ id: "mist", label: "Mist", description: "Thin diffusing mist", promptHint: "light mist atmosphere, thin atmospheric haze gently diffusing distant elements while keeping the subject crisp" },
|
|
27
|
-
{ id: "fog-mist", label: "Fog / Mist", description: "Soft diffusing fog", promptHint: "foggy atmosphere, soft mist reducing visibility and diffusing distant elements" },
|
|
30
|
+
{ id: "clear", label: "Clear", description: "Clean, no atmospheric effect", promptHint: "clear atmosphere, clean visibility with no fog or particles", term: "clear atmosphere" },
|
|
31
|
+
{ id: "cloudy", label: "Cloudy", description: "Partial cloud cover, mixed light", promptHint: "cloudy atmosphere, partial cloud cover with mixed direct and diffused light, soft contrast and intermittent shadows", term: "cloudy sky" },
|
|
32
|
+
{ id: "overcast", label: "Overcast", description: "Uniform gray cloud cover", promptHint: "overcast atmosphere, uniform gray cloud cover with diffused flat light", term: "overcast sky" },
|
|
33
|
+
{ id: "fog", label: "Fog", description: "Dense low-visibility fog", promptHint: "dense fog atmosphere, thick low-visibility moisture obscuring all but the nearest subject, muted desaturated tones", term: "dense fog" },
|
|
34
|
+
{ id: "mist", label: "Mist", description: "Thin diffusing mist", promptHint: "light mist atmosphere, thin atmospheric haze gently diffusing distant elements while keeping the subject crisp", term: "light mist" },
|
|
35
|
+
{ id: "fog-mist", label: "Fog / Mist", description: "Soft diffusing fog", promptHint: "foggy atmosphere, soft mist reducing visibility and diffusing distant elements", term: "soft fog and mist" },
|
|
28
36
|
{ id: "light-rain", label: "Light Rain", description: "Soft falling rain", promptHint: "light rain falling softly, subtle droplets visible in the air with wet surfaces" },
|
|
29
37
|
{ id: "heavy-rain", label: "Heavy Rain", description: "Heavy storm with sheets of rain", promptHint: "heavy rainstorm, dense sheets of rain with visible droplets and splashing surfaces" },
|
|
30
|
-
{ id: "storm", label: "Storm", description: "Violent thunderstorm with rain + lightning", promptHint: "stormy atmosphere, violent thunderstorm with sheeting rain, dramatic dark clouds, flickering lightning illuminating the scene, and wind-driven debris" },
|
|
31
|
-
{ id: "snow", label: "Snow", description: "Falling snowflakes", promptHint: "falling snow, snowflakes drifting through the air and accumulating on surfaces" },
|
|
38
|
+
{ id: "storm", label: "Storm", description: "Violent thunderstorm with rain + lightning", promptHint: "stormy atmosphere, violent thunderstorm with sheeting rain, dramatic dark clouds, flickering lightning illuminating the scene, and wind-driven debris", term: "thunderstorm" },
|
|
39
|
+
{ id: "snow", label: "Snow", description: "Falling snowflakes", promptHint: "falling snow, snowflakes drifting through the air and accumulating on surfaces", term: "falling snow" },
|
|
32
40
|
{ id: "blizzard", label: "Blizzard", description: "Violent snowstorm, near whiteout", promptHint: "blizzard atmosphere, violent snowstorm with horizontal wind-driven snow, near-whiteout visibility, deep accumulation on every surface" },
|
|
33
|
-
{ id: "dust", label: "Dust", description: "Dust particles in air", promptHint: "dusty atmosphere, visible airborne dust particles catching light and softening distant elements" },
|
|
41
|
+
{ id: "dust", label: "Dust", description: "Dust particles in air", promptHint: "dusty atmosphere, visible airborne dust particles catching light and softening distant elements", term: "airborne dust" },
|
|
34
42
|
{ id: "god-rays", label: "God Rays", description: "Sun shafts through haze", promptHint: "visible volumetric god rays, sun shafts cutting through hazy atmosphere" },
|
|
35
|
-
{ id: "smoke", label: "Smoke", description: "Drifting smoke", promptHint: "drifting smoke in the scene, hazy volumetric smoke partially obscuring the subject" },
|
|
43
|
+
{ id: "smoke", label: "Smoke", description: "Drifting smoke", promptHint: "drifting smoke in the scene, hazy volumetric smoke partially obscuring the subject", term: "drifting smoke" },
|
|
36
44
|
{ id: "bokeh-particles", label: "Bokeh Particles", description: "Floating out-of-focus specks", promptHint: "floating bokeh particles in the air, out-of-focus glowing specks adding ambient depth" },
|
|
37
45
|
{ id: "chalk-dust", label: "Chalk Dust", description: "Soft chalk dust hanging in the air", promptHint: "soft chalk dust haze suspended in the air, fine pale powder catching light with a classroom-like quality" },
|
|
38
46
|
{ id: "falling-petals", label: "Falling Petals", description: "Drifting flower petals", promptHint: "delicate flower petals drifting through the frame, cherry-blossom or rose petals tumbling slowly on a soft breeze" },
|
|
39
47
|
{ id: "confetti", label: "Confetti", description: "Colorful confetti falling", promptHint: "colorful confetti raining through the frame, bright paper flecks tumbling and twirling against the background" },
|
|
40
|
-
{ id: "sparks-embers", label: "Sparks / Embers", description: "Glowing embers drifting upward", promptHint: "glowing sparks and embers drifting upward through the air, hot orange specks trailing faint motion against darker surroundings" },
|
|
41
|
-
{ id: "lens-flare", label: "Lens Flare", description: "Anamorphic flare streak across frame", promptHint: "anamorphic horizontal lens flare streaking across the frame, cinematic light artifact with subtle ghosting and bloom" },
|
|
48
|
+
{ id: "sparks-embers", label: "Sparks / Embers", description: "Glowing embers drifting upward", promptHint: "glowing sparks and embers drifting upward through the air, hot orange specks trailing faint motion against darker surroundings", term: "sparks and embers" },
|
|
49
|
+
{ id: "lens-flare", label: "Lens Flare", description: "Anamorphic flare streak across frame", promptHint: "anamorphic horizontal lens flare streaking across the frame, cinematic light artifact with subtle ghosting and bloom", term: "anamorphic lens flare" },
|
|
42
50
|
{ id: "heat-haze", label: "Heat Haze", description: "Visible heat shimmer warping background", promptHint: "visible heat shimmer rising in the scene, warping and rippling the background with refracted air distortion" },
|
|
43
|
-
{ id: "steam", label: "Steam", description: "Rising white steam", promptHint: "soft white steam rising through the frame, warm vapor curling upward from a hot surface and catching ambient light" },
|
|
51
|
+
{ id: "steam", label: "Steam", description: "Rising white steam", promptHint: "soft white steam rising through the frame, warm vapor curling upward from a hot surface and catching ambient light", term: "rising steam" },
|
|
44
52
|
{ id: "bubbles-underwater", label: "Underwater Bubbles", description: "Rising bubbles in water", promptHint: "streams of bubbles rising through water, clear underwater spheres drifting upward with shifting refractive light" },
|
|
45
53
|
{ id: "rain-on-glass", label: "Rain on Glass", description: "Droplets streaking foreground glass", promptHint: "raindrops beading and streaking down a foreground window pane, distorting the view behind with soft refracted detail" },
|
|
46
|
-
{ id: "pollen-light", label: "Pollen in Light", description: "Warm particles in a sunbeam", promptHint: "warm pollen and floating particles caught in a beam of sunlight, glowing motes drifting lazily through a shaft of light" },
|
|
47
|
-
{ id: "water-droplets", label: "Water Droplets", description: "Droplets clinging to skin or surface", promptHint: "fine water droplets clinging to skin and surfaces, fresh post-shower wetness with small beads catching highlights" },
|
|
54
|
+
{ id: "pollen-light", label: "Pollen in Light", description: "Warm particles in a sunbeam", promptHint: "warm pollen and floating particles caught in a beam of sunlight, glowing motes drifting lazily through a shaft of light", term: "sunlit pollen motes" },
|
|
55
|
+
{ id: "water-droplets", label: "Water Droplets", description: "Droplets clinging to skin or surface", promptHint: "fine water droplets clinging to skin and surfaces, fresh post-shower wetness with small beads catching highlights", term: "water droplets on skin" },
|
|
48
56
|
{ id: "falling-ash", label: "Falling Ash", description: "Fine grey ash drifting through the air", promptHint: "fine grey ash drifting slowly through the air, weightless flakes settling across the scene with a quiet post-fire mood" },
|
|
49
57
|
{ id: "fireflies", label: "Fireflies", description: "Drifting bioluminescent specks", promptHint: "fireflies drifting in soft warm pulses through the scene, summer-night magic glinting in the air with bioluminescent specks" },
|
|
50
58
|
{ id: "incense-smoke", label: "Incense Smoke", description: "Slow rising thick incense smoke", promptHint: "thick incense smoke rising slowly through the frame, spiritual temple atmosphere with dust-lit shafts curling upward" },
|
|
51
59
|
{ id: "cigarette-smoke", label: "Cigarette Smoke", description: "Exhaled smoke curling upward", promptHint: "exhaled cigarette smoke curling upward through the frame, café noir mood with thin pale plumes drifting against ambient light" },
|
|
52
|
-
{ id: "candle-glow", label: "Candle-Glow", description: "Warm flame light with soft halo", promptHint: "warm candle flame casting a soft glowing halo across the scene, intimate vigil-like atmosphere with flickering golden light pooling around the source" },
|
|
53
|
-
{ id: "glitter-sparkle", label: "Glitter / Sparkle", description: "Sparkly particles in air", promptHint: "sparkly glitter particles suspended in the air, party-disco atmosphere with tiny points of light catching and reflecting across the scene" },
|
|
54
|
-
{ id: "starfield", label: "Starfield / Visible Stars", description: "Visible night sky with stars", promptHint: "visible starfield filling the night sky, milky way and countless points of light spread across a vast cosmic backdrop" },
|
|
55
|
-
{ id: "dandelion-seeds", label: "Dandelion Seeds", description: "Drifting dandelion fluff", promptHint: "dandelion seed fluff drifting on a soft summer breeze, ethereal whitish parachutes floating weightlessly through the frame with whimsical magic" },
|
|
56
|
-
{ id: "pollen-drift", label: "Pollen Drift", description: "Fine yellow-gold pollen in golden light", promptHint: "fine yellow-gold pollen drifting through golden hour light, warm dust motes suspended in slanted sunbeams across the scene" },
|
|
60
|
+
{ id: "candle-glow", label: "Candle-Glow", description: "Warm flame light with soft halo", promptHint: "warm candle flame casting a soft glowing halo across the scene, intimate vigil-like atmosphere with flickering golden light pooling around the source", term: "candlelight glow" },
|
|
61
|
+
{ id: "glitter-sparkle", label: "Glitter / Sparkle", description: "Sparkly particles in air", promptHint: "sparkly glitter particles suspended in the air, party-disco atmosphere with tiny points of light catching and reflecting across the scene", term: "floating glitter particles" },
|
|
62
|
+
{ id: "starfield", label: "Starfield / Visible Stars", description: "Visible night sky with stars", promptHint: "visible starfield filling the night sky, milky way and countless points of light spread across a vast cosmic backdrop", term: "visible starfield" },
|
|
63
|
+
{ id: "dandelion-seeds", label: "Dandelion Seeds", description: "Drifting dandelion fluff", promptHint: "dandelion seed fluff drifting on a soft summer breeze, ethereal whitish parachutes floating weightlessly through the frame with whimsical magic", term: "drifting dandelion seeds" },
|
|
64
|
+
{ id: "pollen-drift", label: "Pollen Drift", description: "Fine yellow-gold pollen in golden light", promptHint: "fine yellow-gold pollen drifting through golden hour light, warm dust motes suspended in slanted sunbeams across the scene", term: "drifting golden pollen" },
|
|
57
65
|
{ id: "snowflakes-heavy", label: "Heavy Snowfall", description: "Heavy thick snowflakes filling the air, blizzard", promptHint: "heavy thick snowflakes filling the air in a near-blizzard, dense flurries blowing across the frame and accumulating rapidly on every surface" },
|
|
58
|
-
{ id: "snowflakes-light", label: "Light Snow Drift", description: "Sparse drifting snowflakes, calm winter scene", promptHint: "sparse snowflakes drifting lazily through a calm winter scene, occasional flakes catching ambient light against a quiet hushed atmosphere" },
|
|
66
|
+
{ id: "snowflakes-light", label: "Light Snow Drift", description: "Sparse drifting snowflakes, calm winter scene", promptHint: "sparse snowflakes drifting lazily through a calm winter scene, occasional flakes catching ambient light against a quiet hushed atmosphere", term: "light drifting snow" },
|
|
59
67
|
{ id: "raindrops-on-skin", label: "Raindrops on Skin", description: "Visible water droplets beading on skin and hair", promptHint: "visible water droplets beading on skin and hair, fresh rain catching highlights with rivulets tracing down cheeks and damp strands clinging to the face" },
|
|
60
68
|
{ id: "bioluminescent-cloud", label: "Bioluminescent Particle Cloud", description: "Glowing blue-green bioluminescent particles drifting like sea sparkle", promptHint: "glowing blue-green bioluminescent particles drifting through the air like sea sparkle, ethereal cyan motes pulsing softly with their own light against a darkened backdrop" },
|
|
61
|
-
{ id: "motion-streaks", label: "Motion Streaks", description: "Speed-line motion-blur streaks suggesting fast movement", promptHint: "speed-line motion-blur streaks slicing across the frame, smeared light trails and directional blur suggesting fast movement through the scene" },
|
|
69
|
+
{ id: "motion-streaks", label: "Motion Streaks", description: "Speed-line motion-blur streaks suggesting fast movement", promptHint: "speed-line motion-blur streaks slicing across the frame, smeared light trails and directional blur suggesting fast movement through the scene", term: "motion blur streaks" },
|
|
62
70
|
] as const
|
|
63
71
|
|
|
64
72
|
const atmosphereById = new Map<string, Atmosphere>(ATMOSPHERES.map((a) => [a.id, a]))
|
|
@@ -79,13 +87,24 @@ export function getAtmospherePromptHint(id: string | undefined | null): string {
|
|
|
79
87
|
return getAtmosphere(id)?.promptHint ?? ""
|
|
80
88
|
}
|
|
81
89
|
|
|
90
|
+
/**
|
|
91
|
+
* Compact counterpart of `getAtmospherePromptHint`: the short professional
|
|
92
|
+
* term this atmosphere injects in compact hint mode ("dense fog" where the
|
|
93
|
+
* hint is the full sentence). Empty string for an unknown id and for any
|
|
94
|
+
* entry that injects no hint at all.
|
|
95
|
+
*/
|
|
96
|
+
export function getAtmosphereTerm(id: string | undefined | null): string {
|
|
97
|
+
return resolveTerm(getAtmosphere(id))
|
|
98
|
+
}
|
|
99
|
+
|
|
82
100
|
/**
|
|
83
101
|
* Multi-pick: 1-2 atmosphere ids → composite atmospheric clause. Single →
|
|
84
102
|
* entry's own promptHint. Two → emit independently and join — atmospheres
|
|
85
103
|
* are particle-effect descriptions that compose naturally
|
|
86
104
|
* ("fog drifting in soft cool clouds, with golden god-rays cutting through").
|
|
87
105
|
*/
|
|
88
|
-
export function buildAtmosphereHints(value: unknown): string[] {
|
|
106
|
+
export function buildAtmosphereHints(value: unknown, mode: PickerHintMode = "full"): string[] {
|
|
107
|
+
if (mode === "compact") return buildAtmosphereTerms(value)
|
|
89
108
|
const ids: string[] = []
|
|
90
109
|
if (typeof value === "string" && value) ids.push(value)
|
|
91
110
|
else if (Array.isArray(value)) {
|
|
@@ -101,4 +120,26 @@ export function buildAtmosphereHints(value: unknown): string[] {
|
|
|
101
120
|
return out
|
|
102
121
|
}
|
|
103
122
|
|
|
123
|
+
/**
|
|
124
|
+
* Compact counterpart of `buildAtmosphereHints`: the same 1-2 id multi-pick,
|
|
125
|
+
* emitted as short professional terms instead of full mechanism sentences
|
|
126
|
+
* ("dense fog", "god rays"). Same collection order, same skip-the-no-ops
|
|
127
|
+
* behavior.
|
|
128
|
+
*/
|
|
129
|
+
export function buildAtmosphereTerms(value: unknown): string[] {
|
|
130
|
+
const ids: string[] = []
|
|
131
|
+
if (typeof value === "string" && value) ids.push(value)
|
|
132
|
+
else if (Array.isArray(value)) {
|
|
133
|
+
for (const v of value) {
|
|
134
|
+
if (typeof v === "string" && v && !ids.includes(v)) ids.push(v)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const out: string[] = []
|
|
138
|
+
for (const id of ids) {
|
|
139
|
+
const term = getAtmosphereTerm(id)
|
|
140
|
+
if (term) out.push(term)
|
|
141
|
+
}
|
|
142
|
+
return out
|
|
143
|
+
}
|
|
144
|
+
|
|
104
145
|
export const ATMOSPHERE_IDS: ReadonlyArray<string> = ATMOSPHERES.map((a) => a.id)
|
package/src/backdrop.ts
CHANGED
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
* and the backend orchestrator.
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
+
import { resolveTerm } from "./term.js"
|
|
26
|
+
|
|
25
27
|
export type BackdropCategory =
|
|
26
28
|
| "solid"
|
|
27
29
|
| "gradient"
|
|
@@ -36,59 +38,66 @@ export interface Backdrop {
|
|
|
36
38
|
readonly category: BackdropCategory
|
|
37
39
|
readonly description: string
|
|
38
40
|
readonly promptHint: string
|
|
41
|
+
/**
|
|
42
|
+
* Compact professional term injected in compact hint mode — authored only
|
|
43
|
+
* where the lowercased label would not read as the backdrop a photographer
|
|
44
|
+
* means (bare colors that describe the SUBJECT instead of the wall, UI
|
|
45
|
+
* shorthand like "Muslin" or "Paper Roll Seamless"). See `term.ts`.
|
|
46
|
+
*/
|
|
47
|
+
readonly term?: string
|
|
39
48
|
}
|
|
40
49
|
|
|
41
50
|
export const BACKDROPS: ReadonlyArray<Backdrop> = [
|
|
42
51
|
// -------------------- Solid / Seamless --------------------
|
|
43
|
-
{ id: "white-seamless", label: "White Seamless", category: "solid", description: "Clean white studio paper", promptHint: "against a clean white seamless studio backdrop, evenly lit with soft diffused fill and no environmental detail beyond the subject" },
|
|
44
|
-
{ id: "black-seamless", label: "Black Seamless", category: "solid", description: "Pure black studio backdrop", promptHint: "against a deep black seamless studio backdrop falling off into shadow, isolating the subject in a pool of contained light" },
|
|
45
|
-
{ id: "grey-seamless", label: "Grey Seamless", category: "solid", description: "Neutral mid-grey studio paper", promptHint: "against a neutral mid-grey seamless studio backdrop, soft even lighting and a clean editorial portrait feel" },
|
|
46
|
-
{ id: "ivory-seamless", label: "Ivory Seamless", category: "solid", description: "Warm ivory off-white backdrop", promptHint: "against a warm ivory seamless backdrop, soft golden-toned fill and an elegant editorial cleanliness" },
|
|
47
|
-
{ id: "deep-red", label: "Deep Red", category: "solid", description: "Saturated deep red wall", promptHint: "against a saturated deep crimson studio backdrop, the rich red color reflecting subtly into the subject's skin and wardrobe" },
|
|
48
|
-
{ id: "royal-blue", label: "Royal Blue", category: "solid", description: "Saturated royal blue backdrop", promptHint: "against a vivid royal-blue studio backdrop, the bold color framing the subject with regal editorial weight" },
|
|
49
|
-
{ id: "emerald-green", label: "Emerald Green", category: "solid", description: "Saturated emerald wall", promptHint: "against a saturated emerald-green studio backdrop, the jewel tone giving the portrait a lush editorial intensity" },
|
|
50
|
-
{ id: "dusty-pink", label: "Dusty Pink", category: "solid", description: "Soft muted pink backdrop", promptHint: "against a soft dusty-pink studio backdrop, gentle warm reflected light and a romantic muted editorial palette" },
|
|
51
|
-
{ id: "mustard-yellow", label: "Mustard Yellow", category: "solid", description: "Warm mustard backdrop", promptHint: "against a warm mustard-yellow studio backdrop, the saturated tone radiating retro editorial warmth onto the subject" },
|
|
52
|
+
{ id: "white-seamless", label: "White Seamless", category: "solid", description: "Clean white studio paper", promptHint: "against a clean white seamless studio backdrop, evenly lit with soft diffused fill and no environmental detail beyond the subject", term: "white seamless backdrop" },
|
|
53
|
+
{ id: "black-seamless", label: "Black Seamless", category: "solid", description: "Pure black studio backdrop", promptHint: "against a deep black seamless studio backdrop falling off into shadow, isolating the subject in a pool of contained light", term: "black seamless backdrop" },
|
|
54
|
+
{ id: "grey-seamless", label: "Grey Seamless", category: "solid", description: "Neutral mid-grey studio paper", promptHint: "against a neutral mid-grey seamless studio backdrop, soft even lighting and a clean editorial portrait feel", term: "grey seamless backdrop" },
|
|
55
|
+
{ id: "ivory-seamless", label: "Ivory Seamless", category: "solid", description: "Warm ivory off-white backdrop", promptHint: "against a warm ivory seamless backdrop, soft golden-toned fill and an elegant editorial cleanliness", term: "ivory seamless backdrop" },
|
|
56
|
+
{ id: "deep-red", label: "Deep Red", category: "solid", description: "Saturated deep red wall", promptHint: "against a saturated deep crimson studio backdrop, the rich red color reflecting subtly into the subject's skin and wardrobe", term: "deep red studio backdrop" },
|
|
57
|
+
{ id: "royal-blue", label: "Royal Blue", category: "solid", description: "Saturated royal blue backdrop", promptHint: "against a vivid royal-blue studio backdrop, the bold color framing the subject with regal editorial weight", term: "royal blue studio backdrop" },
|
|
58
|
+
{ id: "emerald-green", label: "Emerald Green", category: "solid", description: "Saturated emerald wall", promptHint: "against a saturated emerald-green studio backdrop, the jewel tone giving the portrait a lush editorial intensity", term: "emerald green studio backdrop" },
|
|
59
|
+
{ id: "dusty-pink", label: "Dusty Pink", category: "solid", description: "Soft muted pink backdrop", promptHint: "against a soft dusty-pink studio backdrop, gentle warm reflected light and a romantic muted editorial palette", term: "dusty pink studio backdrop" },
|
|
60
|
+
{ id: "mustard-yellow", label: "Mustard Yellow", category: "solid", description: "Warm mustard backdrop", promptHint: "against a warm mustard-yellow studio backdrop, the saturated tone radiating retro editorial warmth onto the subject", term: "mustard yellow studio backdrop" },
|
|
52
61
|
{ id: "teal-textured-wall", label: "Textured Teal Wall", category: "solid", description: "Painted teal textured wall", promptHint: "against a painted teal wall with subtle texture and uneven coverage, mid-tone shadows pooling into the surface and an editorial-portrait color cast" },
|
|
53
|
-
{ id: "chroma-green", label: "Chroma Green", category: "solid", description: "Flat saturated green-screen", promptHint: "against a flat saturated chroma-green screen backdrop, evenly lit with no shadow falloff and the uniform key-ready surface used for compositing" },
|
|
54
|
-
{ id: "chroma-blue", label: "Chroma Blue", category: "solid", description: "Flat saturated blue-screen", promptHint: "against a flat saturated chroma-blue screen backdrop, evenly lit with no shadow falloff and the uniform key-ready surface used for compositing" },
|
|
55
|
-
{ id: "paper-roll-seamless", label: "Paper Roll Seamless", category: "solid", description: "Generic neutral pastel paper roll", promptHint: "against a generic seamless paper-roll backdrop in a soft neutral pastel tone, evenly lit with the gentle curve of a sweep rolling onto the floor and a clean studio-portrait feel" },
|
|
62
|
+
{ id: "chroma-green", label: "Chroma Green", category: "solid", description: "Flat saturated green-screen", promptHint: "against a flat saturated chroma-green screen backdrop, evenly lit with no shadow falloff and the uniform key-ready surface used for compositing", term: "chroma green screen" },
|
|
63
|
+
{ id: "chroma-blue", label: "Chroma Blue", category: "solid", description: "Flat saturated blue-screen", promptHint: "against a flat saturated chroma-blue screen backdrop, evenly lit with no shadow falloff and the uniform key-ready surface used for compositing", term: "chroma blue screen" },
|
|
64
|
+
{ id: "paper-roll-seamless", label: "Paper Roll Seamless", category: "solid", description: "Generic neutral pastel paper roll", promptHint: "against a generic seamless paper-roll backdrop in a soft neutral pastel tone, evenly lit with the gentle curve of a sweep rolling onto the floor and a clean studio-portrait feel", term: "seamless paper roll backdrop" },
|
|
56
65
|
|
|
57
66
|
// -------------------- Gradient --------------------
|
|
58
|
-
{ id: "red-orange-gradient", label: "Red-Orange Gradient", category: "gradient", description: "Warm red-to-orange sweep", promptHint: "against a smoothly graded red-to-orange studio sweep, the warm fiery transition wrapping behind the subject for a dynamic editorial backdrop" },
|
|
59
|
-
{ id: "pink-orange-gradient", label: "Pink-Orange Gradient", category: "gradient", description: "Sunset pink-to-orange sweep", promptHint: "against a sunset-style gradient backdrop fading from soft pink at the top to warm orange below, a dreamy color sweep behind the subject" },
|
|
60
|
-
{ id: "blue-emerald-gradient", label: "Blue-Emerald Gradient", category: "gradient", description: "Cool blue-to-emerald sweep", promptHint: "against a cool gradient backdrop fading from royal blue to emerald, the saturated transition giving the portrait a sleek editorial poster feel" },
|
|
61
|
-
{ id: "sunset-gradient", label: "Sunset Gradient", category: "gradient", description: "Multi-tone sunset sweep", promptHint: "against a multi-tone sunset gradient backdrop sweeping from violet through pink to gold, the colors blending behind the subject like a painted sky" },
|
|
62
|
-
{ id: "two-tone-split", label: "Two-Tone Split", category: "gradient", description: "Split-color half-and-half wall", promptHint: "against a two-tone studio backdrop split vertically into a saturated color on one side and a contrasting tone on the other, the hard color line slicing behind the subject" },
|
|
67
|
+
{ id: "red-orange-gradient", label: "Red-Orange Gradient", category: "gradient", description: "Warm red-to-orange sweep", promptHint: "against a smoothly graded red-to-orange studio sweep, the warm fiery transition wrapping behind the subject for a dynamic editorial backdrop", term: "red-to-orange gradient backdrop" },
|
|
68
|
+
{ id: "pink-orange-gradient", label: "Pink-Orange Gradient", category: "gradient", description: "Sunset pink-to-orange sweep", promptHint: "against a sunset-style gradient backdrop fading from soft pink at the top to warm orange below, a dreamy color sweep behind the subject", term: "pink-to-orange gradient backdrop" },
|
|
69
|
+
{ id: "blue-emerald-gradient", label: "Blue-Emerald Gradient", category: "gradient", description: "Cool blue-to-emerald sweep", promptHint: "against a cool gradient backdrop fading from royal blue to emerald, the saturated transition giving the portrait a sleek editorial poster feel", term: "blue-to-emerald gradient backdrop" },
|
|
70
|
+
{ id: "sunset-gradient", label: "Sunset Gradient", category: "gradient", description: "Multi-tone sunset sweep", promptHint: "against a multi-tone sunset gradient backdrop sweeping from violet through pink to gold, the colors blending behind the subject like a painted sky", term: "sunset gradient backdrop" },
|
|
71
|
+
{ id: "two-tone-split", label: "Two-Tone Split", category: "gradient", description: "Split-color half-and-half wall", promptHint: "against a two-tone studio backdrop split vertically into a saturated color on one side and a contrasting tone on the other, the hard color line slicing behind the subject", term: "two-tone split-color backdrop" },
|
|
63
72
|
|
|
64
73
|
// -------------------- Textured --------------------
|
|
65
74
|
{ id: "brick-wall", label: "Brick Wall", category: "textured", description: "Exposed red-brick wall", promptHint: "against an exposed red-brick wall with weathered mortar, soft ambient light raking across the rough surface for a gritty street-portrait feel" },
|
|
66
75
|
{ id: "concrete-wall", label: "Concrete Wall", category: "textured", description: "Raw concrete surface", promptHint: "against a raw cast-concrete wall with subtle imperfections and form-tie marks, a cool industrial backdrop with neutral grey shadow" },
|
|
67
|
-
{ id: "plastered-wall", label: "Plastered Wall", category: "textured", description: "Hand-troweled plaster", promptHint: "against a hand-troweled plaster wall with soft directional texture and warm cream tones, an artisanal editorial backdrop" },
|
|
68
|
-
{ id: "peeling-paint", label: "Peeling Paint", category: "textured", description: "Vintage peeling-paint wall", promptHint: "against a vintage wall with chipped and peeling layers of old paint, weathered texture and a moody worn-in editorial feel" },
|
|
76
|
+
{ id: "plastered-wall", label: "Plastered Wall", category: "textured", description: "Hand-troweled plaster", promptHint: "against a hand-troweled plaster wall with soft directional texture and warm cream tones, an artisanal editorial backdrop", term: "hand-troweled plaster wall" },
|
|
77
|
+
{ id: "peeling-paint", label: "Peeling Paint", category: "textured", description: "Vintage peeling-paint wall", promptHint: "against a vintage wall with chipped and peeling layers of old paint, weathered texture and a moody worn-in editorial feel", term: "peeling paint wall" },
|
|
69
78
|
{ id: "wood-paneling", label: "Wood Paneling", category: "textured", description: "Warm wood-paneled wall", promptHint: "against warm wood-paneled wall with horizontal plank lines, soft light catching the natural grain and a vintage interior portrait feel" },
|
|
70
|
-
{ id: "tile-wall", label: "Tile Wall", category: "textured", description: "Bathroom or kitchen square tile", promptHint: "against a square-tiled bathroom or kitchen wall with crisp grout lines, slight ceramic gloss catching the studio key and a clean utilitarian backdrop" },
|
|
79
|
+
{ id: "tile-wall", label: "Tile Wall", category: "textured", description: "Bathroom or kitchen square tile", promptHint: "against a square-tiled bathroom or kitchen wall with crisp grout lines, slight ceramic gloss catching the studio key and a clean utilitarian backdrop", term: "square-tiled wall" },
|
|
71
80
|
{ id: "marble-wall", label: "Marble Wall", category: "textured", description: "Luxury veined marble wall", promptHint: "against a luxury veined marble wall, soft directional light revealing the natural stone striations and a polished high-end editorial backdrop" },
|
|
72
81
|
{ id: "graffiti-wall", label: "Graffiti Wall", category: "textured", description: "Vibrant urban graffiti tagged wall, street art", promptHint: "against a vibrant urban wall covered in layered graffiti tags and street-art murals, saturated spray-paint colors and the gritty energy of an alley shoot" },
|
|
73
82
|
{ id: "exposed-stone", label: "Exposed Stone Wall", category: "textured", description: "Raw exposed stone or ashlar masonry wall", promptHint: "against an exposed stone wall of raw ashlar masonry, irregular blocks with weathered mortar joints catching directional light for a rugged architectural backdrop" },
|
|
74
83
|
|
|
75
84
|
// -------------------- Fabric / Drape --------------------
|
|
76
|
-
{ id: "muslin-drape", label: "Muslin", category: "fabric", description: "Mottled hand-painted muslin", promptHint: "against a mottled hand-painted muslin backdrop, soft cloudy color variation and the classic painterly studio-portrait feel" },
|
|
77
|
-
{ id: "velvet-drape", label: "Velvet Drape", category: "fabric", description: "Heavy velvet drape backdrop", promptHint: "against a richly draped velvet backdrop with deep saturated color, soft folds catching directional light and a luxurious old-Hollywood feel" },
|
|
78
|
-
{ id: "satin-drape", label: "Satin Drape", category: "fabric", description: "Glossy satin drape", promptHint: "against a glossy satin drape with fluid folds catching specular highlights, a glamorous editorial backdrop with a soft sheen" },
|
|
79
|
-
{ id: "canvas-painted", label: "Painted Canvas", category: "fabric", description: "Painterly canvas backdrop", promptHint: "against a painterly hand-painted canvas backdrop with soft brushstroke variation and a classic portrait-studio atmosphere" },
|
|
85
|
+
{ id: "muslin-drape", label: "Muslin", category: "fabric", description: "Mottled hand-painted muslin", promptHint: "against a mottled hand-painted muslin backdrop, soft cloudy color variation and the classic painterly studio-portrait feel", term: "mottled muslin backdrop" },
|
|
86
|
+
{ id: "velvet-drape", label: "Velvet Drape", category: "fabric", description: "Heavy velvet drape backdrop", promptHint: "against a richly draped velvet backdrop with deep saturated color, soft folds catching directional light and a luxurious old-Hollywood feel", term: "draped velvet backdrop" },
|
|
87
|
+
{ id: "satin-drape", label: "Satin Drape", category: "fabric", description: "Glossy satin drape", promptHint: "against a glossy satin drape with fluid folds catching specular highlights, a glamorous editorial backdrop with a soft sheen", term: "draped satin backdrop" },
|
|
88
|
+
{ id: "canvas-painted", label: "Painted Canvas", category: "fabric", description: "Painterly canvas backdrop", promptHint: "against a painterly hand-painted canvas backdrop with soft brushstroke variation and a classic portrait-studio atmosphere", term: "hand-painted canvas backdrop" },
|
|
80
89
|
|
|
81
90
|
// -------------------- Effect / Lighting --------------------
|
|
82
|
-
{ id: "bokeh-blur", label: "Bokeh Blur", category: "effect", description: "Out-of-focus bokeh field", promptHint: "against an out-of-focus bokeh field of soft warm light circles, a dreamy shallow-depth backdrop that throws all attention onto the subject" },
|
|
83
|
-
{ id: "neon-bokeh", label: "Neon Bokeh", category: "effect", description: "Saturated neon bokeh blur", promptHint: "against a saturated neon-bokeh blur of pink, cyan and magenta lights, a nightlife-style shallow-depth backdrop that frames the subject in glowing color" },
|
|
84
|
-
{ id: "halo-glow", label: "Halo Glow", category: "effect", description: "Glowing circular halo behind head", promptHint: "against a darkened backdrop with a single glowing circular halo of light directly behind the subject's head, sun-like and centered, framing them in a saintly aura" },
|
|
91
|
+
{ id: "bokeh-blur", label: "Bokeh Blur", category: "effect", description: "Out-of-focus bokeh field", promptHint: "against an out-of-focus bokeh field of soft warm light circles, a dreamy shallow-depth backdrop that throws all attention onto the subject", term: "out-of-focus bokeh background" },
|
|
92
|
+
{ id: "neon-bokeh", label: "Neon Bokeh", category: "effect", description: "Saturated neon bokeh blur", promptHint: "against a saturated neon-bokeh blur of pink, cyan and magenta lights, a nightlife-style shallow-depth backdrop that frames the subject in glowing color", term: "neon bokeh background" },
|
|
93
|
+
{ id: "halo-glow", label: "Halo Glow", category: "effect", description: "Glowing circular halo behind head", promptHint: "against a darkened backdrop with a single glowing circular halo of light directly behind the subject's head, sun-like and centered, framing them in a saintly aura", term: "glowing halo ring behind the subject" },
|
|
85
94
|
{ id: "light-leak", label: "Light Leak", category: "effect", description: "Lens-flare light-leak streak", promptHint: "against a backdrop washed by a warm orange light leak streaking across one side of the frame, lens-flare flares and a dreamy analog feel" },
|
|
86
95
|
{ id: "vignette-dark", label: "Dark Vignette", category: "effect", description: "Heavy dark-vignette surround", promptHint: "against a deep darkened backdrop with a heavy circular vignette pulling the edges into shadow, the subject illuminated in the center under a single soft key" },
|
|
87
|
-
{ id: "window-with-light", label: "Window with Light", category: "effect", description: "Large window backdrop with light pouring through", promptHint: "against a large window backdrop with bright daylight pouring through the panes, soft silhouetted frame lines and glowing rim light haloing the subject from behind" },
|
|
88
|
-
{ id: "rooftop-skyline", label: "Rooftop Skyline", category: "effect", description: "Outdoor rooftop with city skyline as backdrop", promptHint: "against an outdoor rooftop view with a sweeping city skyline as the backdrop, distant buildings softened by atmospheric haze and an open-air editorial feel" },
|
|
96
|
+
{ id: "window-with-light", label: "Window with Light", category: "effect", description: "Large window backdrop with light pouring through", promptHint: "against a large window backdrop with bright daylight pouring through the panes, soft silhouetted frame lines and glowing rim light haloing the subject from behind", term: "backlit window with daylight streaming through" },
|
|
97
|
+
{ id: "rooftop-skyline", label: "Rooftop Skyline", category: "effect", description: "Outdoor rooftop with city skyline as backdrop", promptHint: "against an outdoor rooftop view with a sweeping city skyline as the backdrop, distant buildings softened by atmospheric haze and an open-air editorial feel", term: "city skyline seen from a rooftop" },
|
|
89
98
|
|
|
90
99
|
// -------------------- Reflective --------------------
|
|
91
|
-
{ id: "mirror-floor", label: "Mirror Floor", category: "reflective", description: "Reflective mirrored surface", promptHint: "against a backdrop with a polished mirrored floor reflecting the subject upside-down beneath them, the doubled composition adding a surreal editorial touch" },
|
|
100
|
+
{ id: "mirror-floor", label: "Mirror Floor", category: "reflective", description: "Reflective mirrored surface", promptHint: "against a backdrop with a polished mirrored floor reflecting the subject upside-down beneath them, the doubled composition adding a surreal editorial touch", term: "mirrored floor with reflection" },
|
|
92
101
|
{ id: "polished-floor", label: "Polished Floor", category: "reflective", description: "Glossy polished floor reflection", promptHint: "against a glossy polished floor with a soft hint of reflection beneath the subject, a clean architectural editorial backdrop" },
|
|
93
102
|
] as const
|
|
94
103
|
|
|
@@ -110,6 +119,11 @@ export function getBackdropPromptHint(id: string | undefined | null): string {
|
|
|
110
119
|
return getBackdrop(id)?.promptHint ?? ""
|
|
111
120
|
}
|
|
112
121
|
|
|
122
|
+
/** Compact professional term for a backdrop id — the short form of the hint. */
|
|
123
|
+
export function getBackdropTerm(id: string | undefined | null): string {
|
|
124
|
+
return resolveTerm(getBackdrop(id))
|
|
125
|
+
}
|
|
126
|
+
|
|
113
127
|
export const BACKDROP_IDS: ReadonlyArray<string> = BACKDROPS.map((b) => b.id)
|
|
114
128
|
|
|
115
129
|
export const BACKDROP_CATEGORY_LABELS: Readonly<Record<BackdropCategory, string>> = {
|
package/src/camera-format.ts
CHANGED
|
@@ -9,18 +9,35 @@
|
|
|
9
9
|
* frontend DAG executor and the backend orchestrator.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
import { resolveTerm } from "./term.js"
|
|
13
|
+
|
|
12
14
|
export interface CameraFormat {
|
|
13
15
|
readonly id: string
|
|
14
16
|
readonly label: string
|
|
15
17
|
readonly description: string
|
|
16
18
|
readonly promptHint: string
|
|
19
|
+
/**
|
|
20
|
+
* Compact professional term (see `term.ts`). Authored only where the
|
|
21
|
+
* lowercased label is not what a cinematographer would write in a prompt:
|
|
22
|
+
* a UI compound ("Webcam / FaceTime", "Tintype / Wet Plate", "B&W Film"),
|
|
23
|
+
* a parenthetical whose annotation carries the meaning ("Drone (Aerial)",
|
|
24
|
+
* "Toy Camera (Holga)", "Security Cam (CCTV)"), a bare name that reads as
|
|
25
|
+
* a subject rather than a capture medium once lowercased ("red komodo" is
|
|
26
|
+
* a lizard, "iphone" is a phone in frame), or a correct-but-underspecified
|
|
27
|
+
* name whose `promptHint` carries the distinguishing detail ("Camcorder" →
|
|
28
|
+
* "90s consumer camcorder", "Voigtlander" → "voigtlander rangefinder",
|
|
29
|
+
* "Super 8" → "super 8mm film"). Remaining labels are already the trade
|
|
30
|
+
* term ("35mm film", "vhs", "polaroid", "daguerreotype") and carry no
|
|
31
|
+
* `term`.
|
|
32
|
+
*/
|
|
33
|
+
readonly term?: string
|
|
17
34
|
}
|
|
18
35
|
|
|
19
36
|
export const CAMERA_FORMATS: ReadonlyArray<CameraFormat> = [
|
|
20
37
|
// Film stocks
|
|
21
38
|
{ id: "35mm-film", label: "35mm Film", description: "Classic cinema film grain", promptHint: "shot on 35mm film, classic cinematic grain texture and color science" },
|
|
22
39
|
{ id: "16mm-film", label: "16mm Film", description: "Indie / documentary grain", promptHint: "shot on 16mm film, indie documentary grain with characteristic muted tones" },
|
|
23
|
-
{ id: "super-8", label: "Super 8", description: "Vintage 8mm home-movie look", promptHint: "shot on Super 8 film, soft vintage grain with warm color cast and subtle gate weave" },
|
|
40
|
+
{ id: "super-8", label: "Super 8", description: "Vintage 8mm home-movie look", promptHint: "shot on Super 8 film, soft vintage grain with warm color cast and subtle gate weave", term: "super 8mm film" },
|
|
24
41
|
{ id: "imax-70mm", label: "IMAX 70mm", description: "Large-format pristine clarity", promptHint: "shot on IMAX 70mm film, ultra-high-resolution large-format with pristine clarity and rich tonal depth" },
|
|
25
42
|
{ id: "anamorphic-scope", label: "Anamorphic Scope", description: "2.39:1 widescreen cinema look", promptHint: "shot in anamorphic scope, 2.39:1 widescreen aspect ratio with horizontal lens flares and oval bokeh" },
|
|
26
43
|
// Modern digital
|
|
@@ -28,31 +45,31 @@ export const CAMERA_FORMATS: ReadonlyArray<CameraFormat> = [
|
|
|
28
45
|
{ id: "alexa-65", label: "ARRI Alexa 65", description: "Large-format 65mm IMAX-class cinema", promptHint: "shot on an ARRI Alexa 65 large-format cinema camera, the IMAX-class 65mm sensor delivering creamy bokeh, immense tonal latitude, and flagship Hollywood-blockbuster image quality" },
|
|
29
46
|
{ id: "sony-venice", label: "Sony Venice", description: "Full-frame dual-base-ISO cinema", promptHint: "shot on a Sony Venice full-frame cinema camera, dual-base-ISO sensor producing clean shadows in low light, refined Sony cinema color science, and the polished premium-streaming-production look" },
|
|
30
47
|
{ id: "blackmagic-pocket-6k", label: "Blackmagic Pocket 6K", description: "Indie RAW cinema camera", promptHint: "shot on a Blackmagic Pocket Cinema Camera 6K, indie-filmmaker RAW recording with rich color depth, organic film-like rendering, and the unmistakable Blackmagic gen-5 color science" },
|
|
31
|
-
{ id: "red-komodo", label: "RED Komodo", description: "Compact 6K action cinema camera", promptHint: "shot on a RED Komodo 6K cinema camera, compact-body REDCODE RAW capture with crisp action-grade detail, RED IPP2 color science, and dynamic gimbal- or drone-friendly framing" },
|
|
48
|
+
{ id: "red-komodo", label: "RED Komodo", description: "Compact 6K action cinema camera", promptHint: "shot on a RED Komodo 6K cinema camera, compact-body REDCODE RAW capture with crisp action-grade detail, RED IPP2 color science, and dynamic gimbal- or drone-friendly framing", term: "red komodo cinema camera" },
|
|
32
49
|
{ id: "dslr", label: "DSLR", description: "Crisp video-DSLR look", promptHint: "shot on DSLR, crisp clean video with shallow depth of field and modern digital color" },
|
|
33
50
|
{ id: "mirrorless-a7iii", label: "Sony A7III", description: "Modern hybrid mirrorless", promptHint: "shot on a Sony A7III mirrorless camera, clean modern hybrid look with fast-AF aesthetic, slightly cool Sony color science, and crisp full-frame sensor rendering" },
|
|
34
51
|
{ id: "canon-r5", label: "Canon EOS R5", description: "High-res fashion-editorial mirrorless", promptHint: "shot on a Canon EOS R5 mirrorless camera, high-resolution full-frame imagery with Canon's signature warm skin tones and clean editorial-fashion clarity" },
|
|
35
52
|
{ id: "hasselblad-medium-format", label: "Hasselblad Medium Format", description: "Editorial medium format", promptHint: "shot on a Hasselblad medium-format camera, ultra-shallow depth of field with painterly tonal rolloff, prestigious editorial color science, and large-sensor microcontrast" },
|
|
36
53
|
{ id: "leica-m-rangefinder", label: "Leica M Rangefinder", description: "Classic 35mm rangefinder", promptHint: "shot on a Leica M-series rangefinder, classic 35mm street-photography aesthetic with gentle bokeh, refined contrast, and signature Leica rendering" },
|
|
37
|
-
{ id: "voigtlander", label: "Voigtlander", description: "Boutique rangefinder character", promptHint: "shot on a Voigtlander rangefinder, distinctive color rendition with subtle vintage character, slightly muted saturation, and unique micro-contrast signature" },
|
|
54
|
+
{ id: "voigtlander", label: "Voigtlander", description: "Boutique rangefinder character", promptHint: "shot on a Voigtlander rangefinder, distinctive color rendition with subtle vintage character, slightly muted saturation, and unique micro-contrast signature", term: "voigtlander rangefinder" },
|
|
38
55
|
{ id: "fuji-xt4", label: "Fujifilm X-T4", description: "Film-emulating Fuji color", promptHint: "shot on a Fujifilm X-T4, film-like Fuji color science with rich greens, warm reds, and the distinctive emulation-style tonal curve Fuji is known for" },
|
|
39
56
|
// Aerial / action
|
|
40
|
-
{ id: "drone-aerial", label: "Drone (Aerial)", description: "Overhead gimbal-stabilized aerial", promptHint: "overhead drone aerial footage, slight wide-angle distortion with smooth gimbal stabilization, top-down or low-altitude perspective, and atmospheric haze on distant subjects" },
|
|
57
|
+
{ id: "drone-aerial", label: "Drone (Aerial)", description: "Overhead gimbal-stabilized aerial", promptHint: "overhead drone aerial footage, slight wide-angle distortion with smooth gimbal stabilization, top-down or low-altitude perspective, and atmospheric haze on distant subjects", term: "aerial drone footage" },
|
|
41
58
|
{ id: "gopro-action-cam", label: "GoPro Action Cam", description: "Fisheye-wide action camera", promptHint: "shot on a GoPro action camera, heavy fisheye-wide distortion with high-contrast saturated color, motion-active framing, and characteristic warped horizon lines" },
|
|
42
59
|
// Lo-fi modern
|
|
43
|
-
{ id: "webcam-facetime", label: "Webcam / FaceTime", description: "Low-res video call", promptHint: "low-resolution webcam or FaceTime call footage, soft compression artifacts with color-shifted skin tones, low frame-rate ghosting, and slightly laggy motion blur" },
|
|
60
|
+
{ id: "webcam-facetime", label: "Webcam / FaceTime", description: "Low-res video call", promptHint: "low-resolution webcam or FaceTime call footage, soft compression artifacts with color-shifted skin tones, low frame-rate ghosting, and slightly laggy motion blur", term: "webcam video call footage" },
|
|
44
61
|
// Vintage / lo-fi
|
|
45
62
|
{ id: "vhs", label: "VHS", description: "Tape distortion + scanlines", promptHint: "shot on VHS, analog tape distortion with horizontal scanlines, color bleed, and tracking artifacts" },
|
|
46
|
-
{ id: "camcorder", label: "Camcorder", description: "Consumer 90s video", promptHint: "shot on a 90s consumer camcorder, soft video with low resolution and slight chromatic fringing" },
|
|
63
|
+
{ id: "camcorder", label: "Camcorder", description: "Consumer 90s video", promptHint: "shot on a 90s consumer camcorder, soft video with low resolution and slight chromatic fringing", term: "90s consumer camcorder" },
|
|
47
64
|
{ id: "polaroid", label: "Polaroid", description: "Instant film tonality", promptHint: "polaroid instant film, square frame with soft tonality, slight color shift, and characteristic white border" },
|
|
48
65
|
{ id: "fuji-instax", label: "Fujifilm Instax", description: "Modern instant film", promptHint: "shot on Fujifilm Instax instant film, square frame with soft pastel tones, slight blue cast, gentle highlight rolloff, and the characteristic crisp white instax border" },
|
|
49
66
|
{ id: "disposable-camera", label: "Disposable Camera", description: "Single-use 90s/2000s film", promptHint: "shot on a single-use disposable film camera, gritty 90s/2000s aesthetic with harsh on-camera flash, blown highlights, color shift toward magenta, and gritty grain in shadows" },
|
|
50
|
-
{ id: "toy-camera-holga", label: "Toy Camera (Holga)", description: "Lo-fi Holga / Lomo plastic-lens", promptHint: "shot on a toy camera like a Holga or Lomo, heavy vignetting with light leaks, soft plastic-lens focus, lo-fi vintage character, and unpredictable color shifts" },
|
|
51
|
-
{ id: "tintype-wet-plate", label: "Tintype / Wet Plate", description: "Vintage wet-plate collodion", promptHint: "vintage tintype wet-plate collodion photograph, silver-mirror tonality with ethereal blur on edges, sepia-leaning monochrome, slow-exposure stillness, and antique surface character" },
|
|
67
|
+
{ id: "toy-camera-holga", label: "Toy Camera (Holga)", description: "Lo-fi Holga / Lomo plastic-lens", promptHint: "shot on a toy camera like a Holga or Lomo, heavy vignetting with light leaks, soft plastic-lens focus, lo-fi vintage character, and unpredictable color shifts", term: "holga toy camera" },
|
|
68
|
+
{ id: "tintype-wet-plate", label: "Tintype / Wet Plate", description: "Vintage wet-plate collodion", promptHint: "vintage tintype wet-plate collodion photograph, silver-mirror tonality with ethereal blur on edges, sepia-leaning monochrome, slow-exposure stillness, and antique surface character", term: "tintype wet-plate collodion" },
|
|
52
69
|
{ id: "daguerreotype", label: "Daguerreotype", description: "1840s silver-mirror process", promptHint: "1840s daguerreotype photograph, silver-mirror surface with slight ghostly blur from long exposure, hyper-vintage tonality, and the unmistakable reflective polished-plate quality" },
|
|
53
|
-
{ id: "security-cam", label: "Security Cam (CCTV)", description: "CCTV fisheye + timestamp overlay", promptHint: "CCTV security-camera footage, wide-angle fisheye distortion with visible timestamp overlay in the corner, low resolution monochrome or desaturated color, static interference lines, tracking artifacts, and surveillance-grade compression" },
|
|
54
|
-
{ id: "bw-film", label: "B&W Film", description: "Black and white film stock", promptHint: "shot on black and white film, rich grayscale tonality with classic film grain" },
|
|
55
|
-
{ id: "iphone", label: "iPhone", description: "Modern phone-camera look", promptHint: "shot on a modern iPhone, computational image processing with sharp clarity, slight HDR look, and characteristic phone-camera color science" },
|
|
70
|
+
{ id: "security-cam", label: "Security Cam (CCTV)", description: "CCTV fisheye + timestamp overlay", promptHint: "CCTV security-camera footage, wide-angle fisheye distortion with visible timestamp overlay in the corner, low resolution monochrome or desaturated color, static interference lines, tracking artifacts, and surveillance-grade compression", term: "cctv security camera footage" },
|
|
71
|
+
{ id: "bw-film", label: "B&W Film", description: "Black and white film stock", promptHint: "shot on black and white film, rich grayscale tonality with classic film grain", term: "black and white film" },
|
|
72
|
+
{ id: "iphone", label: "iPhone", description: "Modern phone-camera look", promptHint: "shot on a modern iPhone, computational image processing with sharp clarity, slight HDR look, and characteristic phone-camera color science", term: "iphone camera footage" },
|
|
56
73
|
] as const
|
|
57
74
|
|
|
58
75
|
const formatById = new Map<string, CameraFormat>(CAMERA_FORMATS.map((f) => [f.id, f]))
|
|
@@ -73,4 +90,9 @@ export function getCameraFormatPromptHint(id: string | undefined | null): string
|
|
|
73
90
|
return getCameraFormat(id)?.promptHint ?? ""
|
|
74
91
|
}
|
|
75
92
|
|
|
93
|
+
/** Compact-mode sibling of `getCameraFormatPromptHint` — same lookup, short form. */
|
|
94
|
+
export function getCameraFormatTerm(id: string | undefined | null): string {
|
|
95
|
+
return resolveTerm(getCameraFormat(id))
|
|
96
|
+
}
|
|
97
|
+
|
|
76
98
|
export const CAMERA_FORMAT_IDS: ReadonlyArray<string> = CAMERA_FORMATS.map((f) => f.id)
|