studio-lumiere-cli 0.1.6 → 0.1.7
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/README.md +550 -532
- package/dist/cli.js +9 -2
- package/dist/cli.js.map +1 -1
- package/dist/config/options.d.ts +1 -1
- package/dist/config/options.js +1 -1
- package/dist/config/options.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/pipelines/generateImages.js +26 -25
- package/dist/pipelines/generateImages.js.map +1 -1
- package/dist/pipelines/resolve.d.ts +2 -1
- package/dist/pipelines/resolve.js +12 -2
- package/dist/pipelines/resolve.js.map +1 -1
- package/dist/studio/constants.d.ts +2 -9
- package/dist/studio/constants.js +147 -95
- package/dist/studio/constants.js.map +1 -1
- package/dist/studio/promptBuilder.d.ts +1 -1
- package/dist/studio/promptBuilder.js +150 -125
- package/dist/studio/promptBuilder.js.map +1 -1
- package/dist/studio/types.d.ts +6 -0
- package/dist/types.d.ts +3 -0
- package/package.json +1 -1
package/dist/studio/constants.js
CHANGED
|
@@ -40,7 +40,8 @@ export const TEMPLATES = [
|
|
|
40
40
|
{ id: 'nail_french', name: 'French Manicure', value: 'classic french tip manicure', visualColor: '#FDF5E6' },
|
|
41
41
|
{ id: 'nail_natural', name: 'Natural & Clean', value: 'clean, natural unpainted nails with a clear healthy coat', visualColor: '#F3EFE0' },
|
|
42
42
|
{ id: 'nail_dark', name: 'Noir / Dark', value: 'chic dark black or burgundy nail polish', visualColor: '#1A1A1A' }
|
|
43
|
-
]
|
|
43
|
+
],
|
|
44
|
+
hasModel: true
|
|
44
45
|
},
|
|
45
46
|
{
|
|
46
47
|
id: 'neck_model',
|
|
@@ -63,7 +64,8 @@ export const TEMPLATES = [
|
|
|
63
64
|
{ id: 'makeup_soft', name: 'Soft Glam', value: 'polished elegant makeup with defined features, warm tones, sophisticated', visualColor: '#E8C4A8' },
|
|
64
65
|
{ id: 'makeup_full', name: 'Full Glam', value: 'bold glamorous makeup with defined eyes, statement lips, high-fashion finish', visualColor: '#CD9575' },
|
|
65
66
|
{ id: 'makeup_editorial', name: 'Editorial / Artistic', value: 'artistic editorial makeup with creative elements, runway-inspired, avant-garde', visualColor: '#8B4513' }
|
|
66
|
-
]
|
|
67
|
+
],
|
|
68
|
+
hasModel: true
|
|
67
69
|
},
|
|
68
70
|
{
|
|
69
71
|
id: 'ear_model',
|
|
@@ -85,7 +87,8 @@ export const TEMPLATES = [
|
|
|
85
87
|
{ id: 'makeup_soft', name: 'Soft Glam', value: 'polished elegant makeup with defined features, warm tones, sophisticated', visualColor: '#E8C4A8' },
|
|
86
88
|
{ id: 'makeup_full', name: 'Full Glam', value: 'bold glamorous makeup with defined eyes, statement lips, high-fashion finish', visualColor: '#CD9575' },
|
|
87
89
|
{ id: 'makeup_editorial', name: 'Editorial / Artistic', value: 'artistic editorial makeup with creative elements, runway-inspired, avant-garde', visualColor: '#8B4513' }
|
|
88
|
-
]
|
|
90
|
+
],
|
|
91
|
+
hasModel: true
|
|
89
92
|
},
|
|
90
93
|
{
|
|
91
94
|
id: 'flatlay_creative',
|
|
@@ -100,9 +103,15 @@ export const TEMPLATES = [
|
|
|
100
103
|
{ id: 'surf_velvet', name: 'Beige Velvet', value: 'placed on soft beige velvet fabric', visualColor: '#E3CDB8' },
|
|
101
104
|
{ id: 'surf_wood', name: 'Aged Wood', value: 'placed on rich, dark aged mahogany wood', visualColor: '#5C4033' },
|
|
102
105
|
{ id: 'surf_sand', name: 'Fine Sand', value: 'placed on rippled, fine white sand', visualColor: '#F5F5DC' },
|
|
106
|
+
{ id: 'surf_travertine', name: 'Travertine', value: 'placed on warm ivory travertine stone with subtle pitted texture', visualColor: '#E9DFC9' },
|
|
107
|
+
{ id: 'surf_obsidian', name: 'Black Obsidian', value: 'placed on a glossy black obsidian surface with deep reflective sheen', visualColor: '#0F0F10' },
|
|
108
|
+
{ id: 'surf_mirrored', name: 'Mirrored Glass', value: 'placed on a clean mirrored glass surface with soft reflections', visualColor: '#D6DDE5' },
|
|
109
|
+
{ id: 'surf_brushed_metal', name: 'Brushed Metal', value: 'placed on a brushed champagne metal surface with fine linear texture', visualColor: '#C7B9A5' },
|
|
110
|
+
{ id: 'surf_frosted_acrylic', name: 'Frosted Acrylic', value: 'placed on frosted acrylic with a soft diffused, milky translucence', visualColor: '#E8EDF0' },
|
|
103
111
|
{ id: 'surf_pedestal', name: 'Geometric Pedestal', value: 'displayed on a minimal matte geometric pedestal or cube, architectural and sculptural', visualColor: '#3D3D3D' },
|
|
104
112
|
{ id: 'surf_riser', name: 'Stone Riser', value: 'elevated on a raw natural stone riser or block, organic texture contrasting with polished jewelry', visualColor: '#8B8680' }
|
|
105
|
-
]
|
|
113
|
+
],
|
|
114
|
+
hasModel: false
|
|
106
115
|
},
|
|
107
116
|
{
|
|
108
117
|
id: 'floating_minimal',
|
|
@@ -116,22 +125,27 @@ export const TEMPLATES = [
|
|
|
116
125
|
{ id: 'light_hard', name: 'Hard Contrast', value: 'hard, dramatic direct lighting with sharp shadows', visualColor: '#000000' },
|
|
117
126
|
{ id: 'light_warm', name: 'Golden Glow', value: 'warm, golden sunset-hued lighting', visualColor: '#FFD700' },
|
|
118
127
|
{ id: 'light_cool', name: 'Cool Steel', value: 'cool, bluish steel-toned professional lighting', visualColor: '#B0C4DE' }
|
|
119
|
-
]
|
|
128
|
+
],
|
|
129
|
+
hasModel: false
|
|
120
130
|
},
|
|
121
131
|
{
|
|
122
132
|
id: 'half_body_muse',
|
|
123
133
|
name: 'The Editorial Muse',
|
|
124
134
|
description: 'A dynamic waist-up fashion shot showcasing how the jewelry complements a complete look.',
|
|
125
135
|
visualUrl: '/template_muse.png',
|
|
126
|
-
basePrompt: 'A waist-up medium shot of a sunningly beautiful [ETHNICITY] female model posing for an editorial. She is wearing the specific jewelry piece(s) shown. The composition focuses on how the jewelry accents her overall style. Authentic
|
|
136
|
+
basePrompt: 'A waist-up medium shot of a sunningly beautiful [ETHNICITY] female model posing for an editorial. Face, head, and shoulders clearly visible. Hands may appear but must not be the primary subject. Do NOT crop to hands only. She is wearing the specific jewelry piece(s) shown. The composition focuses on how the jewelry accents her overall style. Authentic skin texture with subtle variation, no heavy retouching, flyaway hairs, cinematic lighting, shot on film.',
|
|
127
137
|
customizationLabel: 'Fashion Style & Outfit',
|
|
128
138
|
customizationOptions: [
|
|
129
|
-
{ id: '
|
|
139
|
+
{ id: 'outfit_director_choice', name: 'Creative Director\'s Choice', value: 'let the stylist choose the most flattering outfit for the jewelry and selected mood; polished, high-fashion editorial styling; shoulders covered; no lingerie or overly revealing garments', visualColor: '#D9D2C8', visualImage: '/question.jpg' },
|
|
140
|
+
{ id: 'outfit_blazer', name: 'Power Suit (Blazer)', value: 'wearing a tailored, structured blazer over a sophisticated inner layer. Defined shoulders, clean lines, confident modern business-chic aesthetic', visualImage: '/power_blazer.png' },
|
|
141
|
+
{ id: 'outfit_tailored_jumpsuit', name: 'Tailored Jumpsuit', value: 'wearing a sleek tailored jumpsuit with long sleeves and a defined waist. Modern power silhouette; shoulders covered', visualColor: '#B9B1A7', visualImage: '/tailored_jumpsuit.jpg' },
|
|
130
142
|
{ id: 'outfit_evening', name: 'Evening Glamour', value: 'wearing a luxurious silk evening dress. Sophisticated, night-out aesthetic', visualImage: '/evening_glamour.png' },
|
|
143
|
+
{ id: 'outfit_leather_jacket', name: 'Leather Jacket', value: 'wearing a sleek black leather jacket layered over the outfit. Structured silhouette, fashion-forward edge', visualColor: '#2B2B2B', visualImage: '/jacket.jpg' },
|
|
131
144
|
{ id: 'outfit_linen', name: 'Resort Linen', value: 'wearing a breezy linen ensemble (button-down or light dress). Relaxed, vacation-luxe aesthetic', visualImage: '/resort_linen.png' },
|
|
132
145
|
{ id: 'outfit_knit', name: 'Cashmere Knit', value: 'wearing a soft, textured cashmere sweater. Cozy, quiet-luxury aesthetic', visualImage: '/cashmere_outfit.png' },
|
|
133
146
|
{ id: 'outfit_silk', name: 'Silk Shirt', value: 'wearing an elegant unbuttoned silk collared shirt, effortlessly chic. Classic, timeless sophistication', visualImage: '/silk_shirt.png' },
|
|
134
|
-
{ id: 'outfit_turtleneck', name: 'Turtleneck', value: 'wearing a sleek fitted turtleneck. Clean, modern minimalist aesthetic that lets the jewelry stand out', visualImage: '/turtleneck.png' }
|
|
147
|
+
{ id: 'outfit_turtleneck', name: 'Turtleneck', value: 'wearing a sleek fitted turtleneck. Clean, modern minimalist aesthetic that lets the jewelry stand out', visualImage: '/turtleneck.png' },
|
|
148
|
+
{ id: 'outfit_tailored_trench', name: 'Tailored Trench', value: 'wearing a tailored trench coat or overcoat with a refined drape. Sophisticated outerwear styling', visualColor: '#CBBEA6', visualImage: '/trench_coat.jpg' }
|
|
135
149
|
],
|
|
136
150
|
secondaryCustomizationLabel: 'Nail Polish',
|
|
137
151
|
secondaryCustomizationOptions: [
|
|
@@ -152,13 +166,32 @@ export const TEMPLATES = [
|
|
|
152
166
|
quaternaryCustomizationLabel: 'Poses & Expressions',
|
|
153
167
|
quaternaryCustomizationOptions: [
|
|
154
168
|
{ id: 'pose_winking', name: 'Winking', value: 'playfully winking at the camera with a confident smile', visualColor: '#F5F0EB', visualSvg: '<svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="20" cy="20" r="18" stroke="#A68A6B" stroke-width="1.5"/><line x1="11" y1="15" x2="17" y2="15" stroke="#A68A6B" stroke-width="1.5" stroke-linecap="round"/><circle cx="28" cy="15" r="2" fill="#A68A6B"/><path d="M13 26 Q20 31 27 26" stroke="#A68A6B" stroke-width="1.5" stroke-linecap="round" fill="none"/></svg>' },
|
|
155
|
-
{ id: 'pose_grimace', name: 'Playful Grimace', value: 'making a cute, playful grimace
|
|
169
|
+
{ id: 'pose_grimace', name: 'Playful Grimace', value: 'making a cute, playful grimace, full of personality', visualColor: '#F5F0EB', visualSvg: '<svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="20" cy="20" r="18" stroke="#A68A6B" stroke-width="1.5"/><circle cx="14" cy="14" r="2" fill="#A68A6B"/><circle cx="26" cy="14" r="2" fill="#A68A6B"/><path d="M14 18 Q17 16 20 18 Q23 16 26 18" stroke="#A68A6B" stroke-width="1" stroke-linecap="round" fill="none"/><path d="M13 26 L16 24 L19 26 L22 24 L25 26 L28 24" stroke="#A68A6B" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg>' },
|
|
156
170
|
{ id: 'pose_teasing', name: 'Teasing / Tongue Out', value: 'playfully sticking tongue out slightly, teasing and fun expression', visualColor: '#F5F0EB', visualSvg: '<svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="20" cy="20" r="18" stroke="#A68A6B" stroke-width="1.5"/><circle cx="14" cy="15" r="2" fill="#A68A6B"/><circle cx="26" cy="15" r="2" fill="#A68A6B"/><ellipse cx="20" cy="26" rx="4" ry="2.5" stroke="#A68A6B" stroke-width="1.5" fill="none"/><ellipse cx="20" cy="29" rx="2.5" ry="2" fill="#C4AD91"/></svg>' },
|
|
157
171
|
{ id: 'pose_kiss', name: 'Blowing a Kiss', value: 'blowing a kiss towards the camera, hand near mouth, flirty and fun', visualColor: '#F5F0EB', visualSvg: '<svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="20" cy="20" r="18" stroke="#A68A6B" stroke-width="1.5"/><circle cx="14" cy="15" r="2" fill="#A68A6B"/><circle cx="26" cy="15" r="2" fill="#A68A6B"/><path d="M18 25 Q20 28 22 25" stroke="#A68A6B" stroke-width="1.5" stroke-linecap="round" fill="none"/><path d="M30 8 L31 5 L33 7 Z" fill="#A68A6B" opacity="0.6"/><path d="M33 10 L35 8 L36 11 Z" fill="#A68A6B" opacity="0.4"/></svg>' },
|
|
158
172
|
{ id: 'pose_laughing', name: 'Candid Laugh', value: 'throwing head back in genuine, unposed laughter, joyous and radiant', visualColor: '#F5F0EB', visualSvg: '<svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="20" cy="20" r="18" stroke="#A68A6B" stroke-width="1.5"/><path d="M11 14 Q14 11 17 14" stroke="#A68A6B" stroke-width="1.5" stroke-linecap="round" fill="none"/><path d="M23 14 Q26 11 29 14" stroke="#A68A6B" stroke-width="1.5" stroke-linecap="round" fill="none"/><path d="M12 24 Q20 32 28 24" stroke="#A68A6B" stroke-width="1.5" stroke-linecap="round" fill="none"/><line x1="12" y1="24" x2="28" y2="24" stroke="#A68A6B" stroke-width="1.5" stroke-linecap="round"/></svg>' },
|
|
159
173
|
{ id: 'pose_pout', name: 'Model Pout', value: 'serious high-fashion model pout, intense gaze, editorial attitude', visualColor: '#F5F0EB', visualSvg: '<svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="20" cy="20" r="18" stroke="#A68A6B" stroke-width="1.5"/><line x1="11" y1="12" x2="17" y2="14" stroke="#A68A6B" stroke-width="1.5" stroke-linecap="round"/><line x1="29" y1="12" x2="23" y2="14" stroke="#A68A6B" stroke-width="1.5" stroke-linecap="round"/><circle cx="14" cy="16" r="1.5" fill="#A68A6B"/><circle cx="26" cy="16" r="1.5" fill="#A68A6B"/><ellipse cx="20" cy="27" rx="5" ry="2.5" fill="#C4AD91" opacity="0.3" stroke="#A68A6B" stroke-width="1.5"/></svg>' },
|
|
174
|
+
{ id: 'pose_power_tilt', name: 'Power Tilt', value: 'chin raised with a subtle head tilt, confident gaze, strong editorial attitude', visualColor: '#F5F0EB' },
|
|
175
|
+
{ id: 'pose_hand_ear', name: 'Hand to Ear', value: 'hand lifted near ear or temple, poised and composed, earrings visible if present', visualColor: '#F5F0EB' },
|
|
176
|
+
{ id: 'pose_profile', name: 'Side Profile', value: 'strong side profile with defined jawline, sleek posture, composed expression', visualColor: '#F5F0EB' },
|
|
177
|
+
{ id: 'pose_over_shoulder', name: 'Over-Shoulder', value: 'over-shoulder turn with elongated neck, subtle intensity, editorial confidence', visualColor: '#F5F0EB' },
|
|
160
178
|
{ id: 'pose_peace', name: 'Peace Sign', value: 'holding up a peace sign near face, cute and casual vibe', visualColor: '#F5F0EB', visualSvg: '<svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="20" cy="20" r="18" stroke="#A68A6B" stroke-width="1.5"/><circle cx="14" cy="15" r="2" fill="#A68A6B"/><circle cx="26" cy="15" r="2" fill="#A68A6B"/><path d="M14 25 Q20 29 26 25" stroke="#A68A6B" stroke-width="1.5" stroke-linecap="round" fill="none"/><line x1="33" y1="4" x2="31" y2="13" stroke="#A68A6B" stroke-width="1.5" stroke-linecap="round"/><line x1="36" y1="7" x2="34" y2="13" stroke="#A68A6B" stroke-width="1.5" stroke-linecap="round"/><path d="M30 13 Q32 14 35 13" stroke="#A68A6B" stroke-width="1" stroke-linecap="round" fill="none"/></svg>' }
|
|
161
|
-
]
|
|
179
|
+
],
|
|
180
|
+
quinaryCustomizationLabel: 'Accessories & Styling',
|
|
181
|
+
quinaryCustomizationOptions: [
|
|
182
|
+
{ id: 'accessory_sunglasses', name: 'Tinted Sunglasses', value: 'wearing refined tinted sunglasses with lenses translucent enough to clearly see the eyes; bold editorial styling; shoulders fully covered', visualColor: '#D9D9D9' },
|
|
183
|
+
{ id: 'accessory_silk_scarf', name: 'Silk Scarf', value: 'silk scarf styled at the neck or in the hair; elegant and refined; shoulders covered', visualColor: '#E7D4C8' },
|
|
184
|
+
{ id: 'accessory_silk_headband', name: 'Silk Headband', value: 'silk headband or hair wrap with refined styling; face unobstructed; shoulders covered', visualColor: '#BFA88F' },
|
|
185
|
+
{ id: 'accessory_sheer_gloves', name: 'Sheer Gloves', value: 'sheer mesh or fingerless gloves for editorial edge; keep rings and bracelets visible if present; shoulders covered', visualColor: '#DAD1C8' },
|
|
186
|
+
{ id: 'accessory_statement_belt', name: 'Statement Belt', value: 'bold waist belt or cinch over the outfit; polished and fashion-forward; shoulders covered', visualColor: '#7A6A58' },
|
|
187
|
+
{ id: 'accessory_silk_bandana', name: 'Silk Bandana', value: 'silk bandana styled as a head wrap or tied at the neck; refined styling; shoulders covered', visualColor: '#D8C7B8' },
|
|
188
|
+
{ id: 'accessory_silk_tie', name: 'Silk Necktie', value: 'sleek silk necktie or ribbon tie styled at the collar; fashion-forward tailoring; shoulders covered', visualColor: '#B7A091' },
|
|
189
|
+
{ id: 'accessory_hair_clip', name: 'Hair Clip', value: 'sleek hair clip or barrette with clean styling; face unobstructed; shoulders covered', visualColor: '#CBBBAA' },
|
|
190
|
+
{ id: 'accessory_beret', name: 'Beret', value: 'structured beret angled back so the face remains fully visible; editorial sophistication; shoulders covered', visualColor: '#5C4B3B' },
|
|
191
|
+
{ id: 'accessory_wide_brim_hat', name: 'Wide-Brim Hat', value: 'wide-brim hat tilted back so the face and eyes remain visible; editorial sophistication; shoulders covered', visualColor: '#4E4138' },
|
|
192
|
+
{ id: 'accessory_leather_gloves', name: 'Leather Gloves', value: 'sleek leather gloves with a tailored fit; keep rings and bracelets visible if present; shoulders covered', visualColor: '#2F2A26' }
|
|
193
|
+
],
|
|
194
|
+
hasModel: true
|
|
162
195
|
},
|
|
163
196
|
{
|
|
164
197
|
id: 'romance_proposal',
|
|
@@ -190,7 +223,8 @@ export const TEMPLATES = [
|
|
|
190
223
|
{ id: 'nail_french', name: 'French Manicure', value: 'classic french tip manicure', visualColor: '#FDF5E6' },
|
|
191
224
|
{ id: 'nail_natural', name: 'Natural & Clean', value: 'clean, natural unpainted nails with a clear healthy coat', visualColor: '#F3EFE0' },
|
|
192
225
|
{ id: 'nail_dark', name: 'Noir / Dark', value: 'chic dark black or burgundy nail polish', visualColor: '#1A1A1A' }
|
|
193
|
-
]
|
|
226
|
+
],
|
|
227
|
+
hasModel: true
|
|
194
228
|
},
|
|
195
229
|
{
|
|
196
230
|
id: 'museum_exhibit',
|
|
@@ -212,7 +246,8 @@ export const TEMPLATES = [
|
|
|
212
246
|
{ id: 'display_stand', name: 'Open Display on Stand', value: 'displayed openly on a minimal museum stand, accessible and commanding', visualColor: '#C0C0C0' },
|
|
213
247
|
{ id: 'display_wall', name: 'Museum Wall Mount', value: 'mounted on museum wall with professional track lighting and descriptive placard', visualColor: '#F5F5DC' },
|
|
214
248
|
{ id: 'display_alcove', name: 'Illuminated Alcove', value: 'placed in an illuminated alcove with dramatic recessed lighting and shadow play', visualColor: '#2C2C2C' }
|
|
215
|
-
]
|
|
249
|
+
],
|
|
250
|
+
hasModel: false
|
|
216
251
|
},
|
|
217
252
|
{
|
|
218
253
|
id: 'romantic_mood',
|
|
@@ -236,7 +271,8 @@ export const TEMPLATES = [
|
|
|
236
271
|
{ id: 'mood_moody', name: 'Moody & Dark', value: 'dark and dramatic mood with deep shadows, single warm light source, chiaroscuro romance, mysterious and intense', visualColor: '#2C1810' },
|
|
237
272
|
{ id: 'mood_golden', name: 'Golden Hour Glow', value: 'rich golden hour warmth, everything bathed in honeyed light, long soft shadows, magic hour romance', visualColor: '#A68A6B' },
|
|
238
273
|
{ id: 'mood_blush', name: 'Blush Pink Haze', value: 'soft blush pink and rose tones, dreamy and feminine, slightly hazy and ethereal, Valentine energy', visualColor: '#F4C2C2' }
|
|
239
|
-
]
|
|
274
|
+
],
|
|
275
|
+
hasModel: false
|
|
240
276
|
}
|
|
241
277
|
];
|
|
242
278
|
export const SKIN_TONES = [
|
|
@@ -278,12 +314,17 @@ export const ETHNICITIES = [
|
|
|
278
314
|
];
|
|
279
315
|
export const HAIR_COLORS = [
|
|
280
316
|
{ id: 'dark', name: 'Jet Black', value: 'deep jet black hair with a natural healthy sheen', visualColor: '#000000' },
|
|
281
|
-
{ id: 'brunette', name: 'Rich Brunette', value: 'rich chocolate brown
|
|
317
|
+
{ id: 'brunette', name: 'Rich Brunette', value: 'rich chocolate brown hair with subtle lowlights and shine', visualColor: '#4A3728' },
|
|
318
|
+
{ id: 'light_brown', name: 'Light Brown', value: 'natural light brown hair with soft warmth and dimension', visualColor: '#7A5A3A' },
|
|
319
|
+
{ id: 'natural_blonde', name: 'Natural Blonde', value: 'soft natural blonde hair with balanced warmth and subtle highlights', visualColor: '#DDBB7E' },
|
|
282
320
|
{ id: 'honey_blonde', name: 'Honey Blonde', value: 'warm honey blonde hair with golden tones', visualColor: '#D4AF37' },
|
|
283
|
-
{ id: 'blonde', name: 'Platinum Blonde', value: 'cool platinum blonde hair, sleek
|
|
321
|
+
{ id: 'blonde', name: 'Platinum / Icy Blonde', value: 'cool platinum blonde hair with an icy, sleek finish', visualColor: '#F5F5DC' },
|
|
284
322
|
{ id: 'strawberry', name: 'Strawberry Blonde', value: 'soft strawberry blonde hair with warm reddish-gold undertones', visualColor: '#E6CBA5' },
|
|
323
|
+
{ id: 'copper_red', name: 'Copper Red', value: 'vibrant copper red hair with glossy warmth and natural depth', visualColor: '#C66A2F' },
|
|
324
|
+
{ id: 'chestnut_red', name: 'Chestnut Red', value: 'rich chestnut red hair with warm brown undertones', visualColor: '#8B4A2B' },
|
|
285
325
|
{ id: 'auburn', name: 'Deep Auburn', value: 'intense deep auburn red hair with rich copper highlights', visualColor: '#8D4004' },
|
|
286
|
-
{ id: '
|
|
326
|
+
{ id: 'mahogany', name: 'Mahogany', value: 'deep mahogany red-brown hair with subtle wine undertones', visualColor: '#6B2E2E' },
|
|
327
|
+
{ id: 'silver', name: 'Metallic Silver', value: 'high-shine metallic silver hair with a cool chrome sheen', visualColor: '#BFC3C7' },
|
|
287
328
|
];
|
|
288
329
|
export const BACKGROUNDS = [
|
|
289
330
|
{ id: 'none', name: 'None', value: '', visualColor: 'transparent' },
|
|
@@ -315,11 +356,20 @@ export const STUDIO_FLAT_POOL = [
|
|
|
315
356
|
'flawless studio environment with a smooth, matte backdrop'
|
|
316
357
|
];
|
|
317
358
|
export const OUTDOOR_POOL = [
|
|
318
|
-
'softly blurred outdoor
|
|
319
|
-
'
|
|
320
|
-
'elegant
|
|
321
|
-
'serene
|
|
322
|
-
'
|
|
359
|
+
'softly blurred outdoor environment with cinematic bokeh',
|
|
360
|
+
'garden or terrace exterior with softly out-of-focus foliage and architectural details',
|
|
361
|
+
'elegant outdoor setting with depth and atmospheric blur',
|
|
362
|
+
'serene exterior landscape softly out of focus in the distance',
|
|
363
|
+
'outdoor scene with subtle haze and gentle background separation',
|
|
364
|
+
'courtyard exterior with stone textures and softly blurred greenery',
|
|
365
|
+
'rooftop terrace with distant cityscape softened into elegant bokeh',
|
|
366
|
+
'botanical garden walkway with lush foliage softly receding into blur',
|
|
367
|
+
'villa exterior with textured walls and archways blurred in the background',
|
|
368
|
+
'outdoor colonnade or veranda with soft depth-of-field and architectural rhythm',
|
|
369
|
+
'terrace with sculptural planters and a softly blurred horizon line',
|
|
370
|
+
'elegant exterior stairway or landing with shallow depth and creamy bokeh',
|
|
371
|
+
'garden wall or pergola backdrop with soft lens blur and atmospheric depth',
|
|
372
|
+
'waterfront or poolside exterior suggested as soft reflections and bokeh shapes'
|
|
323
373
|
];
|
|
324
374
|
export const MACRO_TEXTURE_POOL = [
|
|
325
375
|
'abstract macro textural background of softly draped silk filling the frame',
|
|
@@ -380,7 +430,58 @@ export const VIBES = [
|
|
|
380
430
|
{ id: 'high_fashion_flash', name: 'Editorial Flash', value: 'hard direct flash, sharp highlights, distinct shadows, high-energy fashion editorial, 90s aesthetic, sharp micro-contrast', visualImage: '/editorial_flash.jpg' },
|
|
381
431
|
{ id: 'analog_dream', name: 'Analog Dream', value: 'shot on vintage 35mm film, subtle light leaks, rich saturated colors, nostalgic soft focus, Kodak Ektar 100, authentic film grain', visualImage: '/analog_dream.jpg' },
|
|
382
432
|
{ id: 'midnight_glamour', name: 'Midnight Glamour', value: 'deep moody atmosphere, rich jewel tones, single dramatic spotlight cutting through darkness, luxurious midnight aesthetic, sharp reflections on metal', visualImage: '/midnight_glamour.jpg' },
|
|
383
|
-
{ id: 'editorial_daylight', name: 'Sun-Drenched', value: 'bright diffused daylight, overexposed highlights, soft dreamy aesthetic, high-end magazine cover style,
|
|
433
|
+
{ id: 'editorial_daylight', name: 'Sun-Drenched', value: 'bright diffused daylight, overexposed highlights, soft dreamy aesthetic, high-end magazine cover style, sun-drenched', visualImage: '/sun_drenched.jpg' },
|
|
434
|
+
];
|
|
435
|
+
export const PHOTOGRAPHY_STYLES = [
|
|
436
|
+
{
|
|
437
|
+
id: 'ethereal_dream',
|
|
438
|
+
name: 'Ethereal Dream',
|
|
439
|
+
description: 'Soft-focus, painterly textures, and haunting, impressionist tones.',
|
|
440
|
+
value: 'painterly surrealist photography, heavy soft-focus, blurred motion, desaturated impressionist palette, glowing highlights, inspired by Sarah Moon and Paolo Roversi',
|
|
441
|
+
visualColor: 'linear-gradient(135deg, #d3c4be, #8e7d76)'
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
id: 'heritage_luxury',
|
|
445
|
+
name: 'High-Flash Raw',
|
|
446
|
+
description: 'Direct flash, punchy highlights, gritty editorial energy.',
|
|
447
|
+
value: 'direct flash photography, high-contrast punch, bold specular highlights, gritty editorial realism, inspired by Juergen Teller and Terry Richardson',
|
|
448
|
+
visualColor: 'linear-gradient(135deg, #f1f0ef, #6e6a67)'
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
id: 'modern_edge',
|
|
452
|
+
name: 'Modern Edge',
|
|
453
|
+
description: 'Bolder contrast, sharper angles, fashion-forward tension.',
|
|
454
|
+
value: 'modern edgy fashion photography, bold contrast, crisp angles, graphic shadows, assertive composition, inspired by Helmut Newton and Steven Klein',
|
|
455
|
+
visualColor: 'linear-gradient(135deg, #2d2f35, #6f7a88)'
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
id: 'soft_natural',
|
|
459
|
+
name: 'Chromatic Gel',
|
|
460
|
+
description: 'Color-gel lighting, bold casts, nightclub editorial edge.',
|
|
461
|
+
value: 'color gel lighting, bold chromatic casts, magenta and cyan accents, high-energy fashion editorial, inspired by David LaChapelle and Nadia Lee Cohen',
|
|
462
|
+
visualColor: 'linear-gradient(135deg, #351b5e, #8aa6ff)'
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
id: 'acid_lofi',
|
|
466
|
+
name: 'Acid Infrared',
|
|
467
|
+
description: 'Extreme false-color shifts, thermal aesthetics, and psychedelic saturation.',
|
|
468
|
+
value: 'false-color infrared photography, Aerochrome style, vivid hot pinks and deep teals, high grain, surreal alien atmosphere, inspired by Richard Mosse',
|
|
469
|
+
visualColor: 'linear-gradient(135deg, #ff007f, #00ffcc)'
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
id: 'cyber_grit',
|
|
473
|
+
name: 'Cyber-Grit Noir',
|
|
474
|
+
description: 'High-contrast grain, light trails, and chaotic digital distortion.',
|
|
475
|
+
value: 'experimental long exposure, aggressive film grain, light trailing, high-contrast black and white, digital glitch artifacts, inspired by Daido Moriyama',
|
|
476
|
+
visualColor: 'linear-gradient(135deg, #000000, #4a4a4a)'
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
id: 'cinematic_editorial',
|
|
480
|
+
name: 'Cinematic Editorial',
|
|
481
|
+
description: 'Filmic tone, rich depth, dramatic direction.',
|
|
482
|
+
value: 'cinematic editorial photography, rich tonal depth, filmic color grading, anamorphic lens flares, narrative storytelling, dramatic but refined, inspired by Nick Knight and Craig McDean',
|
|
483
|
+
visualColor: 'linear-gradient(135deg, #1b1a1f, #394152)'
|
|
484
|
+
}
|
|
384
485
|
];
|
|
385
486
|
export const OCCASIONS = [
|
|
386
487
|
{
|
|
@@ -388,13 +489,9 @@ export const OCCASIONS = [
|
|
|
388
489
|
name: 'Moroccan Wedding',
|
|
389
490
|
icon: '👰',
|
|
390
491
|
description: 'Traditional Moroccan wedding luxury aesthetic with rich cultural details',
|
|
391
|
-
autoConfig: { vibe: 'golden_hour', background: 'gold', backgroundType: 'luxury_interior' },
|
|
392
492
|
promptDetails: {
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
colorPalette: 'Rich jewel tones - deep crimson red, emerald green, royal purple, and abundant gold accents. Ivory and cream for contrast. Warm, luxurious color temperature',
|
|
396
|
-
culturalElements: 'Subtle traditional Moroccan bridal elements may include: intricate henna patterns visible on hands, traditional gold jewelry aesthetic, rich embroidered fabrics, Moroccan rose petals, ornate brass serving pieces in blurred background',
|
|
397
|
-
styling: 'Model styled as an elegant Moroccan bride or guest. Hair in traditional styling, makeup elegant and defined, traditional gold jewelry aesthetic. If visible, clothing suggests luxury kaftan or takchita with gold embroidery and embellishments'
|
|
493
|
+
culturalElements: 'Subtle Moroccan bridal motifs: delicate henna patterns (only if hands appear), refined zellige or arabesque patterns, ornate brass accents, rich embroidered textiles.',
|
|
494
|
+
decor: 'Soft lantern glow, silk cushions, carved wood accents, warm metallic details.'
|
|
398
495
|
}
|
|
399
496
|
},
|
|
400
497
|
{
|
|
@@ -402,13 +499,9 @@ export const OCCASIONS = [
|
|
|
402
499
|
name: 'Eid al-Fitr',
|
|
403
500
|
icon: '🌙',
|
|
404
501
|
description: 'Elegant celebration of Eid al-Fitr with festive, joyful atmosphere',
|
|
405
|
-
autoConfig: { vibe: 'clean_minimal', background: 'emerald_green', backgroundType: 'luxury_interior' },
|
|
406
502
|
promptDetails: {
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
colorPalette: 'Emerald green, gold, white, and soft pastels. Fresh and luminous tones',
|
|
410
|
-
culturalElements: 'Subtle festive Eid elements - elegant Islamic geometric patterns, fresh flowers, refined decorative details',
|
|
411
|
-
styling: 'Model styled in celebration attire with polished, festive makeup and elegant hair. Joyful, refined aesthetic'
|
|
503
|
+
culturalElements: 'Elegant Islamic geometric motifs, refined festive cues, fresh florals in a celebratory spirit.',
|
|
504
|
+
decor: 'Subtle lantern accents, delicate florals, soft celebratory details.'
|
|
412
505
|
}
|
|
413
506
|
},
|
|
414
507
|
{
|
|
@@ -416,13 +509,9 @@ export const OCCASIONS = [
|
|
|
416
509
|
name: 'Eid al-Adha',
|
|
417
510
|
icon: '🕌',
|
|
418
511
|
description: 'Sophisticated Eid al-Adha celebration with refined elegance',
|
|
419
|
-
autoConfig: { vibe: 'golden_hour', background: 'gold', backgroundType: 'luxury_interior' },
|
|
420
512
|
promptDetails: {
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
colorPalette: 'Rich gold, burgundy, deep greens, cream. Warm, sophisticated tones',
|
|
424
|
-
culturalElements: 'Elegant cultural references - refined Islamic art patterns, luxury fabrics, traditional elements in modern interpretation',
|
|
425
|
-
styling: 'Model styled with sophisticated elegance. Rich makeup, refined styling, traditional yet contemporary aesthetic'
|
|
513
|
+
culturalElements: 'Refined Islamic art motifs, luxury fabrics, dignified celebratory cues in a modern interpretation.',
|
|
514
|
+
decor: 'Warm golden accents, elegant textiles, understated celebratory details.'
|
|
426
515
|
}
|
|
427
516
|
},
|
|
428
517
|
{
|
|
@@ -430,13 +519,9 @@ export const OCCASIONS = [
|
|
|
430
519
|
name: 'Henna Night',
|
|
431
520
|
icon: '🎨',
|
|
432
521
|
description: 'Traditional Moroccan henna ceremony with intricate cultural elements',
|
|
433
|
-
autoConfig: { vibe: 'golden_hour', background: 'terracotta', backgroundType: 'luxury_interior' },
|
|
434
522
|
promptDetails: {
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
colorPalette: 'Warm terracotta, deep orange, burgundy, gold. Earthy and rich with golden accents',
|
|
438
|
-
culturalElements: 'Intricate henna patterns prominently visible on hands if showing hands. Traditional lanterns, Moroccan textiles, ornate serving pieces. Rose water ambiance',
|
|
439
|
-
styling: 'Model styled as if at traditional henna ceremony. Elaborate henna designs, traditional jewelry, warm glowing makeup, cultural celebration aesthetic'
|
|
523
|
+
culturalElements: 'Intricate henna motifs (only if hands appear), Moroccan lanterns, traditional textiles, ceremonial elegance.',
|
|
524
|
+
decor: 'Lantern light, embroidered cushions, ornate trays, rose-water ceremony cues.'
|
|
440
525
|
}
|
|
441
526
|
},
|
|
442
527
|
{
|
|
@@ -444,13 +529,9 @@ export const OCCASIONS = [
|
|
|
444
529
|
name: 'Ramadan',
|
|
445
530
|
icon: '⭐',
|
|
446
531
|
description: 'Serene Ramadan atmosphere with spiritual elegance',
|
|
447
|
-
autoConfig: { vibe: 'moody_chic', background: 'midnight_blue', backgroundType: 'luxury_interior' },
|
|
448
532
|
promptDetails: {
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
colorPalette: 'Deep midnight blue, silver, soft gold, white. Cool, peaceful tones with metallic accents',
|
|
452
|
-
culturalElements: 'Subtle Ramadan elements - soft lantern light, crescent moon motifs, dates, refined Islamic patterns, peaceful spiritual aesthetic',
|
|
453
|
-
styling: 'Model styled with serene, natural elegance. Soft, glowing makeup. Modest, refined aesthetic'
|
|
533
|
+
culturalElements: 'Soft lantern glow, crescent motifs, dates, refined Islamic patterns, peaceful spiritual cues.',
|
|
534
|
+
decor: 'Subtle lanterns, quiet reflective accents, minimal ceremonial details.'
|
|
454
535
|
}
|
|
455
536
|
},
|
|
456
537
|
{
|
|
@@ -458,13 +539,9 @@ export const OCCASIONS = [
|
|
|
458
539
|
name: "Valentine's Day",
|
|
459
540
|
icon: '❤️',
|
|
460
541
|
description: 'Romantic ambiance with rose petals and soft candlelight',
|
|
461
|
-
autoConfig: { vibe: 'romantic_soft', background: 'blush_pink', backgroundType: 'studio' },
|
|
462
542
|
promptDetails: {
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
colorPalette: 'Blush pink, soft red, cream, rose gold. Warm, romantic, delicate tones',
|
|
466
|
-
culturalElements: 'Rose petals scattered elegantly, soft romantic florals, intimate candlelight glow, love celebration aesthetic',
|
|
467
|
-
styling: 'Model styled with romantic, soft makeup. Natural, glowing skin. Dreamy, feminine aesthetic'
|
|
543
|
+
culturalElements: 'Rose petals, soft romantic florals, gentle candlelight glow, love-celebration cues.',
|
|
544
|
+
decor: 'Subtle candles, delicate petals, soft romantic textile accents.'
|
|
468
545
|
}
|
|
469
546
|
},
|
|
470
547
|
{
|
|
@@ -472,13 +549,9 @@ export const OCCASIONS = [
|
|
|
472
549
|
name: "Mother's Day",
|
|
473
550
|
icon: '🌸',
|
|
474
551
|
description: 'Warm, tender atmosphere celebrating maternal love',
|
|
475
|
-
autoConfig: { vibe: 'golden_hour', background: 'soft_lavender', backgroundType: 'studio' },
|
|
476
552
|
promptDetails: {
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
colorPalette: 'Soft lavender, warm peach, cream, gentle pastels. Warm, comforting tones',
|
|
480
|
-
culturalElements: 'Delicate spring flowers, soft fabrics, warm comforting aesthetic, celebration of motherhood',
|
|
481
|
-
styling: 'Model styled with warm, natural elegance. Soft makeup, genuine warmth. Maternal grace'
|
|
553
|
+
culturalElements: 'Delicate spring flowers, soft fabrics, warm and caring celebratory cues.',
|
|
554
|
+
decor: 'Gentle florals, light ribbons, comforting soft accents.'
|
|
482
555
|
}
|
|
483
556
|
},
|
|
484
557
|
{
|
|
@@ -486,13 +559,9 @@ export const OCCASIONS = [
|
|
|
486
559
|
name: 'Birthday',
|
|
487
560
|
icon: '🎂',
|
|
488
561
|
description: 'Celebratory and joyful setting with festive elements',
|
|
489
|
-
autoConfig: { vibe: 'clean_minimal', background: 'champagne_gold', backgroundType: 'studio' },
|
|
490
562
|
promptDetails: {
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
colorPalette: 'Champagne gold, white, soft pastels, metallic accents. Festive, bright tones',
|
|
494
|
-
culturalElements: 'Elegant celebration elements, refined party aesthetic, joyful festive details',
|
|
495
|
-
styling: 'Model styled for celebration with polished, festive makeup. Joyful, confident aesthetic'
|
|
563
|
+
culturalElements: 'Refined celebration cues, subtle party accents, joyful festive details.',
|
|
564
|
+
decor: 'Minimal celebratory decor, soft ribbons or confetti bokeh, tasteful party touches.'
|
|
496
565
|
}
|
|
497
566
|
},
|
|
498
567
|
{
|
|
@@ -500,13 +569,9 @@ export const OCCASIONS = [
|
|
|
500
569
|
name: 'Anniversary',
|
|
501
570
|
icon: '💍',
|
|
502
571
|
description: 'Elegant, timeless aesthetic for commemorating special milestones',
|
|
503
|
-
autoConfig: { vibe: 'golden_hour', background: 'gold', backgroundType: 'luxury_interior' },
|
|
504
572
|
promptDetails: {
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
colorPalette: 'Rich gold, champagne, cream, deep burgundy. Luxurious, timeless tones',
|
|
508
|
-
culturalElements: 'Elegant romantic details, luxurious fabrics, refined celebration aesthetic, timeless sophistication',
|
|
509
|
-
styling: 'Model styled with timeless elegance. Classic, sophisticated makeup. Enduring beauty'
|
|
573
|
+
culturalElements: 'Elegant romantic details, luxurious fabrics, refined celebration cues, timeless sophistication.',
|
|
574
|
+
decor: 'Soft candlelight accents, understated florals, quiet romantic touches.'
|
|
510
575
|
}
|
|
511
576
|
},
|
|
512
577
|
{
|
|
@@ -514,13 +579,9 @@ export const OCCASIONS = [
|
|
|
514
579
|
name: 'Graduation',
|
|
515
580
|
icon: '🎓',
|
|
516
581
|
description: 'Proud and accomplished atmosphere with sophisticated styling',
|
|
517
|
-
autoConfig: { vibe: 'clean_minimal', background: 'white', backgroundType: 'studio' },
|
|
518
582
|
promptDetails: {
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
colorPalette: 'Clean white, navy blue, gold accents. Professional, accomplished tones',
|
|
522
|
-
culturalElements: 'Academic achievement aesthetic, professional polish, celebration of success',
|
|
523
|
-
styling: 'Model styled with confident, professional polish. Clean, sophisticated makeup. Achievement glow'
|
|
583
|
+
culturalElements: 'Academic achievement cues, professional polish, celebration of success.',
|
|
584
|
+
decor: 'Subtle graduation motifs (cap/tassel suggested in decor only), understated celebratory details.'
|
|
524
585
|
}
|
|
525
586
|
},
|
|
526
587
|
{
|
|
@@ -528,13 +589,9 @@ export const OCCASIONS = [
|
|
|
528
589
|
name: 'Christmas',
|
|
529
590
|
icon: '🎄',
|
|
530
591
|
description: 'Festive holiday spirit with elegant seasonal decorations',
|
|
531
|
-
autoConfig: { vibe: 'golden_hour', background: 'forest_green', backgroundType: 'luxury_interior' },
|
|
532
592
|
promptDetails: {
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
colorPalette: 'Deep forest green, rich red, gold, cream. Classic holiday luxury tones',
|
|
536
|
-
culturalElements: 'Elegant holiday elements - pine branches, warm candlelight, luxurious seasonal decor, festive sophistication',
|
|
537
|
-
styling: 'Model styled with festive elegance. Rich, warm makeup. Holiday glamour'
|
|
593
|
+
culturalElements: 'Pine greenery, warm candlelight, refined holiday accents, festive sophistication.',
|
|
594
|
+
decor: 'Subtle evergreen boughs, soft twinkle-light bokeh, understated holiday touches.'
|
|
538
595
|
}
|
|
539
596
|
},
|
|
540
597
|
{
|
|
@@ -542,13 +599,9 @@ export const OCCASIONS = [
|
|
|
542
599
|
name: 'New Year',
|
|
543
600
|
icon: '✨',
|
|
544
601
|
description: 'Glamorous celebration with sparkle and sophistication',
|
|
545
|
-
autoConfig: { vibe: 'moody_chic', background: 'midnight_blue', backgroundType: 'luxury_interior' },
|
|
546
602
|
promptDetails: {
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
colorPalette: 'Midnight blue, silver, gold, black. Dramatic, sophisticated evening tones',
|
|
550
|
-
culturalElements: 'Elegant evening celebration, sophisticated party aesthetic, champagne glamour, new year sparkle',
|
|
551
|
-
styling: 'Model styled with dramatic evening glamour. Bold, sophisticated makeup. Celebration elegance'
|
|
603
|
+
culturalElements: 'Elegant evening celebration cues, refined party aesthetic, champagne glamour, new-year sparkle.',
|
|
604
|
+
decor: 'Subtle glitter bokeh, minimalist celebratory accents, midnight celebration details.'
|
|
552
605
|
}
|
|
553
606
|
}
|
|
554
607
|
];
|
|
@@ -587,7 +640,6 @@ export const GENERATION_STYLE_POOL = [
|
|
|
587
640
|
"Model interacting with the environment (e.g., leaning against a wall or window), natural vibe.",
|
|
588
641
|
"A 'moment of preparation' look, looking down as if adjusting the clasp or admiring the piece.",
|
|
589
642
|
"Holding a glass or prop near the face, adding lifestyle context without obscuring the jewelry.",
|
|
590
|
-
"Shielding eyes from the 'sun' with a hand, casting interesting shadow patterns on the face.",
|
|
591
643
|
"Resting head on a hand, casual but elegant, creating a relaxed luxury feel.",
|
|
592
644
|
// Avant-Garde & High Fashion
|
|
593
645
|
"An artistic, slightly off-center composition (rule of thirds) for a modern magazine look.",
|