@nodaro/prompts 1.25.1 → 1.26.0
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 +9 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +9 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/fixtures/parameter-hint-golden.json +9 -9
- package/src/__tests__/transitions-scope.test.ts +58 -0
- package/src/person.ts +1 -0
- package/src/setting.ts +2 -0
- package/src/styling.ts +2 -0
- package/src/transitions.ts +4 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nodaro/prompts",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.26.0",
|
|
4
4
|
"description": "Nodaro's prompt-engineering layer — person/picker catalogs with prompt hints, identity-lock clauses, entity prompt builders, brand presets, and prompt/reference assembly shared by the Nodaro platform and SDK.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "FSL-1.1-Apache-2.0",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"test": "vitest run"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@nodaro/shared": "^3.
|
|
23
|
+
"@nodaro/shared": "^3.13.0"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"tsup": "^8.5.0",
|
|
@@ -1831,7 +1831,7 @@
|
|
|
1831
1831
|
"hairColor": "hair-platinum",
|
|
1832
1832
|
"eyebrows": "brows-natural",
|
|
1833
1833
|
"skinTone": "skin-very-fair",
|
|
1834
|
-
"skinTexture": "texture-
|
|
1834
|
+
"skinTexture": "texture-natural",
|
|
1835
1835
|
"eyeColor": "eyes-brown",
|
|
1836
1836
|
"eyeState": "eye-state-closed",
|
|
1837
1837
|
"facialHair": "face-clean-shaven",
|
|
@@ -1839,7 +1839,7 @@
|
|
|
1839
1839
|
}
|
|
1840
1840
|
},
|
|
1841
1841
|
"ctx": null,
|
|
1842
|
-
"expected": "a man, a baby under 1 year old, of Asian descent, a California beach aesthetic — laid-back beach-town vibe, golden-hour sun-warmed energy, easy carefree mood, petite, lean build, an oval face shape, a strong, sharply defined jawline, almond-shaped eyes, a straight nose, thin lips, with chapped, cracked, weather-worn dry lips, a shaved bald head, platinum blonde hair, very pale and icy, natural eyebrows, very fair pale skin, with
|
|
1842
|
+
"expected": "a man, a baby under 1 year old, of Asian descent, a California beach aesthetic — laid-back beach-town vibe, golden-hour sun-warmed energy, easy carefree mood, petite, lean build, an oval face shape, a strong, sharply defined jawline, almond-shaped eyes, a straight nose, thin lips, with chapped, cracked, weather-worn dry lips, a shaved bald head, platinum blonde hair, very pale and icy, natural eyebrows, very fair pale skin, with natural, unretouched skin — visible pores and small, even variation in tone, brown eyes, with eyes fully closed in a peaceful expression, clean-shaven, wearing glasses"
|
|
1843
1843
|
},
|
|
1844
1844
|
{
|
|
1845
1845
|
"key": "person/last-of-each",
|
|
@@ -2518,17 +2518,17 @@
|
|
|
2518
2518
|
"expected": "set in a cozy coffee shop interior with warm pendant lights, exposed brick walls and steam drifting over espresso machines"
|
|
2519
2519
|
},
|
|
2520
2520
|
{
|
|
2521
|
-
"key": "setting/id:
|
|
2521
|
+
"key": "setting/id:neon-alley",
|
|
2522
2522
|
"note": "single-dim catalog id",
|
|
2523
2523
|
"node": {
|
|
2524
2524
|
"id": "n1",
|
|
2525
2525
|
"type": "setting",
|
|
2526
2526
|
"data": {
|
|
2527
|
-
"setting": "
|
|
2527
|
+
"setting": "neon-alley"
|
|
2528
2528
|
}
|
|
2529
2529
|
},
|
|
2530
2530
|
"ctx": null,
|
|
2531
|
-
"expected": "set in a
|
|
2531
|
+
"expected": "set in a rain-soaked neon-lit alley in a Tokyo-style nightlife district with glowing kanji signs, steam vents and reflective puddles"
|
|
2532
2532
|
},
|
|
2533
2533
|
{
|
|
2534
2534
|
"key": "setting/id:wasteland",
|
|
@@ -2674,7 +2674,7 @@
|
|
|
2674
2674
|
"id": "n1",
|
|
2675
2675
|
"type": "styling",
|
|
2676
2676
|
"data": {
|
|
2677
|
-
"makeup": "makeup-
|
|
2677
|
+
"makeup": "makeup-bare",
|
|
2678
2678
|
"hairCut": "cut-sisterlocks",
|
|
2679
2679
|
"hairTreatment": "treatment-rooted",
|
|
2680
2680
|
"hairState": "hair-flowing",
|
|
@@ -2694,7 +2694,7 @@
|
|
|
2694
2694
|
}
|
|
2695
2695
|
},
|
|
2696
2696
|
"ctx": null,
|
|
2697
|
-
"expected": "with
|
|
2697
|
+
"expected": "with a completely bare face, no makeup at all, in thin neat sisterlocks, with a rooted look — visible darker roots blending into lighter lengths, with hair flowing freely, strands cascading and rippling with subtle movement, wearing wraparound sport sunglasses, wearing a wide-brim Western cowboy hat with a creased crown, wearing a thin metallic body chain draped across the torso, with classic French tip manicure, with warrior war paint streaked across the face, dressed in a long flowing caftan robe, a full-length garment worn across the Middle East and North Africa, wearing a strapless bandeau top wrapped across the chest, in fitted lycra bike shorts ending mid-thigh, wearing a plush fur coat with a deep textured pile, with bunched knit leg warmers stacked over the calves, in woven jute-sole espadrilles with a canvas upper, a casual summer shoe, wearing glossy latex with a high-shine liquid look clinging to the body, the outfit composed of multiple stacked layers, each piece visible at the edges"
|
|
2698
2698
|
},
|
|
2699
2699
|
{
|
|
2700
2700
|
"key": "styling/mid-of-each",
|
|
@@ -2703,7 +2703,7 @@
|
|
|
2703
2703
|
"id": "n1",
|
|
2704
2704
|
"type": "styling",
|
|
2705
2705
|
"data": {
|
|
2706
|
-
"makeup": "makeup-
|
|
2706
|
+
"makeup": "makeup-editorial",
|
|
2707
2707
|
"hairCut": "cut-side-swept",
|
|
2708
2708
|
"hairTreatment": "treatment-sombre",
|
|
2709
2709
|
"hairState": "hair-voluminous",
|
|
@@ -2723,7 +2723,7 @@
|
|
|
2723
2723
|
}
|
|
2724
2724
|
},
|
|
2725
2725
|
"ctx": null,
|
|
2726
|
-
"expected": "with
|
|
2726
|
+
"expected": "with avant-garde editorial makeup, artistic and unconventional, side-swept across the face with strands falling over one eye, with sombré — a subtle, soft ombré gradient, with hair full of volume, blown out and bouncy with body and lift at the roots, wearing round wire-frame glasses, John Lennon style, wearing a striped pharaonic nemes headdress with a golden uraeus cobra at the brow, wearing a black leather choker fitted close around the throat, with dark black nail polish, with tribal-inspired face markings, wrapped in a plush terrycloth bathrobe tied at the waist, wearing a thin satin camisole with delicate spaghetti straps, in casual mid-thigh shorts, wearing a quilted puffer jacket with horizontal baffles and a stand-up collar, with lace-topped thigh-high stockings cinched mid-thigh, in polished leather penny loafers, wearing warm woven wool with a soft matte surface and visible fibers, the top neatly tucked into the bottom"
|
|
2727
2727
|
},
|
|
2728
2728
|
{
|
|
2729
2729
|
"key": "styling/one-dimension",
|
|
@@ -65,6 +65,64 @@ describe("approved row bodies", () => {
|
|
|
65
65
|
})
|
|
66
66
|
})
|
|
67
67
|
|
|
68
|
+
describe("F1 bodies — the subject becomes the material and reforms (2026-09-25 A/B, arm B won)", () => {
|
|
69
|
+
// The approved drafts, tidied to read like every other row inside `term (…)`:
|
|
70
|
+
// first letter lower-cased, final full stop dropped. Nothing else differs from the draft.
|
|
71
|
+
const F1_BODIES: Record<string, { term: string; body: string }> = {
|
|
72
|
+
"dissolve-to-mist": {
|
|
73
|
+
term: "dissolve to mist",
|
|
74
|
+
body:
|
|
75
|
+
"the first subject loses its solid form and turns into a soft cloud of fine mist, starting at its " +
|
|
76
|
+
"edges and working inward. The camera stays where it is and the framing does not change. The mist " +
|
|
77
|
+
"drifts through the frame and thins until the first shot is gone, then gathers again at the same " +
|
|
78
|
+
"place in the frame and condenses into the second subject as the second shot appears behind it. The " +
|
|
79
|
+
"shot ends on the second subject, solid and fully resolved, with no mist left. The second subject " +
|
|
80
|
+
"forms only out of the gathered mist",
|
|
81
|
+
},
|
|
82
|
+
"water-splash": {
|
|
83
|
+
term: "water splash",
|
|
84
|
+
body:
|
|
85
|
+
"the first subject turns to water and collapses into a splashing cascade that spreads across the " +
|
|
86
|
+
"lower part of the frame. The camera stays where it is and the framing does not change. The water " +
|
|
87
|
+
"surges upward at the same place in the frame and takes the shape of the second subject, while the " +
|
|
88
|
+
"second shot appears behind it as the spray falls away. The shot ends on the second subject, solid " +
|
|
89
|
+
"and fully resolved, with no water left on it. The second subject forms only out of the rising water",
|
|
90
|
+
},
|
|
91
|
+
"pixelate-reform": {
|
|
92
|
+
term: "pixelate and reform",
|
|
93
|
+
body:
|
|
94
|
+
"the first subject breaks into large square mosaic blocks, and the blocks scatter outward across the " +
|
|
95
|
+
"frame. The camera stays where it is and the framing does not change. The blocks fly back, lock " +
|
|
96
|
+
"together at the same place in the frame and sharpen into the second subject, while the second shot " +
|
|
97
|
+
"appears behind them. The shot ends on the second subject, fully sharp, with no blocks left. Only the " +
|
|
98
|
+
"subject turns into blocks; the surroundings change as the blocks clear",
|
|
99
|
+
},
|
|
100
|
+
"polygon-shatter": {
|
|
101
|
+
term: "polygon shatter",
|
|
102
|
+
body:
|
|
103
|
+
"the first subject fractures into large opaque flat-shaded chunks, like the facets of a low-polygon " +
|
|
104
|
+
"model, and the chunks burst outward in slow motion. The camera stays where it is and the framing " +
|
|
105
|
+
"does not change. The chunks turn around mid-flight and fly back along clean straight paths, locking " +
|
|
106
|
+
"together at the same place in the frame into the shape of the second subject, while the second shot " +
|
|
107
|
+
"appears behind them. The shot ends on the second subject, solid and fully resolved, with no loose " +
|
|
108
|
+
"chunks left. The chunks stay opaque and matte throughout, like painted blocks",
|
|
109
|
+
},
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
it.each(Object.keys(F1_BODIES))("%s renders `term (body)` at the tile-default levers", (id) => {
|
|
113
|
+
const { term, body } = F1_BODIES[id]!
|
|
114
|
+
expect(getTransitionPromptHint(id)).toBe(body)
|
|
115
|
+
expect(composeTransitionHintFromConnections(id, [], [], {}, "full", { scope: "shot" })).toBe(`${term} (${body})`)
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
it.each(Object.keys(F1_BODIES))("%s at middle / short / natural", (id) => {
|
|
119
|
+
const { term, body } = F1_BODIES[id]!
|
|
120
|
+
expect(composeTransitionHintFromConnections(id, [], [], { position: "middle", duration: "short", intensity: "natural" })).toBe(
|
|
121
|
+
`${term} (${body}), the transition occurs in the middle of the clip, lasting approximately 1 second, with natural timing`,
|
|
122
|
+
)
|
|
123
|
+
})
|
|
124
|
+
})
|
|
125
|
+
|
|
68
126
|
describe("L1 — a cut spans nothing, so `full` adds no clause", () => {
|
|
69
127
|
it.each(INSTANT_IDS)("%s + full renders no position clause", (id) => {
|
|
70
128
|
const out = composeTransitionHintFromConnections(id, [], [], { position: "full", duration: "short", intensity: "natural" })
|
package/src/person.ts
CHANGED
|
@@ -694,6 +694,7 @@ export const PEOPLE: ReadonlyArray<Person> = [
|
|
|
694
694
|
{ id: "face-five-oclock-shadow", label: "Five-O'Clock Shadow", dimension: "facial-hair", description: "Heavier daily growth — denser than light stubble", promptHint: "a five-o'clock shadow, daily growth heavier than light stubble" },
|
|
695
695
|
|
|
696
696
|
// -------------------- Skin Texture --------------------
|
|
697
|
+
{ id: "texture-natural", label: "Natural", dimension: "skin-texture", description: "Real pores and natural variation", promptHint: "with natural, unretouched skin — visible pores and small, even variation in tone", term: "natural unretouched skin" },
|
|
697
698
|
{ id: "texture-smooth", label: "Smooth", dimension: "skin-texture", description: "Flawless, silky smooth skin", promptHint: "with flawless, silky smooth skin", term: "flawless smooth skin" },
|
|
698
699
|
{ id: "texture-wrinkled", label: "Wrinkled", dimension: "skin-texture", description: "Aged, deeply lined skin", promptHint: "with deep wrinkles and aged skin texture", term: "deeply wrinkled aged skin" },
|
|
699
700
|
{ id: "texture-goosebumps", label: "Goosebumps", dimension: "skin-texture", description: "Raised goosebumps on skin", promptHint: "with goosebumps raised on the skin" },
|
package/src/setting.ts
CHANGED
|
@@ -50,6 +50,7 @@ export const SETTINGS: ReadonlyArray<Setting> = [
|
|
|
50
50
|
{ id: "bedroom", label: "Bedroom", category: "indoor", description: "Intimate bedroom", promptHint: "set in an intimate bedroom with soft diffused window light, rumpled linen bedding and warm wood floors" },
|
|
51
51
|
{ id: "living-room", label: "Living Room", category: "indoor", description: "Cozy residential living room", promptHint: "set in a cozy residential living room with a plush sofa, wooden coffee table, soft lamplight, bookshelves and a warm family-home atmosphere" },
|
|
52
52
|
{ id: "kitchen", label: "Kitchen", category: "indoor", description: "Warm home kitchen with morning light", term: "home kitchen", promptHint: "set in a warm home kitchen with morning light, wood cabinets, a marble island with fresh produce and steam rising from a stovetop" },
|
|
53
|
+
{ id: "bathroom", label: "Bathroom", category: "indoor", description: "Bright everyday home bathroom", promptHint: "set in a bright everyday home bathroom with a tiled wall, a mirror and a towel on a hook", term: "home bathroom" },
|
|
53
54
|
{ id: "hotel-room", label: "Hotel Room", category: "indoor", description: "Elegant hotel room with city view", promptHint: "set in an elegant hotel room with a neatly made king bed, heavy drapes, a panoramic city view through the window, minimalist desk and soft warm lamplight" },
|
|
54
55
|
{ id: "restaurant", label: "Restaurant", category: "indoor", description: "Intimate candlelit restaurant", promptHint: "set in an intimate restaurant interior with candlelit tables, white linen, leather booths, wine glasses catching warm light and a softly bustling dining room" },
|
|
55
56
|
{ id: "nightclub", label: "Nightclub", category: "indoor", description: "Dark club with lasers and smoke", promptHint: "set in a dark nightclub interior with a packed dance floor, laser and strobe lighting, thumping bass energy, silhouetted bodies and hazy atmospheric smoke" },
|
|
@@ -61,6 +62,7 @@ export const SETTINGS: ReadonlyArray<Setting> = [
|
|
|
61
62
|
{ id: "warehouse", label: "Industrial Warehouse", category: "indoor", description: "Cavernous warehouse with skylights", promptHint: "set in a cavernous industrial warehouse with steel rafters, concrete floors and dust motes in shafts of light from skylights above" },
|
|
62
63
|
{ id: "subway-car", label: "Subway Car", category: "indoor", description: "Moving subway interior", term: "subway car interior", promptHint: "set inside a moving subway car with fluorescent strip lights, graffiti-scarred windows and empty blue plastic seats" },
|
|
63
64
|
{ id: "taxi", label: "Taxi Interior", category: "indoor", description: "Back seat of a city taxi at night", promptHint: "set inside the back seat of a city taxi at night with rain-streaked windows, neon reflections sliding across the dashboard, the driver silhouetted against the windshield and the dim green glow of the fare meter" },
|
|
65
|
+
{ id: "car-interior", label: "Car Interior", category: "indoor", description: "Front seat of a parked car", promptHint: "set in the front seat of a parked car, daylight through the side window", term: "parked car interior" },
|
|
64
66
|
{ id: "cathedral", label: "Cathedral", category: "indoor", description: "Gothic cathedral interior", term: "gothic cathedral interior", promptHint: "set in a vast gothic cathedral interior with vaulted stone ceilings, stained-glass kaleidoscopes and candlelit side chapels" },
|
|
65
67
|
{ id: "art-gallery", label: "Art Gallery", category: "indoor", description: "Minimalist white-cube gallery", promptHint: "set in a minimalist white-cube art gallery with polished concrete floor, precision track lighting and framed canvases on bare walls" },
|
|
66
68
|
{ id: "balcony", label: "Balcony", category: "indoor", description: "Apartment balcony with urban view", term: "apartment balcony", promptHint: "set on an apartment balcony with potted plants along the railing, a sweeping urban view beyond, soft daylight and a candid intimate atmosphere of a private outdoor pocket above the city" },
|
package/src/styling.ts
CHANGED
|
@@ -123,6 +123,7 @@ export const STYLINGS: ReadonlyArray<Styling> = [
|
|
|
123
123
|
{ id: "makeup-editorial", label: "Editorial", dimension: "makeup", description: "Avant-garde fashion makeup", promptHint: "with avant-garde editorial makeup, artistic and unconventional", term: "editorial makeup" },
|
|
124
124
|
{ id: "makeup-goth", label: "Goth", dimension: "makeup", description: "Dark goth aesthetic", promptHint: "with goth makeup — pale skin, black eyeliner, dark lips", term: "goth makeup" },
|
|
125
125
|
{ id: "makeup-dewy", label: "Dewy Glow", dimension: "makeup", description: "Glowing fresh-skin focus", promptHint: "with dewy makeup, glowing fresh skin and minimal coverage", term: "dewy makeup" },
|
|
126
|
+
{ id: "makeup-bare", label: "Bare Face", dimension: "makeup", description: "No makeup at all", promptHint: "with a completely bare face, no makeup at all", term: "bare face, no makeup" },
|
|
126
127
|
|
|
127
128
|
// -------------------- Eyewear --------------------
|
|
128
129
|
{ id: "eyewear-sunglasses", label: "Sunglasses", dimension: "eyewear", description: "Generic dark sunglasses", promptHint: "wearing sunglasses" },
|
|
@@ -303,6 +304,7 @@ export const STYLINGS: ReadonlyArray<Styling> = [
|
|
|
303
304
|
{ id: "outfit-one-piece-swim", label: "One-Piece Swimsuit", dimension: "outfit", description: "Fitted one-piece swimsuit", promptHint: "in a fitted one-piece swimsuit" , adultOnly: true },
|
|
304
305
|
{ id: "outfit-lingerie", label: "Lingerie Set", dimension: "outfit", description: "Matching lingerie set", promptHint: "in a matching lingerie set" , adultOnly: true },
|
|
305
306
|
{ id: "outfit-pajamas", label: "Pajamas", dimension: "outfit", description: "Soft cotton pajama set", promptHint: "in a soft cotton pajama set — a button-up top and matching pants" },
|
|
307
|
+
{ id: "outfit-casual-home", label: "At-Home Casual", dimension: "outfit", description: "Soft tee or knit with relaxed trousers", promptHint: "wearing relaxed at-home clothes — a soft tee or knit top with comfortable trousers", term: "at-home casual clothes" },
|
|
306
308
|
{ id: "outfit-bathrobe", label: "Bathrobe", dimension: "outfit", description: "Plush terrycloth robe", promptHint: "wrapped in a plush terrycloth bathrobe tied at the waist" },
|
|
307
309
|
{ id: "outfit-kimono", label: "Kimono", dimension: "outfit", description: "Traditional Japanese kimono", promptHint: "dressed in a traditional Japanese kimono with an obi sash" },
|
|
308
310
|
{ id: "outfit-ballerina", label: "Ballerina", dimension: "outfit", description: "Classical ballerina costume", promptHint: "dressed in a classical ballerina costume — fitted leotard and tulle tutu", term: "ballerina leotard and tutu" },
|
package/src/transitions.ts
CHANGED
|
@@ -147,9 +147,9 @@ export const TRANSITIONS: ReadonlyArray<Transition> = [
|
|
|
147
147
|
// ELEMENT — 14 entries — teleport via natural element
|
|
148
148
|
// ============================================================================
|
|
149
149
|
{ id: "dissolve-to-mist", label: "Dissolve to Mist", category: "element", description: "Subject turns to mist, drifts, reforms",
|
|
150
|
-
promptHint: "the subject
|
|
150
|
+
promptHint: "the first subject loses its solid form and turns into a soft cloud of fine mist, starting at its edges and working inward. The camera stays where it is and the framing does not change. The mist drifts through the frame and thins until the first shot is gone, then gathers again at the same place in the frame and condenses into the second subject as the second shot appears behind it. The shot ends on the second subject, solid and fully resolved, with no mist left. The second subject forms only out of the gathered mist" },
|
|
151
151
|
{ id: "water-splash", label: "Water Splash", category: "element", description: "Subject becomes water, splashes, reforms",
|
|
152
|
-
promptHint: "the subject
|
|
152
|
+
promptHint: "the first subject turns to water and collapses into a splashing cascade that spreads across the lower part of the frame. The camera stays where it is and the framing does not change. The water surges upward at the same place in the frame and takes the shape of the second subject, while the second shot appears behind it as the spray falls away. The shot ends on the second subject, solid and fully resolved, with no water left on it. The second subject forms only out of the rising water" },
|
|
153
153
|
{ id: "sand-scatter", label: "Sand Scatter", category: "element", description: "Subject becomes sand, blown away, reforms",
|
|
154
154
|
promptHint: "the subject crumbles into fine sand that is swept away by a gust of wind in a swirling vortex, then the sand particles converge and re-form into the new subject" },
|
|
155
155
|
{ id: "fire-burnup", label: "Burn-Up", category: "element", description: "Subject burns to embers, embers reform",
|
|
@@ -181,7 +181,7 @@ export const TRANSITIONS: ReadonlyArray<Transition> = [
|
|
|
181
181
|
{ id: "liquid-morph", label: "Liquid Morph", category: "morph", description: "Subject melts and reforms as new subject",
|
|
182
182
|
promptHint: "smooth liquid morph: the first subject's surface becomes fluid and continuously deforms, flowing without breaks into the silhouette and details of the second subject" },
|
|
183
183
|
{ id: "pixelate-reform", label: "Pixelate & Reform", category: "morph", description: "Pixelates, scatters, reforms as new",
|
|
184
|
-
promptHint: "the first subject
|
|
184
|
+
promptHint: "the first subject breaks into large square mosaic blocks, and the blocks scatter outward across the frame. The camera stays where it is and the framing does not change. The blocks fly back, lock together at the same place in the frame and sharpen into the second subject, while the second shot appears behind them. The shot ends on the second subject, fully sharp, with no blocks left. Only the subject turns into blocks; the surroundings change as the blocks clear", term: "pixelate and reform" },
|
|
185
185
|
{ id: "shatter-glass", label: "Shatter & Reform", category: "morph", description: "Subject shatters like glass, reforms",
|
|
186
186
|
promptHint: "the first subject shatters like glass into hundreds of shards that fly outward, then the shards reverse direction in reverse time and reassemble into the new subject", term: "shatter like glass and reform" },
|
|
187
187
|
{ id: "origami-fold", label: "Origami Fold", category: "morph", description: "Subject folds like paper into new subject",
|
|
@@ -193,7 +193,7 @@ export const TRANSITIONS: ReadonlyArray<Transition> = [
|
|
|
193
193
|
{ id: "wireframe-morph", label: "Wireframe Morph", category: "morph", description: "Subject reduces to wireframe, reforms as new subject",
|
|
194
194
|
promptHint: "the first subject's surface peels away to reveal a glowing geometric wireframe of polygons and edges, the wireframe flexes and re-tessellates into the topology of the new subject, then the new surface skins over the wireframe" },
|
|
195
195
|
{ id: "polygon-shatter", label: "Polygon Shatter", category: "morph", description: "Subject fragments into low-poly chunks, reassembles",
|
|
196
|
-
promptHint: "the first subject fractures into low-polygon
|
|
196
|
+
promptHint: "the first subject fractures into large opaque flat-shaded chunks, like the facets of a low-polygon model, and the chunks burst outward in slow motion. The camera stays where it is and the framing does not change. The chunks turn around mid-flight and fly back along clean straight paths, locking together at the same place in the frame into the shape of the second subject, while the second shot appears behind them. The shot ends on the second subject, solid and fully resolved, with no loose chunks left. The chunks stay opaque and matte throughout, like painted blocks" },
|
|
197
197
|
{ id: "melt-down", label: "Melt Down", category: "morph", description: "Subject melts into puddle, reforms as new",
|
|
198
198
|
promptHint: "the first subject's form softens and melts downward like wax, collapsing into a glossy puddle on the ground, the puddle then surges upward and re-solidifies into the new subject standing in the new scene", term: "melt into a puddle and reform" },
|
|
199
199
|
|