@nodaro/prompts 1.27.0 → 1.29.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.
Files changed (33) hide show
  1. package/dist/index.cjs +915 -603
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +251 -17
  4. package/dist/index.d.ts +251 -17
  5. package/dist/index.js +896 -604
  6. package/dist/index.js.map +1 -1
  7. package/package.json +2 -2
  8. package/src/__tests__/fixtures/blended-cut-approved.json +712 -0
  9. package/src/__tests__/fixtures/parameter-hint-golden.json +33 -1
  10. package/src/__tests__/hint-join.test.ts +64 -1
  11. package/src/__tests__/motion-hint.test.ts +20 -0
  12. package/src/__tests__/parameter-registry-sync.test.ts +1 -0
  13. package/src/__tests__/person-mixed-heritage.test.ts +43 -0
  14. package/src/__tests__/resolve-prompt.test.ts +13 -1
  15. package/src/__tests__/transition-options.test.ts +223 -0
  16. package/src/__tests__/transition-styles.test.ts +202 -0
  17. package/src/__tests__/transition-timing-catalogs.test.ts +41 -0
  18. package/src/__tests__/transitions-blended-cut.test.ts +325 -0
  19. package/src/__tests__/transitions-instant.test.ts +9 -5
  20. package/src/__tests__/transitions-scope.test.ts +420 -4
  21. package/src/__tests__/video-own-motion.test.ts +26 -0
  22. package/src/hint-join.ts +33 -1
  23. package/src/index.ts +1 -0
  24. package/src/parameter-prompt-hint.ts +20 -3
  25. package/src/person.ts +24 -8
  26. package/src/picker-art/character-art-files.generated.ts +536 -536
  27. package/src/picker-catalogs.ts +83 -7
  28. package/src/prompt-builder.ts +2 -1
  29. package/src/prompt-hint-join.ts +8 -2
  30. package/src/prompt-style-section.ts +3 -5
  31. package/src/resolve-prompt.ts +22 -4
  32. package/src/transitions.ts +408 -52
  33. package/src/video-own-motion.ts +29 -0
package/dist/index.cjs CHANGED
@@ -3296,13 +3296,17 @@ function normalizePickIds(value) {
3296
3296
  }
3297
3297
  return out;
3298
3298
  }
3299
+ function heritageNoun(id) {
3300
+ const noun = (getPerson(id)?.promptHint ?? "").trim().replace(/^of\s+/i, "").replace(/\s+(descent|heritage)$/i, "").trim();
3301
+ return noun.length > 0 ? noun : void 0;
3302
+ }
3299
3303
  function buildEthnicityFragment(value, fragmentFor) {
3300
- const ids = normalizePickIds(value);
3304
+ const ids = normalizePickIds(value).filter((id, _, all) => all.length < 2 || id !== "mixed");
3301
3305
  if (ids.length === 0) return "";
3302
3306
  if (ids.length === 1) return fragmentFor(ids[0]);
3303
- const labels = ids.slice(0, 2).map((id) => getPerson(id)?.shortLabel ?? getPerson(id)?.label ?? "").filter((s) => Boolean(s));
3304
- if (labels.length < 2) return fragmentFor(ids[0]);
3305
- return `of mixed ${labels[0]} and ${labels[1]} heritage`;
3307
+ const nouns = ids.slice(0, 2).map(heritageNoun).filter((s) => Boolean(s));
3308
+ if (nouns.length < 2) return fragmentFor(ids[0]);
3309
+ return `of mixed ${nouns[0]} and ${nouns[1]} heritage`;
3306
3310
  }
3307
3311
  function buildHairColorFragment(value, fragmentFor) {
3308
3312
  const ids = normalizePickIds(value);
@@ -4267,7 +4271,7 @@ function buildTemporalTerms(data) {
4267
4271
  }
4268
4272
 
4269
4273
  // src/hint-join.ts
4270
- var ENDS_SENTENCE = /[.!?]$/;
4274
+ var ENDS_SENTENCE = /[.!?…。!?]$/;
4271
4275
  function joinHintFragments(fragments) {
4272
4276
  let out = "";
4273
4277
  for (const fragment of fragments) {
@@ -4280,6 +4284,23 @@ function joinHintFragments(fragments) {
4280
4284
  }
4281
4285
  return out;
4282
4286
  }
4287
+ function joinSentences(pieces) {
4288
+ let out = "";
4289
+ for (const piece of pieces) {
4290
+ if (!piece || !piece.trim()) continue;
4291
+ if (!out) {
4292
+ out = piece;
4293
+ continue;
4294
+ }
4295
+ const head = out.trimEnd();
4296
+ out = ENDS_SENTENCE.test(head) ? `${head} ${piece}` : `${head}. ${piece}`;
4297
+ }
4298
+ return out;
4299
+ }
4300
+ function appendPromptHints(prompt, hints) {
4301
+ const joined = joinHintFragments(hints);
4302
+ return joined.trim() ? joinSentences([prompt, joined]) : prompt ?? "";
4303
+ }
4283
4304
 
4284
4305
  // src/camera-motions.ts
4285
4306
  var CAMERA_MOTIONS = [
@@ -4873,6 +4894,179 @@ function composeCameraMotionTermFromConnections(motionId, startTerms, endTerms)
4873
4894
  }
4874
4895
 
4875
4896
  // src/transitions.ts
4897
+ var WIPE_DIRECTION = {
4898
+ field: "wipeDirection",
4899
+ label: "Direction",
4900
+ choices: [
4901
+ {
4902
+ id: "auto",
4903
+ label: "Auto",
4904
+ description: "Let the model choose the direction",
4905
+ term: "",
4906
+ phrase: "straight edge sweeps across the frame"
4907
+ },
4908
+ {
4909
+ id: "left-to-right",
4910
+ label: "Left \u2192 Right",
4911
+ description: "A vertical edge travels from the left side to the right",
4912
+ term: "left to right",
4913
+ phrase: "vertical edge sweeps across the frame from left to right"
4914
+ },
4915
+ {
4916
+ id: "right-to-left",
4917
+ label: "Right \u2192 Left",
4918
+ description: "A vertical edge travels from the right side to the left",
4919
+ term: "right to left",
4920
+ phrase: "vertical edge sweeps across the frame from right to left"
4921
+ },
4922
+ {
4923
+ id: "top-to-bottom",
4924
+ label: "Top \u2192 Bottom",
4925
+ description: "A horizontal edge travels down from the top",
4926
+ term: "top to bottom",
4927
+ phrase: "horizontal edge sweeps down the frame from top to bottom"
4928
+ },
4929
+ {
4930
+ id: "bottom-to-top",
4931
+ label: "Bottom \u2192 Top",
4932
+ description: "A horizontal edge travels up from the bottom",
4933
+ term: "bottom to top",
4934
+ phrase: "horizontal edge sweeps up the frame from bottom to top"
4935
+ },
4936
+ {
4937
+ id: "top-left-to-bottom-right",
4938
+ label: "Top-left \u2192 Bottom-right",
4939
+ description: "A diagonal edge travels from the top-left corner to the bottom-right",
4940
+ term: "top-left to bottom-right",
4941
+ phrase: "diagonal edge sweeps across the frame from the top-left corner to the bottom-right corner"
4942
+ },
4943
+ {
4944
+ id: "top-right-to-bottom-left",
4945
+ label: "Top-right \u2192 Bottom-left",
4946
+ description: "A diagonal edge travels from the top-right corner to the bottom-left",
4947
+ term: "top-right to bottom-left",
4948
+ phrase: "diagonal edge sweeps across the frame from the top-right corner to the bottom-left corner"
4949
+ }
4950
+ ]
4951
+ };
4952
+ function rowStyle(row, choices) {
4953
+ return {
4954
+ field: TRANSITION_STYLE_FIELD,
4955
+ label: "Style",
4956
+ choices: choices.map((c, i) => ({
4957
+ id: i === 0 ? "auto" : `${row}-${c.slug}`,
4958
+ label: i === 0 ? `${c.label} (default)` : c.label,
4959
+ description: c.description,
4960
+ phrase: c.phrase,
4961
+ term: ""
4962
+ }))
4963
+ };
4964
+ }
4965
+ var TRANSITION_STYLE_FIELD = "style";
4966
+ var DEBRIS_SHOWER_STYLE = rowStyle("debris-shower", [
4967
+ {
4968
+ label: "Full cover",
4969
+ description: "Debris fills the whole screen, then blows past to reveal the next scene",
4970
+ phrase: "a dense shower of loose leaves, paper scraps and dust whips across the frame from one side, close to the lens, thick enough to hide the whole picture. The camera stays where it is and the framing does not change. As the last of the debris blows past the far edge, the second shot is revealed behind it. The shot ends on the second shot, clear and fully resolved, with no debris left. The debris passes in front of the picture in one direction, and the second shot appears only once it has passed"
4971
+ },
4972
+ {
4973
+ slug: "light-sweep",
4974
+ label: "Light sweep",
4975
+ description: "A quick scatter of debris crosses the screen; the scene has changed behind it",
4976
+ phrase: "a shower of debris \u2014 leaves, papers, dust \u2014 sweeps across the frame in front of the camera, and once the debris clears the scene behind has changed"
4977
+ }
4978
+ ]);
4979
+ var GARDEN_BLOOM_STYLE = rowStyle("garden-bloom", [
4980
+ {
4981
+ label: "Grow & part",
4982
+ description: "Flowers and vines grow over the picture, then part like curtains on the next scene",
4983
+ phrase: "lush flowers and vines rapidly grow and bloom outward from the edges of the frame, the foliage spreads to overtake the entire image, then parts open like curtains to reveal the new scene behind"
4984
+ },
4985
+ {
4986
+ slug: "hedge-doors",
4987
+ label: "Hedge doors",
4988
+ description: "Leafy panels close over the picture, then slide apart to the sides",
4989
+ phrase: "vines and flowers grow rapidly inward from the edges of the frame, blooming as they spread, until leaves and blossoms cover the whole picture. The camera stays where it is and the framing does not change. The foliage then splits down the middle and draws apart toward the side edges, opening onto the second shot behind it. The shot ends on the second shot, clear and fully resolved, with no leaves or flowers left. The plants grow over the front of the picture, and the first shot stays unchanged until they cover it completely"
4990
+ }
4991
+ ]);
4992
+ var SMOKE_PUFF_STYLE = rowStyle("smoke-puff", [
4993
+ {
4994
+ label: "Engulf",
4995
+ description: "Smoke billows up around the subject, and the new subject appears inside it",
4996
+ phrase: "the subject vanishes in a soft puff of smoke that billows outward and fills the frame, the smoke then clears to reveal the new subject in the new scene"
4997
+ },
4998
+ {
4999
+ slug: "full-cover",
5000
+ label: "Full cover",
5001
+ description: "Smoke from the subject fills the whole screen, then clears on the next scene",
5002
+ phrase: "the first subject vanishes in a sudden soft puff of smoke that billows outward from where it stood until the smoke fills the frame. The camera stays where it is and the framing does not change. The smoke thins and clears from the centre outward, revealing the second shot with the second subject at the same place in the frame. The shot ends on the second shot, clear and fully resolved, with no smoke left. The smoke comes only from where the first subject was"
5003
+ }
5004
+ ]);
5005
+ var SAKURA_PETALS_STYLE = rowStyle("sakura-petals", [
5006
+ {
5007
+ label: "Swirling veil",
5008
+ description: "A swirl of pink petals veils the picture, then drifts past",
5009
+ phrase: "a dense storm of cherry blossom petals swirls in from one side and fills the frame in soft pink motion, the petals cluster to fully veil the image, then drift past to reveal the new scene"
5010
+ },
5011
+ {
5012
+ slug: "side-sweep",
5013
+ label: "Side sweep",
5014
+ description: "Petals sweep across from one side and leave by the other, uncovering the next scene",
5015
+ phrase: "a dense storm of pink cherry blossom petals swirls in from one side of the frame, close to the lens, and thickens until the petals veil the whole picture. The camera stays where it is and the framing does not change. The petals keep drifting the same way and thin out, revealing the second shot behind them. The shot ends on the second shot, clear and fully resolved, with no petals left. The petals fly across the front of the picture in one direction, and the first shot stays unchanged until they hide it completely"
5016
+ }
5017
+ ]);
5018
+ var AURORA_SWEEP_STYLE = rowStyle("aurora-sweep", [
5019
+ {
5020
+ label: "Sky glow",
5021
+ description: "Aurora light glows over the scene, then fades to reveal the next one",
5022
+ phrase: "a luminous curtain of green and violet aurora light ripples across the whole frame, and its bright bands veil the first shot. The camera stays where it is and the framing does not change. As the bands fade, the second shot is revealed behind them. The shot ends on the second shot, clear and fully resolved, with no aurora light left. The aurora glows over the front of the picture, and the second shot appears only as it fades"
5023
+ },
5024
+ {
5025
+ slug: "veil",
5026
+ label: "Veil",
5027
+ description: "Aurora curtains drop over the whole picture, then fade to reveal the next scene",
5028
+ phrase: "a luminous green and violet aurora curtain ripples across the entire frame, the bright bands obscure the first scene, and as the aurora dissipates the second scene resolves in the clear sky"
5029
+ }
5030
+ ]);
5031
+ var SAND_STORM_STYLE = rowStyle("sand-storm", [
5032
+ {
5033
+ label: "Full cover",
5034
+ description: "A wall of sand hides the whole picture, then clears on the next scene",
5035
+ phrase: "a wall of opaque, swirling ochre sand sweeps in from one side of the frame and surges across it until the whole picture is hidden in dust. The camera stays where it is and the framing does not change. The dust then thins and sinks away toward the lower edge of the frame, revealing the second shot behind it. The shot ends on the second shot, clear and fully resolved, with no dust left. The first shot stays as it is until the sand covers it completely, and the second shot appears only as the dust clears"
5036
+ },
5037
+ {
5038
+ slug: "light-sweep",
5039
+ label: "Light sweep",
5040
+ description: "A streak of blown sand crosses the screen with the next scene already behind it",
5041
+ phrase: "a narrow streak of blown sand races across the frame close to the lens in one direction. The first shot stays clear ahead of the streak and the second shot is already clear behind it. The camera stays where it is and the framing does not change. The shot ends on the second shot, fully resolved, with no sand left"
5042
+ }
5043
+ ]);
5044
+ var WHITE_FLASH_STYLE = rowStyle("white-flash", [
5045
+ {
5046
+ label: "Flash",
5047
+ description: "A camera flash pops the picture to white, holds, then fades down on the next scene",
5048
+ phrase: "a bright camera-flash bloom fills the whole frame with pure white. The camera stays where it is and the framing does not change. The white holds for a clear beat, then fades down to reveal the second shot. The shot ends on the second shot, fully resolved, with no white haze left. The first shot is gone once the frame is white, and the second shot appears only out of the white"
5049
+ },
5050
+ {
5051
+ slug: "overexposure",
5052
+ label: "Overexposure",
5053
+ description: "The picture blooms to white and resolves into the next scene",
5054
+ phrase: "a bright camera-flash bloom fills the frame with pure white, holds for a fraction of a second, then resolves into the new scene"
5055
+ }
5056
+ ]);
5057
+ var optionToken = (field) => `{${field}}`;
5058
+ function fillOptionSlots(template, options, values2) {
5059
+ let out = template;
5060
+ for (const option of options) {
5061
+ const picked = values2?.[option.field];
5062
+ const choice = option.choices.find((c) => c.id === picked) ?? option.choices[0];
5063
+ out = out.split(optionToken(option.field)).join(choice?.phrase ?? "");
5064
+ }
5065
+ return out;
5066
+ }
5067
+ function withOptionSlots(row) {
5068
+ return { ...row, promptHint: fillOptionSlots(row.promptTemplate, row.options) };
5069
+ }
4876
5070
  var TRANSITIONS = [
4877
5071
  // ============================================================================
4878
5072
  // STANDARD — 14 entries — classical editing transitions
@@ -4913,7 +5107,7 @@ var TRANSITIONS = [
4913
5107
  label: "Snap to Black",
4914
5108
  category: "standard",
4915
5109
  description: "Instant cut to full black for a beat, then the next shot",
4916
- promptHint: "snap to black: the first shot cuts instantly to full black with no fade, the frame holds pure black for a single beat, then the second shot cuts in at full brightness",
5110
+ promptHint: "snap to black: the first shot cuts straight to full black on a single frame. The camera holds its framing right up to the cut. The frame stays pure black for a single beat, then the second shot cuts in at full brightness on a single frame. The shot ends on the second shot, fully resolved",
4917
5111
  term: "snap to black",
4918
5112
  instant: true
4919
5113
  },
@@ -4922,7 +5116,7 @@ var TRANSITIONS = [
4922
5116
  label: "Match Cut",
4923
5117
  category: "standard",
4924
5118
  description: "Shape or motion match across shots",
4925
- promptHint: "match cut: the final composition of the first shot matches the opening composition of the second shot in shape, color, and motion, so the cut feels like a visual rhyme",
5119
+ promptHint: "match cut: the last picture of the first shot and the first picture of the second share one shape, at the same place and the same size in the frame. The camera holds that shape in place across the cut. On the next frame everything around the shape has changed while the shape itself stays put. The shot ends on the second shot, fully resolved, with no flash frame or zoom between the two",
4926
5120
  instant: true
4927
5121
  },
4928
5122
  {
@@ -4941,20 +5135,21 @@ var TRANSITIONS = [
4941
5135
  promptHint: "iris transition: a circular vignette closes inward over the first shot until the frame is black, then opens outward to reveal the second shot",
4942
5136
  term: "iris wipe"
4943
5137
  },
4944
- {
5138
+ withOptionSlots({
4945
5139
  id: "wipe",
4946
5140
  label: "Wipe",
4947
5141
  category: "standard",
4948
5142
  description: "Linear wipe replaces first shot",
4949
- promptHint: "linear wipe transition: a clean diagonal line sweeps across the frame, revealing the second shot behind it",
4950
- term: "linear wipe"
4951
- },
5143
+ promptTemplate: "linear wipe transition: a clean {wipeDirection}, revealing the second shot behind it",
5144
+ term: "linear wipe",
5145
+ options: [WIPE_DIRECTION]
5146
+ }),
4952
5147
  {
4953
5148
  id: "roll-transition",
4954
5149
  label: "Roll",
4955
5150
  category: "standard",
4956
5151
  description: "Frame rolls 90-180\xB0, second shot upright on landing",
4957
- promptHint: "the frame rolls along the camera axis with a smooth 90 to 180 degree rotation, motion-blurred during the roll, and as the rotation completes the new shot is upright and stable in frame",
5152
+ promptHint: "the picture rolls around its centre in one smooth, fast turn, blurred by the speed of the turn. The camera stays in the same spot, turning only around its lens axis. During the turn the second shot takes over, and the roll slows and stops with it level and upright. The shot ends on the second shot, level, upright and still. The roll turns one way only and stops once, with no swing back",
4958
5153
  term: "camera roll transition"
4959
5154
  },
4960
5155
  {
@@ -4964,7 +5159,8 @@ var TRANSITIONS = [
4964
5159
  description: "Hidden cut disguised by matched motion and color",
4965
5160
  promptHint: "hidden seamless transition: the camera motion, color palette, and on-screen motion at the end of the first shot continue exactly across the cut into the second shot, so the boundary is invisible and the two shots feel like one unbroken take",
4966
5161
  term: "invisible cut",
4967
- instant: true
5162
+ instant: true,
5163
+ blendable: true
4968
5164
  },
4969
5165
  {
4970
5166
  id: "whip-pan",
@@ -4979,7 +5175,7 @@ var TRANSITIONS = [
4979
5175
  label: "Jump Cut",
4980
5176
  category: "standard",
4981
5177
  description: "Same framing, time skips forward",
4982
- promptHint: "jump cut: the framing, lens, and camera position stay identical across the cut while time skips abruptly forward, so the subject snaps to a new position inside what still reads as one continuous shot",
5178
+ promptHint: "jump cut: the framing, lens, and camera position stay identical across the cut while time skips abruptly forward, so the subject snaps to a new position inside what still reads as one continuous shot. No leap, no run, no lunge and no motion blur between the two positions; the subject is in the old place on one frame and already in the new place on the next",
4983
5179
  term: "jump cut",
4984
5180
  instant: true
4985
5181
  },
@@ -4991,7 +5187,7 @@ var TRANSITIONS = [
4991
5187
  label: "Fast-Forward (Day \u2192 Night)",
4992
5188
  category: "time",
4993
5189
  description: "Time-lapse day to night same scene",
4994
- promptHint: "fast-forward time-lapse transition: the sun visibly arcs across the sky, shadows sweep, clouds streak, sky shifts from daylight blue through golden hour to deep night, stars emerge, all while framing and camera position remain locked on the same scene",
5190
+ promptHint: "fast-forward time-lapse transition: the same view with framing locked while hours pass in seconds: light and shadows sweep across the scene, daylight warms to dusk and fades to night, lights come on, until the picture matches the end frame",
4995
5191
  term: "day-to-night time-lapse"
4996
5192
  },
4997
5193
  {
@@ -5007,7 +5203,7 @@ var TRANSITIONS = [
5007
5203
  label: "Seasonal Shift",
5008
5204
  category: "time",
5009
5205
  description: "Same scene through changing seasons",
5010
- promptHint: "accelerated seasonal time-lapse: foliage transitions from spring green to summer lushness to autumn red-gold to winter bare, leaves fall and regrow, snow accumulates and melts, all within the same locked framing",
5206
+ promptHint: "accelerated seasonal time-lapse: the same view races through the seasons in fast motion, from the season of the first shot to the season of the second, as growing things bud, turn and fall and snow comes or goes. The camera stays where it is and the framing does not change. The change flows continuously across the whole picture, every part moving on together, until the view matches the second shot. The shot ends on the second shot's season, still and fully resolved. Only the season changes, and the layout of the view stays exactly the same",
5011
5207
  term: "seasonal time-lapse"
5012
5208
  },
5013
5209
  {
@@ -5047,7 +5243,7 @@ var TRANSITIONS = [
5047
5243
  label: "Flashback",
5048
5244
  category: "time",
5049
5245
  description: "Memory-flashback into a past moment of the subject",
5050
- promptHint: "brief flashback transition: the frame washes with a soft warm or desaturated tint, faint ripple distortion crosses the image as the present scene fades, and a remembered earlier moment resolves into focus on the same subject"
5246
+ promptHint: "brief flashback transition: a soft warm wash spreads over the whole picture and a faint ripple drifts across it as the present moment fades. The camera stays where it is and the framing does not change. Through the ripple an earlier moment of the same subject comes into focus, like a memory. The shot ends on the remembered moment, steady and fully resolved, with the ripple gone. The subject stays at the same place in the frame while the moment around it changes"
5051
5247
  },
5052
5248
  // ============================================================================
5053
5249
  // ELEMENT — 14 entries — teleport via natural element
@@ -5081,13 +5277,14 @@ var TRANSITIONS = [
5081
5277
  promptHint: "the subject ignites and burns from edges inward into glowing embers and ash, the embers swirl through the frame and re-ignite into the new subject",
5082
5278
  term: "burn to embers and reform"
5083
5279
  },
5084
- {
5280
+ withOptionSlots({
5085
5281
  id: "smoke-puff",
5086
5282
  label: "Smoke Puff",
5087
5283
  category: "element",
5088
5284
  description: "Subject vanishes in smoke, reappears",
5089
- promptHint: "the subject vanishes in a soft puff of smoke that billows outward and fills the frame, the smoke then clears to reveal the new subject in the new scene"
5090
- },
5285
+ promptTemplate: "{style}",
5286
+ options: [SMOKE_PUFF_STYLE]
5287
+ }),
5091
5288
  {
5092
5289
  id: "magic-sparkles",
5093
5290
  label: "Magic Sparkles",
@@ -5109,13 +5306,14 @@ var TRANSITIONS = [
5109
5306
  description: "Ink splashes across, scene changes",
5110
5307
  promptHint: "black ink splashes across the frame in expanding tendrils that fully cover the image, then the ink retracts inward and pulls back to reveal the new scene"
5111
5308
  },
5112
- {
5309
+ withOptionSlots({
5113
5310
  id: "sand-storm",
5114
5311
  label: "Sand Storm",
5115
5312
  category: "element",
5116
5313
  description: "Sand storm engulfs the frame, scene changes inside",
5117
- promptHint: "a wall of opaque, swirling ochre sand sweeps in from one side of the frame and surges across it until the whole picture is hidden in dust. The camera stays where it is and the framing does not change. The dust then thins and sinks away toward the lower edge of the frame, revealing the second shot behind it. The shot ends on the second shot, clear and fully resolved, with no dust left. The first shot stays as it is until the sand covers it completely, and the second shot appears only as the dust clears"
5118
- },
5314
+ promptTemplate: "{style}",
5315
+ options: [SAND_STORM_STYLE]
5316
+ }),
5119
5317
  {
5120
5318
  id: "paint-splash",
5121
5319
  label: "Paint Splash",
@@ -5123,28 +5321,31 @@ var TRANSITIONS = [
5123
5321
  description: "Vivid paint splash covers, retracts into new scene",
5124
5322
  promptHint: "vivid splashes of coloured paint fly across the frame in arcing streaks and pile over one another until the whole picture is covered in wet paint. The camera stays where it is and the framing does not change. The paint then gathers toward the centre of the frame and shrinks to nothing, uncovering the second shot from the edges inward. The shot ends on the second shot, clean and fully resolved, with no paint left. The paint lies on the surface of the picture itself, and the second shot appears only where the paint has gone"
5125
5323
  },
5126
- {
5324
+ withOptionSlots({
5127
5325
  id: "aurora-sweep",
5128
5326
  label: "Aurora Sweep",
5129
5327
  category: "element",
5130
5328
  description: "Aurora curtain sweeps across, scene changes behind",
5131
- promptHint: "a luminous curtain of green and violet aurora light ripples across the whole frame, and its bright bands veil the first shot. The camera stays where it is and the framing does not change. As the bands fade, the second shot is revealed behind them. The shot ends on the second shot, clear and fully resolved, with no aurora light left. The aurora glows over the front of the picture, and the second shot appears only as it fades"
5132
- },
5133
- {
5329
+ promptTemplate: "{style}",
5330
+ options: [AURORA_SWEEP_STYLE]
5331
+ }),
5332
+ withOptionSlots({
5134
5333
  id: "sakura-petals",
5135
5334
  label: "Sakura Storm",
5136
5335
  category: "element",
5137
5336
  description: "Cherry blossom petals storm across the frame",
5138
- promptHint: "a dense storm of cherry blossom petals swirls in from one side and fills the frame in soft pink motion, the petals cluster to fully veil the image, then drift past to reveal the new scene",
5139
- term: "cherry blossom petal storm"
5140
- },
5141
- {
5337
+ promptTemplate: "{style}",
5338
+ term: "cherry blossom petal storm",
5339
+ options: [SAKURA_PETALS_STYLE]
5340
+ }),
5341
+ withOptionSlots({
5142
5342
  id: "garden-bloom",
5143
5343
  label: "Garden Bloom",
5144
5344
  category: "element",
5145
5345
  description: "Flowers bloom outward, parting to reveal new scene",
5146
- promptHint: "lush flowers and vines rapidly grow and bloom outward from the edges of the frame, the foliage spreads to overtake the entire image, then parts open like curtains to reveal the new scene behind"
5147
- },
5346
+ promptTemplate: "{style}",
5347
+ options: [GARDEN_BLOOM_STYLE]
5348
+ }),
5148
5349
  {
5149
5350
  id: "powder-burst",
5150
5351
  label: "Powder Burst",
@@ -5236,7 +5437,7 @@ var TRANSITIONS = [
5236
5437
  label: "Zoom Into Mirror",
5237
5438
  category: "portal",
5238
5439
  description: "Push into mirror, scene inside reflection",
5239
- promptHint: "the camera pushes toward a mirror in the scene, the mirror's reflection fills the frame, and the camera passes through the mirror surface into the reflected world which becomes the new scene"
5440
+ promptHint: "the camera pushes straight at a mirror in the frame. As the lens meets the glass, the mirror's surface turns liquid and rings ripple out across the whole picture, and the camera keeps moving forward through the rippling surface, out the far side into the second shot. Until the lens touches the glass, the mirror keeps its own reflection. The shot ends in the second shot, still and fully resolved, with no ripples left"
5240
5441
  },
5241
5442
  {
5242
5443
  id: "zoom-into-screen",
@@ -5336,13 +5537,14 @@ var TRANSITIONS = [
5336
5537
  description: "Fist strikes camera, scene changes",
5337
5538
  promptHint: "a fist or object swings rapidly toward the camera and strikes the lens with motion blur and impact frames, and the moment of impact reveals the new scene"
5338
5539
  },
5339
- {
5540
+ withOptionSlots({
5340
5541
  id: "debris-shower",
5341
5542
  label: "Debris Shower",
5342
5543
  category: "physics",
5343
5544
  description: "Debris flies past, scene changes behind",
5344
- promptHint: "a shower of debris \u2014 leaves, papers, dust \u2014 sweeps across the frame in front of the camera, and once the debris clears the scene behind has changed"
5345
- },
5545
+ promptTemplate: "{style}",
5546
+ options: [DEBRIS_SHOWER_STYLE]
5547
+ }),
5346
5548
  {
5347
5549
  id: "gravity-flip",
5348
5550
  label: "Gravity Flip",
@@ -5369,9 +5571,10 @@ var TRANSITIONS = [
5369
5571
  label: "Jump Match",
5370
5572
  category: "physics",
5371
5573
  description: "Subject jumps, landing matches into new scene",
5372
- promptHint: "the subject jumps upward and out of frame at the end of the first shot, with matched velocity the camera follows the arc, and on landing the subject is in a new location seamlessly continuing the same jump",
5574
+ promptHint: "the subject launches into a jump, and at the height of the leap the picture cuts to a new place. The camera follows the arc of the jump at the same speed on both sides of the cut, and the subject stays at the same place in the frame. In the second shot the same jump carries on without a break, and the subject comes down and lands in the new place. The shot ends on the subject landed in the second shot, fully resolved",
5373
5575
  term: "match cut on a jump",
5374
- instant: true
5576
+ instant: true,
5577
+ blendable: true
5375
5578
  },
5376
5579
  {
5377
5580
  id: "hand-swipe",
@@ -5392,13 +5595,14 @@ var TRANSITIONS = [
5392
5595
  // ============================================================================
5393
5596
  // LIGHT — 8 entries — flash and lens FX
5394
5597
  // ============================================================================
5395
- {
5598
+ withOptionSlots({
5396
5599
  id: "white-flash",
5397
5600
  label: "White Flash",
5398
5601
  category: "light",
5399
5602
  description: "Frame blooms to white",
5400
- promptHint: "a bright camera-flash bloom fills the frame with pure white, holds for a fraction of a second, then resolves into the new scene"
5401
- },
5603
+ promptTemplate: "{style}",
5604
+ options: [WHITE_FLASH_STYLE]
5605
+ }),
5402
5606
  {
5403
5607
  id: "lens-flare-swipe",
5404
5608
  label: "Lens Flare Swipe",
@@ -5418,7 +5622,7 @@ var TRANSITIONS = [
5418
5622
  label: "Color Invert Flash",
5419
5623
  category: "light",
5420
5624
  description: "Colors invert briefly",
5421
- promptHint: "colors invert across the entire frame to their negative for a single beat, and when the colors snap back the scene has changed to the new setting"
5625
+ promptHint: "the colours of the whole picture turn to their photographic negative in an instant. The camera stays where it is and the framing does not change. The negative holds for a single beat, and when the colours snap back to normal the second shot is in place. The shot ends on the second shot in natural colour, fully resolved. The change of shot happens while the picture is in negative, and the picture stays upright and in place throughout"
5422
5626
  },
5423
5627
  {
5424
5628
  id: "sun-glare",
@@ -5470,14 +5674,14 @@ var TRANSITIONS = [
5470
5674
  label: "Datamosh",
5471
5675
  category: "glitch",
5472
5676
  description: "Motion-vector smear bleeds scenes",
5473
- promptHint: "datamosh transition: the motion vectors of the first scene continue smearing into the pixels of the second scene, creating a fluid pixel-bleed handoff"
5677
+ promptHint: "datamosh transition: the first shot's pixels tear loose in square compression blocks and slide sideways across the frame in long smeared streaks. The camera stays where it is and the framing does not change. The blocks pile up into the shapes of the second shot, still in the first shot's colours, until the true colours snap in block by block. The shot ends on the second shot, sharp and fully resolved, with no smears or blocks left. The smear covers the whole frame"
5474
5678
  },
5475
5679
  {
5476
5680
  id: "channel-flip",
5477
5681
  label: "Channel Flip",
5478
5682
  category: "glitch",
5479
5683
  description: "TV channel flip with static",
5480
- promptHint: "a brief burst of TV static and channel-flip artifacts sweeps the frame, and the new scene resolves as if changing channels on an old television",
5684
+ promptHint: "the whole picture breaks into a brief burst of black-and-white static, the image jumping and tearing as if the channel were being changed. The camera stays where it is and the framing does not change. The static clears as quickly as it came, and the second shot snaps in, steady, like the next channel. The shot ends on the second shot, clean and fully resolved, with no static left. The static covers the whole frame, so the picture itself is what changes channel",
5481
5685
  term: "tv channel flip with static"
5482
5686
  },
5483
5687
  {
@@ -5485,14 +5689,14 @@ var TRANSITIONS = [
5485
5689
  label: "Hologram Flicker",
5486
5690
  category: "glitch",
5487
5691
  description: "Hologram-style flicker materialises new scene",
5488
- promptHint: "a hologram-style flicker with horizontal interference bands and chromatic aberration overtakes the frame for a beat, and resolves into the new scene as if it materialised from a projection"
5692
+ promptHint: "the first shot breaks into thin lines of cyan light that flicker out from the top down, leaving the frame black. The camera stays where it is and the framing does not change. A bright scan line sweeps down and draws the second shot behind it in flickering cyan lines that steady into natural colour. The shot ends on the second shot, solid and fully resolved, with no scan lines left. The second shot is drawn only on black, never over the first shot"
5489
5693
  },
5490
5694
  {
5491
5695
  id: "display-wipe",
5492
5696
  label: "Display Wipe",
5493
5697
  category: "glitch",
5494
5698
  description: "Scene compresses into display, expands to new scene",
5495
- promptHint: "the first scene compresses into a small floating display screen at the center of the frame with a CRT power-on/off animation and scanline flicker, the display then expands outward and unfolds into the new scene full-frame",
5699
+ promptHint: "the whole first shot shrinks toward the centre of the frame into a small glowing rectangle, then collapses to a bright line and a dot as if its power were cut. The camera stays where it is and the framing does not change. From the dot a line snaps open and widens into a rectangle showing the second shot, which grows until it fills the frame. The shot ends on the second shot, full frame and fully resolved, with no border or scanlines left. The picture itself shrinks and grows on a black field, with the camera holding still throughout",
5496
5700
  term: "compress into a screen and expand out"
5497
5701
  },
5498
5702
  {
@@ -5500,7 +5704,7 @@ var TRANSITIONS = [
5500
5704
  label: "Double Exposure",
5501
5705
  category: "glitch",
5502
5706
  description: "Two scenes overlay translucent, first fades to second",
5503
- promptHint: "the first and second scenes blend as a translucent double exposure where both images coexist semi-transparently on the frame, the first image then gradually fades out leaving the second image fully resolved"
5707
+ promptHint: "the first subject becomes a crisp silhouette filled solid with the second shot, while the rest of the first shot stays untouched around it. The camera stays where it is and the framing does not change. The silhouette holds for a clear beat, both pictures plainly seen at once, then the first shot around it gives way to the second shot. The shot ends on the second shot alone, fully resolved"
5504
5708
  }
5505
5709
  ];
5506
5710
  var TRANSITION_CATEGORY_ORDER = [
@@ -5536,8 +5740,27 @@ function getTransitionLabel(id, fallback) {
5536
5740
  if (fallback !== void 0) return fallback;
5537
5741
  return (id ?? "").replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
5538
5742
  }
5539
- function getTransitionPromptHint(id) {
5540
- return getTransition(id)?.promptHint ?? "";
5743
+ function getTransitionPromptHint(id, values2) {
5744
+ const t = getTransition(id);
5745
+ if (!t) return "";
5746
+ if (!values2 || !t.promptTemplate || !t.options?.length) return t.promptHint;
5747
+ if (t.promptHint !== fillOptionSlots(t.promptTemplate, t.options)) return t.promptHint;
5748
+ return fillOptionSlots(t.promptTemplate, t.options, values2);
5749
+ }
5750
+ function getTransitionOptions(id) {
5751
+ return getTransition(id)?.options ?? [];
5752
+ }
5753
+ var TRANSITION_OPTION_FIELDS = Array.from(
5754
+ new Set(TRANSITIONS.flatMap((t) => (t.options ?? []).map((o) => o.field)))
5755
+ );
5756
+ function readTransitionOptionValues(data) {
5757
+ if (!data) return void 0;
5758
+ const out = {};
5759
+ for (const field of TRANSITION_OPTION_FIELDS) {
5760
+ const v = data[field];
5761
+ if (typeof v === "string" && v.length > 0) out[field] = v;
5762
+ }
5763
+ return Object.keys(out).length > 0 ? out : void 0;
5541
5764
  }
5542
5765
  function getTransitionTerm(id) {
5543
5766
  return resolveTerm(getTransition(id));
@@ -5548,24 +5771,39 @@ function isInstantTransition(id) {
5548
5771
  if (ids.length === 0) return false;
5549
5772
  return ids.every((one) => getTransition(one)?.instant === true);
5550
5773
  }
5774
+ function isBlendableTransition(id) {
5775
+ const ids = typeof id === "string" ? [id] : id ? [...id] : [];
5776
+ if (ids.length === 0) return false;
5777
+ return ids.every((one) => {
5778
+ const t = getTransition(one);
5779
+ return t?.instant === true && t.blendable === true;
5780
+ });
5781
+ }
5551
5782
  var INSTANT_CUT_CLAUSE = "an abrupt single-frame hard cut, no dissolve, crossfade or superimposition; the two images never blend";
5552
5783
  var LEADING_LABEL = /^\s*((?:[^\s:,;.()]+\s+){0,4}[^\s:,;.()]+)\s*:\s+/;
5553
5784
  var normalizePhrase = (s) => s.trim().toLowerCase().replace(/\s+/g, " ");
5554
- function transitionHintBody(id, term) {
5555
- const hint = getTransitionPromptHint(id).replace(LEADING_LABEL, "").trim();
5785
+ function transitionHintBody(id, term, values2) {
5786
+ const hint = getTransitionPromptHint(id, values2).replace(LEADING_LABEL, "").trim();
5556
5787
  const t = normalizePhrase(term);
5557
5788
  return hint.split(/,\s*/).filter((item) => normalizePhrase(item) !== t).join(", ").trim();
5558
5789
  }
5559
- function transitionFragment(id, withCutClause) {
5790
+ function transitionFragment(id, cutClause, values2) {
5560
5791
  const term = getTransitionTerm(id);
5561
5792
  if (!term) return "";
5562
- const inner = [transitionHintBody(id, term), withCutClause ? INSTANT_CUT_CLAUSE : ""].filter((part) => part.length > 0).join("; ");
5793
+ const inner = [transitionHintBody(id, term, values2), cutClause].filter((part) => part.length > 0).join("; ");
5563
5794
  return inner.length > 0 && normalizePhrase(inner) !== normalizePhrase(term) ? `${term} (${inner})` : term;
5564
5795
  }
5565
- function renderTransitionBases(ids, _mode = "full") {
5796
+ function renderTransitionBases(ids, _mode = "full", values2) {
5797
+ return renderBasesWith(ids, INSTANT_CUT_CLAUSE, values2);
5798
+ }
5799
+ function renderBasesWith(ids, cutClause, values2) {
5566
5800
  const picked = ids.filter((id) => getTransitionTerm(id).length > 0);
5567
5801
  const instant = isInstantTransition(picked);
5568
- return picked.map((id, i) => transitionFragment(id, instant && i === 0));
5802
+ return picked.map((id, i) => transitionFragment(id, instant && i === 0 ? cutClause : "", values2));
5803
+ }
5804
+ function blendedCutClause(duration3) {
5805
+ const row = TRANSITION_DURATIONS.find((d) => d.id === duration3);
5806
+ return row?.blendsCut ? `instead of a hard cut, the two shots blend into each other over ${row.term}` : "";
5569
5807
  }
5570
5808
  var TRANSITION_POSITIONS = [
5571
5809
  { id: "auto", label: "Auto", description: "Let the model place it", promptHint: "", term: "" },
@@ -5577,7 +5815,7 @@ var TRANSITION_POSITIONS = [
5577
5815
  var TRANSITION_DURATIONS = [
5578
5816
  { id: "auto", label: "Auto", description: "Let the model time it", promptHint: "", term: "" },
5579
5817
  { id: "instant", label: "Instant", description: "No perceptible duration", promptHint: "occurring instantaneously", term: "instantaneous" },
5580
- { id: "short", label: "Short (~1s)", description: "Approximately 1 second", promptHint: "lasting approximately 1 second", term: "about 1 second" },
5818
+ { id: "short", label: "Short (~1s)", description: "Approximately 1 second", promptHint: "lasting approximately 1 second", term: "about 1 second", blendsCut: true },
5581
5819
  { id: "medium", label: "Medium (~2s)", description: "Approximately 2 seconds", promptHint: "lasting approximately 2 seconds", term: "about 2 seconds" },
5582
5820
  { id: "long", label: "Long (~3s)", description: "Approximately 3 seconds", promptHint: "lasting approximately 3 seconds", term: "about 3 seconds" }
5583
5821
  ];
@@ -5602,11 +5840,13 @@ var SHOT_POSITION_CLAUSES = Object.fromEntries(
5602
5840
  );
5603
5841
  var DURATION_CLAUSES = clausesOf(TRANSITION_DURATIONS);
5604
5842
  var INTENSITY_CLAUSES = clausesOf(TRANSITION_INTENSITIES);
5605
- function composeTransitionHintFromConnections(transitionId, startHints, endHints, timing, mode = "full", options) {
5843
+ function composeTransitionHintFromConnections(transitionId, startHints, endHints, timing, _mode = "full", options) {
5606
5844
  const ids = Array.isArray(transitionId) ? Array.from(new Set(transitionId)).slice(0, 2) : transitionId ? [transitionId] : [];
5607
- const baseHints = renderTransitionBases(ids, mode);
5845
+ const contributing = ids.filter((id) => getTransitionTerm(id).length > 0);
5846
+ const instant = isInstantTransition(contributing);
5847
+ const blend = instant && isBlendableTransition(contributing) ? blendedCutClause(timing?.duration) : "";
5848
+ const baseHints = renderBasesWith(ids, blend || INSTANT_CUT_CLAUSE, options?.optionValues);
5608
5849
  if (baseHints.length === 0) return "";
5609
- const instant = isInstantTransition(ids.filter((id) => getTransitionTerm(id).length > 0));
5610
5850
  const combinedBase = baseHints.join(", and ");
5611
5851
  const parts = [combinedBase];
5612
5852
  if (timing?.position && timing.position !== "auto" && !(instant && timing.position === "full")) {
@@ -17780,55 +18020,55 @@ var CHARACTER_ART_FILES = {
17780
18020
  "wool": "wool.3fc2cb4f"
17781
18021
  },
17782
18022
  "person": {
17783
- "abidjan-cosmopolitan": "abidjan-cosmopolitan.865e5888",
17784
- "aboriginal-australian": "aboriginal-australian.49a1e0ee",
17785
- "accra-afro-fashion": "accra-afro-fashion.8a6a57ea",
17786
- "addis-habesha": "addis-habesha.4f752c4e",
17787
- "african": "african.fe33494d",
17788
- "afro-caribbean": "afro-caribbean.c139c22c",
17789
- "age-20s": "age-20s.48be4a15",
17790
- "age-30s": "age-30s.08719398",
17791
- "age-40s": "age-40s.c18c504a",
17792
- "age-50s": "age-50s.aaeeb433",
17793
- "age-60s": "age-60s.d5939824",
17794
- "age-baby": "age-baby.bb2e9478",
17795
- "age-child": "age-child.f7d5a884",
17796
- "age-custom": "age-custom.eed5a72c",
17797
- "age-early-20s": "age-early-20s.707b0c9f",
17798
- "age-early-teen": "age-early-teen.3aa5fd13",
17799
- "age-elderly": "age-elderly.11c7af9b",
17800
- "age-late-20s": "age-late-20s.ac95026b",
17801
- "age-late-teen": "age-late-teen.c124b5ec",
17802
- "age-pre-teen": "age-pre-teen.75d621ab",
17803
- "age-teen": "age-teen.24ab39ce",
17804
- "age-toddler": "age-toddler.f853dd62",
17805
- "age-young-child": "age-young-child.7d5a3d74",
17806
- "ai-hologram": "ai-hologram.a71e330d",
17807
- "alice-wonderland": "alice-wonderland.6d4f2df9",
17808
- "alien": "alien.48be5573",
17809
- "andean-indigenous": "andean-indigenous.cbf5de90",
17810
- "androgynous": "androgynous.39d58019",
17811
- "android-man": "android-man.86525371",
17812
- "android-neutral": "android-neutral.537f265a",
17813
- "android-woman": "android-woman.8d429e20",
17814
- "angel": "angel.3636af67",
17815
- "anthro": "anthro.9b17e97e",
17816
- "apeman": "apeman.43b034e4",
17817
- "artist": "artist.fcdd9edd",
17818
- "asian-any": "asian-any.afc38a97",
17819
- "astronaut": "astronaut.1406c070",
17820
- "athlete": "athlete.a2c4f225",
17821
- "atl-southern": "atl-southern.997d9908",
17822
- "auckland-coastal": "auckland-coastal.76bfae99",
17823
- "australian-outback": "australian-outback.97a51a5f",
17824
- "bad-boy": "bad-boy.87619157",
17825
- "baddie": "baddie.b3d7da24",
17826
- "baltic": "baltic.f8fcea31",
17827
- "bangkok-street": "bangkok-street.af587a33",
17828
- "barbarian": "barbarian.e0998e26",
17829
- "barbarian-man": "barbarian-man.6a46b91e",
17830
- "barbarian-woman": "barbarian-woman.0d3d6d07",
17831
- "barista": "barista.c1539405",
18023
+ "abidjan-cosmopolitan": "abidjan-cosmopolitan.0aef5cc6",
18024
+ "aboriginal-australian": "aboriginal-australian.03edf64c",
18025
+ "accra-afro-fashion": "accra-afro-fashion.455aef15",
18026
+ "addis-habesha": "addis-habesha.4fe853c5",
18027
+ "african": "african.bec5cae8",
18028
+ "afro-caribbean": "afro-caribbean.3d98e33c",
18029
+ "age-20s": "age-20s.f4d83ba7",
18030
+ "age-30s": "age-30s.8a80b865",
18031
+ "age-40s": "age-40s.3492dc4c",
18032
+ "age-50s": "age-50s.f94dc049",
18033
+ "age-60s": "age-60s.2b31919a",
18034
+ "age-baby": "age-baby.889ff675",
18035
+ "age-child": "age-child.5710d38e",
18036
+ "age-custom": "age-custom.02cba899",
18037
+ "age-early-20s": "age-early-20s.b43ebb95",
18038
+ "age-early-teen": "age-early-teen.29cd52af",
18039
+ "age-elderly": "age-elderly.a27b558d",
18040
+ "age-late-20s": "age-late-20s.3b7c0c20",
18041
+ "age-late-teen": "age-late-teen.35fe5215",
18042
+ "age-pre-teen": "age-pre-teen.c1d0b5ae",
18043
+ "age-teen": "age-teen.049e2a6b",
18044
+ "age-toddler": "age-toddler.502fd1c1",
18045
+ "age-young-child": "age-young-child.90638c96",
18046
+ "ai-hologram": "ai-hologram.ba0a61e7",
18047
+ "alice-wonderland": "alice-wonderland.57e019cb",
18048
+ "alien": "alien.b894f17a",
18049
+ "andean-indigenous": "andean-indigenous.6ad8992f",
18050
+ "androgynous": "androgynous.1075c43e",
18051
+ "android-man": "android-man.3ed0b0c9",
18052
+ "android-neutral": "android-neutral.075e2b8a",
18053
+ "android-woman": "android-woman.d23cd019",
18054
+ "angel": "angel.3656f37c",
18055
+ "anthro": "anthro.2b1c3d8b",
18056
+ "apeman": "apeman.089992df",
18057
+ "artist": "artist.6bfc7af5",
18058
+ "asian-any": "asian-any.b51d6a45",
18059
+ "astronaut": "astronaut.d56a7184",
18060
+ "athlete": "athlete.62d9d086",
18061
+ "atl-southern": "atl-southern.72455a11",
18062
+ "auckland-coastal": "auckland-coastal.b2242c01",
18063
+ "australian-outback": "australian-outback.a0e9a781",
18064
+ "bad-boy": "bad-boy.474ef57d",
18065
+ "baddie": "baddie.1ead2959",
18066
+ "baltic": "baltic.28743272",
18067
+ "bangkok-street": "bangkok-street.2e4e81ad",
18068
+ "barbarian": "barbarian.a2c31f07",
18069
+ "barbarian-man": "barbarian-man.c07e7a3e",
18070
+ "barbarian-woman": "barbarian-woman.b2223fbd",
18071
+ "barista": "barista.bbce4edb",
17832
18072
  "base-afro": "base-afro.e1d36b85",
17833
18073
  "base-bald": "base-bald.4e294be7",
17834
18074
  "base-buzz": "base-buzz.3e37acbc",
@@ -17849,17 +18089,17 @@ var CHARACTER_ART_FILES = {
17849
18089
  "base-very-long-straight": "base-very-long-straight.35f46100",
17850
18090
  "base-very-long-wavy": "base-very-long-wavy.9ae6fc79",
17851
18091
  "base-wet": "base-wet.477dbfbc",
17852
- "bear": "bear.693a02ef",
17853
- "beautiful-woman": "beautiful-woman.1182d37f",
17854
- "beijing-hutong": "beijing-hutong.a5741624",
17855
- "beirut-riviera": "beirut-riviera.f6419e7a",
17856
- "berlin-alt": "berlin-alt.c435aeef",
17857
- "bogota-cosmopolitan": "bogota-cosmopolitan.7a867612",
17858
- "boho-la": "boho-la.0fb6510e",
17859
- "bondi-beach": "bondi-beach.12228d11",
17860
- "boy-next-door": "boy-next-door.c5c82318",
17861
- "brazilian": "brazilian.82e75501",
17862
- "brooklyn-hipster": "brooklyn-hipster.cbc37db1",
18092
+ "bear": "bear.64ab6686",
18093
+ "beautiful-woman": "beautiful-woman.24189676",
18094
+ "beijing-hutong": "beijing-hutong.76f7ffec",
18095
+ "beirut-riviera": "beirut-riviera.ac571e9e",
18096
+ "berlin-alt": "berlin-alt.cef33626",
18097
+ "bogota-cosmopolitan": "bogota-cosmopolitan.76dfe5b2",
18098
+ "boho-la": "boho-la.513a474a",
18099
+ "bondi-beach": "bondi-beach.cc59bef6",
18100
+ "boy-next-door": "boy-next-door.00517ae2",
18101
+ "brazilian": "brazilian.1d5c6b88",
18102
+ "brooklyn-hipster": "brooklyn-hipster.a02dafc0",
17863
18103
  "brows-arched": "brows-arched.692c9c09",
17864
18104
  "brows-bold": "brows-bold.1e2aa159",
17865
18105
  "brows-microbladed": "brows-microbladed.45792f9c",
@@ -17870,94 +18110,94 @@ var CHARACTER_ART_FILES = {
17870
18110
  "brows-thin": "brows-thin.6c292a1a",
17871
18111
  "brows-tinted": "brows-tinted.7d824c8a",
17872
18112
  "brows-unibrow": "brows-unibrow.21908d56",
17873
- "buenos-aires-tango": "buenos-aires-tango.076cacbd",
17874
- "businessman": "businessman.23c6cd2b",
17875
- "businesswoman": "businesswoman.34952521",
17876
- "bust-average": "bust-average.b6891581",
17877
- "bust-full": "bust-full.81754f2f",
17878
- "bust-small": "bust-small.49a10fd9",
17879
- "bust-very-full": "bust-very-full.72f5b5c5",
17880
- "cairene-cosmopolitan": "cairene-cosmopolitan.e0bbee28",
17881
- "cali-beach": "cali-beach.78874220",
17882
- "canthal-neutral": "canthal-neutral.672c0d77",
17883
- "cape-town-cosmopolitan": "cape-town-cosmopolitan.041af1d6",
17884
- "caped-crusader": "caped-crusader.d5a0a4d9",
17885
- "caped-crusader-man": "caped-crusader-man.f40e7c9c",
17886
- "caped-crusader-woman": "caped-crusader-woman.33667b64",
17887
- "captain-nemo": "captain-nemo.9a05f6e6",
17888
- "caribbean-latino": "caribbean-latino.8aec5eea",
17889
- "carioca-rio": "carioca-rio.1d1426bc",
17890
- "catalan-modern": "catalan-modern.5d300b03",
17891
- "catboy": "catboy.107d8bad",
17892
- "catgirl": "catgirl.4ead9fe8",
17893
- "caveman": "caveman.57535fcf",
17894
- "cavewoman": "cavewoman.dbdb6adc",
17895
- "celtic": "celtic.206b5c9a",
17896
- "centaur": "centaur.601fbf5a",
17897
- "central-african": "central-african.175ebf90",
17898
- "centurion": "centurion.3dbf16a0",
17899
- "cheekbones-average": "cheekbones-average.4e2280ec",
17900
- "cheekbones-high-defined": "cheekbones-high-defined.b11a8075",
17901
- "cheekbones-low": "cheekbones-low.d349ee06",
17902
- "cheekbones-sculpted": "cheekbones-sculpted.ae22e1a8",
17903
- "cheekbones-wide": "cheekbones-wide.e5a9708e",
17904
- "chef": "chef.75f12038",
17905
- "chicago-south-side": "chicago-south-side.8da6c008",
17906
- "chilango-traditional": "chilango-traditional.ce3ab498",
17907
- "chinese": "chinese.a1c21ceb",
17908
- "cleopatra": "cleopatra.b6f0e545",
17909
- "construction-worker": "construction-worker.2f693f9d",
17910
- "cowardly-lion": "cowardly-lion.5800489a",
17911
- "crusader": "crusader.71e2cb02",
17912
- "cyborg": "cyborg.230f80f0",
17913
- "cyborg-man": "cyborg-man.3e1abe68",
17914
- "cyborg-woman": "cyborg-woman.3cd7ac32",
17915
- "czech": "czech.700da3b5",
17916
- "dakar-francophone": "dakar-francophone.9dab0ad3",
17917
- "danish": "danish.04189148",
17918
- "demon": "demon.154d4865",
17919
- "detective": "detective.48b0c0aa",
17920
- "dmv-go-go": "dmv-go-go.590c49e4",
17921
- "doctor": "doctor.6812fa62",
17922
- "dorothy-oz": "dorothy-oz.3c6ff32e",
17923
- "dracula": "dracula.1e9fdff8",
17924
- "dragonkin": "dragonkin.14328e7d",
17925
- "druid": "druid.1c4eb4cb",
17926
- "dubai-modern": "dubai-modern.80a7ad32",
17927
- "dwarf": "dwarf.51edc05f",
17928
- "east-african": "east-african.b4f69980",
17929
- "east-asian": "east-asian.9fd02e89",
17930
- "eastern-european-glam": "eastern-european-glam.c632b231",
17931
- "eastern-european-stoic": "eastern-european-stoic.f1551e36",
17932
- "elegant-woman": "elegant-woman.a5453498",
17933
- "elf": "elf.983c0139",
17934
- "elf-man": "elf-man.6fec2626",
17935
- "elf-woman": "elf-woman.b583edd6",
17936
- "english-rose": "english-rose.83bfd2a5",
17937
- "european-any": "european-any.33e42dd1",
17938
- "eye-almond": "eye-almond.0d798687",
17939
- "eye-close-set": "eye-close-set.39c2dcfb",
17940
- "eye-deep-set": "eye-deep-set.842a6318",
17941
- "eye-double-eyelid": "eye-double-eyelid.81ceb92e",
17942
- "eye-downturned": "eye-downturned.97d7dc2c",
17943
- "eye-droopy": "eye-droopy.834be4ca",
17944
- "eye-hooded": "eye-hooded.a7bb8bfe",
17945
- "eye-monolid": "eye-monolid.0948de90",
17946
- "eye-narrow": "eye-narrow.209ef83b",
17947
- "eye-round": "eye-round.f428e05d",
17948
- "eye-spacing-average": "eye-spacing-average.5981c27f",
17949
- "eye-state-closed": "eye-state-closed.b0dab435",
17950
- "eye-state-gazing-away": "eye-state-gazing-away.3782800f",
17951
- "eye-state-gazing-down": "eye-state-gazing-down.1daf70af",
17952
- "eye-state-gazing-up": "eye-state-gazing-up.e66fe4f2",
17953
- "eye-state-glassy": "eye-state-glassy.9d612057",
17954
- "eye-state-half-lidded": "eye-state-half-lidded.f634a2d6",
17955
- "eye-state-staring-camera": "eye-state-staring-camera.5d0395b8",
17956
- "eye-state-wide-eyed": "eye-state-wide-eyed.960a90dd",
17957
- "eye-upturned": "eye-upturned.f049574a",
17958
- "eye-wide": "eye-wide.01beb3eb",
17959
- "eye-wide-set": "eye-wide-set.d0accca8",
17960
- "eyelid-standard": "eyelid-standard.570085bd",
18113
+ "buenos-aires-tango": "buenos-aires-tango.0bc0fb95",
18114
+ "businessman": "businessman.ef3c8fdc",
18115
+ "businesswoman": "businesswoman.bb2b7d57",
18116
+ "bust-average": "bust-average.a692b6d6",
18117
+ "bust-full": "bust-full.13d4a4a7",
18118
+ "bust-small": "bust-small.6fca2e36",
18119
+ "bust-very-full": "bust-very-full.015464c3",
18120
+ "cairene-cosmopolitan": "cairene-cosmopolitan.c5b89fa0",
18121
+ "cali-beach": "cali-beach.24602197",
18122
+ "canthal-neutral": "canthal-neutral.85814b09",
18123
+ "cape-town-cosmopolitan": "cape-town-cosmopolitan.3a088a23",
18124
+ "caped-crusader": "caped-crusader.573520dc",
18125
+ "caped-crusader-man": "caped-crusader-man.df8541d5",
18126
+ "caped-crusader-woman": "caped-crusader-woman.2f7b0e7f",
18127
+ "captain-nemo": "captain-nemo.3b4a6a17",
18128
+ "caribbean-latino": "caribbean-latino.8b749d79",
18129
+ "carioca-rio": "carioca-rio.2e2acb66",
18130
+ "catalan-modern": "catalan-modern.d456749f",
18131
+ "catboy": "catboy.84bbb452",
18132
+ "catgirl": "catgirl.563abdff",
18133
+ "caveman": "caveman.7aed8c8b",
18134
+ "cavewoman": "cavewoman.7dcf64e1",
18135
+ "celtic": "celtic.254f4712",
18136
+ "centaur": "centaur.2baface4",
18137
+ "central-african": "central-african.ade477a2",
18138
+ "centurion": "centurion.73eda6ef",
18139
+ "cheekbones-average": "cheekbones-average.aa1189e2",
18140
+ "cheekbones-high-defined": "cheekbones-high-defined.15c9ff76",
18141
+ "cheekbones-low": "cheekbones-low.5d041829",
18142
+ "cheekbones-sculpted": "cheekbones-sculpted.fbe28059",
18143
+ "cheekbones-wide": "cheekbones-wide.cac3b8b0",
18144
+ "chef": "chef.3b56ba79",
18145
+ "chicago-south-side": "chicago-south-side.f53a9b1a",
18146
+ "chilango-traditional": "chilango-traditional.7fc9d9d4",
18147
+ "chinese": "chinese.5f908dbe",
18148
+ "cleopatra": "cleopatra.0cca50dd",
18149
+ "construction-worker": "construction-worker.a2e182c4",
18150
+ "cowardly-lion": "cowardly-lion.fb80e9f0",
18151
+ "crusader": "crusader.337a99a3",
18152
+ "cyborg": "cyborg.689a9408",
18153
+ "cyborg-man": "cyborg-man.2592b90a",
18154
+ "cyborg-woman": "cyborg-woman.c3dc9782",
18155
+ "czech": "czech.15cc5210",
18156
+ "dakar-francophone": "dakar-francophone.81731f36",
18157
+ "danish": "danish.785f39b2",
18158
+ "demon": "demon.8b78d570",
18159
+ "detective": "detective.1f603e4a",
18160
+ "dmv-go-go": "dmv-go-go.ff785218",
18161
+ "doctor": "doctor.decd6c53",
18162
+ "dorothy-oz": "dorothy-oz.28ea6954",
18163
+ "dracula": "dracula.88f16e11",
18164
+ "dragonkin": "dragonkin.505b2ded",
18165
+ "druid": "druid.8f515c24",
18166
+ "dubai-modern": "dubai-modern.d66254b0",
18167
+ "dwarf": "dwarf.2c738257",
18168
+ "east-african": "east-african.94770acb",
18169
+ "east-asian": "east-asian.93728c3f",
18170
+ "eastern-european-glam": "eastern-european-glam.7591f99e",
18171
+ "eastern-european-stoic": "eastern-european-stoic.5630b64d",
18172
+ "elegant-woman": "elegant-woman.c7838f49",
18173
+ "elf": "elf.d2ce8a4c",
18174
+ "elf-man": "elf-man.11e4767e",
18175
+ "elf-woman": "elf-woman.d16020ff",
18176
+ "english-rose": "english-rose.85317171",
18177
+ "european-any": "european-any.fafa4abf",
18178
+ "eye-almond": "eye-almond.bc7e3503",
18179
+ "eye-close-set": "eye-close-set.0b759f93",
18180
+ "eye-deep-set": "eye-deep-set.bc9d9b5a",
18181
+ "eye-double-eyelid": "eye-double-eyelid.67fe42ff",
18182
+ "eye-downturned": "eye-downturned.6b0844fc",
18183
+ "eye-droopy": "eye-droopy.007b3d94",
18184
+ "eye-hooded": "eye-hooded.6cf3ec31",
18185
+ "eye-monolid": "eye-monolid.17bcef86",
18186
+ "eye-narrow": "eye-narrow.f0e41313",
18187
+ "eye-round": "eye-round.721c97b9",
18188
+ "eye-spacing-average": "eye-spacing-average.be643de1",
18189
+ "eye-state-closed": "eye-state-closed.dc36ccab",
18190
+ "eye-state-gazing-away": "eye-state-gazing-away.9315db66",
18191
+ "eye-state-gazing-down": "eye-state-gazing-down.b081a87e",
18192
+ "eye-state-gazing-up": "eye-state-gazing-up.f603f35b",
18193
+ "eye-state-glassy": "eye-state-glassy.6238ec85",
18194
+ "eye-state-half-lidded": "eye-state-half-lidded.eb56deed",
18195
+ "eye-state-staring-camera": "eye-state-staring-camera.40a3470e",
18196
+ "eye-state-wide-eyed": "eye-state-wide-eyed.07f7a0ae",
18197
+ "eye-upturned": "eye-upturned.b7e49e00",
18198
+ "eye-wide": "eye-wide.4ddd5668",
18199
+ "eye-wide-set": "eye-wide-set.270c2f04",
18200
+ "eyelid-standard": "eyelid-standard.8d4c2eef",
17961
18201
  "eyes-amber": "eyes-amber.307003c2",
17962
18202
  "eyes-black": "eyes-black.9453213e",
17963
18203
  "eyes-blue": "eyes-blue.c8c38a75",
@@ -17971,303 +18211,303 @@ var CHARACTER_ART_FILES = {
17971
18211
  "eyes-silver": "eyes-silver.1e9f3130",
17972
18212
  "eyes-turquoise": "eyes-turquoise.661fd2ae",
17973
18213
  "eyes-violet": "eyes-violet.15fa47a7",
17974
- "eyeset-average": "eyeset-average.b624b9e9",
17975
- "eyeset-high": "eyeset-high.3d4604b7",
17976
- "eyeset-low": "eyeset-low.33725419",
18214
+ "eyeset-average": "eyeset-average.f9587aa7",
18215
+ "eyeset-high": "eyeset-high.39ab51f6",
18216
+ "eyeset-low": "eyeset-low.e325b760",
17977
18217
  "face-clean-shaven": "face-clean-shaven.d04de7eb",
17978
- "face-diamond": "face-diamond.9c62b5f7",
18218
+ "face-diamond": "face-diamond.e3365863",
17979
18219
  "face-five-oclock-shadow": "face-five-oclock-shadow.214ad504",
17980
18220
  "face-full-beard": "face-full-beard.b06c169d",
17981
18221
  "face-goatee": "face-goatee.70ba5fbc",
17982
- "face-heart": "face-heart.1c814b0f",
18222
+ "face-heart": "face-heart.2686002d",
17983
18223
  "face-mustache": "face-mustache.16d74dc2",
17984
- "face-oblong": "face-oblong.181bea08",
17985
- "face-oval": "face-oval.e4607e69",
17986
- "face-round": "face-round.8b5bb8ab",
18224
+ "face-oblong": "face-oblong.61ec6394",
18225
+ "face-oval": "face-oval.886f59a8",
18226
+ "face-round": "face-round.9f39b316",
17987
18227
  "face-short-beard": "face-short-beard.af30d08c",
17988
- "face-square": "face-square.6f9f2443",
18228
+ "face-square": "face-square.aed294cf",
17989
18229
  "face-stubble": "face-stubble.5d6f9d2f",
17990
- "face-triangular": "face-triangular.2bfea5ce",
17991
- "facial-fullness-average": "facial-fullness-average.f4b1f69f",
17992
- "facial-fullness-full": "facial-fullness-full.44d56ffb",
17993
- "facial-fullness-gaunt": "facial-fullness-gaunt.325dda62",
17994
- "facial-fullness-lean": "facial-fullness-lean.3bdd6338",
17995
- "facial-fullness-round": "facial-fullness-round.6b5ac61f",
17996
- "farmer": "farmer.167946a5",
17997
- "faun": "faun.a15df170",
17998
- "feature-aegyo-sal": "feature-aegyo-sal.3769bab3",
17999
- "feature-back-tattoo": "feature-back-tattoo.abb7a9f8",
18230
+ "face-triangular": "face-triangular.f433b6b2",
18231
+ "facial-fullness-average": "facial-fullness-average.762dbcf2",
18232
+ "facial-fullness-full": "facial-fullness-full.62d93d33",
18233
+ "facial-fullness-gaunt": "facial-fullness-gaunt.4188130d",
18234
+ "facial-fullness-lean": "facial-fullness-lean.6177edbd",
18235
+ "facial-fullness-round": "facial-fullness-round.199ae5d7",
18236
+ "farmer": "farmer.331b03a2",
18237
+ "faun": "faun.81cb2fd2",
18238
+ "feature-aegyo-sal": "feature-aegyo-sal.d427846a",
18239
+ "feature-back-tattoo": "feature-back-tattoo.4ec928a2",
18000
18240
  "feature-bare-shoulders": "feature-bare-shoulders.07dcca4b",
18001
- "feature-birthmark": "feature-birthmark.56ded5db",
18002
- "feature-chest-tattoo": "feature-chest-tattoo.0daa8875",
18003
- "feature-cleft-chin": "feature-cleft-chin.0c5b9e67",
18241
+ "feature-birthmark": "feature-birthmark.7aa4a3d8",
18242
+ "feature-chest-tattoo": "feature-chest-tattoo.e424c5c2",
18243
+ "feature-cleft-chin": "feature-cleft-chin.15fd25b6",
18004
18244
  "feature-collarbone-visible": "feature-collarbone-visible.badbbc9b",
18005
- "feature-dimpled-chin": "feature-dimpled-chin.4027f730",
18006
- "feature-dimples": "feature-dimples.ac499701",
18245
+ "feature-dimpled-chin": "feature-dimpled-chin.dc61f5c0",
18246
+ "feature-dimples": "feature-dimples.882152b1",
18007
18247
  "feature-ear-piercings": "feature-ear-piercings.4d3c5767",
18008
18248
  "feature-elongated-neck": "feature-elongated-neck.0deb3bb7",
18009
- "feature-eye-bags": "feature-eye-bags.1f90fde0",
18010
- "feature-face-tattoo": "feature-face-tattoo.574ddbfe",
18249
+ "feature-eye-bags": "feature-eye-bags.fbee5aef",
18250
+ "feature-face-tattoo": "feature-face-tattoo.4cda5e86",
18011
18251
  "feature-fangs": "feature-fangs.a4dcbb06",
18012
18252
  "feature-forearm-tattoo": "feature-forearm-tattoo.f07b7858",
18013
- "feature-freckles": "feature-freckles.e56b0705",
18014
- "feature-gap-teeth": "feature-gap-teeth.25cb7065",
18015
- "feature-glasses": "feature-glasses.6d965bbd",
18016
- "feature-hand-tattoos": "feature-hand-tattoos.5c7cc52a",
18017
- "feature-heterochromia": "feature-heterochromia.ca12f2b8",
18253
+ "feature-freckles": "feature-freckles.2b5af280",
18254
+ "feature-gap-teeth": "feature-gap-teeth.77d13397",
18255
+ "feature-glasses": "feature-glasses.da35804b",
18256
+ "feature-hand-tattoos": "feature-hand-tattoos.47e0f0d0",
18257
+ "feature-heterochromia": "feature-heterochromia.8960094f",
18018
18258
  "feature-leg-tattoo": "feature-leg-tattoo.999d01fa",
18019
18259
  "feature-lip-piercing": "feature-lip-piercing.4f074400",
18020
18260
  "feature-midriff-visible": "feature-midriff-visible.d5c3ffc1",
18021
- "feature-mole": "feature-mole.c0ea42db",
18261
+ "feature-mole": "feature-mole.86214bc4",
18022
18262
  "feature-navel-visible": "feature-navel-visible.3ae33e88",
18023
18263
  "feature-nostril-piercing": "feature-nostril-piercing.9e5818e2",
18024
- "feature-piercing": "feature-piercing.6f188a6e",
18025
- "feature-scar": "feature-scar.41ed833f",
18026
- "feature-sleeve-tattoo": "feature-sleeve-tattoo.cb0dbc87",
18027
- "feature-tattoos": "feature-tattoos.0847685b",
18264
+ "feature-piercing": "feature-piercing.5f095ccc",
18265
+ "feature-scar": "feature-scar.6fd43c5e",
18266
+ "feature-sleeve-tattoo": "feature-sleeve-tattoo.8a57bd76",
18267
+ "feature-tattoos": "feature-tattoos.b7208be9",
18028
18268
  "feature-under-eye-circles": "feature-under-eye-circles.6c8b5ebb",
18029
18269
  "feature-visible-piercings": "feature-visible-piercings.5cdba354",
18030
- "feature-vitiligo": "feature-vitiligo.16e2d0b4",
18031
- "femboy": "femboy.ae618e9f",
18032
- "femme-fatale": "femme-fatale.6d05ef29",
18033
- "feral-wildman": "feral-wildman.73e6866d",
18034
- "filipino": "filipino.6f0baadd",
18035
- "finnish": "finnish.5bcd2730",
18036
- "firefighter": "firefighter.141f4174",
18037
- "flight-attendant": "flight-attendant.f6fa905d",
18038
- "frame-average": "frame-average.b819c61e",
18039
- "frame-broad": "frame-broad.774f4b1b",
18040
- "frame-petite": "frame-petite.82fe3b55",
18041
- "frame-slim": "frame-slim.78336144",
18042
- "frankenstein-monster": "frankenstein-monster.24a1e105",
18043
- "french": "french.3a48791b",
18044
- "gangnam-glam": "gangnam-glam.440694fd",
18045
- "gentleman": "gentleman.9910e4be",
18046
- "germanic": "germanic.9aac4bb3",
18047
- "ghost": "ghost.58c8ef0f",
18048
- "ginza-office": "ginza-office.b83a9d37",
18049
- "girl-next-door": "girl-next-door.7cf3cbe9",
18050
- "gladiator": "gladiator.f6621442",
18051
- "goblin": "goblin.039649c0",
18052
- "god": "god.23bdb7c9",
18053
- "goddess": "goddess.273fc0dc",
18054
- "goth": "goth.b2ea3206",
18055
- "graceful-woman": "graceful-woman.f9be86fc",
18056
- "greek": "greek.967b6541",
18057
- "greek-mediterranean": "greek-mediterranean.32ebb46d",
18058
- "grim-reaper": "grim-reaper.abe76d49",
18059
- "hair-ash-blonde": "hair-ash-blonde.52171c54",
18060
- "hair-auburn": "hair-auburn.79d7bd17",
18061
- "hair-black": "hair-black.7a3241e1",
18062
- "hair-blonde": "hair-blonde.3fe5c3c8",
18063
- "hair-blue": "hair-blue.c3dbfdbd",
18064
- "hair-brown": "hair-brown.d03b6c97",
18065
- "hair-burgundy": "hair-burgundy.44f914ed",
18066
- "hair-caramel": "hair-caramel.f0d47697",
18067
- "hair-chestnut": "hair-chestnut.41f4e11f",
18068
- "hair-chocolate": "hair-chocolate.f00b9d68",
18069
- "hair-copper": "hair-copper.76fefce3",
18070
- "hair-creamy": "hair-creamy.4916d97b",
18071
- "hair-dark-brown": "hair-dark-brown.9f595854",
18072
- "hair-dyed": "hair-dyed.dc3b877e",
18073
- "hair-ginger": "hair-ginger.ec9b97e6",
18074
- "hair-gray": "hair-gray.550dcfdf",
18075
- "hair-green": "hair-green.e450c16f",
18076
- "hair-honey": "hair-honey.374ae073",
18077
- "hair-jet-black": "hair-jet-black.cf9ea9c0",
18078
- "hair-lavender": "hair-lavender.17e8be2d",
18079
- "hair-light-brown": "hair-light-brown.914c40db",
18080
- "hair-magenta": "hair-magenta.09ecc5bd",
18081
- "hair-mermaid": "hair-mermaid.07971032",
18082
- "hair-mint": "hair-mint.49f0f647",
18083
- "hair-pastel-blue": "hair-pastel-blue.653935ae",
18084
- "hair-pastel-pink": "hair-pastel-pink.39dab78c",
18085
- "hair-peach": "hair-peach.d64e1466",
18086
- "hair-pink": "hair-pink.58cfd266",
18087
- "hair-platinum": "hair-platinum.213c73bf",
18088
- "hair-purple": "hair-purple.a9165deb",
18089
- "hair-rainbow": "hair-rainbow.545df315",
18090
- "hair-red": "hair-red.24433538",
18091
- "hair-rose-gold": "hair-rose-gold.de7cbddd",
18092
- "hair-salt-pepper": "hair-salt-pepper.e15023aa",
18093
- "hair-silver": "hair-silver.a18ca460",
18094
- "hair-strawberry": "hair-strawberry.2672c962",
18095
- "hair-teal": "hair-teal.9ac870e6",
18096
- "hair-white": "hair-white.cd18562c",
18097
- "half-elf": "half-elf.faf32882",
18098
- "handsome-man": "handsome-man.2b70de16",
18099
- "harlem-classic": "harlem-classic.cd985460",
18100
- "hawaii-island": "hawaii-island.b9f23720",
18101
- "hips-balanced": "hips-balanced.f7bd5f07",
18102
- "hips-narrow": "hips-narrow.02f668e9",
18103
- "hips-wide": "hips-wide.424e34a3",
18104
- "hong-kong-cinematic": "hong-kong-cinematic.f6fbddea",
18105
- "iberian": "iberian.2ca59f0e",
18106
- "icelandic": "icelandic.8fed3f55",
18107
- "indigenous-any": "indigenous-any.c3b58b4d",
18108
- "indonesian-malay": "indonesian-malay.d23bbb5e",
18109
- "inuit": "inuit.7f2aef65",
18110
- "israeli": "israeli.5b97e288",
18111
- "istanbul-bosphorus": "istanbul-bosphorus.fbe9e34d",
18112
- "italian": "italian.aff4605f",
18113
- "japanese": "japanese.6b5f8163",
18114
- "jaw-double": "jaw-double.ce00c170",
18115
- "jaw-pointed": "jaw-pointed.8c2e39f6",
18116
- "jaw-soft": "jaw-soft.1f39278a",
18117
- "jaw-strong": "jaw-strong.e9007352",
18118
- "jaw-wide": "jaw-wide.deb0e853",
18119
- "jerusalem-stone": "jerusalem-stone.aab0b63c",
18120
- "joan-of-arc": "joan-of-arc.4f3111a2",
18121
- "johannesburg-urban": "johannesburg-urban.7c18ea29",
18122
- "journalist": "journalist.5abb6377",
18123
- "judge": "judge.0622e9eb",
18124
- "karate-fighter": "karate-fighter.477465f8",
18125
- "khmer": "khmer.4c121551",
18126
- "king-arthur": "king-arthur.e74993dc",
18127
- "kinshasa-sape": "kinshasa-sape.19513713",
18128
- "knight": "knight.3a51a69f",
18129
- "knight-man": "knight-man.386b5041",
18130
- "knight-woman": "knight-woman.50c93dfa",
18131
- "korean": "korean.567fb304",
18132
- "kung-fu-master": "kung-fu-master.f2222646",
18133
- "kunoichi": "kunoichi.fadab984",
18134
- "lagos-afro-glam": "lagos-afro-glam.76e30b80",
18135
- "latin-american": "latin-american.d8797025",
18136
- "lawyer": "lawyer.b38470ee",
18137
- "lip-state-bare": "lip-state-bare.a28a4b50",
18138
- "lip-state-bitten": "lip-state-bitten.0b7659bf",
18139
- "lip-state-bold-black": "lip-state-bold-black.47c08a30",
18140
- "lip-state-bold-red": "lip-state-bold-red.cc738dfa",
18141
- "lip-state-burgundy": "lip-state-burgundy.8298898c",
18142
- "lip-state-chapped": "lip-state-chapped.2767a5d5",
18143
- "lip-state-glossy": "lip-state-glossy.ff03cee0",
18144
- "lip-state-mauve": "lip-state-mauve.969c9bf9",
18145
- "lip-state-parted": "lip-state-parted.993ce841",
18146
- "lip-state-plum": "lip-state-plum.61c1f465",
18147
- "lip-state-pouting": "lip-state-pouting.620cd2c6",
18148
- "lip-state-pursed": "lip-state-pursed.81aaf165",
18149
- "lips-cupids-bow": "lips-cupids-bow.7e7235f3",
18150
- "lips-full": "lips-full.921ab902",
18151
- "lips-full-lower": "lips-full-lower.2a5c91f9",
18152
- "lips-heart": "lips-heart.d8674763",
18153
- "lips-medium": "lips-medium.f6563654",
18154
- "lips-natural": "lips-natural.98e7c0b8",
18155
- "lips-small": "lips-small.3852b012",
18156
- "lips-thin": "lips-thin.5824fa56",
18157
- "lips-wide": "lips-wide.36d13239",
18158
- "london-prep": "london-prep.4029872d",
18159
- "luanda-lusophone": "luanda-lusophone.0d935bf1",
18160
- "madrile\xF1a": "madrilena.36075257",
18161
- "madrile\xF1o": "madrileno.22d64b4d",
18162
- "maghreb-coastal": "maghreb-coastal.51a5768e",
18163
- "magical-girl": "magical-girl.e9606eb4",
18164
- "man": "man.441363db",
18165
- "manchester-indie": "manchester-indie.8fe241d9",
18166
- "marrakech-bohemian": "marrakech-bohemian.8e202b62",
18167
- "masked-vigilante": "masked-vigilante.1cfd5649",
18168
- "mass-average": "mass-average.60747e82",
18169
- "mass-full": "mass-full.7e973bcf",
18170
- "mass-heavy": "mass-heavy.a08f2d16",
18171
- "mass-lean": "mass-lean.95f2f35a",
18172
- "mechanic": "mechanic.09b70e14",
18173
- "mediterranean": "mediterranean.026a7bde",
18174
- "mena-any": "mena-any.dc74f8a5",
18175
- "merlin": "merlin.540aa004",
18176
- "mermaid": "mermaid.e4913bba",
18177
- "merman": "merman.e9fe75c8",
18178
- "mexican-mesoamerican": "mexican-mesoamerican.7e61b255",
18179
- "mexico-city-chic": "mexico-city-chic.d45a5d06",
18180
- "miami-latina": "miami-latina.f3358aa7",
18181
- "miami-latino": "miami-latino.249e12a5",
18182
- "middle-eastern": "middle-eastern.9401fb8f",
18183
- "milanese-fashion": "milanese-fashion.27ce995f",
18184
- "mixed": "mixed.973ca77d",
18185
- "mongol-warrior": "mongol-warrior.d859f113",
18186
- "mongolian-tibetan": "mongolian-tibetan.e44f3327",
18187
- "mr-hyde": "mr-hyde.bbe935b9",
18188
- "mumbai-bollywood": "mumbai-bollywood.7d842c6f",
18189
- "munich-traditional": "munich-traditional.47db3c88",
18190
- "musician": "musician.7264fda9",
18191
- "musketeer": "musketeer.0a33a4ad",
18192
- "mutant": "mutant.9cabc0a5",
18193
- "mysterious-figure": "mysterious-figure.d1326b08",
18194
- "nairobi-cosmopolitan": "nairobi-cosmopolitan.7a78e830",
18195
- "nashville-country": "nashville-country.e26ede44",
18196
- "nashville-cowboy": "nashville-cowboy.8c53895a",
18197
- "native-american": "native-american.d352bb08",
18198
- "neanderthal": "neanderthal.cf0175b0",
18199
- "necromancer": "necromancer.8a6b4187",
18200
- "new-england-prep": "new-england-prep.a4760f2f",
18201
- "ninja": "ninja.7810d8b5",
18202
- "nola-creole": "nola-creole.ca79054c",
18203
- "norcal-hippie": "norcal-hippie.3c740f73",
18204
- "nordic": "nordic.55c9bc01",
18205
- "norwegian": "norwegian.e7b21c31",
18206
- "nose-aquiline": "nose-aquiline.3b555a31",
18207
- "nose-broad": "nose-broad.bb6cfb39",
18208
- "nose-button": "nose-button.8ea1eea9",
18209
- "nose-hooked": "nose-hooked.1dbb62a6",
18210
- "nose-narrow": "nose-narrow.154d1817",
18211
- "nose-roman": "nose-roman.377e8fd9",
18212
- "nose-snub": "nose-snub.7c5bdcf8",
18213
- "nose-straight": "nose-straight.1659310b",
18214
- "nose-tip-drooping": "nose-tip-drooping.a3900810",
18215
- "nose-tip-natural": "nose-tip-natural.e5d3711c",
18216
- "nose-tip-refined": "nose-tip-refined.90a3e69a",
18217
- "nose-tip-rounded": "nose-tip-rounded.a1a34091",
18218
- "nose-tip-upturned": "nose-tip-upturned.dd81c942",
18219
- "not-defined": "not-defined.6f0489b1",
18220
- "nun": "nun.17226954",
18221
- "nurse": "nurse.d0e720e4",
18222
- "nyc-fashion": "nyc-fashion.d4bea881",
18223
- "nyc-sharp": "nyc-sharp.33c18ba8",
18224
- "orc": "orc.3c157625",
18225
- "osaka-everyday": "osaka-everyday.5ebde606",
18226
- "outback-stockman": "outback-stockman.d19fac81",
18227
- "pacific-islander": "pacific-islander.71f9cacd",
18228
- "parisian-flaneur": "parisian-flaneur.4cf6c2f7",
18229
- "parisienne": "parisienne.dac38aee",
18230
- "paulista": "paulista.08b8e3ee",
18231
- "persian": "persian.f51610aa",
18232
- "persian-glam": "persian-glam.f9cf4504",
18233
- "peter-pan": "peter-pan.1e90e5fa",
18234
- "phantom-opera": "phantom-opera.0f3d2242",
18235
- "pilot": "pilot.ddafb482",
18236
- "pirate": "pirate.5e4234d9",
18237
- "pnw-granola": "pnw-granola.001eba82",
18238
- "police-officer": "police-officer.4efb02c1",
18239
- "policeman": "policeman.24664907",
18240
- "policewoman": "policewoman.eff14c6d",
18241
- "porte\xF1o": "porteno.c8ed5def",
18242
- "priest": "priest.8c5bd3f6",
18243
- "prince": "prince.6c7348de",
18244
- "princess": "princess.3ba6d322",
18245
- "ranger": "ranger.ff31449d",
18246
- "robin-hood": "robin-hood.2b3eb174",
18247
- "robot": "robot.1f4d427b",
18248
- "rugged-man": "rugged-man.b36b1000",
18249
- "russian": "russian.cb62f74e",
18250
- "sabra": "sabra.8b9ceacd",
18251
- "samarkand-silk-road": "samarkand-silk-road.163f7eb8",
18252
- "samurai": "samurai.74792207",
18253
- "samurai-man": "samurai-man.ea82c663",
18254
- "samurai-woman": "samurai-woman.df7e970b",
18255
- "santa-claus": "santa-claus.cfd61f82",
18256
- "scandi-minimal": "scandi-minimal.5b269c7a",
18257
- "scarecrow-oz": "scarecrow-oz.10ec1ccf",
18258
- "scientist": "scientist.4faaacb3",
18259
- "seoul-k-pop": "seoul-k-pop.4ac7819b",
18260
- "shanghai-modern": "shanghai-modern.56a75bc1",
18261
- "shaolin-monk": "shaolin-monk.7439db75",
18262
- "sherlock-holmes": "sherlock-holmes.3470321d",
18263
- "shibuya-streetwear": "shibuya-streetwear.b4715920",
18264
- "sicilian-beach": "sicilian-beach.7c2a347b",
18265
- "silhouette-athletic": "silhouette-athletic.5275fbff",
18266
- "silhouette-hourglass": "silhouette-hourglass.53bdd47b",
18267
- "silhouette-inverted": "silhouette-inverted.16da2238",
18268
- "silhouette-pear": "silhouette-pear.44c2e5d2",
18269
- "silhouette-rectangular": "silhouette-rectangular.c1e7cb79",
18270
- "silver-fox": "silver-fox.991735a5",
18270
+ "feature-vitiligo": "feature-vitiligo.edcf7edc",
18271
+ "femboy": "femboy.57646350",
18272
+ "femme-fatale": "femme-fatale.11fb0348",
18273
+ "feral-wildman": "feral-wildman.d1352c60",
18274
+ "filipino": "filipino.5656d473",
18275
+ "finnish": "finnish.f92cc3b3",
18276
+ "firefighter": "firefighter.d9e30f88",
18277
+ "flight-attendant": "flight-attendant.5c343e49",
18278
+ "frame-average": "frame-average.ae2c9d90",
18279
+ "frame-broad": "frame-broad.f84fe416",
18280
+ "frame-petite": "frame-petite.2cb2a5b7",
18281
+ "frame-slim": "frame-slim.06112816",
18282
+ "frankenstein-monster": "frankenstein-monster.15f158a0",
18283
+ "french": "french.916c1127",
18284
+ "gangnam-glam": "gangnam-glam.35f37ca8",
18285
+ "gentleman": "gentleman.ff00e0f9",
18286
+ "germanic": "germanic.0189483f",
18287
+ "ghost": "ghost.26004442",
18288
+ "ginza-office": "ginza-office.357e843d",
18289
+ "girl-next-door": "girl-next-door.067745c4",
18290
+ "gladiator": "gladiator.321aeaee",
18291
+ "goblin": "goblin.35d79297",
18292
+ "god": "god.2b5ab072",
18293
+ "goddess": "goddess.ad30ad48",
18294
+ "goth": "goth.8b32fdf9",
18295
+ "graceful-woman": "graceful-woman.a68a59e0",
18296
+ "greek": "greek.fcc4b151",
18297
+ "greek-mediterranean": "greek-mediterranean.f81ee0ab",
18298
+ "grim-reaper": "grim-reaper.2569b486",
18299
+ "hair-ash-blonde": "hair-ash-blonde.de2d1bda",
18300
+ "hair-auburn": "hair-auburn.9a70be5d",
18301
+ "hair-black": "hair-black.0ddfa287",
18302
+ "hair-blonde": "hair-blonde.b55cee73",
18303
+ "hair-blue": "hair-blue.f481ec14",
18304
+ "hair-brown": "hair-brown.d822daff",
18305
+ "hair-burgundy": "hair-burgundy.ef64b93a",
18306
+ "hair-caramel": "hair-caramel.9df2e0e9",
18307
+ "hair-chestnut": "hair-chestnut.d27c23ce",
18308
+ "hair-chocolate": "hair-chocolate.d3939f13",
18309
+ "hair-copper": "hair-copper.7bde014d",
18310
+ "hair-creamy": "hair-creamy.e19dc4ee",
18311
+ "hair-dark-brown": "hair-dark-brown.6f2c491c",
18312
+ "hair-dyed": "hair-dyed.f998f32d",
18313
+ "hair-ginger": "hair-ginger.627ab53a",
18314
+ "hair-gray": "hair-gray.00a9adef",
18315
+ "hair-green": "hair-green.660f2c76",
18316
+ "hair-honey": "hair-honey.693b9aeb",
18317
+ "hair-jet-black": "hair-jet-black.19fa76f5",
18318
+ "hair-lavender": "hair-lavender.e2562d95",
18319
+ "hair-light-brown": "hair-light-brown.886d0b91",
18320
+ "hair-magenta": "hair-magenta.20871a96",
18321
+ "hair-mermaid": "hair-mermaid.5985ba5b",
18322
+ "hair-mint": "hair-mint.5deed4a8",
18323
+ "hair-pastel-blue": "hair-pastel-blue.caaf7784",
18324
+ "hair-pastel-pink": "hair-pastel-pink.20917313",
18325
+ "hair-peach": "hair-peach.8425a328",
18326
+ "hair-pink": "hair-pink.305739ec",
18327
+ "hair-platinum": "hair-platinum.b1b325ef",
18328
+ "hair-purple": "hair-purple.db070bee",
18329
+ "hair-rainbow": "hair-rainbow.56401c53",
18330
+ "hair-red": "hair-red.68a93f0e",
18331
+ "hair-rose-gold": "hair-rose-gold.fc4cb0ee",
18332
+ "hair-salt-pepper": "hair-salt-pepper.890424d3",
18333
+ "hair-silver": "hair-silver.40e3d472",
18334
+ "hair-strawberry": "hair-strawberry.10f0b520",
18335
+ "hair-teal": "hair-teal.1e0d1de6",
18336
+ "hair-white": "hair-white.ede1960d",
18337
+ "half-elf": "half-elf.7ee2ee17",
18338
+ "handsome-man": "handsome-man.d113fbe7",
18339
+ "harlem-classic": "harlem-classic.ead2e23b",
18340
+ "hawaii-island": "hawaii-island.2957cc6f",
18341
+ "hips-balanced": "hips-balanced.8e3827cb",
18342
+ "hips-narrow": "hips-narrow.e905840c",
18343
+ "hips-wide": "hips-wide.f3f07481",
18344
+ "hong-kong-cinematic": "hong-kong-cinematic.3a70d257",
18345
+ "iberian": "iberian.388b6ce8",
18346
+ "icelandic": "icelandic.69bc6644",
18347
+ "indigenous-any": "indigenous-any.97c4f62a",
18348
+ "indonesian-malay": "indonesian-malay.7c0acf0c",
18349
+ "inuit": "inuit.edd729f6",
18350
+ "israeli": "israeli.ebf4a1a0",
18351
+ "istanbul-bosphorus": "istanbul-bosphorus.cd094332",
18352
+ "italian": "italian.eb5b746d",
18353
+ "japanese": "japanese.26ff1a91",
18354
+ "jaw-double": "jaw-double.ed20ea16",
18355
+ "jaw-pointed": "jaw-pointed.90268a61",
18356
+ "jaw-soft": "jaw-soft.7b0295c8",
18357
+ "jaw-strong": "jaw-strong.9442d3f6",
18358
+ "jaw-wide": "jaw-wide.56013eba",
18359
+ "jerusalem-stone": "jerusalem-stone.7b602219",
18360
+ "joan-of-arc": "joan-of-arc.72e7d4ef",
18361
+ "johannesburg-urban": "johannesburg-urban.c873b0bf",
18362
+ "journalist": "journalist.d82e88eb",
18363
+ "judge": "judge.ea3c1f04",
18364
+ "karate-fighter": "karate-fighter.0a2683f8",
18365
+ "khmer": "khmer.e438ac8b",
18366
+ "king-arthur": "king-arthur.9a110d20",
18367
+ "kinshasa-sape": "kinshasa-sape.e793d787",
18368
+ "knight": "knight.ebe07e0d",
18369
+ "knight-man": "knight-man.6312ed68",
18370
+ "knight-woman": "knight-woman.44b02a31",
18371
+ "korean": "korean.ac39779e",
18372
+ "kung-fu-master": "kung-fu-master.54078936",
18373
+ "kunoichi": "kunoichi.36d1e4b6",
18374
+ "lagos-afro-glam": "lagos-afro-glam.112a127c",
18375
+ "latin-american": "latin-american.56206332",
18376
+ "lawyer": "lawyer.436f5bdb",
18377
+ "lip-state-bare": "lip-state-bare.df6331a6",
18378
+ "lip-state-bitten": "lip-state-bitten.095dadc1",
18379
+ "lip-state-bold-black": "lip-state-bold-black.25847ba4",
18380
+ "lip-state-bold-red": "lip-state-bold-red.24b999e6",
18381
+ "lip-state-burgundy": "lip-state-burgundy.ed9f17c1",
18382
+ "lip-state-chapped": "lip-state-chapped.395dca92",
18383
+ "lip-state-glossy": "lip-state-glossy.6e79ae8b",
18384
+ "lip-state-mauve": "lip-state-mauve.dd101f88",
18385
+ "lip-state-parted": "lip-state-parted.49df312d",
18386
+ "lip-state-plum": "lip-state-plum.e58bcfce",
18387
+ "lip-state-pouting": "lip-state-pouting.678de7c7",
18388
+ "lip-state-pursed": "lip-state-pursed.b6f161ab",
18389
+ "lips-cupids-bow": "lips-cupids-bow.f6a7edf3",
18390
+ "lips-full": "lips-full.5b360348",
18391
+ "lips-full-lower": "lips-full-lower.5e3e14cc",
18392
+ "lips-heart": "lips-heart.e4846849",
18393
+ "lips-medium": "lips-medium.284333c5",
18394
+ "lips-natural": "lips-natural.3b0383db",
18395
+ "lips-small": "lips-small.09de7235",
18396
+ "lips-thin": "lips-thin.497d66b7",
18397
+ "lips-wide": "lips-wide.2f3b0121",
18398
+ "london-prep": "london-prep.ab700df0",
18399
+ "luanda-lusophone": "luanda-lusophone.ba6ea78e",
18400
+ "madrile\xF1a": "madrilena.80edd022",
18401
+ "madrile\xF1o": "madrileno.f281e739",
18402
+ "maghreb-coastal": "maghreb-coastal.507d2bb8",
18403
+ "magical-girl": "magical-girl.88fbeedf",
18404
+ "man": "man.d6bed999",
18405
+ "manchester-indie": "manchester-indie.e5aab9bb",
18406
+ "marrakech-bohemian": "marrakech-bohemian.a61ff7cd",
18407
+ "masked-vigilante": "masked-vigilante.c2ca668c",
18408
+ "mass-average": "mass-average.882e2121",
18409
+ "mass-full": "mass-full.ff8a45c4",
18410
+ "mass-heavy": "mass-heavy.4b24a5c8",
18411
+ "mass-lean": "mass-lean.e8f80c9f",
18412
+ "mechanic": "mechanic.ce6ed356",
18413
+ "mediterranean": "mediterranean.1891dd5f",
18414
+ "mena-any": "mena-any.61739d1c",
18415
+ "merlin": "merlin.4a510bf6",
18416
+ "mermaid": "mermaid.776e28b5",
18417
+ "merman": "merman.9b914bcf",
18418
+ "mexican-mesoamerican": "mexican-mesoamerican.3db55830",
18419
+ "mexico-city-chic": "mexico-city-chic.a569a510",
18420
+ "miami-latina": "miami-latina.16272589",
18421
+ "miami-latino": "miami-latino.69f94943",
18422
+ "middle-eastern": "middle-eastern.ba4852ec",
18423
+ "milanese-fashion": "milanese-fashion.296a9ea9",
18424
+ "mixed": "mixed.e2c2056e",
18425
+ "mongol-warrior": "mongol-warrior.2a863884",
18426
+ "mongolian-tibetan": "mongolian-tibetan.6e1490dd",
18427
+ "mr-hyde": "mr-hyde.a2411b5a",
18428
+ "mumbai-bollywood": "mumbai-bollywood.e8c2bf8f",
18429
+ "munich-traditional": "munich-traditional.3006319e",
18430
+ "musician": "musician.1fabfea7",
18431
+ "musketeer": "musketeer.d4d8ee22",
18432
+ "mutant": "mutant.c4f8b5e0",
18433
+ "mysterious-figure": "mysterious-figure.6f7029e8",
18434
+ "nairobi-cosmopolitan": "nairobi-cosmopolitan.6965b9f3",
18435
+ "nashville-country": "nashville-country.a4eb14a2",
18436
+ "nashville-cowboy": "nashville-cowboy.db923886",
18437
+ "native-american": "native-american.061cec3a",
18438
+ "neanderthal": "neanderthal.defc1c63",
18439
+ "necromancer": "necromancer.ff3b5f7d",
18440
+ "new-england-prep": "new-england-prep.2d5f43f5",
18441
+ "ninja": "ninja.4af2ef6f",
18442
+ "nola-creole": "nola-creole.4c862ac1",
18443
+ "norcal-hippie": "norcal-hippie.0f613651",
18444
+ "nordic": "nordic.7d40c268",
18445
+ "norwegian": "norwegian.0a5dc507",
18446
+ "nose-aquiline": "nose-aquiline.7d245d4b",
18447
+ "nose-broad": "nose-broad.8fb09d3c",
18448
+ "nose-button": "nose-button.8b8389c1",
18449
+ "nose-hooked": "nose-hooked.3104bb61",
18450
+ "nose-narrow": "nose-narrow.f18c4f78",
18451
+ "nose-roman": "nose-roman.18edd526",
18452
+ "nose-snub": "nose-snub.d9fbb6d2",
18453
+ "nose-straight": "nose-straight.2198c654",
18454
+ "nose-tip-drooping": "nose-tip-drooping.44fe00dd",
18455
+ "nose-tip-natural": "nose-tip-natural.0d901d3c",
18456
+ "nose-tip-refined": "nose-tip-refined.ea59e2f8",
18457
+ "nose-tip-rounded": "nose-tip-rounded.da12465c",
18458
+ "nose-tip-upturned": "nose-tip-upturned.d2d3735e",
18459
+ "not-defined": "not-defined.2c6ef9e9",
18460
+ "nun": "nun.e1d5dbd2",
18461
+ "nurse": "nurse.0b1fb0d6",
18462
+ "nyc-fashion": "nyc-fashion.40ffdf0d",
18463
+ "nyc-sharp": "nyc-sharp.f9ec3dac",
18464
+ "orc": "orc.4f32e967",
18465
+ "osaka-everyday": "osaka-everyday.f70a4435",
18466
+ "outback-stockman": "outback-stockman.fe20eff0",
18467
+ "pacific-islander": "pacific-islander.1e9307e4",
18468
+ "parisian-flaneur": "parisian-flaneur.b4f83da3",
18469
+ "parisienne": "parisienne.2078870a",
18470
+ "paulista": "paulista.ac3e8047",
18471
+ "persian": "persian.06e3183d",
18472
+ "persian-glam": "persian-glam.af63e019",
18473
+ "peter-pan": "peter-pan.f65d0d17",
18474
+ "phantom-opera": "phantom-opera.efedd2be",
18475
+ "pilot": "pilot.60e9e573",
18476
+ "pirate": "pirate.601480f4",
18477
+ "pnw-granola": "pnw-granola.0ff8e6aa",
18478
+ "police-officer": "police-officer.32508cf2",
18479
+ "policeman": "policeman.2a9ee10d",
18480
+ "policewoman": "policewoman.c51b625e",
18481
+ "porte\xF1o": "porteno.3c696546",
18482
+ "priest": "priest.f7c42b55",
18483
+ "prince": "prince.aa18454f",
18484
+ "princess": "princess.b3f7e096",
18485
+ "ranger": "ranger.e9f3fdb4",
18486
+ "robin-hood": "robin-hood.283d0b04",
18487
+ "robot": "robot.59d59049",
18488
+ "rugged-man": "rugged-man.b8748c04",
18489
+ "russian": "russian.1429e993",
18490
+ "sabra": "sabra.9b1e2cc3",
18491
+ "samarkand-silk-road": "samarkand-silk-road.67bd8700",
18492
+ "samurai": "samurai.a52cb568",
18493
+ "samurai-man": "samurai-man.1fdeaff2",
18494
+ "samurai-woman": "samurai-woman.2fcf592b",
18495
+ "santa-claus": "santa-claus.4ccdc63b",
18496
+ "scandi-minimal": "scandi-minimal.523c802c",
18497
+ "scarecrow-oz": "scarecrow-oz.03c8170e",
18498
+ "scientist": "scientist.74883917",
18499
+ "seoul-k-pop": "seoul-k-pop.b692640b",
18500
+ "shanghai-modern": "shanghai-modern.33fc6694",
18501
+ "shaolin-monk": "shaolin-monk.c74bc683",
18502
+ "sherlock-holmes": "sherlock-holmes.8e9d1104",
18503
+ "shibuya-streetwear": "shibuya-streetwear.89d6cf63",
18504
+ "sicilian-beach": "sicilian-beach.6b283aae",
18505
+ "silhouette-athletic": "silhouette-athletic.d34c439e",
18506
+ "silhouette-hourglass": "silhouette-hourglass.92fa8e9e",
18507
+ "silhouette-inverted": "silhouette-inverted.434484f3",
18508
+ "silhouette-pear": "silhouette-pear.2007e0ac",
18509
+ "silhouette-rectangular": "silhouette-rectangular.c8a9aa0b",
18510
+ "silver-fox": "silver-fox.a88e888d",
18271
18511
  "skin-brown": "skin-brown.322fc699",
18272
18512
  "skin-dark": "skin-dark.ac4dcaf3",
18273
18513
  "skin-fair": "skin-fair.cd7f7b02",
@@ -18276,36 +18516,36 @@ var CHARACTER_ART_FILES = {
18276
18516
  "skin-tan": "skin-tan.35fac0a5",
18277
18517
  "skin-very-dark": "skin-very-dark.e549eef5",
18278
18518
  "skin-very-fair": "skin-very-fair.3c4720e8",
18279
- "slavic": "slavic.f79eae20",
18280
- "soft-butch": "soft-butch.299a72f5",
18281
- "soldier": "soldier.a13092aa",
18282
- "sorcerer": "sorcerer.be6e30e2",
18283
- "sorceress": "sorceress.7eb3a1ad",
18284
- "south-asian": "south-asian.da8e7591",
18285
- "south-india-traditional": "south-india-traditional.ad7a0d28",
18286
- "southeast-asian": "southeast-asian.5bb98ab7",
18287
- "southern-african": "southern-african.ccaa25e4",
18288
- "southern-belle": "southern-belle.0726121a",
18289
- "southern-cone": "southern-cone.0b0c6087",
18290
- "southern-gentleman": "southern-gentleman.084b3289",
18291
- "space-marine": "space-marine.17a07718",
18292
- "spartan-warrior": "spartan-warrior.3c0ceb45",
18293
- "stunning-model": "stunning-model.768cc9a5",
18294
- "stylish-influencer": "stylish-influencer.273386c5",
18295
- "sumo-wrestler": "sumo-wrestler.8e2de31c",
18296
- "super-soldier": "super-soldier.2f1d7a1d",
18297
- "superhero": "superhero.de34a12b",
18298
- "superheroine": "superheroine.b39dbd98",
18299
- "supermodel": "supermodel.f62fa13c",
18300
- "supervillain": "supervillain.2a54059c",
18301
- "surgeon": "surgeon.f8cc06ea",
18302
- "swahili-coast": "swahili-coast.f7fc6899",
18303
- "swedish": "swedish.a7f35436",
18304
- "tashkent-modern": "tashkent-modern.061ce39f",
18305
- "teacher": "teacher.a517c6bc",
18306
- "tel-aviv-beach": "tel-aviv-beach.a9d6c122",
18307
- "texas-cowboy": "texas-cowboy.0e58dc54",
18308
- "texas-cowgirl": "texas-cowgirl.a7f0ad12",
18519
+ "slavic": "slavic.bf0cf9c5",
18520
+ "soft-butch": "soft-butch.792a0390",
18521
+ "soldier": "soldier.ecc5cc82",
18522
+ "sorcerer": "sorcerer.0daa8d13",
18523
+ "sorceress": "sorceress.cf4210f1",
18524
+ "south-asian": "south-asian.fbe88975",
18525
+ "south-india-traditional": "south-india-traditional.710fe3e3",
18526
+ "southeast-asian": "southeast-asian.6912605e",
18527
+ "southern-african": "southern-african.cb5fb395",
18528
+ "southern-belle": "southern-belle.97d426e2",
18529
+ "southern-cone": "southern-cone.af853610",
18530
+ "southern-gentleman": "southern-gentleman.57ccdb40",
18531
+ "space-marine": "space-marine.2cd0ff57",
18532
+ "spartan-warrior": "spartan-warrior.a8e42f6a",
18533
+ "stunning-model": "stunning-model.25296a3b",
18534
+ "stylish-influencer": "stylish-influencer.2f2d3ee7",
18535
+ "sumo-wrestler": "sumo-wrestler.a8c26c39",
18536
+ "super-soldier": "super-soldier.f024b621",
18537
+ "superhero": "superhero.25ce9fbd",
18538
+ "superheroine": "superheroine.3538fe42",
18539
+ "supermodel": "supermodel.09201ad9",
18540
+ "supervillain": "supervillain.adf639c2",
18541
+ "surgeon": "surgeon.ca7c440b",
18542
+ "swahili-coast": "swahili-coast.eb18d0b5",
18543
+ "swedish": "swedish.077da3e3",
18544
+ "tashkent-modern": "tashkent-modern.02a029e0",
18545
+ "teacher": "teacher.6e56ed1f",
18546
+ "tel-aviv-beach": "tel-aviv-beach.77c9282a",
18547
+ "texas-cowboy": "texas-cowboy.3937dc42",
18548
+ "texas-cowgirl": "texas-cowgirl.4b6e6150",
18309
18549
  "texture-acne-scarred": "texture-acne-scarred.c4473d07",
18310
18550
  "texture-ashen": "texture-ashen.c18145d8",
18311
18551
  "texture-baby-soft": "texture-baby-soft.b0012681",
@@ -18325,35 +18565,35 @@ var CHARACTER_ART_FILES = {
18325
18565
  "texture-tanned": "texture-tanned.67065ef7",
18326
18566
  "texture-weathered": "texture-weathered.28c3fdb0",
18327
18567
  "texture-wrinkled": "texture-wrinkled.f8d764d5",
18328
- "thai": "thai.1180f88a",
18329
- "thick": "thick.f477a49f",
18330
- "tiefling": "tiefling.bed5eeab",
18331
- "tin-man": "tin-man.609005c3",
18332
- "tokyo-harajuku": "tokyo-harajuku.539973df",
18333
- "tomboy": "tomboy.0d682de3",
18334
- "tough-guy": "tough-guy.3c24f5ce",
18335
- "turkish": "turkish.72e11b14",
18336
- "twink": "twink.08aa9af6",
18337
- "ukrainian": "ukrainian.649c94bc",
18338
- "valkyrie": "valkyrie.964f7c36",
18339
- "valley-girl": "valley-girl.52323cb3",
18340
- "vampire": "vampire.ecb28b40",
18341
- "vampire-man": "vampire-man.4b3799c1",
18342
- "vampire-woman": "vampire-woman.d15b7807",
18343
- "vegas-glam": "vegas-glam.111c1609",
18344
- "vegas-suit": "vegas-suit.4210295b",
18345
- "vietnamese": "vietnamese.e443498b",
18346
- "viking-warrior": "viking-warrior.9c014d86",
18347
- "waist-average": "waist-average.17784477",
18348
- "waist-defined": "waist-defined.cef4e610",
18349
- "waist-straight": "waist-straight.ff7c45b0",
18350
- "werewolf": "werewolf.fdcf678d",
18351
- "west-african": "west-african.f04c538b",
18352
- "west-coast-hip-hop": "west-coast-hip-hop.f9e076cc",
18353
- "wise-elder": "wise-elder.3d5f0bd3",
18354
- "witch": "witch.d2979416",
18355
- "wizard": "wizard.1b7e2678",
18356
- "woman": "woman.ee7c03c6"
18568
+ "thai": "thai.c8513baf",
18569
+ "thick": "thick.3e9d2e5d",
18570
+ "tiefling": "tiefling.7e838233",
18571
+ "tin-man": "tin-man.56955978",
18572
+ "tokyo-harajuku": "tokyo-harajuku.0734e03e",
18573
+ "tomboy": "tomboy.f6c8a669",
18574
+ "tough-guy": "tough-guy.50dac40a",
18575
+ "turkish": "turkish.66810177",
18576
+ "twink": "twink.a3508b54",
18577
+ "ukrainian": "ukrainian.b69e81ed",
18578
+ "valkyrie": "valkyrie.1bedd383",
18579
+ "valley-girl": "valley-girl.5898bb6c",
18580
+ "vampire": "vampire.07d80bd3",
18581
+ "vampire-man": "vampire-man.3fc6397e",
18582
+ "vampire-woman": "vampire-woman.5b937d84",
18583
+ "vegas-glam": "vegas-glam.2aff6744",
18584
+ "vegas-suit": "vegas-suit.fb77c9b2",
18585
+ "vietnamese": "vietnamese.eb1b8774",
18586
+ "viking-warrior": "viking-warrior.965f44e7",
18587
+ "waist-average": "waist-average.061081a9",
18588
+ "waist-defined": "waist-defined.8e232aea",
18589
+ "waist-straight": "waist-straight.5f67cd31",
18590
+ "werewolf": "werewolf.693ea905",
18591
+ "west-african": "west-african.3075244d",
18592
+ "west-coast-hip-hop": "west-coast-hip-hop.f3a874cd",
18593
+ "wise-elder": "wise-elder.2c8166e5",
18594
+ "witch": "witch.318b2d4e",
18595
+ "wizard": "wizard.a7710a5f",
18596
+ "woman": "woman.ff7f6f85"
18357
18597
  },
18358
18598
  "sections": {
18359
18599
  "accessories": "accessories.08c7cf49",
@@ -18391,33 +18631,33 @@ var CHARACTER_ART_FILES = {
18391
18631
  "bottom-wide-leg-jeans": "bottom-wide-leg-jeans.398fcc4b",
18392
18632
  "cut-bangs": "cut-bangs.b5d2bb2e",
18393
18633
  "cut-bardot-tendrils": "cut-bardot-tendrils.8a1a63d7",
18394
- "cut-bob": "cut-bob.d6f24a1a",
18634
+ "cut-bob": "cut-bob.75f0dc0b",
18395
18635
  "cut-box-braids": "cut-box-braids.5ca05340",
18396
18636
  "cut-braids": "cut-braids.4a2efc0f",
18397
18637
  "cut-bun": "cut-bun.b584d833",
18398
- "cut-buzz-cut": "cut-buzz-cut.a30043ff",
18638
+ "cut-buzz-cut": "cut-buzz-cut.3ed06739",
18399
18639
  "cut-cornrows": "cut-cornrows.cccbbe08",
18400
- "cut-crew-cut": "cut-crew-cut.a761ceb8",
18640
+ "cut-crew-cut": "cut-crew-cut.549cd2c2",
18401
18641
  "cut-crown-braid": "cut-crown-braid.749bab90",
18402
18642
  "cut-curtain-bangs": "cut-curtain-bangs.a1919836",
18403
18643
  "cut-dreadlocks": "cut-dreadlocks.ee424c7d",
18404
18644
  "cut-dutch-braid": "cut-dutch-braid.6c425623",
18405
- "cut-faux-hawk": "cut-faux-hawk.4a7e1a4c",
18645
+ "cut-faux-hawk": "cut-faux-hawk.1313c505",
18406
18646
  "cut-fishtail-braid": "cut-fishtail-braid.0fe04fe1",
18407
- "cut-french-bob": "cut-french-bob.01ef4d8a",
18647
+ "cut-french-bob": "cut-french-bob.288e9ebb",
18408
18648
  "cut-french-braid": "cut-french-braid.be7cf82d",
18409
18649
  "cut-half-up": "cut-half-up.d8053596",
18410
18650
  "cut-high-ponytail": "cut-high-ponytail.3f76e6fb",
18411
- "cut-lob": "cut-lob.3139e465",
18412
- "cut-micro-bob": "cut-micro-bob.680bbcff",
18413
- "cut-mohawk": "cut-mohawk.397f84e7",
18414
- "cut-mullet": "cut-mullet.faedebee",
18415
- "cut-pixie": "cut-pixie.17f68831",
18416
- "cut-pompadour": "cut-pompadour.489db4b1",
18651
+ "cut-lob": "cut-lob.f8c76078",
18652
+ "cut-micro-bob": "cut-micro-bob.4dbd218c",
18653
+ "cut-mohawk": "cut-mohawk.e8b781a9",
18654
+ "cut-mullet": "cut-mullet.2076b436",
18655
+ "cut-pixie": "cut-pixie.3fd3a300",
18656
+ "cut-pompadour": "cut-pompadour.30653f25",
18417
18657
  "cut-ponytail": "cut-ponytail.19eee211",
18418
- "cut-shaved": "cut-shaved.80bc748c",
18419
- "cut-short": "cut-short.13dc4624",
18420
- "cut-short-curly": "cut-short-curly.bce4eb39",
18658
+ "cut-shaved": "cut-shaved.6ad77f15",
18659
+ "cut-short": "cut-short.056116e6",
18660
+ "cut-short-curly": "cut-short-curly.5d93ef4c",
18421
18661
  "cut-side-swept": "cut-side-swept.5197e886",
18422
18662
  "cut-single-braid": "cut-single-braid.22e82326",
18423
18663
  "cut-sisterlocks": "cut-sisterlocks.4e4b4e10",
@@ -18425,7 +18665,7 @@ var CHARACTER_ART_FILES = {
18425
18665
  "cut-space-buns": "cut-space-buns.369c3057",
18426
18666
  "cut-top-knot": "cut-top-knot.849f303a",
18427
18667
  "cut-two-braids": "cut-two-braids.4e20ba2e",
18428
- "cut-undercut": "cut-undercut.2966ed8b",
18668
+ "cut-undercut": "cut-undercut.744dad42",
18429
18669
  "cut-wispy-bangs": "cut-wispy-bangs.c95ecddf",
18430
18670
  "cut-wolf-cut": "cut-wolf-cut.4275c4b6",
18431
18671
  "eyewear-aviators": "eyewear-aviators.56442c0b",
@@ -18560,43 +18800,43 @@ var CHARACTER_ART_FILES = {
18560
18800
  "outerwear-trench": "outerwear-trench.2a9b1981",
18561
18801
  "outerwear-varsity": "outerwear-varsity.46f27750",
18562
18802
  "outerwear-vest": "outerwear-vest.dbbb3cc9",
18563
- "outfit-anime-cosplay": "outfit-anime-cosplay.3bce116d",
18564
- "outfit-athleisure": "outfit-athleisure.3801558e",
18565
- "outfit-ballerina": "outfit-ballerina.6a31b76f",
18566
- "outfit-bathrobe": "outfit-bathrobe.982e0ffb",
18567
- "outfit-bikini": "outfit-bikini.cac020a5",
18568
- "outfit-business-suit": "outfit-business-suit.ea261b10",
18569
- "outfit-caftan": "outfit-caftan.553d3f3b",
18570
- "outfit-chapan": "outfit-chapan.e1aa731a",
18571
- "outfit-cocktail-dress": "outfit-cocktail-dress.c232ba9c",
18572
- "outfit-cottagecore": "outfit-cottagecore.55e9774a",
18573
- "outfit-cyberpunk": "outfit-cyberpunk.e16000bb",
18574
- "outfit-dark-academia": "outfit-dark-academia.76cd80a3",
18575
- "outfit-emo": "outfit-emo.f284edff",
18576
- "outfit-evening-gown": "outfit-evening-gown.fa4ec37d",
18577
- "outfit-fairy": "outfit-fairy.23f0077e",
18578
- "outfit-flapper": "outfit-flapper.68691e25",
18579
- "outfit-goth": "outfit-goth.5baf02fa",
18580
- "outfit-kimono": "outfit-kimono.a0ab2e20",
18581
- "outfit-lab-coat": "outfit-lab-coat.363670e6",
18582
- "outfit-lifeguard": "outfit-lifeguard.2ff149a1",
18583
- "outfit-lingerie": "outfit-lingerie.e87030df",
18584
- "outfit-mermaid": "outfit-mermaid.200a0c67",
18585
- "outfit-military": "outfit-military.29fddfb5",
18586
- "outfit-nurse": "outfit-nurse.4fc589b5",
18587
- "outfit-one-piece-swim": "outfit-one-piece-swim.a29f4256",
18588
- "outfit-pajamas": "outfit-pajamas.df71434a",
18589
- "outfit-pharaoh": "outfit-pharaoh.1e57cf6f",
18590
- "outfit-pirate": "outfit-pirate.19a508d5",
18591
- "outfit-school-uniform": "outfit-school-uniform.ab3bfd03",
18592
- "outfit-scrubs": "outfit-scrubs.bd872a37",
18593
- "outfit-soccer-jersey": "outfit-soccer-jersey.0f751ebb",
18594
- "outfit-streetwear": "outfit-streetwear.4aeef2e0",
18595
- "outfit-sundress": "outfit-sundress.c295408f",
18596
- "outfit-tracksuit": "outfit-tracksuit.c62d9483",
18597
- "outfit-tuxedo": "outfit-tuxedo.90bb9980",
18598
- "outfit-wedding-dress": "outfit-wedding-dress.41b90efd",
18599
- "outfit-workwear-overalls": "outfit-workwear-overalls.09118644",
18803
+ "outfit-anime-cosplay": "outfit-anime-cosplay.d0b9e1aa",
18804
+ "outfit-athleisure": "outfit-athleisure.040f33da",
18805
+ "outfit-ballerina": "outfit-ballerina.522f51c6",
18806
+ "outfit-bathrobe": "outfit-bathrobe.707196bf",
18807
+ "outfit-bikini": "outfit-bikini.3270dab6",
18808
+ "outfit-business-suit": "outfit-business-suit.b72955f0",
18809
+ "outfit-caftan": "outfit-caftan.2071364d",
18810
+ "outfit-chapan": "outfit-chapan.6f5f9d86",
18811
+ "outfit-cocktail-dress": "outfit-cocktail-dress.c1a26736",
18812
+ "outfit-cottagecore": "outfit-cottagecore.f44c6cf5",
18813
+ "outfit-cyberpunk": "outfit-cyberpunk.c3116c60",
18814
+ "outfit-dark-academia": "outfit-dark-academia.41b62c5a",
18815
+ "outfit-emo": "outfit-emo.a30eb876",
18816
+ "outfit-evening-gown": "outfit-evening-gown.5e0dab39",
18817
+ "outfit-fairy": "outfit-fairy.31f59a56",
18818
+ "outfit-flapper": "outfit-flapper.5db4e7aa",
18819
+ "outfit-goth": "outfit-goth.7bdf9574",
18820
+ "outfit-kimono": "outfit-kimono.d2be8d07",
18821
+ "outfit-lab-coat": "outfit-lab-coat.a6f569c1",
18822
+ "outfit-lifeguard": "outfit-lifeguard.fcf481cb",
18823
+ "outfit-lingerie": "outfit-lingerie.a4f136b5",
18824
+ "outfit-mermaid": "outfit-mermaid.909e59d3",
18825
+ "outfit-military": "outfit-military.7b8fc3d8",
18826
+ "outfit-nurse": "outfit-nurse.09dce229",
18827
+ "outfit-one-piece-swim": "outfit-one-piece-swim.aa69f9a5",
18828
+ "outfit-pajamas": "outfit-pajamas.238b8081",
18829
+ "outfit-pharaoh": "outfit-pharaoh.73c25fe5",
18830
+ "outfit-pirate": "outfit-pirate.97ebc2b8",
18831
+ "outfit-school-uniform": "outfit-school-uniform.fd6e2d93",
18832
+ "outfit-scrubs": "outfit-scrubs.41eb4132",
18833
+ "outfit-soccer-jersey": "outfit-soccer-jersey.40303b6c",
18834
+ "outfit-streetwear": "outfit-streetwear.c2760dba",
18835
+ "outfit-sundress": "outfit-sundress.2706ef53",
18836
+ "outfit-tracksuit": "outfit-tracksuit.32c131bc",
18837
+ "outfit-tuxedo": "outfit-tuxedo.62bc51ce",
18838
+ "outfit-wedding-dress": "outfit-wedding-dress.c06fae98",
18839
+ "outfit-workwear-overalls": "outfit-workwear-overalls.f093b5ce",
18600
18840
  "state-cropped": "state-cropped.f7a53c8d",
18601
18841
  "state-distressed": "state-distressed.5f75d0a6",
18602
18842
  "state-fitted": "state-fitted.e6ad8e5e",
@@ -21367,6 +21607,21 @@ function toOptions(arr, categoryField) {
21367
21607
  if (categoryField) opt.category = e[categoryField];
21368
21608
  if (e.adultOnly) opt.adultOnly = true;
21369
21609
  if (e.instant) opt.instant = true;
21610
+ if (e.blendable) opt.blendable = true;
21611
+ if (e.blendsCut) opt.blendsCut = true;
21612
+ if (e.options?.length) {
21613
+ opt.params = e.options.map((o) => ({
21614
+ field: o.field,
21615
+ label: o.label,
21616
+ options: o.choices.map((c) => ({
21617
+ id: c.id,
21618
+ label: c.label,
21619
+ description: c.description,
21620
+ promptHint: c.phrase,
21621
+ term: c.term
21622
+ }))
21623
+ }));
21624
+ }
21370
21625
  return opt;
21371
21626
  });
21372
21627
  }
@@ -21941,6 +22196,17 @@ function summarizePickerCatalogs(opts = {}) {
21941
22196
  });
21942
22197
  }
21943
22198
  function projectOption(o, detail, imageUrl) {
22199
+ const projected = projectOptionFields(o, detail, imageUrl);
22200
+ return o.params ? {
22201
+ ...projected,
22202
+ params: o.params.map((d) => ({
22203
+ field: d.field,
22204
+ label: d.label,
22205
+ options: d.options.map((p) => projectOption(p, detail))
22206
+ }))
22207
+ } : projected;
22208
+ }
22209
+ function projectOptionFields(o, detail, imageUrl) {
21944
22210
  const extras = { ...o.motion ? { motion: o.motion } : {}, ...imageUrl ? { imageUrl } : {} };
21945
22211
  return detail === "full" ? {
21946
22212
  id: o.id,
@@ -22230,6 +22496,11 @@ function readHintMode(data) {
22230
22496
  function byMode(mode, full, compact) {
22231
22497
  return mode === "compact" ? compact : full;
22232
22498
  }
22499
+ var MOTION_INTENSITY_HINTS = {
22500
+ subtle: { full: "subtle, gentle motion with slow, minimal movement", compact: "subtle motion" },
22501
+ moderate: { full: "moderate, natural motion at an even pace", compact: "moderate motion" },
22502
+ dynamic: { full: "dynamic, energetic motion with fast, pronounced movement", compact: "dynamic motion" }
22503
+ };
22233
22504
  function getParameterPromptHint(node, ctx) {
22234
22505
  return resolveParameterHint(node, ctx);
22235
22506
  }
@@ -22261,8 +22532,10 @@ function resolveParameterHint(node, ctx, inherited) {
22261
22532
  duration: asStr(data.duration),
22262
22533
  intensity: asStr(data.intensity)
22263
22534
  };
22535
+ const optionValues = readTransitionOptionValues(data);
22536
+ const hintOptions = optionValues ? { optionValues } : void 0;
22264
22537
  if (!ctx) {
22265
- return withCustomText(data, composeTransitionHintFromConnections(transitionId, [], [], timing, mode));
22538
+ return withCustomText(data, composeTransitionHintFromConnections(transitionId, [], [], timing, mode, hintOptions));
22266
22539
  }
22267
22540
  const startHints = [];
22268
22541
  const endHints = [];
@@ -22275,7 +22548,7 @@ function resolveParameterHint(node, ctx, inherited) {
22275
22548
  if (edge.targetHandle === "startState") startHints.push(hint);
22276
22549
  else if (edge.targetHandle === "endState") endHints.push(hint);
22277
22550
  }
22278
- return withCustomText(data, composeTransitionHintFromConnections(transitionId, startHints, endHints, timing, mode));
22551
+ return withCustomText(data, composeTransitionHintFromConnections(transitionId, startHints, endHints, timing, mode, hintOptions));
22279
22552
  }
22280
22553
  if (node.type === "character-fx") {
22281
22554
  const raw = data.characterFx;
@@ -22410,6 +22683,12 @@ function resolveBaseHint(type, data, mode = "full") {
22410
22683
  return withCustomText(data, byMode(mode, getCompositionEffectPromptHint, getCompositionEffectTerm)(asStr(data.compositionEffect)));
22411
22684
  case "post-process-effects":
22412
22685
  return withCustomText(data, buildPostProcessHints(data.postProcess, mode).join(", "));
22686
+ // Motion intensity: a Generation Settings node that a video node's
22687
+ // Settings input takes as a prompt fragment (video only).
22688
+ case "motion": {
22689
+ const hint = MOTION_INTENSITY_HINTS[asStr(data.motion)];
22690
+ return hint ? byMode(mode, hint.full, hint.compact) : "";
22691
+ }
22413
22692
  // Free text authored by the user, not catalog copy — there is no shorter
22414
22693
  // professional form to swap in, so these are identical in both modes.
22415
22694
  case "tone":
@@ -22422,6 +22701,15 @@ function resolveBaseHint(type, data, mode = "full") {
22422
22701
  return "";
22423
22702
  }
22424
22703
  }
22704
+
22705
+ // src/video-own-motion.ts
22706
+ var OWN_MOTION_NODE_TYPES = /* @__PURE__ */ new Set(["image-to-video", "generate-video"]);
22707
+ var DEFAULT_OWN_MOTION = "moderate";
22708
+ function ownMotionHint(nodeType, data) {
22709
+ if (!OWN_MOTION_NODE_TYPES.has(nodeType) || !data.motionEnabled) return void 0;
22710
+ const step = typeof data.motion === "string" && data.motion ? data.motion : DEFAULT_OWN_MOTION;
22711
+ return `${step} motion`;
22712
+ }
22425
22713
  function effectiveName(name) {
22426
22714
  const trimmed = name.trim();
22427
22715
  if (!trimmed || trimmed === shared.PLACEHOLDER_CHARACTER_NAME) return void 0;
@@ -22579,7 +22867,7 @@ function resolveBrandInput(brand) {
22579
22867
  var PROMPT_HINT_SEPARATOR = ". ";
22580
22868
  function joinPromptHints(userPrompt, hints) {
22581
22869
  if (hints.length === 0) return userPrompt;
22582
- return [userPrompt.trim(), ...hints].filter((p) => p.length > 0).join(PROMPT_HINT_SEPARATOR);
22870
+ return joinSentences([userPrompt.trim(), ...hints]);
22583
22871
  }
22584
22872
 
22585
22873
  // src/direction-registry.ts
@@ -22755,7 +23043,7 @@ function partitionStyleClauses(direction, opts) {
22755
23043
  }));
22756
23044
  }
22757
23045
  function styleSectionFromClauses(clauses) {
22758
- const line = (slot) => clauses.filter((c) => c.slot === slot).map((c) => c.text).join(PROMPT_HINT_SEPARATOR);
23046
+ const line = (slot) => joinSentences(clauses.filter((c) => c.slot === slot).map((c) => c.text));
22759
23047
  const lines = [line("film"), line("scene")].filter((l) => l.length > 0);
22760
23048
  return lines.length === 0 ? "" : `${STYLE_SECTION_HEADER}
22761
23049
  ${lines.join("\n")}`;
@@ -22873,7 +23161,7 @@ function composeIdentityDescPart(subject, canonicalDesc, elementInjection) {
22873
23161
  if (c) parts.push(c);
22874
23162
  const e = elementInjection?.trim();
22875
23163
  if (e) parts.push(e);
22876
- return parts.length > 0 ? `${subject} \u2014 ${parts.join(". ")}` : subject;
23164
+ return parts.length > 0 ? `${subject} \u2014 ${joinSentences(parts)}` : subject;
22877
23165
  }
22878
23166
  function pushOverrideDirective(out, ref, binding) {
22879
23167
  const line = referenceDescriptionLine(binding, ref.descriptionOverride);
@@ -41582,7 +41870,7 @@ function resolvePrompt({ override, typed = [], wired, refMap, appendWired, affix
41582
41870
  function resolveCore({ override, typed = [], wired, refMap, appendWired }) {
41583
41871
  if (appendWired && !present(override)) {
41584
41872
  const base = typed.find(present);
41585
- return [base, wired].filter(present).map((s) => rr(s, refMap)).join(". ");
41873
+ return joinSentences([base, wired].filter(present).map((s) => rr(s, refMap)));
41586
41874
  }
41587
41875
  if (present(override)) return rr(override, refMap);
41588
41876
  for (const t of typed) if (present(t)) return rr(t, refMap);
@@ -41590,7 +41878,7 @@ function resolveCore({ override, typed = [], wired, refMap, appendWired }) {
41590
41878
  return "";
41591
41879
  }
41592
41880
  function composeNegative(typed, wired) {
41593
- return [typed, wired].filter(present).join(". ");
41881
+ return joinSentences([typed, wired]);
41594
41882
  }
41595
41883
  var NODE_PROMPT_CANDIDATE_FIELDS = {
41596
41884
  "generate-image": ["prompt"],
@@ -41635,6 +41923,10 @@ function computeLlmChatFields(data, { override, wiredUserInput, wiredSystemPromp
41635
41923
  systemPrompt: resolvePrompt({ typed: [data.systemPrompt], wired: wiredSystemPrompt, refMap })
41636
41924
  };
41637
41925
  }
41926
+ function computeScriptTopic(data, { override, wired, refMap }) {
41927
+ const core = [override, wired, data.prompt].find(present);
41928
+ return applyPromptAffixes(core === void 0 ? "" : rr(core, refMap), shared.readPromptAffixes(data), refMap);
41929
+ }
41638
41930
 
41639
41931
  // src/node-prompt-fields.ts
41640
41932
  var NODE_PROMPT_FIELDS = {
@@ -47149,6 +47441,7 @@ exports.ASPECT_RATIO_LABELS = ASPECT_RATIO_LABELS;
47149
47441
  exports.ATMOSPHERES = ATMOSPHERES;
47150
47442
  exports.ATMOSPHERE_IDS = ATMOSPHERE_IDS;
47151
47443
  exports.AUDIO_WIZARD_CATEGORIES = AUDIO_WIZARD_CATEGORIES;
47444
+ exports.AURORA_SWEEP_STYLE = AURORA_SWEEP_STYLE;
47152
47445
  exports.BACKDROPS = BACKDROPS;
47153
47446
  exports.BACKDROP_CATEGORY_LABELS = BACKDROP_CATEGORY_LABELS;
47154
47447
  exports.BACKDROP_CATEGORY_ORDER = BACKDROP_CATEGORY_ORDER;
@@ -47186,7 +47479,9 @@ exports.COLOR_LOOK_CATEGORY_ORDER = COLOR_LOOK_CATEGORY_ORDER;
47186
47479
  exports.COLOR_LOOK_IDS = COLOR_LOOK_IDS;
47187
47480
  exports.COMPOSITION_EFFECTS = COMPOSITION_EFFECTS;
47188
47481
  exports.COMPOSITION_EFFECT_IDS = COMPOSITION_EFFECT_IDS;
47482
+ exports.DEBRIS_SHOWER_STYLE = DEBRIS_SHOWER_STYLE;
47189
47483
  exports.DEFAULT_IDENTITY_LOCK = DEFAULT_IDENTITY_LOCK;
47484
+ exports.DEFAULT_OWN_MOTION = DEFAULT_OWN_MOTION;
47190
47485
  exports.DEFAULT_TEMPLATES = DEFAULT_TEMPLATES;
47191
47486
  exports.DIRECTION_ARRAY_CEILING = DIRECTION_ARRAY_CEILING;
47192
47487
  exports.DIRECTION_FIELDS = DIRECTION_FIELDS;
@@ -47212,6 +47507,7 @@ exports.FRAMING_CATEGORY_ORDER = FRAMING_CATEGORY_ORDER;
47212
47507
  exports.FRAMING_FIELD_BY_CATEGORY = FRAMING_FIELD_BY_CATEGORY;
47213
47508
  exports.FRAMING_IDS = FRAMING_IDS;
47214
47509
  exports.GAPS_SCHEMA = GAPS_SCHEMA;
47510
+ exports.GARDEN_BLOOM_STYLE = GARDEN_BLOOM_STYLE;
47215
47511
  exports.HELD_PROPS = HELD_PROPS;
47216
47512
  exports.HELD_PROP_CATEGORY_LABELS = HELD_PROP_CATEGORY_LABELS;
47217
47513
  exports.HELD_PROP_CATEGORY_ORDER = HELD_PROP_CATEGORY_ORDER;
@@ -47271,6 +47567,7 @@ exports.OBJECT_MATERIAL_PRESETS = OBJECT_MATERIAL_PRESETS;
47271
47567
  exports.OBJECT_MATERIAL_PROMPTS = OBJECT_MATERIAL_PROMPTS;
47272
47568
  exports.OBJECT_VARIATION_PRESETS = OBJECT_VARIATION_PRESETS;
47273
47569
  exports.OBJECT_VARIATION_PROMPTS = OBJECT_VARIATION_PROMPTS;
47570
+ exports.OWN_MOTION_NODE_TYPES = OWN_MOTION_NODE_TYPES;
47274
47571
  exports.PEOPLE = PEOPLE;
47275
47572
  exports.PERSON_DIMENSION_LABELS = PERSON_DIMENSION_LABELS;
47276
47573
  exports.PERSON_DIMENSION_ORDER = PERSON_DIMENSION_ORDER;
@@ -47310,6 +47607,8 @@ exports.REF_BINDING = REF_BINDING;
47310
47607
  exports.RENDER_QUALITIES = RENDER_QUALITIES;
47311
47608
  exports.RENDER_QUALITY_IDS = RENDER_QUALITY_IDS;
47312
47609
  exports.RETIRED_ADULT_ONLY_HINT_STRINGS = RETIRED_ADULT_ONLY_HINT_STRINGS;
47610
+ exports.SAKURA_PETALS_STYLE = SAKURA_PETALS_STYLE;
47611
+ exports.SAND_STORM_STYLE = SAND_STORM_STYLE;
47313
47612
  exports.SCENE3D_FIGURE_REFERENCE_RULE = SCENE3D_FIGURE_REFERENCE_RULE;
47314
47613
  exports.SCENE3D_FREE_PLATE_SLOTS = SCENE3D_FREE_PLATE_SLOTS;
47315
47614
  exports.SCENE3D_LAYOUT_REFERENCE_SCOPING_FIXTURE = SCENE3D_LAYOUT_REFERENCE_SCOPING_FIXTURE;
@@ -47328,6 +47627,7 @@ exports.SETTING_IDS = SETTING_IDS;
47328
47627
  exports.SHOT_LABELS = SHOT_LABELS;
47329
47628
  exports.SINGING_STYLES = SINGING_STYLES;
47330
47629
  exports.SINGLE_PICKER_WIRING = SINGLE_PICKER_WIRING;
47630
+ exports.SMOKE_PUFF_STYLE = SMOKE_PUFF_STYLE;
47331
47631
  exports.SNIPPET_MEDIA_VALUES = SNIPPET_MEDIA_VALUES;
47332
47632
  exports.SOUND_ART = SOUND_ART;
47333
47633
  exports.SOUND_ART_FILES = SOUND_ART_FILES;
@@ -47364,7 +47664,9 @@ exports.TRANSITION_CATEGORY_ORDER = TRANSITION_CATEGORY_ORDER;
47364
47664
  exports.TRANSITION_DURATIONS = TRANSITION_DURATIONS;
47365
47665
  exports.TRANSITION_IDS = TRANSITION_IDS;
47366
47666
  exports.TRANSITION_INTENSITIES = TRANSITION_INTENSITIES;
47667
+ exports.TRANSITION_OPTION_FIELDS = TRANSITION_OPTION_FIELDS;
47367
47668
  exports.TRANSITION_POSITIONS = TRANSITION_POSITIONS;
47669
+ exports.TRANSITION_STYLE_FIELD = TRANSITION_STYLE_FIELD;
47368
47670
  exports.VIDEO_HINT_MODE_DEFAULT = VIDEO_HINT_MODE_DEFAULT;
47369
47671
  exports.VIDEO_WIZARD_CATEGORIES = VIDEO_WIZARD_CATEGORIES;
47370
47672
  exports.VOCAL_PRESENCE = VOCAL_PRESENCE;
@@ -47383,9 +47685,12 @@ exports.WARDROBE = WARDROBE;
47383
47685
  exports.WARDROBE_CATEGORY_LABELS = WARDROBE_CATEGORY_LABELS;
47384
47686
  exports.WARDROBE_DIMENSION_ORDER = WARDROBE_DIMENSION_ORDER;
47385
47687
  exports.WARDROBE_FIELD_BY_DIMENSION = WARDROBE_FIELD_BY_DIMENSION;
47688
+ exports.WHITE_FLASH_STYLE = WHITE_FLASH_STYLE;
47689
+ exports.WIPE_DIRECTION = WIPE_DIRECTION;
47386
47690
  exports.__resetCatalogIdGuardForTests = __resetCatalogIdGuardForTests;
47387
47691
  exports.appendField = appendField;
47388
47692
  exports.appendMusicMeta = appendMusicMeta;
47693
+ exports.appendPromptHints = appendPromptHints;
47389
47694
  exports.appendReferenceLines = appendReferenceLines;
47390
47695
  exports.appendScene3DStillScopingLines = appendScene3DStillScopingLines;
47391
47696
  exports.applyMinorAgeFloorToPickerValues = applyMinorAgeFloorToPickerValues;
@@ -47396,6 +47701,7 @@ exports.applyTemplate = applyTemplate;
47396
47701
  exports.asBodyClauses = asBodyClauses;
47397
47702
  exports.assembleImageInput = assembleImageInput;
47398
47703
  exports.assembleSunoInput = assembleSunoInput;
47704
+ exports.blendedCutClause = blendedCutClause;
47399
47705
  exports.buildActionFxHints = buildActionFxHints;
47400
47706
  exports.buildActionFxTerms = buildActionFxTerms;
47401
47707
  exports.buildAdCreativeAnalysisUserText = buildAdCreativeAnalysisUserText;
@@ -47487,6 +47793,7 @@ exports.composedOptionIndex = composedOptionIndex;
47487
47793
  exports.computeLlmChatFields = computeLlmChatFields;
47488
47794
  exports.computeNodePrompt = computeNodePrompt;
47489
47795
  exports.computePackSidecarCoverage = computePackSidecarCoverage;
47796
+ exports.computeScriptTopic = computeScriptTopic;
47490
47797
  exports.containsMinorAgeHint = containsMinorAgeHint;
47491
47798
  exports.curateEntries = curateEntries;
47492
47799
  exports.curatedAnimalPromptHint = curatedAnimalPromptHint;
@@ -47670,6 +47977,7 @@ exports.getTemporalPromptHint = getTemporalPromptHint;
47670
47977
  exports.getTemporalTerm = getTemporalTerm;
47671
47978
  exports.getTransition = getTransition;
47672
47979
  exports.getTransitionLabel = getTransitionLabel;
47980
+ exports.getTransitionOptions = getTransitionOptions;
47673
47981
  exports.getTransitionPromptHint = getTransitionPromptHint;
47674
47982
  exports.getTransitionTerm = getTransitionTerm;
47675
47983
  exports.getVocalPresence = getVocalPresence;
@@ -47700,6 +48008,7 @@ exports.hasUpstreamCharacter = hasUpstreamCharacter;
47700
48008
  exports.identityRefsSentence = identityRefsSentence;
47701
48009
  exports.insertBeforeStyleSection = insertBeforeStyleSection;
47702
48010
  exports.isAnalyzablePicker = isAnalyzablePicker;
48011
+ exports.isBlendableTransition = isBlendableTransition;
47703
48012
  exports.isDeniedStyleId = isDeniedStyleId;
47704
48013
  exports.isInstantTransition = isInstantTransition;
47705
48014
  exports.isInstrumentalVocal = isInstrumentalVocal;
@@ -47710,6 +48019,7 @@ exports.isWizardSupported = isWizardSupported;
47710
48019
  exports.joinHintFragments = joinHintFragments;
47711
48020
  exports.joinPromptHints = joinPromptHints;
47712
48021
  exports.joinPromptParts = joinPromptParts;
48022
+ exports.joinSentences = joinSentences;
47713
48023
  exports.keepableDirectionHints = keepableDirectionHints;
47714
48024
  exports.listPickerCatalogs = listPickerCatalogs;
47715
48025
  exports.lookPreviewStillUrl = lookPreviewStillUrl;
@@ -47720,6 +48030,7 @@ exports.nodeHasPromptField = nodeHasPromptField;
47720
48030
  exports.nodeSupportsPromptAffixes = nodeSupportsPromptAffixes;
47721
48031
  exports.normalizeSubjectFields = normalizeSubjectFields;
47722
48032
  exports.overlayEntry = overlayEntry;
48033
+ exports.ownMotionHint = ownMotionHint;
47723
48034
  exports.partitionStyleClauses = partitionStyleClauses;
47724
48035
  exports.personPacksVersion = personPacksVersion;
47725
48036
  exports.pickerFanoutTargets = pickerFanoutTargets;
@@ -47735,6 +48046,7 @@ exports.promptPartSeparator = promptPartSeparator;
47735
48046
  exports.readDirectionFields = readDirectionFields;
47736
48047
  exports.readStructuredFields = readStructuredFields;
47737
48048
  exports.readSubjectFields = readSubjectFields;
48049
+ exports.readTransitionOptionValues = readTransitionOptionValues;
47738
48050
  exports.referenceDescriptionLine = referenceDescriptionLine;
47739
48051
  exports.referenceRulesBlock = referenceRulesBlock;
47740
48052
  exports.registerCatalogPack = registerCatalogPack;