@nodaro/prompts 1.14.0 → 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +633 -248
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +379 -1
- package/dist/index.d.ts +379 -1
- package/dist/index.js +603 -250
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/adult-only-ratchet.test.ts +110 -0
- package/src/__tests__/age-floor.test.ts +347 -0
- package/src/__tests__/catalog-id-guard.test.ts +146 -0
- package/src/__tests__/catalog-overlay.test.ts +163 -0
- package/src/__tests__/dod-replace-pack-acceptance.test.ts +17 -0
- package/src/__tests__/fixtures/parameter-hint-golden.json +2 -2
- package/src/__tests__/minor-age-floor.test.ts +136 -0
- package/src/__tests__/person-pack-adult-only.test.ts +45 -0
- package/src/__tests__/picker-analyzer-registry.test.ts +14 -0
- package/src/action-fx.ts +2 -1
- package/src/aesthetic.ts +2 -1
- package/src/age-floor.ts +296 -0
- package/src/age-signal.ts +36 -0
- package/src/atmosphere.ts +2 -1
- package/src/backdrop.ts +2 -1
- package/src/camera-format.ts +2 -1
- package/src/camera-motions.ts +2 -1
- package/src/catalog-id-guard.ts +189 -0
- package/src/catalog-overlay.ts +148 -0
- package/src/catalog-packs.ts +27 -2
- package/src/character-fx.ts +2 -1
- package/src/color-look.ts +2 -1
- package/src/composition-effects.ts +2 -1
- package/src/era.ts +2 -1
- package/src/exposure-settings.ts +2 -1
- package/src/framing.ts +2 -1
- package/src/held-prop.ts +2 -1
- package/src/index.ts +4 -0
- package/src/instrumentation.ts +5 -4
- package/src/lens.ts +2 -1
- package/src/lighting.ts +2 -1
- package/src/loop-subject.ts +3 -1
- package/src/materials.ts +2 -1
- package/src/mood.ts +16 -5
- package/src/music-genre.ts +5 -4
- package/src/music-mood.ts +4 -3
- package/src/parameter-prompt-hint.ts +13 -57
- package/src/person-packs.ts +14 -2
- package/src/person.ts +71 -38
- package/src/photo-genre.ts +14 -3
- package/src/photographer.ts +2 -1
- package/src/picker-analyzer-registry.ts +9 -0
- package/src/picker-catalogs.ts +11 -0
- package/src/pose.ts +17 -6
- package/src/post-process-effects.ts +2 -1
- package/src/prompt-builder.ts +3 -3
- package/src/render-quality.ts +2 -1
- package/src/setting.ts +2 -1
- package/src/shared-catalog-overlay.ts +83 -0
- package/src/style.ts +16 -1
- package/src/styling.ts +57 -29
- package/src/subject-registry.ts +2 -2
- package/src/temporal.ts +2 -1
- package/src/transitions.ts +2 -1
- package/src/voice-character.ts +6 -5
- package/src/voice-delivery.ts +4 -3
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ANIMAL_SUBCATEGORY_LABELS, ANIMAL_SUBCATEGORY_ORDER, VEHICLE_SUBCATEGORY_LABELS, VEHICLE_SUBCATEGORY_ORDER, WEAPON_SUBCATEGORY_LABELS, WEAPON_SUBCATEGORY_ORDER, FURNITURE_SUBCATEGORY_LABELS, FURNITURE_SUBCATEGORY_ORDER, SOCIAL_POST_NODE_TYPES, FURNITURE, WEAPONS, VEHICLES, ANIMALS, PASSTHROUGH_TYPES, registerCatalogSidecars, resetCatalogSidecars,
|
|
1
|
+
import { ANIMAL_SUBCATEGORY_LABELS, ANIMAL_SUBCATEGORY_ORDER, VEHICLE_SUBCATEGORY_LABELS, VEHICLE_SUBCATEGORY_ORDER, WEAPON_SUBCATEGORY_LABELS, WEAPON_SUBCATEGORY_ORDER, FURNITURE_SUBCATEGORY_LABELS, FURNITURE_SUBCATEGORY_ORDER, SOCIAL_POST_NODE_TYPES, FURNITURE, WEAPONS, VEHICLES, ANIMALS, getAnimalPromptHint, PASSTHROUGH_TYPES, registerCatalogSidecars, resetCatalogSidecars, getAnimalTerm, getVehicle, getWeapon, getFurniture, pickIds, DEFAULT_USAGE_MODE, usageModeDirective, DEFAULT_LOCATION_USAGE_MODE, imageReferenceLimit, knownImageSlugsFromRefs, findImageMentionTokens, knownEntitySlugsFromRefs, findEntityMentionTokens, findCharacterMentionTokens, findLocationMentionTokens, NATIVE_NEGATIVE_PROMPT_MODELS, getMaxNegativePromptChars, getMaxImagePromptChars, MODELS_WITH_REFERENCE_IMAGE_SUPPORT, roleToPhrase, resolveDefaultRole, SEEDANCE_2_REF_LIMITS, NON_EN_LOCALE_IDS, readPromptAffixes, setRegisteredPersonPackFields, PLACEHOLDER_CHARACTER_NAME, REFERENCE_ROLE_PRESETS, imageMentionSlugForRef, entityMentionSlugForRef, defaultRoleForSource, locationReferencePhotoKindLabel, VIDEO_REF_LIMITS_BY_PROVIDER, resolveNodeRefs, normalizeRoleSlug } from '@nodaro/shared';
|
|
2
2
|
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __export = (target, all) => {
|
|
@@ -105,6 +105,148 @@ function resolveTerm(entry) {
|
|
|
105
105
|
if (entry.promptHint === "") return "";
|
|
106
106
|
return entry.term ?? deriveTerm(entry.label);
|
|
107
107
|
}
|
|
108
|
+
function withTerm(o) {
|
|
109
|
+
return { ...o, term: resolveTerm(o) };
|
|
110
|
+
}
|
|
111
|
+
var packs = [];
|
|
112
|
+
var version = 0;
|
|
113
|
+
var listeners = /* @__PURE__ */ new Set();
|
|
114
|
+
function bump() {
|
|
115
|
+
version++;
|
|
116
|
+
for (const l of listeners) l();
|
|
117
|
+
}
|
|
118
|
+
function registerCatalogPack(pack) {
|
|
119
|
+
if (packs.some((p) => p.id === pack.id)) throw new Error(`duplicate catalog pack id "${pack.id}"`);
|
|
120
|
+
packs = [...packs, pack];
|
|
121
|
+
registerCatalogSidecars(pack.catalogId, pack.sidecars);
|
|
122
|
+
bump();
|
|
123
|
+
}
|
|
124
|
+
function getRegisteredCatalogPacks() {
|
|
125
|
+
return packs;
|
|
126
|
+
}
|
|
127
|
+
function resetCatalogPacks() {
|
|
128
|
+
packs = [];
|
|
129
|
+
resetCatalogSidecars();
|
|
130
|
+
bump();
|
|
131
|
+
}
|
|
132
|
+
function catalogPacksVersion() {
|
|
133
|
+
return version;
|
|
134
|
+
}
|
|
135
|
+
function hasCatalogPacksFor(catalogId) {
|
|
136
|
+
return packs.some((p) => p.catalogId === catalogId);
|
|
137
|
+
}
|
|
138
|
+
function subscribeCatalogPacks(listener) {
|
|
139
|
+
listeners.add(listener);
|
|
140
|
+
return () => {
|
|
141
|
+
listeners.delete(listener);
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function cloneCatalog(c) {
|
|
145
|
+
return {
|
|
146
|
+
...c,
|
|
147
|
+
options: c.options ? c.options.map(withTerm) : void 0,
|
|
148
|
+
dimensions: c.dimensions ? c.dimensions.map((d) => ({ ...d, options: d.options.map(withTerm) })) : void 0
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function applyExtend(c, pack) {
|
|
152
|
+
if (c.kind === "single") {
|
|
153
|
+
return { ...c, options: [...c.options ?? [], ...(pack.options ?? []).map(withTerm)] };
|
|
154
|
+
}
|
|
155
|
+
const byField = new Map((c.dimensions ?? []).map((d) => [d.field, { ...d, options: [...d.options] }]));
|
|
156
|
+
for (const dim of pack.dimensions ?? []) {
|
|
157
|
+
const added = dim.options.map(withTerm);
|
|
158
|
+
const existing = byField.get(dim.field);
|
|
159
|
+
if (existing) existing.options = [...existing.options, ...added];
|
|
160
|
+
else byField.set(dim.field, { ...dim, options: added });
|
|
161
|
+
}
|
|
162
|
+
const dims = [...byField.values()];
|
|
163
|
+
return { ...c, dimensions: dims, fields: dims.map((d) => d.field) };
|
|
164
|
+
}
|
|
165
|
+
function applyDeny(c, denyIds) {
|
|
166
|
+
const deny = new Set(denyIds);
|
|
167
|
+
if (c.kind === "single") return { ...c, options: (c.options ?? []).filter((o) => !deny.has(o.id)) };
|
|
168
|
+
return { ...c, dimensions: (c.dimensions ?? []).map((d) => ({ ...d, options: d.options.filter((o) => !deny.has(o.id)) })) };
|
|
169
|
+
}
|
|
170
|
+
function composePickerCatalogs(base, activePacks) {
|
|
171
|
+
const known = new Set(base.map((c) => c.catalogId));
|
|
172
|
+
for (const pack of activePacks) {
|
|
173
|
+
if (!known.has(pack.catalogId)) throw new Error(`catalog pack "${pack.id}" targets unknown catalog id "${pack.catalogId}"`);
|
|
174
|
+
}
|
|
175
|
+
return base.map((c) => {
|
|
176
|
+
let out = cloneCatalog(c);
|
|
177
|
+
for (const pack of activePacks) {
|
|
178
|
+
if (pack.catalogId !== c.catalogId) continue;
|
|
179
|
+
if (pack.mode === "replace" && pack.catalog) out = cloneCatalog(pack.catalog);
|
|
180
|
+
else if (pack.mode === "extend") out = applyExtend(out, pack);
|
|
181
|
+
else if (pack.mode === "deny") out = applyDeny(out, pack.denyIds ?? []);
|
|
182
|
+
}
|
|
183
|
+
return out;
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// src/catalog-overlay.ts
|
|
188
|
+
var resolver = null;
|
|
189
|
+
function setComposedCatalogResolver(fn) {
|
|
190
|
+
resolver = fn;
|
|
191
|
+
}
|
|
192
|
+
var memo = null;
|
|
193
|
+
function composedOptionIndex(catalogId) {
|
|
194
|
+
const v = catalogPacksVersion();
|
|
195
|
+
if (!memo || memo.v !== v) memo = { v, byCatalog: /* @__PURE__ */ new Map() };
|
|
196
|
+
const hit = memo.byCatalog.get(catalogId);
|
|
197
|
+
if (hit) return hit;
|
|
198
|
+
if (!resolver) {
|
|
199
|
+
throw new Error(
|
|
200
|
+
`[catalog-overlay] catalog "${catalogId}" is curated by a pack but the composed-catalog resolver is not installed \u2014 refusing to resolve against the stock catalog`
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
const cat = resolver(catalogId);
|
|
204
|
+
const index = /* @__PURE__ */ new Map();
|
|
205
|
+
if (cat) {
|
|
206
|
+
for (const o of cat.options ?? []) index.set(o.id, o);
|
|
207
|
+
for (const d of cat.dimensions ?? []) for (const o of d.options) if (!index.has(o.id)) index.set(o.id, o);
|
|
208
|
+
}
|
|
209
|
+
memo.byCatalog.set(catalogId, index);
|
|
210
|
+
return index;
|
|
211
|
+
}
|
|
212
|
+
function overlayEntry(catalogId, id, base) {
|
|
213
|
+
if (!hasCatalogPacksFor(catalogId)) return base;
|
|
214
|
+
const opt = composedOptionIndex(catalogId).get(id);
|
|
215
|
+
if (!opt) return void 0;
|
|
216
|
+
if (!base) return opt;
|
|
217
|
+
return {
|
|
218
|
+
...base,
|
|
219
|
+
label: opt.label,
|
|
220
|
+
promptHint: opt.promptHint,
|
|
221
|
+
term: opt.term,
|
|
222
|
+
...opt.description !== void 0 ? { description: opt.description } : {},
|
|
223
|
+
...opt.category !== void 0 ? { category: opt.category } : {}
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
function composedHas(catalogId, id) {
|
|
227
|
+
if (!hasCatalogPacksFor(catalogId)) return true;
|
|
228
|
+
return composedOptionIndex(catalogId).has(id);
|
|
229
|
+
}
|
|
230
|
+
function composedOption(catalogId, id) {
|
|
231
|
+
if (!hasCatalogPacksFor(catalogId)) return void 0;
|
|
232
|
+
return composedOptionIndex(catalogId).get(id);
|
|
233
|
+
}
|
|
234
|
+
function curateEntries(catalogId, base) {
|
|
235
|
+
if (!hasCatalogPacksFor(catalogId)) return base;
|
|
236
|
+
const index = composedOptionIndex(catalogId);
|
|
237
|
+
const out = [];
|
|
238
|
+
for (const e of base) {
|
|
239
|
+
const opt = index.get(e.id);
|
|
240
|
+
if (!opt) continue;
|
|
241
|
+
out.push({
|
|
242
|
+
...e,
|
|
243
|
+
label: opt.label,
|
|
244
|
+
...opt.description !== void 0 ? { description: opt.description } : {},
|
|
245
|
+
..."promptHint" in e && opt.promptHint !== void 0 ? { promptHint: opt.promptHint } : {}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
return out;
|
|
249
|
+
}
|
|
108
250
|
|
|
109
251
|
// src/framing.ts
|
|
110
252
|
var FRAMINGS = [
|
|
@@ -629,7 +771,7 @@ var FRAMING_CATEGORY_LABELS = {
|
|
|
629
771
|
var framingById = new Map(FRAMINGS.map((f) => [f.id, f]));
|
|
630
772
|
function getFraming(id) {
|
|
631
773
|
if (!id) return void 0;
|
|
632
|
-
return framingById.get(id);
|
|
774
|
+
return overlayEntry("framing", id, framingById.get(id));
|
|
633
775
|
}
|
|
634
776
|
function getFramingLabel(id, fallback) {
|
|
635
777
|
const f = getFraming(id);
|
|
@@ -800,7 +942,7 @@ var LIGHTING_CATEGORY_LABELS = {
|
|
|
800
942
|
var lightingById = new Map(LIGHTINGS.map((l) => [l.id, l]));
|
|
801
943
|
function getLighting(id) {
|
|
802
944
|
if (!id) return void 0;
|
|
803
|
-
return lightingById.get(id);
|
|
945
|
+
return overlayEntry("lighting", id, lightingById.get(id));
|
|
804
946
|
}
|
|
805
947
|
function getLightingLabel(id, fallback) {
|
|
806
948
|
const l = getLighting(id);
|
|
@@ -884,7 +1026,7 @@ var LENSES = [
|
|
|
884
1026
|
var lensById = new Map(LENSES.map((l) => [l.id, l]));
|
|
885
1027
|
function getLens(id) {
|
|
886
1028
|
if (!id) return void 0;
|
|
887
|
-
return lensById.get(id);
|
|
1029
|
+
return overlayEntry("lens", id, lensById.get(id));
|
|
888
1030
|
}
|
|
889
1031
|
function getLensLabel(id, fallback) {
|
|
890
1032
|
const l = getLens(id);
|
|
@@ -942,7 +1084,7 @@ var CAMERA_FORMATS = [
|
|
|
942
1084
|
var formatById = new Map(CAMERA_FORMATS.map((f) => [f.id, f]));
|
|
943
1085
|
function getCameraFormat(id) {
|
|
944
1086
|
if (!id) return void 0;
|
|
945
|
-
return formatById.get(id);
|
|
1087
|
+
return overlayEntry("camera-format", id, formatById.get(id));
|
|
946
1088
|
}
|
|
947
1089
|
function getCameraFormatLabel(id, fallback) {
|
|
948
1090
|
const f = getCameraFormat(id);
|
|
@@ -1018,7 +1160,7 @@ var COLOR_LOOK_CATEGORY_LABELS = {
|
|
|
1018
1160
|
var colorLookById = new Map(COLOR_LOOKS.map((c) => [c.id, c]));
|
|
1019
1161
|
function getColorLook(id) {
|
|
1020
1162
|
if (!id) return void 0;
|
|
1021
|
-
return colorLookById.get(id);
|
|
1163
|
+
return overlayEntry("color-look", id, colorLookById.get(id));
|
|
1022
1164
|
}
|
|
1023
1165
|
function getColorLookLabel(id, fallback) {
|
|
1024
1166
|
const c = getColorLook(id);
|
|
@@ -1080,7 +1222,7 @@ var ATMOSPHERES = [
|
|
|
1080
1222
|
var atmosphereById = new Map(ATMOSPHERES.map((a) => [a.id, a]));
|
|
1081
1223
|
function getAtmosphere(id) {
|
|
1082
1224
|
if (!id) return void 0;
|
|
1083
|
-
return atmosphereById.get(id);
|
|
1225
|
+
return overlayEntry("atmosphere", id, atmosphereById.get(id));
|
|
1084
1226
|
}
|
|
1085
1227
|
function getAtmosphereLabel(id, fallback) {
|
|
1086
1228
|
const a = getAtmosphere(id);
|
|
@@ -1669,7 +1811,7 @@ var ACTION_FX_IDS = ACTION_FX.map((fx) => fx.id);
|
|
|
1669
1811
|
var actionFxById = new Map(ACTION_FX.map((fx) => [fx.id, fx]));
|
|
1670
1812
|
function getActionFx(id) {
|
|
1671
1813
|
if (!id) return void 0;
|
|
1672
|
-
return actionFxById.get(id);
|
|
1814
|
+
return overlayEntry("action-fx", id, actionFxById.get(id));
|
|
1673
1815
|
}
|
|
1674
1816
|
function getActionFxLabel(id, fallback) {
|
|
1675
1817
|
const fx = getActionFx(id);
|
|
@@ -1770,7 +1912,11 @@ var STYLES = [
|
|
|
1770
1912
|
var styleById = new Map(STYLES.map((s) => [s.id, s]));
|
|
1771
1913
|
function getStyle(id) {
|
|
1772
1914
|
if (!id) return void 0;
|
|
1773
|
-
return styleById.get(id);
|
|
1915
|
+
return overlayEntry("style", id, styleById.get(id));
|
|
1916
|
+
}
|
|
1917
|
+
function isDeniedStyleId(value) {
|
|
1918
|
+
if (!value) return false;
|
|
1919
|
+
return styleById.has(value) && getStyle(value) === void 0;
|
|
1774
1920
|
}
|
|
1775
1921
|
function getStyleLabel(id, fallback) {
|
|
1776
1922
|
const s = getStyle(id);
|
|
@@ -1860,7 +2006,7 @@ var SETTINGS = [
|
|
|
1860
2006
|
var settingById = new Map(SETTINGS.map((s) => [s.id, s]));
|
|
1861
2007
|
function getSetting(id) {
|
|
1862
2008
|
if (!id) return void 0;
|
|
1863
|
-
return settingById.get(id);
|
|
2009
|
+
return overlayEntry("setting", id, settingById.get(id));
|
|
1864
2010
|
}
|
|
1865
2011
|
function getSettingLabel(id, fallback) {
|
|
1866
2012
|
const s = getSetting(id);
|
|
@@ -2122,7 +2268,8 @@ var LOOP_SUBJECTS = [
|
|
|
2122
2268
|
}
|
|
2123
2269
|
];
|
|
2124
2270
|
function getLoopSubject(id) {
|
|
2125
|
-
|
|
2271
|
+
if (!id) return void 0;
|
|
2272
|
+
return overlayEntry("loop-subject", id, LOOP_SUBJECTS.find((s) => s.id === id));
|
|
2126
2273
|
}
|
|
2127
2274
|
function getLoopSubjectLabel(id) {
|
|
2128
2275
|
return getLoopSubject(id)?.label ?? id;
|
|
@@ -2133,70 +2280,6 @@ function getLoopSubjectPromptHint(id) {
|
|
|
2133
2280
|
function getLoopSubjectTerm(id) {
|
|
2134
2281
|
return resolveTerm(getLoopSubject(id));
|
|
2135
2282
|
}
|
|
2136
|
-
function withTerm(o) {
|
|
2137
|
-
return { ...o, term: resolveTerm(o) };
|
|
2138
|
-
}
|
|
2139
|
-
var packs = [];
|
|
2140
|
-
var version = 0;
|
|
2141
|
-
function registerCatalogPack(pack) {
|
|
2142
|
-
if (packs.some((p) => p.id === pack.id)) throw new Error(`duplicate catalog pack id "${pack.id}"`);
|
|
2143
|
-
packs = [...packs, pack];
|
|
2144
|
-
version++;
|
|
2145
|
-
registerCatalogSidecars(pack.catalogId, pack.sidecars);
|
|
2146
|
-
}
|
|
2147
|
-
function getRegisteredCatalogPacks() {
|
|
2148
|
-
return packs;
|
|
2149
|
-
}
|
|
2150
|
-
function resetCatalogPacks() {
|
|
2151
|
-
packs = [];
|
|
2152
|
-
version++;
|
|
2153
|
-
resetCatalogSidecars();
|
|
2154
|
-
}
|
|
2155
|
-
function catalogPacksVersion() {
|
|
2156
|
-
return version;
|
|
2157
|
-
}
|
|
2158
|
-
function cloneCatalog(c) {
|
|
2159
|
-
return {
|
|
2160
|
-
...c,
|
|
2161
|
-
options: c.options ? c.options.map(withTerm) : void 0,
|
|
2162
|
-
dimensions: c.dimensions ? c.dimensions.map((d) => ({ ...d, options: d.options.map(withTerm) })) : void 0
|
|
2163
|
-
};
|
|
2164
|
-
}
|
|
2165
|
-
function applyExtend(c, pack) {
|
|
2166
|
-
if (c.kind === "single") {
|
|
2167
|
-
return { ...c, options: [...c.options ?? [], ...(pack.options ?? []).map(withTerm)] };
|
|
2168
|
-
}
|
|
2169
|
-
const byField = new Map((c.dimensions ?? []).map((d) => [d.field, { ...d, options: [...d.options] }]));
|
|
2170
|
-
for (const dim of pack.dimensions ?? []) {
|
|
2171
|
-
const added = dim.options.map(withTerm);
|
|
2172
|
-
const existing = byField.get(dim.field);
|
|
2173
|
-
if (existing) existing.options = [...existing.options, ...added];
|
|
2174
|
-
else byField.set(dim.field, { ...dim, options: added });
|
|
2175
|
-
}
|
|
2176
|
-
const dims = [...byField.values()];
|
|
2177
|
-
return { ...c, dimensions: dims, fields: dims.map((d) => d.field) };
|
|
2178
|
-
}
|
|
2179
|
-
function applyDeny(c, denyIds) {
|
|
2180
|
-
const deny = new Set(denyIds);
|
|
2181
|
-
if (c.kind === "single") return { ...c, options: (c.options ?? []).filter((o) => !deny.has(o.id)) };
|
|
2182
|
-
return { ...c, dimensions: (c.dimensions ?? []).map((d) => ({ ...d, options: d.options.filter((o) => !deny.has(o.id)) })) };
|
|
2183
|
-
}
|
|
2184
|
-
function composePickerCatalogs(base, activePacks) {
|
|
2185
|
-
const known = new Set(base.map((c) => c.catalogId));
|
|
2186
|
-
for (const pack of activePacks) {
|
|
2187
|
-
if (!known.has(pack.catalogId)) throw new Error(`catalog pack "${pack.id}" targets unknown catalog id "${pack.catalogId}"`);
|
|
2188
|
-
}
|
|
2189
|
-
return base.map((c) => {
|
|
2190
|
-
let out = cloneCatalog(c);
|
|
2191
|
-
for (const pack of activePacks) {
|
|
2192
|
-
if (pack.catalogId !== c.catalogId) continue;
|
|
2193
|
-
if (pack.mode === "replace" && pack.catalog) out = cloneCatalog(pack.catalog);
|
|
2194
|
-
else if (pack.mode === "extend") out = applyExtend(out, pack);
|
|
2195
|
-
else if (pack.mode === "deny") out = applyDeny(out, pack.denyIds ?? []);
|
|
2196
|
-
}
|
|
2197
|
-
return out;
|
|
2198
|
-
});
|
|
2199
|
-
}
|
|
2200
2283
|
var personPacks = [];
|
|
2201
2284
|
var version2 = 0;
|
|
2202
2285
|
function syncPersonPackFields() {
|
|
@@ -2219,7 +2302,8 @@ function registerPersonPack(pack) {
|
|
|
2219
2302
|
description: e.description,
|
|
2220
2303
|
category: e.group,
|
|
2221
2304
|
promptHint: e.promptHint,
|
|
2222
|
-
term: resolveTerm(e)
|
|
2305
|
+
term: resolveTerm(e),
|
|
2306
|
+
adultOnly: e.adultOnly
|
|
2223
2307
|
};
|
|
2224
2308
|
const existing = byField.get(dim.field);
|
|
2225
2309
|
if (existing) existing.options.push(opt);
|
|
@@ -2241,7 +2325,7 @@ function resetPersonPacks() {
|
|
|
2241
2325
|
syncPersonPackFields();
|
|
2242
2326
|
}
|
|
2243
2327
|
function personPacksVersion() {
|
|
2244
|
-
return version2;
|
|
2328
|
+
return version2 * 1000003 + catalogPacksVersion();
|
|
2245
2329
|
}
|
|
2246
2330
|
function dimensionByField() {
|
|
2247
2331
|
const out = {};
|
|
@@ -2261,7 +2345,8 @@ function personEntriesFromDims(dims) {
|
|
|
2261
2345
|
description: o.description ?? "",
|
|
2262
2346
|
group: o.category,
|
|
2263
2347
|
promptHint: o.promptHint,
|
|
2264
|
-
dimension
|
|
2348
|
+
dimension,
|
|
2349
|
+
adultOnly: o.adultOnly
|
|
2265
2350
|
});
|
|
2266
2351
|
}
|
|
2267
2352
|
}
|
|
@@ -2298,6 +2383,36 @@ function getRegisteredPersonDimensionLabels() {
|
|
|
2298
2383
|
return extra.length === 0 ? PERSON_DIMENSION_LABELS : { ...PERSON_DIMENSION_LABELS, ...Object.fromEntries(extra) };
|
|
2299
2384
|
}
|
|
2300
2385
|
|
|
2386
|
+
// src/age-signal.ts
|
|
2387
|
+
var ADULT_ONLY_FLAG = "adultOnly";
|
|
2388
|
+
var ADULT_AGE_IDS = /* @__PURE__ */ new Set([
|
|
2389
|
+
"age-early-20s",
|
|
2390
|
+
"age-late-20s",
|
|
2391
|
+
"age-20s",
|
|
2392
|
+
"age-30s",
|
|
2393
|
+
"age-40s",
|
|
2394
|
+
"age-50s",
|
|
2395
|
+
"age-60s",
|
|
2396
|
+
"age-elderly"
|
|
2397
|
+
]);
|
|
2398
|
+
var MINOR_IMPLYING_TYPE_IDS = /* @__PURE__ */ new Set([
|
|
2399
|
+
"alice-wonderland",
|
|
2400
|
+
"dorothy-oz",
|
|
2401
|
+
"peter-pan",
|
|
2402
|
+
"magical-girl",
|
|
2403
|
+
"prince",
|
|
2404
|
+
"princess"
|
|
2405
|
+
]);
|
|
2406
|
+
function isMinorAge(value) {
|
|
2407
|
+
if (!value) return false;
|
|
2408
|
+
const { age, customAge, type } = value;
|
|
2409
|
+
if (typeof age === "string" && age.length > 0) {
|
|
2410
|
+
if (age === "age-custom") return !(typeof customAge === "number" && Number.isFinite(customAge) && customAge >= 20);
|
|
2411
|
+
return !ADULT_AGE_IDS.has(age);
|
|
2412
|
+
}
|
|
2413
|
+
return typeof type === "string" && MINOR_IMPLYING_TYPE_IDS.has(type);
|
|
2414
|
+
}
|
|
2415
|
+
|
|
2301
2416
|
// src/person.ts
|
|
2302
2417
|
var PEOPLE = [
|
|
2303
2418
|
// -------------------- Type (primary subject descriptor) --------------------
|
|
@@ -2334,7 +2449,7 @@ var PEOPLE = [
|
|
|
2334
2449
|
{ id: "stylish-influencer", label: "Stylish Influencer", group: "Realistic \u2014 Style", dimension: "type", description: "Polished social-media tastemaker", promptHint: "a stylish social-media influencer \u2014 polished personal-brand styling, trend-forward outfit, expressive natural posing for the camera, the curated put-together look of a content creator" },
|
|
2335
2450
|
{ id: "stunning-model", label: "Stunning Model", group: "Realistic \u2014 Style", dimension: "type", description: "Fashion-model aesthetic", promptHint: "a stunning fashion model with editorial poise, refined features, and high-fashion presence" },
|
|
2336
2451
|
{ id: "supermodel", label: "Supermodel", group: "Realistic \u2014 Style", dimension: "type", description: "Iconic, top-tier runway and cover star", promptHint: "a supermodel \u2014 iconic top-tier presence with magnetic statement features, a striking silhouette and the unmistakable runway-and-cover aura that commands attention" },
|
|
2337
|
-
{ id: "femme-fatale", label: "Femme Fatale", group: "Realistic \u2014 Style", dimension: "type", description: "Alluring, dangerous noir seductress", promptHint: "a femme fatale \u2014 alluring, mysterious, and dangerous with classic noir seduction" },
|
|
2452
|
+
{ id: "femme-fatale", label: "Femme Fatale", group: "Realistic \u2014 Style", dimension: "type", description: "Alluring, dangerous noir seductress", promptHint: "a femme fatale \u2014 alluring, mysterious, and dangerous with classic noir seduction", adultOnly: true },
|
|
2338
2453
|
{ id: "tough-guy", label: "Tough Guy", group: "Realistic \u2014 Style", dimension: "type", description: "Hardened, tough man", promptHint: "a tough, hardened man" },
|
|
2339
2454
|
// Aesthetic archetypes that traditionally read older — hints kept gender +
|
|
2340
2455
|
// look-focused so the Age dimension stays in control of the literal age.
|
|
@@ -2345,7 +2460,7 @@ var PEOPLE = [
|
|
|
2345
2460
|
{ id: "twink", label: "Twink", group: "Realistic \u2014 Style", dimension: "type", description: "Slim, smooth, soft gay-male type", promptHint: "a twink \u2014 slim, smooth, soft masculine presence with a delicate, gender-fluid vibe" },
|
|
2346
2461
|
{ id: "soft-butch", label: "Soft Butch", group: "Realistic \u2014 Style", dimension: "type", description: "Gentle masculine-of-center woman", promptHint: "a soft-butch woman \u2014 gentle masculine-of-center styling and energy" },
|
|
2347
2462
|
{ id: "tomboy", label: "Tomboy", group: "Realistic \u2014 Style", dimension: "type", description: "Boyish styling and energy on a feminine body", promptHint: "a tomboy \u2014 boyish styling and energy on a feminine body" },
|
|
2348
|
-
{ id: "thick", label: "Thick", group: "Realistic \u2014 Style", dimension: "type", description: "Voluptuous body-positive figure with curves", promptHint: "a thick, voluptuous body-positive figure with full curves", term: "thick voluptuous figure" },
|
|
2463
|
+
{ id: "thick", label: "Thick", group: "Realistic \u2014 Style", dimension: "type", description: "Voluptuous body-positive figure with curves", promptHint: "a thick, voluptuous body-positive figure with full curves", term: "thick voluptuous figure", adultOnly: true },
|
|
2349
2464
|
{ id: "androgynous", label: "Androgynous", group: "Realistic \u2014 Style", dimension: "type", description: "Deliberately blended masculine + feminine cues", promptHint: "an androgynous figure with deliberately blended masculine and feminine cues", term: "androgynous figure" },
|
|
2350
2465
|
{ id: "goth", label: "Goth", group: "Realistic \u2014 Style", dimension: "type", description: "Goth subculture aesthetic \u2014 dark, romantic, dramatic", promptHint: "a goth figure with a dark romantic dramatic subculture aesthetic" },
|
|
2351
2466
|
{ id: "bear", label: "Bear", group: "Realistic \u2014 Style", dimension: "type", description: "Big, bearded, hairy masculine type", promptHint: "a bear \u2014 a big, bearded, hairy man with a warm masculine presence", term: "big bearded hairy man" },
|
|
@@ -2353,7 +2468,7 @@ var PEOPLE = [
|
|
|
2353
2468
|
{ id: "caveman", label: "Caveman", group: "Primitive / Wild", dimension: "type", description: "Stone Age primitive man", promptHint: "a caveman \u2014 Stone Age primitive in animal furs, with shaggy hair, a heavy brow and a sturdy frame" },
|
|
2354
2469
|
{ id: "cavewoman", label: "Cavewoman", group: "Primitive / Wild", dimension: "type", description: "Stone Age primitive woman", promptHint: "a cavewoman \u2014 Stone Age primitive in animal furs, with shaggy hair and a sturdy frame" },
|
|
2355
2470
|
{ id: "apeman", label: "Apeman", group: "Primitive / Wild", dimension: "type", description: "Half-human half-ape hybrid", promptHint: "an apeman \u2014 half-human half-ape hybrid with simian features, broad shoulders and a heavy stooped build" },
|
|
2356
|
-
{ id: "feral-wildman", label: "Feral Wild-Human", group: "Primitive / Wild", dimension: "type", description: "Overgrown, primal feral human", promptHint: "a feral wild-human \u2014 overgrown matted hair, primal eyes and a near-naked, bestial bearing" },
|
|
2471
|
+
{ id: "feral-wildman", label: "Feral Wild-Human", group: "Primitive / Wild", dimension: "type", description: "Overgrown, primal feral human", promptHint: "a feral wild-human \u2014 overgrown matted hair, primal eyes and a near-naked, bestial bearing", adultOnly: true },
|
|
2357
2472
|
{ id: "neanderthal", label: "Neanderthal", group: "Primitive / Wild", dimension: "type", description: "Pre-modern human species", promptHint: "a neanderthal \u2014 heavy brow, broad nose, stocky pre-modern human build with weather-toughened skin" },
|
|
2358
2473
|
// ----- Fantasy (humanoid) -----
|
|
2359
2474
|
{ id: "elf-man", label: "Elf (Male)", group: "Fantasy", dimension: "type", description: "Masculine pointed-ear humanoid", promptHint: "a male elf \u2014 slender masculine humanoid with delicately pointed ears, fine sharp features and an ethereal poise", term: "male elf" },
|
|
@@ -2367,7 +2482,7 @@ var PEOPLE = [
|
|
|
2367
2482
|
{ id: "faun", label: "Faun / Satyr", group: "Fantasy", dimension: "type", description: "Goat-legged horned humanoid", promptHint: "a faun \u2014 humanoid with goat legs, small curling horns and a woodland presence", term: "faun" },
|
|
2368
2483
|
{ id: "centaur", label: "Centaur", group: "Fantasy", dimension: "type", description: "Human torso on a horse body", promptHint: "a centaur \u2014 human torso fused to the body of a horse" },
|
|
2369
2484
|
{ id: "vampire-man", label: "Vampire (Male)", group: "Fantasy", dimension: "type", description: "Masculine fanged immortal", promptHint: "a male vampire \u2014 pale, fanged immortal man in formal evening wear with gothic elegance and a quiet predatory poise", term: "male vampire" },
|
|
2370
|
-
{ id: "vampire-woman", label: "Vampire (Female)", group: "Fantasy", dimension: "type", description: "Feminine fanged immortal", promptHint: "a female vampire \u2014 pale, fanged immortal woman in flowing gothic attire with seductive elegance and a quiet predatory poise", term: "female vampire" },
|
|
2485
|
+
{ id: "vampire-woman", label: "Vampire (Female)", group: "Fantasy", dimension: "type", description: "Feminine fanged immortal", promptHint: "a female vampire \u2014 pale, fanged immortal woman in flowing gothic attire with seductive elegance and a quiet predatory poise", term: "female vampire", adultOnly: true },
|
|
2371
2486
|
{ id: "vampire", label: "Vampire", group: "Fantasy", dimension: "type", description: "Pale, fanged immortal", promptHint: "a vampire \u2014 pale, fanged immortal with a pristine gothic elegance and a quiet predatory poise" },
|
|
2372
2487
|
{ id: "werewolf", label: "Werewolf", group: "Fantasy", dimension: "type", description: "Partially transformed lycanthrope", promptHint: "a werewolf \u2014 partially transformed humanoid with wolfish snout, fur, claws and a feral musculature" },
|
|
2373
2488
|
{ id: "mermaid", label: "Mermaid", group: "Fantasy", dimension: "type", description: "Female humanoid with a fish tail", promptHint: "a mermaid \u2014 humanoid woman from the waist up with a long iridescent fish tail below" },
|
|
@@ -2599,22 +2714,22 @@ var PEOPLE = [
|
|
|
2599
2714
|
{ id: "mass-full", label: "Full", dimension: "body-mass", description: "Full-figured", promptHint: "full-figured", term: "full-figured" },
|
|
2600
2715
|
{ id: "mass-heavy", label: "Heavy", dimension: "body-mass", description: "Heavy-set, large build", promptHint: "heavy-set build", term: "heavy-set build" },
|
|
2601
2716
|
// ----- Bust (applicable subjects; ungated like Facial Hair, neutral = no-op) -----
|
|
2602
|
-
{ id: "bust-small", label: "Small", dimension: "bust", description: "Small bust", promptHint: "small bust", term: "small bust" },
|
|
2717
|
+
{ id: "bust-small", label: "Small", dimension: "bust", description: "Small bust", promptHint: "small bust", term: "small bust", adultOnly: true },
|
|
2603
2718
|
{ id: "bust-average", label: "Average", dimension: "bust", description: "Average bust", promptHint: "" },
|
|
2604
|
-
{ id: "bust-full", label: "Full", dimension: "bust", description: "Full bust", promptHint: "full bust", term: "full bust" },
|
|
2605
|
-
{ id: "bust-very-full", label: "Very Full", dimension: "bust", description: "Very full bust", promptHint: "very full bust", term: "very full bust" },
|
|
2719
|
+
{ id: "bust-full", label: "Full", dimension: "bust", description: "Full bust", promptHint: "full bust", term: "full bust", adultOnly: true },
|
|
2720
|
+
{ id: "bust-very-full", label: "Very Full", dimension: "bust", description: "Very full bust", promptHint: "very full bust", term: "very full bust", adultOnly: true },
|
|
2606
2721
|
// ----- Waist -----
|
|
2607
|
-
{ id: "waist-defined", label: "Defined", dimension: "waist", description: "Defined, cinched waist", promptHint: "defined waist", term: "defined waist" },
|
|
2722
|
+
{ id: "waist-defined", label: "Defined", dimension: "waist", description: "Defined, cinched waist", promptHint: "defined waist", term: "defined waist", adultOnly: true },
|
|
2608
2723
|
{ id: "waist-average", label: "Average", dimension: "waist", description: "Average waist", promptHint: "" },
|
|
2609
|
-
{ id: "waist-straight", label: "Straight", dimension: "waist", description: "Straight, undefined waist", promptHint: "straight waistline", term: "straight waistline" },
|
|
2724
|
+
{ id: "waist-straight", label: "Straight", dimension: "waist", description: "Straight, undefined waist", promptHint: "straight waistline", term: "straight waistline", adultOnly: true },
|
|
2610
2725
|
// ----- Hips -----
|
|
2611
|
-
{ id: "hips-narrow", label: "Narrow", dimension: "hips", description: "Narrow hips", promptHint: "narrow hips", term: "narrow hips" },
|
|
2726
|
+
{ id: "hips-narrow", label: "Narrow", dimension: "hips", description: "Narrow hips", promptHint: "narrow hips", term: "narrow hips", adultOnly: true },
|
|
2612
2727
|
{ id: "hips-balanced", label: "Balanced", dimension: "hips", description: "Balanced hips", promptHint: "" },
|
|
2613
|
-
{ id: "hips-wide", label: "Wide", dimension: "hips", description: "Wide hips", promptHint: "wide hips", term: "wide hips" },
|
|
2728
|
+
{ id: "hips-wide", label: "Wide", dimension: "hips", description: "Wide hips", promptHint: "wide hips", term: "wide hips", adultOnly: true },
|
|
2614
2729
|
// ----- Silhouette (overall body shape; optional, no neutral) -----
|
|
2615
|
-
{ id: "silhouette-hourglass", label: "Hourglass", dimension: "silhouette", description: "Balanced bust + hips, defined waist", promptHint: "hourglass silhouette", term: "hourglass silhouette" },
|
|
2730
|
+
{ id: "silhouette-hourglass", label: "Hourglass", dimension: "silhouette", description: "Balanced bust + hips, defined waist", promptHint: "hourglass silhouette", term: "hourglass silhouette", adultOnly: true },
|
|
2616
2731
|
{ id: "silhouette-rectangular", label: "Rectangular", dimension: "silhouette", description: "Straight up-and-down silhouette", promptHint: "rectangular silhouette", term: "rectangular silhouette" },
|
|
2617
|
-
{ id: "silhouette-pear", label: "Pear", dimension: "silhouette", description: "Hips wider than shoulders", promptHint: "pear-shaped silhouette", term: "pear-shaped silhouette" },
|
|
2732
|
+
{ id: "silhouette-pear", label: "Pear", dimension: "silhouette", description: "Hips wider than shoulders", promptHint: "pear-shaped silhouette", term: "pear-shaped silhouette", adultOnly: true },
|
|
2618
2733
|
{ id: "silhouette-inverted", label: "Inverted Triangle", dimension: "silhouette", description: "Broad shoulders, narrow hips", promptHint: "inverted-triangle silhouette", term: "inverted-triangle silhouette" },
|
|
2619
2734
|
{ id: "silhouette-athletic", label: "Athletic", dimension: "silhouette", description: "Lean, toned, V-taper", promptHint: "athletic silhouette", term: "athletic silhouette" },
|
|
2620
2735
|
// -------------------- Face Shape --------------------
|
|
@@ -2701,17 +2816,17 @@ var PEOPLE = [
|
|
|
2701
2816
|
{ id: "lips-small", label: "Small", dimension: "lip-shape", description: "Petite mouth", promptHint: "a small petite mouth", term: "small petite mouth" },
|
|
2702
2817
|
// -------------------- Lip State (what the lips are doing / wearing) --------------------
|
|
2703
2818
|
{ id: "lip-state-chapped", label: "Chapped", dimension: "lip-state", description: "Cracked, dry, weather-worn lips", promptHint: "with chapped, cracked, weather-worn dry lips", term: "chapped dry lips" },
|
|
2704
|
-
{ id: "lip-state-glossy", label: "Glossy", dimension: "lip-state", description: "High-shine, wet-look lips", promptHint: "with high-shine glossy wet-look lips", term: "glossy wet-look lips" },
|
|
2819
|
+
{ id: "lip-state-glossy", label: "Glossy", dimension: "lip-state", description: "High-shine, wet-look lips", promptHint: "with high-shine glossy wet-look lips", term: "glossy wet-look lips", adultOnly: true },
|
|
2705
2820
|
{ id: "lip-state-bare", label: "Bare", dimension: "lip-state", description: "Natural, untreated, no makeup", promptHint: "with bare, natural, untreated lips", term: "bare natural lips" },
|
|
2706
2821
|
{ id: "lip-state-bold-red", label: "Bold Red", dimension: "lip-state", description: "Saturated red lipstick statement", promptHint: "with a bold, saturated red lipstick statement", term: "bold red lipstick" },
|
|
2707
|
-
{ id: "lip-state-bitten", label: "Bitten", dimension: "lip-state", description: "Slight playful lip-bite, lower lip caught", promptHint: "playfully biting the lower lip", term: "biting the lower lip" },
|
|
2708
|
-
{ id: "lip-state-parted", label: "Parted", dimension: "lip-state", description: "Lips slightly parted, breath of air", promptHint: "with lips slightly parted, taking a soft breath", term: "lips slightly parted" },
|
|
2822
|
+
{ id: "lip-state-bitten", label: "Bitten", dimension: "lip-state", description: "Slight playful lip-bite, lower lip caught", promptHint: "playfully biting the lower lip", term: "biting the lower lip", adultOnly: true },
|
|
2823
|
+
{ id: "lip-state-parted", label: "Parted", dimension: "lip-state", description: "Lips slightly parted, breath of air", promptHint: "with lips slightly parted, taking a soft breath", term: "lips slightly parted", adultOnly: true },
|
|
2709
2824
|
{ id: "lip-state-pursed", label: "Pursed", dimension: "lip-state", description: "Lips pressed and pushed forward", promptHint: "with lips pursed, pressed and pushed forward", term: "pursed lips" },
|
|
2710
2825
|
{ id: "lip-state-bold-black", label: "Bold Black", dimension: "lip-state", description: "Saturated black lipstick statement (goth / avant-garde)", promptHint: "with a bold, saturated black lipstick statement, goth / avant-garde", term: "bold black lipstick" },
|
|
2711
2826
|
{ id: "lip-state-burgundy", label: "Burgundy", dimension: "lip-state", description: "Deep wine-red lipstick", promptHint: "with deep wine-red burgundy lipstick", term: "burgundy lipstick" },
|
|
2712
2827
|
{ id: "lip-state-plum", label: "Plum", dimension: "lip-state", description: "Dark purple-toned lipstick", promptHint: "with dark purple-toned plum lipstick", term: "plum lipstick" },
|
|
2713
2828
|
{ id: "lip-state-mauve", label: "Mauve", dimension: "lip-state", description: "Muted mauve / dusty-pink lipstick", promptHint: "with muted mauve, dusty-pink lipstick", term: "mauve lipstick" },
|
|
2714
|
-
{ id: "lip-state-pouting", label: "Pouting", dimension: "lip-state", description: "Full pout", promptHint: "with a full pouting expression", term: "full pouting expression" },
|
|
2829
|
+
{ id: "lip-state-pouting", label: "Pouting", dimension: "lip-state", description: "Full pout", promptHint: "with a full pouting expression", term: "full pouting expression", adultOnly: true },
|
|
2715
2830
|
// -------------------- Hair Color --------------------
|
|
2716
2831
|
// Blonde family (light → warm → cool)
|
|
2717
2832
|
{ id: "hair-platinum", label: "Platinum", dimension: "hair-color", description: "Very pale, icy platinum", promptHint: "platinum blonde hair, very pale and icy", term: "platinum blonde hair" },
|
|
@@ -2818,7 +2933,7 @@ var PEOPLE = [
|
|
|
2818
2933
|
{ id: "eyes-black", label: "Black", dimension: "eye-color", description: "Truly black iris (deeper than brown)", promptHint: "jet-black eyes with a truly black iris, deeper than brown", term: "jet-black eyes" },
|
|
2819
2934
|
// -------------------- Eye State (what the eyes are doing / where they look) --------------------
|
|
2820
2935
|
{ id: "eye-state-closed", label: "Closed", dimension: "eye-state", description: "Eyes fully closed, peaceful", promptHint: "with eyes fully closed in a peaceful expression", term: "eyes fully closed" },
|
|
2821
|
-
{ id: "eye-state-half-lidded", label: "Half-lidded", dimension: "eye-state", description: "Heavy-lidded sleepy gaze", promptHint: "with heavy half-lidded sleepy eyes", term: "half-lidded sleepy eyes" },
|
|
2936
|
+
{ id: "eye-state-half-lidded", label: "Half-lidded", dimension: "eye-state", description: "Heavy-lidded sleepy gaze", promptHint: "with heavy half-lidded sleepy eyes", term: "half-lidded sleepy eyes", adultOnly: true },
|
|
2822
2937
|
{ id: "eye-state-wide-eyed", label: "Wide-eyed", dimension: "eye-state", description: "Eyes wide open, alert / surprised", promptHint: "with eyes wide open, alert and surprised" },
|
|
2823
2938
|
{ id: "eye-state-staring-camera", label: "Staring at Camera", dimension: "eye-state", description: "Direct unbroken eye contact with the lens", promptHint: "staring directly at the camera with unbroken eye contact" },
|
|
2824
2939
|
{ id: "eye-state-gazing-away", label: "Gazing Away", dimension: "eye-state", description: "Looking off-camera, contemplative", promptHint: "gazing off-camera with a contemplative expression", term: "gazing off-camera" },
|
|
@@ -2838,20 +2953,20 @@ var PEOPLE = [
|
|
|
2838
2953
|
{ id: "texture-wrinkled", label: "Wrinkled", dimension: "skin-texture", description: "Aged, deeply lined skin", promptHint: "with deep wrinkles and aged skin texture", term: "deeply wrinkled aged skin" },
|
|
2839
2954
|
{ id: "texture-goosebumps", label: "Goosebumps", dimension: "skin-texture", description: "Raised goosebumps on skin", promptHint: "with goosebumps raised on the skin" },
|
|
2840
2955
|
{ id: "texture-dewy", label: "Dewy", dimension: "skin-texture", description: "Glowing, dewy fresh skin", promptHint: "with dewy, glowing skin and a fresh sheen", term: "dewy glowing skin" },
|
|
2841
|
-
{ id: "texture-glistening", label: "Glistening", dimension: "skin-texture", description: "Sweat or oil sheen", promptHint: "with glistening skin, sweat or oil catching the light", term: "glistening skin" },
|
|
2956
|
+
{ id: "texture-glistening", label: "Glistening", dimension: "skin-texture", description: "Sweat or oil sheen", promptHint: "with glistening skin, sweat or oil catching the light", term: "glistening skin", adultOnly: true },
|
|
2842
2957
|
{ id: "texture-weathered", label: "Weathered", dimension: "skin-texture", description: "Sun-aged rough skin", promptHint: "with weathered, sun-worn rough skin", term: "weathered sun-worn skin" },
|
|
2843
2958
|
{ id: "texture-porcelain", label: "Porcelain", dimension: "skin-texture", description: "Flawless near-translucent porcelain", promptHint: "with flawless, near-translucent porcelain skin", term: "porcelain skin" },
|
|
2844
2959
|
{ id: "texture-sun-kissed", label: "Sun-kissed", dimension: "skin-texture", description: "Warm tan with healthy glow", promptHint: "with sun-kissed skin, warmly tanned with a healthy glow", term: "sun-kissed skin" },
|
|
2845
2960
|
{ id: "texture-tanned", label: "Tanned", dimension: "skin-texture", description: "Deeply, evenly tanned skin", promptHint: "with deeply, evenly bronzed tanned skin", term: "deeply tanned skin" },
|
|
2846
|
-
{ id: "texture-tan-lines", label: "Tan Lines", dimension: "skin-texture", description: "Visible tan lines from swimwear", promptHint: "with visible swimwear tan lines on the skin", term: "visible swimwear tan lines" },
|
|
2961
|
+
{ id: "texture-tan-lines", label: "Tan Lines", dimension: "skin-texture", description: "Visible tan lines from swimwear", promptHint: "with visible swimwear tan lines on the skin", term: "visible swimwear tan lines", adultOnly: true },
|
|
2847
2962
|
{ id: "texture-freckled", label: "Freckled", dimension: "skin-texture", description: "Freckles across cheeks and nose", promptHint: "with visible freckles scattered across cheeks and the bridge of the nose", term: "freckled skin" },
|
|
2848
2963
|
{ id: "texture-ruddy", label: "Ruddy", dimension: "skin-texture", description: "Pink-flushed cheeks and nose", promptHint: "with ruddy, warm pink-flushed cheeks and nose", term: "ruddy flushed complexion" },
|
|
2849
2964
|
{ id: "texture-ashen", label: "Ashen / Pale", dimension: "skin-texture", description: "Cool pale, near-bloodless undertone", promptHint: "with ashen, cool pale, near-bloodless skin", term: "ashen pale skin" },
|
|
2850
|
-
{ id: "texture-oily", label: "Oily / Shiny", dimension: "skin-texture", description: "Slight oil sheen on T-zone", promptHint: "with a slight oily sheen across the T-zone", term: "oily shiny skin" },
|
|
2965
|
+
{ id: "texture-oily", label: "Oily / Shiny", dimension: "skin-texture", description: "Slight oil sheen on T-zone", promptHint: "with a slight oily sheen across the T-zone", term: "oily shiny skin", adultOnly: true },
|
|
2851
2966
|
{ id: "texture-matte", label: "Matte", dimension: "skin-texture", description: "Poreless matte finish", promptHint: "with a poreless, matte skin finish", term: "matte skin finish" },
|
|
2852
2967
|
{ id: "texture-blemished", label: "Blemished", dimension: "skin-texture", description: "Visible blemishes, real-skin imperfections", promptHint: "with visible blemishes and natural real-skin imperfections", term: "blemished skin" },
|
|
2853
2968
|
{ id: "texture-baby-soft", label: "Baby-soft", dimension: "skin-texture", description: "Smooth, fine-pored youthful skin", promptHint: "with baby-soft, fine-pored, youthful smooth skin", term: "baby-soft skin" },
|
|
2854
|
-
{ id: "texture-shower-fresh-wet", label: "Shower-Fresh Wet", dimension: "skin-texture", description: "Just-out-of-shower wet skin with water beads", promptHint: "with just-out-of-the-shower wet skin, water beading on the surface and rolling in slow droplets down the curves of the body", term: "shower-fresh wet skin" },
|
|
2969
|
+
{ id: "texture-shower-fresh-wet", label: "Shower-Fresh Wet", dimension: "skin-texture", description: "Just-out-of-shower wet skin with water beads", promptHint: "with just-out-of-the-shower wet skin, water beading on the surface and rolling in slow droplets down the curves of the body", term: "shower-fresh wet skin", adultOnly: true },
|
|
2855
2970
|
{ id: "texture-acne-scarred", label: "Acne-scarred", dimension: "skin-texture", description: "Visible acne scarring (distinct from blemished \u2014 healed scar pattern)", promptHint: "with visible acne scarring, healed pitted-skin texture and uneven surface from past breakouts", term: "acne-scarred skin" },
|
|
2856
2971
|
// -------------------- Distinctive Features --------------------
|
|
2857
2972
|
{ id: "feature-glasses", label: "Glasses", dimension: "distinctive-features", description: "Wears glasses", promptHint: "wearing glasses", term: "wearing glasses" },
|
|
@@ -2872,18 +2987,18 @@ var PEOPLE = [
|
|
|
2872
2987
|
{ id: "feature-sleeve-tattoo", label: "Sleeve Tattoo", dimension: "distinctive-features", description: "Full one-arm tattoo sleeve", promptHint: "with a full tattoo sleeve covering one arm in intricate ink" },
|
|
2873
2988
|
{ id: "feature-face-tattoo", label: "Face Tattoo", dimension: "distinctive-features", description: "Small face tattoo near eye or cheekbone", promptHint: "with a small face tattoo near the eye or cheekbone" },
|
|
2874
2989
|
{ id: "feature-hand-tattoos", label: "Hand Tattoos", dimension: "distinctive-features", description: "Knuckle / finger tattoos", promptHint: "with hand tattoos across knuckles and fingers" },
|
|
2875
|
-
{ id: "feature-back-tattoo", label: "Back Tattoo", dimension: "distinctive-features", description: "Large piece across the back", promptHint: "with a large back-piece tattoo across the upper back" },
|
|
2876
|
-
{ id: "feature-chest-tattoo", label: "Chest Tattoo", dimension: "distinctive-features", description: "Tattoo across chest / d\xE9colletage", promptHint: "with a tattoo across the chest and d\xE9colletage" },
|
|
2877
|
-
{ id: "feature-leg-tattoo", label: "Leg Tattoo", dimension: "distinctive-features", description: "Visible tattoo on leg / calf / thigh", promptHint: "with a visible tattoo on the leg, running across the calf or thigh" },
|
|
2990
|
+
{ id: "feature-back-tattoo", label: "Back Tattoo", dimension: "distinctive-features", description: "Large piece across the back", promptHint: "with a large back-piece tattoo across the upper back", adultOnly: true },
|
|
2991
|
+
{ id: "feature-chest-tattoo", label: "Chest Tattoo", dimension: "distinctive-features", description: "Tattoo across chest / d\xE9colletage", promptHint: "with a tattoo across the chest and d\xE9colletage", adultOnly: true },
|
|
2992
|
+
{ id: "feature-leg-tattoo", label: "Leg Tattoo", dimension: "distinctive-features", description: "Visible tattoo on leg / calf / thigh", promptHint: "with a visible tattoo on the leg, running across the calf or thigh", adultOnly: true },
|
|
2878
2993
|
{ id: "feature-forearm-tattoo", label: "Forearm Tattoo", dimension: "distinctive-features", description: "Tattoo on inner or outer forearm", promptHint: "with a tattoo on the forearm, visible on the inner or outer side" },
|
|
2879
2994
|
{ id: "feature-visible-piercings", label: "Visible Piercings", dimension: "distinctive-features", description: "Multiple visible piercings (septum, nose, lip, multi-ear)", promptHint: "with multiple visible piercings \u2014 septum, nose, lip, and multi-ear", term: "multiple visible piercings" },
|
|
2880
2995
|
{ id: "feature-ear-piercings", label: "Ear Piercings", dimension: "distinctive-features", description: "Multiple stacked ear piercings (cartilage, helix, conch)", promptHint: "with multiple stacked ear piercings \u2014 cartilage, helix, and conch", term: "multiple stacked ear piercings" },
|
|
2881
2996
|
{ id: "feature-lip-piercing", label: "Lip Piercing", dimension: "distinctive-features", description: "Lip ring / labret stud", promptHint: "with a lip piercing, a small ring or labret stud at the lip" },
|
|
2882
2997
|
{ id: "feature-nostril-piercing", label: "Nostril Piercing", dimension: "distinctive-features", description: "Single nostril stud or ring", promptHint: "with a single nostril piercing, a small stud or ring at the nostril" },
|
|
2883
|
-
{ id: "feature-bare-shoulders", label: "Bare Shoulders", dimension: "distinctive-features", description: "Bare shoulders exposed", promptHint: "with bare shoulders exposed, the line of the collarbone and shoulder muscles uncovered" },
|
|
2884
|
-
{ id: "feature-collarbone-visible", label: "Collarbone Visible", dimension: "distinctive-features", description: "Prominent collarbone catching light", promptHint: "with a prominent collarbone clearly defined and catching the light", term: "visible collarbone" },
|
|
2885
|
-
{ id: "feature-midriff-visible", label: "Midriff Visible", dimension: "distinctive-features", description: "Exposed midriff between top and bottom", promptHint: "wearing a cropped style with the midriff visible", term: "visible midriff" },
|
|
2886
|
-
{ id: "feature-navel-visible", label: "Navel Visible", dimension: "distinctive-features", description: "Visible navel on bare stomach", promptHint: "with the navel visible", term: "visible navel" },
|
|
2998
|
+
{ id: "feature-bare-shoulders", label: "Bare Shoulders", dimension: "distinctive-features", description: "Bare shoulders exposed", promptHint: "with bare shoulders exposed, the line of the collarbone and shoulder muscles uncovered", adultOnly: true },
|
|
2999
|
+
{ id: "feature-collarbone-visible", label: "Collarbone Visible", dimension: "distinctive-features", description: "Prominent collarbone catching light", promptHint: "with a prominent collarbone clearly defined and catching the light", term: "visible collarbone", adultOnly: true },
|
|
3000
|
+
{ id: "feature-midriff-visible", label: "Midriff Visible", dimension: "distinctive-features", description: "Exposed midriff between top and bottom", promptHint: "wearing a cropped style with the midriff visible", term: "visible midriff", adultOnly: true },
|
|
3001
|
+
{ id: "feature-navel-visible", label: "Navel Visible", dimension: "distinctive-features", description: "Visible navel on bare stomach", promptHint: "with the navel visible", term: "visible navel", adultOnly: true },
|
|
2887
3002
|
{ id: "feature-elongated-neck", label: "Elongated Neck", dimension: "distinctive-features", description: "Long swan-like neck", promptHint: "with an elongated, swan-like neck, long and gracefully extended", term: "elongated swan-like neck" },
|
|
2888
3003
|
{ id: "feature-under-eye-circles", label: "Under-Eye Circles", dimension: "distinctive-features", description: "Subtle dark circles under the eyes (distinct from puffy eye-bags)", promptHint: "with subtle dark circles under the eyes", term: "dark under-eye circles" },
|
|
2889
3004
|
{ id: "feature-fangs", label: "Fangs", dimension: "distinctive-features", description: "Visible fangs (vampire / character archetype)", promptHint: "with visible fangs at the canines, character / vampire archetype", term: "visible fangs at the canines" },
|
|
@@ -2964,7 +3079,7 @@ var PEOPLE = [
|
|
|
2964
3079
|
// ----- Latin America -----
|
|
2965
3080
|
{ id: "carioca-rio", label: "Carioca (Rio)", group: "Latin America", dimension: "regional-aesthetic", description: "Rio de Janeiro beach-and-favela-music Brazilian aesthetic", promptHint: "a Carioca aesthetic \u2014 Rio de Janeiro beach-and-favela-music vibe, sun-warmed Brazilian energy", term: "carioca aesthetic" },
|
|
2966
3081
|
{ id: "paulista", label: "Paulista (S\xE3o Paulo)", group: "Latin America", dimension: "regional-aesthetic", description: "S\xE3o Paulo metropolitan Brazilian creative-class aesthetic", promptHint: "a Paulista aesthetic \u2014 S\xE3o Paulo metropolitan vibe, urban-Brazilian creative-class polish", term: "paulista aesthetic" },
|
|
2967
|
-
{ id: "buenos-aires-tango", label: "Buenos Aires Tango", group: "Latin America", dimension: "regional-aesthetic", description: "Buenos Aires Recoleta / San Telmo tango aesthetic (feminine)", promptHint: "a Buenos Aires tango aesthetic \u2014 Recoleta / San Telmo vibe, sultry porte\xF1a confidence", term: "buenos aires tango aesthetic" },
|
|
3082
|
+
{ id: "buenos-aires-tango", label: "Buenos Aires Tango", group: "Latin America", dimension: "regional-aesthetic", description: "Buenos Aires Recoleta / San Telmo tango aesthetic (feminine)", promptHint: "a Buenos Aires tango aesthetic \u2014 Recoleta / San Telmo vibe, sultry porte\xF1a confidence", term: "buenos aires tango aesthetic", adultOnly: true },
|
|
2968
3083
|
{ id: "porte\xF1o", label: "Porte\xF1o", group: "Latin America", dimension: "regional-aesthetic", description: "Buenos Aires refined milonguero aesthetic (masculine)", promptHint: "a Porte\xF1o aesthetic \u2014 Buenos Aires vibe, refined milonguero presence", term: "porte\xF1o aesthetic" },
|
|
2969
3084
|
{ id: "mexico-city-chic", label: "Mexico City Chic", group: "Latin America", dimension: "regional-aesthetic", description: "CDMX Roma / Polanco modern-Mexican aesthetic", promptHint: "a Mexico City chic aesthetic \u2014 CDMX Roma / Polanco vibe, modern-Mexican polish", term: "mexico city chic aesthetic" },
|
|
2970
3085
|
{ id: "chilango-traditional", label: "Chilango Traditional", group: "Latin America", dimension: "regional-aesthetic", description: "Mexico City warm folk-and-feast aesthetic", promptHint: "a Chilango traditional aesthetic \u2014 Mexico City vibe, warm folk-and-feast mood", term: "chilango traditional aesthetic" },
|
|
@@ -3209,7 +3324,7 @@ function emitIndependentFragments(value, fragmentFor) {
|
|
|
3209
3324
|
const navel = ids.includes("feature-navel-visible");
|
|
3210
3325
|
for (const id of ids) {
|
|
3211
3326
|
if (midriff && navel && (id === "feature-midriff-visible" || id === "feature-navel-visible")) {
|
|
3212
|
-
if (id === "feature-midriff-visible") out.push("wearing a cropped style, midriff and navel visible");
|
|
3327
|
+
if (id === "feature-midriff-visible" && fragmentFor(id) !== "") out.push("wearing a cropped style, midriff and navel visible");
|
|
3213
3328
|
continue;
|
|
3214
3329
|
}
|
|
3215
3330
|
const fragment = fragmentFor(id);
|
|
@@ -3221,6 +3336,8 @@ function collectPersonFragments(data, fragmentFor) {
|
|
|
3221
3336
|
const hints = [];
|
|
3222
3337
|
const pre = typeof data.preText === "string" ? data.preText.trim() : "";
|
|
3223
3338
|
if (pre) hints.push(pre);
|
|
3339
|
+
const floored = isMinorAge(data);
|
|
3340
|
+
const emit = floored ? (id) => typeof id === "string" && getPerson(id)?.adultOnly === true ? "" : fragmentFor(id) : fragmentFor;
|
|
3224
3341
|
const fieldByDimension = getRegisteredPersonFieldByDimension();
|
|
3225
3342
|
for (const dimension of getRegisteredPersonDimensionOrder()) {
|
|
3226
3343
|
const field = fieldByDimension[dimension];
|
|
@@ -3229,34 +3346,34 @@ function collectPersonFragments(data, fragmentFor) {
|
|
|
3229
3346
|
if (dimension === "age") {
|
|
3230
3347
|
const ageId = typeof raw === "string" ? raw : void 0;
|
|
3231
3348
|
const customAge = typeof data.customAge === "number" ? data.customAge : void 0;
|
|
3232
|
-
const h = buildAgeFragment(ageId, customAge,
|
|
3349
|
+
const h = buildAgeFragment(ageId, customAge, emit);
|
|
3233
3350
|
if (h) hints.push(h);
|
|
3234
3351
|
continue;
|
|
3235
3352
|
}
|
|
3236
3353
|
if (dimension === "ethnicity") {
|
|
3237
|
-
const h = buildEthnicityFragment(raw,
|
|
3354
|
+
const h = buildEthnicityFragment(raw, emit);
|
|
3238
3355
|
if (h) hints.push(h);
|
|
3239
3356
|
continue;
|
|
3240
3357
|
}
|
|
3241
3358
|
if (dimension === "hair-color") {
|
|
3242
|
-
const h = buildHairColorFragment(raw,
|
|
3359
|
+
const h = buildHairColorFragment(raw, emit);
|
|
3243
3360
|
if (h) hints.push(h);
|
|
3244
3361
|
continue;
|
|
3245
3362
|
}
|
|
3246
3363
|
if (dimension === "eye-color") {
|
|
3247
|
-
for (const h of buildEyeColorFragments(raw,
|
|
3364
|
+
for (const h of buildEyeColorFragments(raw, emit)) hints.push(h);
|
|
3248
3365
|
continue;
|
|
3249
3366
|
}
|
|
3250
3367
|
if (dimension === "distinctive-features" || dimension === "lip-state" || dimension === "eye-state" || dimension === "skin-texture" || dimension === "regional-aesthetic") {
|
|
3251
|
-
for (const h of emitIndependentFragments(raw,
|
|
3368
|
+
for (const h of emitIndependentFragments(raw, emit)) hints.push(h);
|
|
3252
3369
|
continue;
|
|
3253
3370
|
}
|
|
3254
3371
|
if (typeof raw !== "string" || raw.length === 0) continue;
|
|
3255
|
-
const hint =
|
|
3372
|
+
const hint = emit(raw);
|
|
3256
3373
|
if (hint) hints.push(hint);
|
|
3257
3374
|
}
|
|
3258
3375
|
if (typeof data.lips === "string" && data.lips.length > 0 && !data.lipFullness && !data.lipShape) {
|
|
3259
|
-
const legacyLips =
|
|
3376
|
+
const legacyLips = emit(data.lips);
|
|
3260
3377
|
if (legacyLips) hints.push(legacyLips);
|
|
3261
3378
|
}
|
|
3262
3379
|
const post = typeof data.postText === "string" ? data.postText.trim() : "";
|
|
@@ -3338,17 +3455,17 @@ var MOODS = [
|
|
|
3338
3455
|
{ id: "determined", label: "Determined", category: "intense", description: "Resolute, focused will", promptHint: "with a determined, resolute expression and iron focus", term: "determined, resolute expression" },
|
|
3339
3456
|
{ id: "passionate", label: "Passionate", category: "intense", description: "Burning passion", promptHint: "with a passionate, burning expression full of conviction", term: "passionate expression" },
|
|
3340
3457
|
{ id: "brooding", label: "Brooding", category: "intense", description: "Dark, brooding melancholy", promptHint: "with a brooding, dark expression and moody introspection", term: "brooding expression" },
|
|
3341
|
-
{ id: "seductive", label: "Seductive", category: "intense", description: "Alluring, seductive", promptHint: "with a seductive, alluring expression and lidded gaze", term: "seductive expression" },
|
|
3458
|
+
{ id: "seductive", label: "Seductive", category: "intense", description: "Alluring, seductive", promptHint: "with a seductive, alluring expression and lidded gaze", term: "seductive expression", adultOnly: true },
|
|
3342
3459
|
{ id: "defiant", label: "Defiant", category: "intense", description: "Defiant, unyielding", promptHint: "with a defiant, unyielding expression and challenging stance", term: "defiant expression" },
|
|
3343
|
-
{ id: "sultry", label: "Sultry", category: "intense", description: "Smoldering, heavy-lidded", promptHint: "with a sultry, smoldering expression, heavy-lidded gaze and lips softly parted", term: "sultry expression" },
|
|
3344
|
-
{ id: "smoldering", label: "Smoldering", category: "intense", description: "Coiled, slow-burning intensity", promptHint: "with a smoldering, coiled expression, slow-burning intensity behind half-closed eyes and a still, predatory calm", term: "smoldering intensity" },
|
|
3460
|
+
{ id: "sultry", label: "Sultry", category: "intense", description: "Smoldering, heavy-lidded", promptHint: "with a sultry, smoldering expression, heavy-lidded gaze and lips softly parted", term: "sultry expression", adultOnly: true },
|
|
3461
|
+
{ id: "smoldering", label: "Smoldering", category: "intense", description: "Coiled, slow-burning intensity", promptHint: "with a smoldering, coiled expression, slow-burning intensity behind half-closed eyes and a still, predatory calm", term: "smoldering intensity", adultOnly: true },
|
|
3345
3462
|
{ id: "sinister", label: "Sinister", category: "intense", description: "Dark, malicious, threatening", promptHint: "with a sinister expression, a slow crooked smile and eyes glinting with dark malicious intent", term: "sinister expression" },
|
|
3346
3463
|
{ id: "wiccan-mystical", label: "Wiccan / Mystical", category: "intense", description: "Quietly otherworldly, occult", promptHint: "with a quietly mystical, otherworldly expression, eyes distant and knowing as if reading something the camera cannot see", term: "occult, otherworldly mystical expression" },
|
|
3347
3464
|
{ id: "lazy-shy", label: "Lazy Shy", category: "neutral", description: "Drowsy, soft, half-shy", promptHint: "with a soft, drowsy half-shy expression, eyes lowered and barely-there smile, languid and unbothered", term: "drowsy, half-shy expression" },
|
|
3348
3465
|
{ id: "awe", label: "Awe", category: "intense", description: "Wonder, reverent", promptHint: "with an awestruck expression of wonder, mouth slightly agape and wide-eyed", term: "awestruck wonder" },
|
|
3349
3466
|
{ id: "shocked", label: "Shocked", category: "intense", description: "Surprised, mouth open", promptHint: "with a shocked, surprised expression, eyes wide, brows raised and mouth open", term: "shocked expression" },
|
|
3350
3467
|
// -------------------- Micro-emotions --------------------
|
|
3351
|
-
{ id: "flirty", label: "Flirty", category: "positive", description: "Playful flirtation, lingering smile, sustained eye contact", promptHint: "with a flirty expression, a lingering playful smile and sustained, knowing eye contact with the camera", term: "flirty expression" },
|
|
3468
|
+
{ id: "flirty", label: "Flirty", category: "positive", description: "Playful flirtation, lingering smile, sustained eye contact", promptHint: "with a flirty expression, a lingering playful smile and sustained, knowing eye contact with the camera", term: "flirty expression", adultOnly: true },
|
|
3352
3469
|
{ id: "suspicious", label: "Suspicious", category: "negative", description: "Wary distrust, narrowed eyes, side-eye", promptHint: "with a suspicious, wary expression, eyes narrowed in distrust and a sidelong side-eye glance", term: "suspicious, wary expression" },
|
|
3353
3470
|
{ id: "resigned", label: "Resigned", category: "neutral", description: "Quiet acceptance of an unpleasant situation, sigh", promptHint: "with a resigned expression of quiet acceptance, shoulders softly dropped mid-sigh and a tired half-closed gaze", term: "resigned expression of quiet acceptance" },
|
|
3354
3471
|
{ id: "conflicted", label: "Conflicted", category: "neutral", description: "Visible internal struggle, brow furrowed, gaze unfocused", promptHint: "with a conflicted expression of visible internal struggle, brow furrowed and gaze unfocused, caught between two impulses", term: "conflicted, torn expression" }
|
|
@@ -3356,7 +3473,7 @@ var MOODS = [
|
|
|
3356
3473
|
var moodById = new Map(MOODS.map((m) => [m.id, m]));
|
|
3357
3474
|
function getMood(id) {
|
|
3358
3475
|
if (!id) return void 0;
|
|
3359
|
-
return moodById.get(id);
|
|
3476
|
+
return overlayEntry("mood", id, moodById.get(id));
|
|
3360
3477
|
}
|
|
3361
3478
|
function getMoodLabel(id, fallback) {
|
|
3362
3479
|
const m = getMood(id);
|
|
@@ -3448,8 +3565,8 @@ var POSES = [
|
|
|
3448
3565
|
{ id: "cross-legged", label: "Cross-legged", category: "seated", description: "Seated cross-legged on floor", promptHint: "sitting cross-legged on the ground", term: "sitting cross-legged" },
|
|
3449
3566
|
{ id: "kneeling", label: "Kneeling", category: "seated", description: "Kneeling on the ground", promptHint: "kneeling on one or both knees" },
|
|
3450
3567
|
{ id: "crouching", label: "Crouching", category: "seated", description: "Crouched low", promptHint: "crouched low with knees bent" },
|
|
3451
|
-
{ id: "lounging", label: "Lounging", category: "seated", description: "Reclined, relaxed sitting", promptHint: "lounging in a relaxed, reclined position" },
|
|
3452
|
-
{ id: "sitting-edge-of-bed", label: "Sitting on Edge of Bed", category: "seated", description: "Perched on the edge of a bed", promptHint: "perched on the edge of a bed, hands resting on the mattress", term: "sitting on the edge of a bed" },
|
|
3568
|
+
{ id: "lounging", label: "Lounging", category: "seated", description: "Reclined, relaxed sitting", promptHint: "lounging in a relaxed, reclined position", adultOnly: true },
|
|
3569
|
+
{ id: "sitting-edge-of-bed", label: "Sitting on Edge of Bed", category: "seated", description: "Perched on the edge of a bed", promptHint: "perched on the edge of a bed, hands resting on the mattress", term: "sitting on the edge of a bed", adultOnly: true },
|
|
3453
3570
|
{ id: "chair-arm-drape", label: "Legs Draped Over Chair", category: "seated", description: "Legs draped over chair arm", promptHint: "sitting sideways in a chair with legs draped casually over one arm", term: "legs draped over the chair arm" },
|
|
3454
3571
|
{ id: "elbow-propped", label: "Cheek on Propped Elbow", category: "seated", description: "Cheek resting on a propped elbow", promptHint: "seated with cheek resting against a propped-up elbow, contemplative", term: "cheek resting on a propped elbow" },
|
|
3455
3572
|
{ id: "lying-on-stomach-reading", label: "Lying Prone Reading", category: "seated", description: "Lying prone, propped on elbows reading", promptHint: "lying on the stomach, propped up on elbows while reading", term: "lying prone propped on elbows, reading" },
|
|
@@ -3472,13 +3589,13 @@ var POSES = [
|
|
|
3472
3589
|
{ id: "throwing", label: "Throwing", category: "action", description: "Mid-throw motion", promptHint: "caught mid-throw, body coiled and releasing", term: "caught mid-throw" },
|
|
3473
3590
|
{ id: "leaping", label: "Leaping", category: "action", description: "Leaping forward dynamically", promptHint: "leaping forward dynamically with body extended" },
|
|
3474
3591
|
{ id: "dramatic-action", label: "Dramatic Action", category: "action", description: "Exaggerated action pose", promptHint: "in a dramatic, exaggerated action pose full of motion", term: "dramatic exaggerated action pose" },
|
|
3475
|
-
{ id: "biting-lip", label: "Biting Lip", category: "action", description: "Slight playful lip-bite", promptHint: "biting the lower lip with a subtle playful expression", term: "biting the lower lip" },
|
|
3592
|
+
{ id: "biting-lip", label: "Biting Lip", category: "action", description: "Slight playful lip-bite", promptHint: "biting the lower lip with a subtle playful expression", term: "biting the lower lip", adultOnly: true },
|
|
3476
3593
|
{ id: "mid-laugh", label: "Mid-Laugh", category: "action", description: "Caught mid-laugh, head back", promptHint: "caught mid-laugh with head tipped back, eyes crinkled" },
|
|
3477
3594
|
{ id: "pointing-at-camera", label: "Pointing at Camera", category: "action", description: "Pointing directly at camera", promptHint: "pointing one finger directly at the camera, arm extended", term: "pointing directly at the camera" },
|
|
3478
3595
|
{ id: "tongue-out", label: "Sticking Tongue Out", category: "action", description: "Playful tongue-out expression", promptHint: "sticking the tongue out playfully" },
|
|
3479
3596
|
{ id: "thinking", label: "Thinking", category: "action", description: "Hand on chin, contemplative", promptHint: "in a thinking pose with hand on chin, gaze contemplative", term: "thinking pose, hand on chin" },
|
|
3480
3597
|
// -------------------- Resting --------------------
|
|
3481
|
-
{ id: "lying-down", label: "Lying Down", category: "resting", description: "Lying flat", promptHint: "lying down flat, relaxed" },
|
|
3598
|
+
{ id: "lying-down", label: "Lying Down", category: "resting", description: "Lying flat", promptHint: "lying down flat, relaxed", adultOnly: true },
|
|
3482
3599
|
{ id: "sleeping", label: "Sleeping", category: "resting", description: "Eyes closed, sleeping", promptHint: "sleeping peacefully with eyes closed" },
|
|
3483
3600
|
{ id: "hugging", label: "Hugging", category: "resting", description: "Embracing another", promptHint: "hugging or embracing another person" },
|
|
3484
3601
|
{ id: "looking-away", label: "Looking Away", category: "resting", description: "Head turned, looking away", promptHint: "head turned, looking off away from the camera" },
|
|
@@ -3500,7 +3617,7 @@ var POSES = [
|
|
|
3500
3617
|
{ id: "leaning-back", label: "Leaning Back", category: "body-lean", description: "Torso leaning back slightly", promptHint: "with the torso leaning back at a slight backward angle", term: "torso leaning slightly back" },
|
|
3501
3618
|
{ id: "leaning-forward", label: "Leaning Forward", category: "body-lean", description: "Torso leaning toward camera", promptHint: "with the torso leaning forward toward the camera", term: "torso leaning forward" },
|
|
3502
3619
|
{ id: "body-lean-contrapposto", label: "Contrapposto", category: "body-lean", description: "Weight on one leg, hip pushed out", promptHint: "with the weight on one leg and one hip pushed out, classical contrapposto", term: "contrapposto, hip pushed out" },
|
|
3503
|
-
{ id: "arched-back", label: "Arched Back", category: "body-lean", description: "Back gently arched, chest forward", promptHint: "with the back gently arched, chest forward" },
|
|
3620
|
+
{ id: "arched-back", label: "Arched Back", category: "body-lean", description: "Back gently arched, chest forward", promptHint: "with the back gently arched, chest forward", adultOnly: true },
|
|
3504
3621
|
{ id: "shoulder-rolled-forward", label: "Shoulder Rolled Forward", category: "body-lean", description: "One shoulder rolled forward", promptHint: "with one shoulder rolled forward, asymmetric stance", term: "one shoulder rolled forward" },
|
|
3505
3622
|
// -------------------- Head Tilt --------------------
|
|
3506
3623
|
{ id: "tilted-up", label: "Tilted Up", category: "head-tilt", description: "Head tipped slightly upward", promptHint: "with the head tipped slightly upward", term: "head tipped slightly up" },
|
|
@@ -3526,7 +3643,7 @@ var POSES = [
|
|
|
3526
3643
|
var poseById = new Map(POSES.map((p) => [p.id, p]));
|
|
3527
3644
|
function getPose(id) {
|
|
3528
3645
|
if (!id) return void 0;
|
|
3529
|
-
return poseById.get(id);
|
|
3646
|
+
return overlayEntry("pose", id, poseById.get(id));
|
|
3530
3647
|
}
|
|
3531
3648
|
function getPoseLabel(id, fallback) {
|
|
3532
3649
|
const p = getPose(id);
|
|
@@ -3725,14 +3842,14 @@ var STYLINGS = [
|
|
|
3725
3842
|
{ id: "jewelry-pearl", label: "Pearl", dimension: "jewelry", description: "Pearl necklace / earrings", promptHint: "wearing a pearl necklace and pearl earrings", term: "pearl jewelry" },
|
|
3726
3843
|
{ id: "jewelry-chunky", label: "Chunky", dimension: "jewelry", description: "Chunky chains and rings", promptHint: "wearing chunky chains and oversized rings", term: "chunky chains and rings" },
|
|
3727
3844
|
{ id: "jewelry-smart-watch", label: "Smart Watch", dimension: "jewelry", description: "Modern smart watch on wrist", promptHint: "wearing a modern smart watch on the wrist with a sleek digital face and silicone band" },
|
|
3728
|
-
{ id: "jewelry-choker-leather", label: "Leather Choker", dimension: "jewelry", description: "Black leather choker close to throat", promptHint: "wearing a black leather choker fitted close around the throat" },
|
|
3729
|
-
{ id: "jewelry-choker-velvet", label: "Velvet Choker", dimension: "jewelry", description: "Velvet ribbon choker, dressy and vintage", promptHint: "wearing a velvet ribbon choker around the throat, a dressy vintage touch with a small pendant at the front" },
|
|
3730
|
-
{ id: "jewelry-choker-chain", label: "Chain Choker", dimension: "jewelry", description: "Thin metal-chain choker", promptHint: "wearing a thin metal-chain choker tight around the throat" },
|
|
3845
|
+
{ id: "jewelry-choker-leather", label: "Leather Choker", dimension: "jewelry", description: "Black leather choker close to throat", promptHint: "wearing a black leather choker fitted close around the throat", adultOnly: true },
|
|
3846
|
+
{ id: "jewelry-choker-velvet", label: "Velvet Choker", dimension: "jewelry", description: "Velvet ribbon choker, dressy and vintage", promptHint: "wearing a velvet ribbon choker around the throat, a dressy vintage touch with a small pendant at the front", adultOnly: true },
|
|
3847
|
+
{ id: "jewelry-choker-chain", label: "Chain Choker", dimension: "jewelry", description: "Thin metal-chain choker", promptHint: "wearing a thin metal-chain choker tight around the throat", adultOnly: true },
|
|
3731
3848
|
{ id: "jewelry-stud-earrings", label: "Stud Earrings", dimension: "jewelry", description: "Small simple studs", promptHint: "wearing small simple stud earrings" },
|
|
3732
3849
|
{ id: "jewelry-hoop-earrings", label: "Hoop Earrings", dimension: "jewelry", description: "Gold or silver hoops", promptHint: "wearing gold or silver hoop earrings" },
|
|
3733
3850
|
{ id: "jewelry-ear-cuff", label: "Ear Cuff", dimension: "jewelry", description: "Sculptural cuff climbing the cartilage", promptHint: "wearing a sculptural ear cuff climbing the cartilage of one ear" },
|
|
3734
3851
|
{ id: "jewelry-septum-ring", label: "Septum Ring", dimension: "jewelry", description: "Septum nose ring", promptHint: "wearing a septum nose ring through the center of the nose" },
|
|
3735
|
-
{ id: "jewelry-body-chain", label: "Body Chain", dimension: "jewelry", description: "Thin metallic chain across torso", promptHint: "wearing a thin metallic body chain draped across the torso" },
|
|
3852
|
+
{ id: "jewelry-body-chain", label: "Body Chain", dimension: "jewelry", description: "Thin metallic chain across torso", promptHint: "wearing a thin metallic body chain draped across the torso", adultOnly: true },
|
|
3736
3853
|
// -------------------- Nails --------------------
|
|
3737
3854
|
{ id: "nails-polished", label: "Polished", dimension: "nails", description: "Clear or nude polished nails", promptHint: "with polished nude nails", term: "polished nude nails" },
|
|
3738
3855
|
{ id: "nails-red", label: "Red", dimension: "nails", description: "Bright red nail polish", promptHint: "with bright red nail polish", term: "red nail polish" },
|
|
@@ -3765,9 +3882,9 @@ var STYLINGS = [
|
|
|
3765
3882
|
{ id: "fabric-chiffon", label: "Chiffon", dimension: "fabric", description: "Sheer flowing chiffon", promptHint: "wearing sheer chiffon with a lightweight floating drape and soft translucent layers" },
|
|
3766
3883
|
{ id: "fabric-fur", label: "Fur", dimension: "fabric", description: "Thick plush fur", promptHint: "wearing thick plush fur with long dense strands and natural variation", term: "fur garment" },
|
|
3767
3884
|
{ id: "fabric-sequins", label: "Sequins", dimension: "fabric", description: "Sparkling sequin fabric", promptHint: "wearing sparkling sequined fabric catching light with countless tiny reflective facets" },
|
|
3768
|
-
{ id: "fabric-latex", label: "Latex", dimension: "fabric", description: "Glossy latex", promptHint: "wearing glossy latex with a high-shine liquid look clinging to the body" },
|
|
3885
|
+
{ id: "fabric-latex", label: "Latex", dimension: "fabric", description: "Glossy latex", promptHint: "wearing glossy latex with a high-shine liquid look clinging to the body", adultOnly: true },
|
|
3769
3886
|
// -------------------- Outfit (single-pick complete look — overrides individual pieces) --------------------
|
|
3770
|
-
{ id: "outfit-school-uniform", label: "School Uniform", dimension: "outfit", description: "Classic school uniform set", promptHint: "dressed in a classic school uniform \u2014 collared blouse, pleated skirt and knee-high socks" },
|
|
3887
|
+
{ id: "outfit-school-uniform", label: "School Uniform", dimension: "outfit", description: "Classic school uniform set", promptHint: "dressed in a classic school uniform \u2014 collared blouse, pleated skirt and knee-high socks", adultOnly: true },
|
|
3771
3888
|
{ id: "outfit-business-suit", label: "Business Suit", dimension: "outfit", description: "Tailored two-piece business suit", promptHint: "dressed in a sharp tailored two-piece business suit with a crisp shirt underneath" },
|
|
3772
3889
|
{ id: "outfit-tuxedo", label: "Tuxedo", dimension: "outfit", description: "Black-tie tuxedo", promptHint: "dressed in a black tuxedo with satin lapels and a bow tie" },
|
|
3773
3890
|
{ id: "outfit-evening-gown", label: "Evening Gown", dimension: "outfit", description: "Floor-length formal gown", promptHint: "dressed in a floor-length evening gown with a fitted bodice and a flowing skirt" },
|
|
@@ -3781,9 +3898,9 @@ var STYLINGS = [
|
|
|
3781
3898
|
{ id: "outfit-athleisure", label: "Athleisure Set", dimension: "outfit", description: "Matching athleisure top and bottom", promptHint: "dressed in a matching athleisure set \u2014 a fitted top and leggings in the same tone" },
|
|
3782
3899
|
{ id: "outfit-tracksuit", label: "Tracksuit", dimension: "outfit", description: "Two-piece zip-front tracksuit", promptHint: "dressed in a two-piece tracksuit \u2014 a zip-front jacket and matching joggers" },
|
|
3783
3900
|
{ id: "outfit-soccer-jersey", label: "Soccer Jersey", dimension: "outfit", description: "National-team football jersey with crest", promptHint: "wearing a national-team soccer jersey \u2014 team colors and trim with the team crest on the chest" },
|
|
3784
|
-
{ id: "outfit-bikini", label: "Bikini", dimension: "outfit", description: "Two-piece swimsuit", promptHint: "in a two-piece bikini" },
|
|
3785
|
-
{ id: "outfit-one-piece-swim", label: "One-Piece Swimsuit", dimension: "outfit", description: "Fitted one-piece swimsuit", promptHint: "in a fitted one-piece swimsuit" },
|
|
3786
|
-
{ id: "outfit-lingerie", label: "Lingerie Set", dimension: "outfit", description: "Matching lingerie set", promptHint: "in a matching lingerie set" },
|
|
3901
|
+
{ id: "outfit-bikini", label: "Bikini", dimension: "outfit", description: "Two-piece swimsuit", promptHint: "in a two-piece bikini", adultOnly: true },
|
|
3902
|
+
{ id: "outfit-one-piece-swim", label: "One-Piece Swimsuit", dimension: "outfit", description: "Fitted one-piece swimsuit", promptHint: "in a fitted one-piece swimsuit", adultOnly: true },
|
|
3903
|
+
{ id: "outfit-lingerie", label: "Lingerie Set", dimension: "outfit", description: "Matching lingerie set", promptHint: "in a matching lingerie set", adultOnly: true },
|
|
3787
3904
|
{ id: "outfit-pajamas", label: "Pajamas", dimension: "outfit", description: "Soft cotton pajama set", promptHint: "in a soft cotton pajama set \u2014 a button-up top and matching pants" },
|
|
3788
3905
|
{ id: "outfit-bathrobe", label: "Bathrobe", dimension: "outfit", description: "Plush terrycloth robe", promptHint: "wrapped in a plush terrycloth bathrobe tied at the waist" },
|
|
3789
3906
|
{ id: "outfit-kimono", label: "Kimono", dimension: "outfit", description: "Traditional Japanese kimono", promptHint: "dressed in a traditional Japanese kimono with an obi sash" },
|
|
@@ -3816,14 +3933,14 @@ var STYLINGS = [
|
|
|
3816
3933
|
{ id: "top-polo", label: "Polo Shirt", dimension: "top", description: "Short-sleeve polo", promptHint: "wearing a fitted polo shirt with a small ribbed collar and short sleeves" },
|
|
3817
3934
|
{ id: "top-tube-top", label: "Tube Top", dimension: "top", description: "Strapless tube top", promptHint: "wearing a strapless tube top fitted across the chest" },
|
|
3818
3935
|
{ id: "top-camisole", label: "Camisole", dimension: "top", description: "Thin satin cami", promptHint: "wearing a thin satin camisole with delicate spaghetti straps" },
|
|
3819
|
-
{ id: "top-corset", label: "Corset", dimension: "top", description: "Structured corset top", promptHint: "wearing a structured corset top with boning and visible lacing" },
|
|
3820
|
-
{ id: "top-bra-top", label: "Bra Top", dimension: "top", description: "Bra-style top showing midriff", promptHint: "wearing a fitted bra-style top with the midriff exposed" },
|
|
3936
|
+
{ id: "top-corset", label: "Corset", dimension: "top", description: "Structured corset top", promptHint: "wearing a structured corset top with boning and visible lacing", adultOnly: true },
|
|
3937
|
+
{ id: "top-bra-top", label: "Bra Top", dimension: "top", description: "Bra-style top showing midriff", promptHint: "wearing a fitted bra-style top with the midriff exposed", adultOnly: true },
|
|
3821
3938
|
{ id: "top-sports-bra", label: "Sports Bra", dimension: "top", description: "Athletic sports bra", promptHint: "wearing a structured sports bra with athletic strapping" },
|
|
3822
|
-
{ id: "top-bikini-top", label: "Bikini Top", dimension: "top", description: "Triangle bikini top", promptHint: "wearing a triangle bikini top tied behind the neck and back" },
|
|
3939
|
+
{ id: "top-bikini-top", label: "Bikini Top", dimension: "top", description: "Triangle bikini top", promptHint: "wearing a triangle bikini top tied behind the neck and back", adultOnly: true },
|
|
3823
3940
|
{ id: "top-bodysuit", label: "Bodysuit", dimension: "top", description: "Fitted one-piece torso garment", promptHint: "wearing a fitted bodysuit, a one-piece torso garment snapped at the inseam" },
|
|
3824
3941
|
{ id: "top-leotard", label: "Leotard", dimension: "top", description: "Dance-style fitted top with sleeves", promptHint: "wearing a dance-style leotard, a fitted one-piece top with sleeves" },
|
|
3825
|
-
{ id: "top-mesh-top", label: "Mesh Top", dimension: "top", description: "Sheer mesh fabric top", promptHint: "wearing a sheer mesh top, the open-weave fabric letting skin show through" },
|
|
3826
|
-
{ id: "top-sheer-top", label: "Sheer Top", dimension: "top", description: "Translucent fabric top", promptHint: "wearing a sheer translucent top with a soft drape, hinting at the silhouette underneath" },
|
|
3942
|
+
{ id: "top-mesh-top", label: "Mesh Top", dimension: "top", description: "Sheer mesh fabric top", promptHint: "wearing a sheer mesh top, the open-weave fabric letting skin show through", adultOnly: true },
|
|
3943
|
+
{ id: "top-sheer-top", label: "Sheer Top", dimension: "top", description: "Translucent fabric top", promptHint: "wearing a sheer translucent top with a soft drape, hinting at the silhouette underneath", adultOnly: true },
|
|
3827
3944
|
{ id: "top-bandeau", label: "Bandeau", dimension: "top", description: "Strapless tube top", promptHint: "wearing a strapless bandeau top wrapped across the chest" },
|
|
3828
3945
|
// -------------------- Bottom (lower-body garment) --------------------
|
|
3829
3946
|
{ id: "bottom-jeans", label: "Jeans", dimension: "bottom", description: "Classic blue jeans", promptHint: "in classic five-pocket blue jeans with a straight leg cut" },
|
|
@@ -3863,11 +3980,11 @@ var STYLINGS = [
|
|
|
3863
3980
|
{ id: "outerwear-fur-coat", label: "Fur Coat", dimension: "outerwear", description: "Plush fur coat", promptHint: "wearing a plush fur coat with a deep textured pile" },
|
|
3864
3981
|
// -------------------- Legwear (between bottom and footwear) --------------------
|
|
3865
3982
|
{ id: "legwear-bare", label: "Bare Legs", dimension: "legwear", description: "Bare legs, no hosiery", promptHint: "with bare legs, no hosiery" },
|
|
3866
|
-
{ id: "legwear-sheer-tights", label: "Sheer Tights", dimension: "legwear", description: "Sheer nude pantyhose", promptHint: "with sheer nude pantyhose" },
|
|
3983
|
+
{ id: "legwear-sheer-tights", label: "Sheer Tights", dimension: "legwear", description: "Sheer nude pantyhose", promptHint: "with sheer nude pantyhose", adultOnly: true },
|
|
3867
3984
|
{ id: "legwear-opaque-tights", label: "Opaque Tights", dimension: "legwear", description: "Solid opaque tights", promptHint: "with opaque black tights covering the legs" },
|
|
3868
|
-
{ id: "legwear-fishnets", label: "Fishnets", dimension: "legwear", description: "Diamond-mesh fishnets", promptHint: "with fishnet stockings, the skin showing through the diamond mesh", term: "fishnet stockings" },
|
|
3869
|
-
{ id: "legwear-thigh-highs", label: "Thigh-High Stockings", dimension: "legwear", description: "Thigh-high stockings", promptHint: "with thigh-high stockings stopping mid-thigh" },
|
|
3870
|
-
{ id: "legwear-lace-top-stockings", label: "Lace-Top Stockings", dimension: "legwear", description: "Lace-banded thigh-highs", promptHint: "with lace-topped thigh-high stockings cinched mid-thigh" },
|
|
3985
|
+
{ id: "legwear-fishnets", label: "Fishnets", dimension: "legwear", description: "Diamond-mesh fishnets", promptHint: "with fishnet stockings, the skin showing through the diamond mesh", term: "fishnet stockings", adultOnly: true },
|
|
3986
|
+
{ id: "legwear-thigh-highs", label: "Thigh-High Stockings", dimension: "legwear", description: "Thigh-high stockings", promptHint: "with thigh-high stockings stopping mid-thigh", adultOnly: true },
|
|
3987
|
+
{ id: "legwear-lace-top-stockings", label: "Lace-Top Stockings", dimension: "legwear", description: "Lace-banded thigh-highs", promptHint: "with lace-topped thigh-high stockings cinched mid-thigh", adultOnly: true },
|
|
3871
3988
|
{ id: "legwear-knee-highs", label: "Knee-High Socks", dimension: "legwear", description: "Knee-high socks", promptHint: "with knee-high socks pulled up the calf" },
|
|
3872
3989
|
{ id: "legwear-crew-socks", label: "Crew Socks", dimension: "legwear", description: "Mid-calf crew socks", promptHint: "with simple crew socks visible above the shoes" },
|
|
3873
3990
|
{ id: "legwear-ankle-socks", label: "Ankle Socks", dimension: "legwear", description: "Low-cut ankle socks", promptHint: "with low-cut ankle socks barely showing above the shoes" },
|
|
@@ -3881,7 +3998,7 @@ var STYLINGS = [
|
|
|
3881
3998
|
{ id: "footwear-platforms", label: "Platform Shoes", dimension: "footwear", description: "Tall platform soles", promptHint: "in platform shoes with thick chunky soles" },
|
|
3882
3999
|
{ id: "footwear-ankle-boots", label: "Ankle Boots", dimension: "footwear", description: "Fitted ankle boots", promptHint: "in fitted black ankle boots" },
|
|
3883
4000
|
{ id: "footwear-knee-boots", label: "Knee-High Boots", dimension: "footwear", description: "Tall knee-high boots", promptHint: "in tall knee-high leather boots" },
|
|
3884
|
-
{ id: "footwear-thigh-high-boots", label: "Thigh-High Boots", dimension: "footwear", description: "Thigh-high boots", promptHint: "in over-the-knee thigh-high leather boots" },
|
|
4001
|
+
{ id: "footwear-thigh-high-boots", label: "Thigh-High Boots", dimension: "footwear", description: "Thigh-high boots", promptHint: "in over-the-knee thigh-high leather boots", adultOnly: true },
|
|
3885
4002
|
{ id: "footwear-combat-boots", label: "Combat Boots", dimension: "footwear", description: "Laced combat boots", promptHint: "in laced black combat boots with a chunky lugged sole" },
|
|
3886
4003
|
{ id: "footwear-chelsea-boots", label: "Chelsea Boots", dimension: "footwear", description: "Slip-on Chelsea boots", promptHint: "in clean Chelsea boots with elastic side panels" },
|
|
3887
4004
|
{ id: "footwear-cowboy-boots", label: "Cowboy Boots", dimension: "footwear", description: "Pointed-toe cowboy boots", promptHint: "in pointed-toe cowboy boots with a stacked heel and decorative stitching" },
|
|
@@ -3900,18 +4017,18 @@ var STYLINGS = [
|
|
|
3900
4017
|
{ id: "footwear-espadrilles", label: "Espadrilles", dimension: "footwear", description: "Woven jute-sole canvas summer shoe", promptHint: "in woven jute-sole espadrilles with a canvas upper, a casual summer shoe" },
|
|
3901
4018
|
// -------------------- Wardrobe State (modifier — composes with any garment) --------------------
|
|
3902
4019
|
{ id: "state-oversized", label: "Oversized", dimension: "wardrobe-state", description: "Loose, oversized fit", promptHint: "the clothing loose and oversized, draping freely well past the body", term: "oversized fit" },
|
|
3903
|
-
{ id: "state-fitted", label: "Fitted", dimension: "wardrobe-state", description: "Form-fitting silhouette", promptHint: "the clothing fitted and form-conscious, hugging the contours of the body", term: "form-fitting clothing" },
|
|
3904
|
-
{ id: "state-cropped", label: "Cropped", dimension: "wardrobe-state", description: "Top cropped at midriff", promptHint: "the top cropped above the midriff with the stomach visible", term: "cropped top" },
|
|
3905
|
-
{ id: "state-sheer", label: "Sheer", dimension: "wardrobe-state", description: "Translucent fabric", promptHint: "the fabric translucent and sheer, hinting at the silhouette underneath", term: "sheer clothing" },
|
|
3906
|
-
{ id: "state-wet", label: "Wet", dimension: "wardrobe-state", description: "Soaked, water-clinging", promptHint: "the clothing soaked and wet, the fabric clinging to the body and dripping water", term: "wet clothing" },
|
|
4020
|
+
{ id: "state-fitted", label: "Fitted", dimension: "wardrobe-state", description: "Form-fitting silhouette", promptHint: "the clothing fitted and form-conscious, hugging the contours of the body", term: "form-fitting clothing", adultOnly: true },
|
|
4021
|
+
{ id: "state-cropped", label: "Cropped", dimension: "wardrobe-state", description: "Top cropped at midriff", promptHint: "the top cropped above the midriff with the stomach visible", term: "cropped top", adultOnly: true },
|
|
4022
|
+
{ id: "state-sheer", label: "Sheer", dimension: "wardrobe-state", description: "Translucent fabric", promptHint: "the fabric translucent and sheer, hinting at the silhouette underneath", term: "sheer clothing", adultOnly: true },
|
|
4023
|
+
{ id: "state-wet", label: "Wet", dimension: "wardrobe-state", description: "Soaked, water-clinging", promptHint: "the clothing soaked and wet, the fabric clinging to the body and dripping water", term: "wet clothing", adultOnly: true },
|
|
3907
4024
|
{ id: "state-ripped", label: "Ripped", dimension: "wardrobe-state", description: "Torn and frayed", promptHint: "the fabric torn and ripped at the seams, with frayed edges", term: "ripped clothing" },
|
|
3908
4025
|
{ id: "state-distressed", label: "Distressed", dimension: "wardrobe-state", description: "Worn, faded, weathered", promptHint: "the clothing distressed and weathered, with faded color and worn-down edges", term: "distressed clothing" },
|
|
3909
4026
|
{ id: "state-vintage", label: "Vintage", dimension: "wardrobe-state", description: "Worn, retro character", promptHint: "the clothing carrying vintage character \u2014 softened color, broken-in fit, retro silhouette", term: "vintage clothing" },
|
|
3910
4027
|
{ id: "state-tucked-in", label: "Tucked In", dimension: "wardrobe-state", description: "Top tucked into bottom", promptHint: "the top neatly tucked into the bottom", term: "top tucked in" },
|
|
3911
4028
|
{ id: "state-half-tucked", label: "Half-Tucked", dimension: "wardrobe-state", description: "Front-tucked, back loose", promptHint: "the top half-tucked \u2014 front neatly tucked in, back hanging loose", term: "top half-tucked" },
|
|
3912
|
-
{ id: "state-off-shoulder", label: "Off-Shoulder", dimension: "wardrobe-state", description: "Slipped off one shoulder", promptHint: "the top slipped off one shoulder, baring the skin and collarbone", term: "off-the-shoulder top" },
|
|
3913
|
-
{ id: "state-halter-neck", label: "Halter Neck", dimension: "wardrobe-state", description: "Straps tied behind the neck", promptHint: "the top cut as a halter \u2014 straps tied behind the neck, shoulders and upper back bare", term: "halter neckline" },
|
|
3914
|
-
{ id: "state-plunging-neck", label: "Plunging Neckline", dimension: "wardrobe-state", description: "Deep plunging V neckline", promptHint: "the neckline cut in a deep plunging V" },
|
|
4029
|
+
{ id: "state-off-shoulder", label: "Off-Shoulder", dimension: "wardrobe-state", description: "Slipped off one shoulder", promptHint: "the top slipped off one shoulder, baring the skin and collarbone", term: "off-the-shoulder top", adultOnly: true },
|
|
4030
|
+
{ id: "state-halter-neck", label: "Halter Neck", dimension: "wardrobe-state", description: "Straps tied behind the neck", promptHint: "the top cut as a halter \u2014 straps tied behind the neck, shoulders and upper back bare", term: "halter neckline", adultOnly: true },
|
|
4031
|
+
{ id: "state-plunging-neck", label: "Plunging Neckline", dimension: "wardrobe-state", description: "Deep plunging V neckline", promptHint: "the neckline cut in a deep plunging V", adultOnly: true },
|
|
3915
4032
|
{ id: "state-unbuttoned", label: "Unbuttoned", dimension: "wardrobe-state", description: "Open / unbuttoned", promptHint: "the outerwear hanging open and unbuttoned, falling loose at the sides", term: "worn open and unbuttoned" },
|
|
3916
4033
|
{ id: "state-rolled-sleeves", label: "Rolled Sleeves", dimension: "wardrobe-state", description: "Sleeves rolled up forearm", promptHint: "the sleeves rolled up to the forearm", term: "rolled-up sleeves" },
|
|
3917
4034
|
{ id: "state-layered", label: "Layered", dimension: "wardrobe-state", description: "Multiple stacked layers", promptHint: "the outfit composed of multiple stacked layers, each piece visible at the edges", term: "layered outfit" }
|
|
@@ -3990,7 +4107,7 @@ function getStylingDimensionLimit(dimension) {
|
|
|
3990
4107
|
var stylingById = new Map(STYLINGS.map((s) => [s.id, s]));
|
|
3991
4108
|
function getStyling(id) {
|
|
3992
4109
|
if (!id) return void 0;
|
|
3993
|
-
return stylingById.get(id);
|
|
4110
|
+
return overlayEntry("styling", id, stylingById.get(id));
|
|
3994
4111
|
}
|
|
3995
4112
|
function getStylingLabel(id, fallback) {
|
|
3996
4113
|
const s = getStyling(id);
|
|
@@ -4011,17 +4128,19 @@ function collectStylingFragments(data, fragmentFor) {
|
|
|
4011
4128
|
if (pre) out.push(pre);
|
|
4012
4129
|
const lipStateRaw = data.lipState;
|
|
4013
4130
|
const boldRedAlready = Array.isArray(lipStateRaw) ? lipStateRaw.includes("lip-state-bold-red") : lipStateRaw === "lip-state-bold-red";
|
|
4131
|
+
const floored = isMinorAge(data);
|
|
4132
|
+
const emit = floored ? (id) => getStyling(id)?.adultOnly === true ? "" : fragmentFor(id) : fragmentFor;
|
|
4014
4133
|
for (const dimension of STYLING_DIMENSION_ORDER) {
|
|
4015
4134
|
const field = STYLING_FIELD_BY_DIMENSION[dimension];
|
|
4016
4135
|
const raw = data[field];
|
|
4017
4136
|
if (dimension === "makeup" && boldRedAlready && raw === "makeup-bold-lips") continue;
|
|
4018
4137
|
if (typeof raw === "string" && raw.length > 0) {
|
|
4019
|
-
const fragment =
|
|
4138
|
+
const fragment = emit(raw);
|
|
4020
4139
|
if (fragment) out.push(fragment);
|
|
4021
4140
|
} else if (Array.isArray(raw)) {
|
|
4022
4141
|
for (const item of raw) {
|
|
4023
4142
|
if (typeof item !== "string" || item.length === 0) continue;
|
|
4024
|
-
const fragment =
|
|
4143
|
+
const fragment = emit(item);
|
|
4025
4144
|
if (fragment) out.push(fragment);
|
|
4026
4145
|
}
|
|
4027
4146
|
}
|
|
@@ -4078,7 +4197,7 @@ var TEMPORAL_CATEGORY_LABELS = {
|
|
|
4078
4197
|
var temporalById = new Map(TEMPORALS.map((t) => [t.id, t]));
|
|
4079
4198
|
function getTemporal(id) {
|
|
4080
4199
|
if (!id) return void 0;
|
|
4081
|
-
return temporalById.get(id);
|
|
4200
|
+
return overlayEntry("temporal", id, temporalById.get(id));
|
|
4082
4201
|
}
|
|
4083
4202
|
function getTemporalLabel(id, fallback) {
|
|
4084
4203
|
const t = getTemporal(id);
|
|
@@ -4671,7 +4790,7 @@ var motionById = new Map(
|
|
|
4671
4790
|
);
|
|
4672
4791
|
function getCameraMotion(id) {
|
|
4673
4792
|
if (!id) return void 0;
|
|
4674
|
-
return motionById.get(id);
|
|
4793
|
+
return overlayEntry("camera-motions", id, motionById.get(id));
|
|
4675
4794
|
}
|
|
4676
4795
|
function getCameraMotionLabel(id, fallback) {
|
|
4677
4796
|
const m = getCameraMotion(id);
|
|
@@ -5358,7 +5477,7 @@ var transitionById = new Map(
|
|
|
5358
5477
|
);
|
|
5359
5478
|
function getTransition(id) {
|
|
5360
5479
|
if (!id) return void 0;
|
|
5361
|
-
return transitionById.get(id);
|
|
5480
|
+
return overlayEntry("transitions", id, transitionById.get(id));
|
|
5362
5481
|
}
|
|
5363
5482
|
function getTransitionLabel(id, fallback) {
|
|
5364
5483
|
const t = getTransition(id);
|
|
@@ -5885,7 +6004,7 @@ var characterFxById = new Map(
|
|
|
5885
6004
|
);
|
|
5886
6005
|
function getCharacterFx(id) {
|
|
5887
6006
|
if (!id) return void 0;
|
|
5888
|
-
return characterFxById.get(id);
|
|
6007
|
+
return overlayEntry("character-fx", id, characterFxById.get(id));
|
|
5889
6008
|
}
|
|
5890
6009
|
function getCharacterFxLabel(id, fallback) {
|
|
5891
6010
|
const c = getCharacterFx(id);
|
|
@@ -6025,7 +6144,7 @@ var MATERIALS = [
|
|
|
6025
6144
|
var materialById = new Map(MATERIALS.map((m) => [m.id, m]));
|
|
6026
6145
|
function getMaterial(id) {
|
|
6027
6146
|
if (!id) return void 0;
|
|
6028
|
-
return materialById.get(id);
|
|
6147
|
+
return overlayEntry("materials", id, materialById.get(id));
|
|
6029
6148
|
}
|
|
6030
6149
|
function getMaterialLabel(id, fallback) {
|
|
6031
6150
|
const m = getMaterial(id);
|
|
@@ -6084,6 +6203,35 @@ var MATERIAL_CATEGORY_ORDER = [
|
|
|
6084
6203
|
"natural",
|
|
6085
6204
|
"exotic"
|
|
6086
6205
|
];
|
|
6206
|
+
function curatedAnimalPromptHint(id) {
|
|
6207
|
+
if (!id) return "";
|
|
6208
|
+
if (!composedHas("animals", id)) return "";
|
|
6209
|
+
return composedOption("animals", id)?.promptHint ?? getAnimalPromptHint(id);
|
|
6210
|
+
}
|
|
6211
|
+
function curatedAnimalTerm(id) {
|
|
6212
|
+
if (!id) return "";
|
|
6213
|
+
if (!composedHas("animals", id)) return "";
|
|
6214
|
+
return composedOption("animals", id)?.term ?? getAnimalTerm(id);
|
|
6215
|
+
}
|
|
6216
|
+
function objectEntityText(catalogId, id, stock, stockHint, stockTerm) {
|
|
6217
|
+
if (!id || !composedHas(catalogId, id)) return { hint: "", term: "" };
|
|
6218
|
+
const composed = composedOption(catalogId, id);
|
|
6219
|
+
if (composed) return { hint: composed.promptHint, term: composed.term };
|
|
6220
|
+
if (!stock) return { hint: "", term: "" };
|
|
6221
|
+
return { hint: stockHint(stock), term: stockTerm(stock) };
|
|
6222
|
+
}
|
|
6223
|
+
function objectEntityTerm(entry) {
|
|
6224
|
+
return entry.term ?? deriveTerm(entry.label);
|
|
6225
|
+
}
|
|
6226
|
+
function curatedVehicleText(id) {
|
|
6227
|
+
return objectEntityText("vehicles", id, getVehicle(id), (e) => `featuring a ${e.label.toLowerCase()}, ${e.description}`, objectEntityTerm);
|
|
6228
|
+
}
|
|
6229
|
+
function curatedWeaponText(id) {
|
|
6230
|
+
return objectEntityText("weapons", id, getWeapon(id), (e) => `with a ${e.label.toLowerCase()}, ${e.description}`, objectEntityTerm);
|
|
6231
|
+
}
|
|
6232
|
+
function curatedFurnitureText(id) {
|
|
6233
|
+
return objectEntityText("furniture", id, getFurniture(id), (e) => `including a ${e.label.toLowerCase()}, ${e.description}`, objectEntityTerm);
|
|
6234
|
+
}
|
|
6087
6235
|
|
|
6088
6236
|
// src/photo-genre.ts
|
|
6089
6237
|
var PHOTO_GENRES = [
|
|
@@ -6101,7 +6249,7 @@ var PHOTO_GENRES = [
|
|
|
6101
6249
|
{ id: "brand-jil-sander", label: "Jil Sander Minimalism", category: "editorial", description: "Jil Sander \u2014 minimalist architectural muted", promptHint: "shot in the language of a Jil Sander editorial, minimalist composition, muted ecru and stone palette, architectural wardrobe with clean unbroken lines and the brand's quiet austere mood" },
|
|
6102
6250
|
{ id: "brand-vivienne-tam", label: "Vivienne Tam Style", category: "editorial", description: "Vivienne Tam \u2014 orientalist ornate fashion", promptHint: "shot in the language of a Vivienne Tam editorial, orientalist motifs and dragon embroidery, ornate East-Asian fashion detailing and a saturated jewel-toned palette" },
|
|
6103
6251
|
{ id: "brand-jacquemus", label: "Jacquemus Style", category: "editorial", description: "Jacquemus \u2014 sun-soaked surrealist playful", promptHint: "shot in the language of a Jacquemus campaign, sun-soaked Mediterranean light, surrealist scale play with oversized hats and miniature bags, terracotta and ochre palette and a playful French Riviera mood" },
|
|
6104
|
-
{ id: "brand-helmut-newton", label: "Helmut Newton Style", category: "editorial", description: "Helmut Newton \u2014 high-contrast B&W provocation", promptHint: "shot in the signature language of Helmut Newton, high-contrast black-and-white, hard direct flash carving every line, statuesque pose, glamorous wardrobe and the cool confrontational eroticism of his 1970s editorial work" },
|
|
6252
|
+
{ id: "brand-helmut-newton", label: "Helmut Newton Style", category: "editorial", description: "Helmut Newton \u2014 high-contrast B&W provocation", promptHint: "shot in the signature language of Helmut Newton, high-contrast black-and-white, hard direct flash carving every line, statuesque pose, glamorous wardrobe and the cool confrontational eroticism of his 1970s editorial work", adultOnly: true },
|
|
6105
6253
|
{ id: "brand-harpers-bazaar", label: "Harper's Bazaar Style", category: "editorial", description: "Harper's Bazaar \u2014 high-fashion glossy", promptHint: "shot in the signature language of a Harper's Bazaar editorial, high-fashion glossy production, bold graphic backdrops, dramatic single-source key light and the brand's distinctively confident composition" },
|
|
6106
6254
|
// -------------------- Documentary / Candid --------------------
|
|
6107
6255
|
{ id: "paparazzi", label: "Paparazzi", category: "documentary", description: "Flash-blown tabloid candid", term: "paparazzi flash candid", promptHint: "shot as a paparazzi tabloid candid, harsh on-camera flash blowing out the highlights, slight motion blur, low candid angle, blurred crowd in the background and grainy cropped tabloid framing" },
|
|
@@ -6118,7 +6266,7 @@ var PHOTO_GENRES = [
|
|
|
6118
6266
|
{ id: "mugshot", label: "Mugshot", category: "studio-formal", description: "Police booking-style portrait", promptHint: "shot as a police booking mugshot, harsh fluorescent overhead lighting, height chart on the wall behind, dead-square frontal framing and a flat institutional color cast" },
|
|
6119
6267
|
{ id: "wedding-portrait", label: "Wedding Portrait", category: "studio-formal", description: "Romantic bridal-style portrait", promptHint: "shot as a wedding portrait, soft golden-hour backlight, romantic shallow depth of field, dreamy pastel color grade and an intimate posed embrace or solo bridal stance" },
|
|
6120
6268
|
{ id: "family-portrait", label: "Family Portrait", category: "studio-formal", description: "Posed family group shot", promptHint: "shot as a posed family portrait, warm even studio lighting, neutral backdrop, coordinated wardrobe and the group arranged in a balanced pyramid composition" },
|
|
6121
|
-
{ id: "glamour-portrait", label: "Glamour Portrait", category: "studio-formal", description: "Soft-focus glamour portrait", promptHint: "shot as a glamour portrait with soft diffused beauty lighting, a high-key warm tone, gentle skin retouch, voluminous hair and a sultry over-the-shoulder pose" },
|
|
6269
|
+
{ id: "glamour-portrait", label: "Glamour Portrait", category: "studio-formal", description: "Soft-focus glamour portrait", promptHint: "shot as a glamour portrait with soft diffused beauty lighting, a high-key warm tone, gentle skin retouch, voluminous hair and a sultry over-the-shoulder pose", adultOnly: true },
|
|
6122
6270
|
{ id: "film-noir", label: "Film Noir", category: "studio-formal", description: "Hard-shadow noir portrait", promptHint: "shot in a film-noir portrait idiom, hard single-source key light casting deep shadows, venetian-blind shadow patterns, monochrome high-contrast palette and a brooding closed-off pose" },
|
|
6123
6271
|
// -------------------- Selfie sub-types --------------------
|
|
6124
6272
|
{ id: "mirror-selfie", label: "Mirror Selfie", category: "selfie", description: "Phone-in-mirror full-body selfie", promptHint: "shot as a smartphone mirror selfie, the phone visible in one raised hand reflected in the mirror, full or three-quarter body framing, a domestic bedroom or bathroom background and natural ambient light" },
|
|
@@ -6147,7 +6295,7 @@ var photoGenreById = new Map(
|
|
|
6147
6295
|
);
|
|
6148
6296
|
function getPhotoGenre(id) {
|
|
6149
6297
|
if (!id) return void 0;
|
|
6150
|
-
return photoGenreById.get(id);
|
|
6298
|
+
return overlayEntry("photo-genre", id, photoGenreById.get(id));
|
|
6151
6299
|
}
|
|
6152
6300
|
function getPhotoGenreLabel(id, fallback) {
|
|
6153
6301
|
const g = getPhotoGenre(id);
|
|
@@ -6233,7 +6381,7 @@ var BACKDROPS = [
|
|
|
6233
6381
|
var backdropById = new Map(BACKDROPS.map((b) => [b.id, b]));
|
|
6234
6382
|
function getBackdrop(id) {
|
|
6235
6383
|
if (!id) return void 0;
|
|
6236
|
-
return backdropById.get(id);
|
|
6384
|
+
return overlayEntry("backdrop", id, backdropById.get(id));
|
|
6237
6385
|
}
|
|
6238
6386
|
function getBackdropLabel(id, fallback) {
|
|
6239
6387
|
const b = getBackdrop(id);
|
|
@@ -6340,7 +6488,7 @@ var HELD_PROPS = [
|
|
|
6340
6488
|
var heldPropById = new Map(HELD_PROPS.map((p) => [p.id, p]));
|
|
6341
6489
|
function getHeldProp(id) {
|
|
6342
6490
|
if (!id) return void 0;
|
|
6343
|
-
return heldPropById.get(id);
|
|
6491
|
+
return overlayEntry("held-prop", id, heldPropById.get(id));
|
|
6344
6492
|
}
|
|
6345
6493
|
function getHeldPropLabel(id, fallback) {
|
|
6346
6494
|
const p = getHeldProp(id);
|
|
@@ -6922,7 +7070,7 @@ var photographerById = new Map(
|
|
|
6922
7070
|
);
|
|
6923
7071
|
function getPhotographer(id) {
|
|
6924
7072
|
if (!id) return void 0;
|
|
6925
|
-
return photographerById.get(id);
|
|
7073
|
+
return overlayEntry("photographer", id, photographerById.get(id));
|
|
6926
7074
|
}
|
|
6927
7075
|
function getPhotographerLabel(id, fallback) {
|
|
6928
7076
|
const p = getPhotographer(id);
|
|
@@ -7302,7 +7450,7 @@ var aestheticById = new Map(
|
|
|
7302
7450
|
);
|
|
7303
7451
|
function getAesthetic(id) {
|
|
7304
7452
|
if (!id) return void 0;
|
|
7305
|
-
return aestheticById.get(id);
|
|
7453
|
+
return overlayEntry("aesthetic", id, aestheticById.get(id));
|
|
7306
7454
|
}
|
|
7307
7455
|
function getAestheticLabel(id, fallback) {
|
|
7308
7456
|
const a = getAesthetic(id);
|
|
@@ -7569,7 +7717,7 @@ var ERAS = [
|
|
|
7569
7717
|
var eraById = new Map(ERAS.map((e) => [e.id, e]));
|
|
7570
7718
|
function getEra(id) {
|
|
7571
7719
|
if (!id) return void 0;
|
|
7572
|
-
return eraById.get(id);
|
|
7720
|
+
return overlayEntry("era", id, eraById.get(id));
|
|
7573
7721
|
}
|
|
7574
7722
|
function getEraLabel(id, fallback) {
|
|
7575
7723
|
const e = getEra(id);
|
|
@@ -7637,7 +7785,7 @@ var exposureById = new Map(
|
|
|
7637
7785
|
);
|
|
7638
7786
|
function getExposure(id) {
|
|
7639
7787
|
if (!id) return void 0;
|
|
7640
|
-
return exposureById.get(id);
|
|
7788
|
+
return overlayEntry("exposure-settings", id, exposureById.get(id));
|
|
7641
7789
|
}
|
|
7642
7790
|
function getExposureLabel(id, fallback) {
|
|
7643
7791
|
const e = getExposure(id);
|
|
@@ -7717,7 +7865,7 @@ var renderQualityById = new Map(
|
|
|
7717
7865
|
);
|
|
7718
7866
|
function getRenderQuality(id) {
|
|
7719
7867
|
if (!id) return void 0;
|
|
7720
|
-
return renderQualityById.get(id);
|
|
7868
|
+
return overlayEntry("render-quality", id, renderQualityById.get(id));
|
|
7721
7869
|
}
|
|
7722
7870
|
function getRenderQualityLabel(id, fallback) {
|
|
7723
7871
|
const r = getRenderQuality(id);
|
|
@@ -7765,7 +7913,7 @@ var compositionEffectById = new Map(
|
|
|
7765
7913
|
);
|
|
7766
7914
|
function getCompositionEffect(id) {
|
|
7767
7915
|
if (!id) return void 0;
|
|
7768
|
-
return compositionEffectById.get(id);
|
|
7916
|
+
return overlayEntry("composition-effects", id, compositionEffectById.get(id));
|
|
7769
7917
|
}
|
|
7770
7918
|
function getCompositionEffectLabel(id, fallback) {
|
|
7771
7919
|
const c = getCompositionEffect(id);
|
|
@@ -7807,7 +7955,7 @@ var postProcessById = new Map(
|
|
|
7807
7955
|
);
|
|
7808
7956
|
function getPostProcessEffect(id) {
|
|
7809
7957
|
if (!id) return void 0;
|
|
7810
|
-
return postProcessById.get(id);
|
|
7958
|
+
return overlayEntry("post-process-effects", id, postProcessById.get(id));
|
|
7811
7959
|
}
|
|
7812
7960
|
function getPostProcessEffectLabel(id, fallback) {
|
|
7813
7961
|
const p = getPostProcessEffect(id);
|
|
@@ -8382,20 +8530,20 @@ var GENRE_BY_ID = new Map(MUSIC_GENRES.map((g) => [g.id, g]));
|
|
|
8382
8530
|
var ERA_BY_ID = new Map(MUSIC_ERAS.map((e) => [e.id, e]));
|
|
8383
8531
|
function getMusicGenre(id) {
|
|
8384
8532
|
if (!id) return void 0;
|
|
8385
|
-
return GENRE_BY_ID.get(id);
|
|
8533
|
+
return overlayEntry("music-genre", id, GENRE_BY_ID.get(id));
|
|
8386
8534
|
}
|
|
8387
8535
|
function getMusicGenreLabel(id) {
|
|
8388
8536
|
if (!id) return "";
|
|
8389
|
-
return
|
|
8537
|
+
return getMusicGenre(id)?.label ?? id;
|
|
8390
8538
|
}
|
|
8391
8539
|
function getMusicSubgenre(genreId, subgenreId) {
|
|
8392
8540
|
if (!genreId || !subgenreId) return void 0;
|
|
8393
8541
|
const genre = GENRE_BY_ID.get(genreId);
|
|
8394
|
-
return genre?.subgenres.find((s) => s.id === subgenreId);
|
|
8542
|
+
return overlayEntry("music-genre", subgenreId, genre?.subgenres.find((s) => s.id === subgenreId));
|
|
8395
8543
|
}
|
|
8396
8544
|
function getMusicEra(id) {
|
|
8397
8545
|
if (!id) return void 0;
|
|
8398
|
-
return ERA_BY_ID.get(id);
|
|
8546
|
+
return overlayEntry("music-genre", id, ERA_BY_ID.get(id));
|
|
8399
8547
|
}
|
|
8400
8548
|
function getMusicGenreTerm(id) {
|
|
8401
8549
|
return resolveTerm(getMusicGenre(id ?? void 0));
|
|
@@ -8532,13 +8680,13 @@ var ENERGY_BY_ID = new Map(MUSIC_ENERGIES.map((x) => [x.id, x]));
|
|
|
8532
8680
|
var EMOTION_BY_ID = new Map(MUSIC_EMOTIONS.map((x) => [x.id, x]));
|
|
8533
8681
|
var VIBE_BY_ID = new Map(MUSIC_VIBES.map((x) => [x.id, x]));
|
|
8534
8682
|
function getMusicEnergy(id) {
|
|
8535
|
-
return id ? ENERGY_BY_ID.get(id) : void 0;
|
|
8683
|
+
return id ? overlayEntry("music-mood", id, ENERGY_BY_ID.get(id)) : void 0;
|
|
8536
8684
|
}
|
|
8537
8685
|
function getMusicEmotion(id) {
|
|
8538
|
-
return id ? EMOTION_BY_ID.get(id) : void 0;
|
|
8686
|
+
return id ? overlayEntry("music-mood", id, EMOTION_BY_ID.get(id)) : void 0;
|
|
8539
8687
|
}
|
|
8540
8688
|
function getMusicVibe(id) {
|
|
8541
|
-
return id ? VIBE_BY_ID.get(id) : void 0;
|
|
8689
|
+
return id ? overlayEntry("music-mood", id, VIBE_BY_ID.get(id)) : void 0;
|
|
8542
8690
|
}
|
|
8543
8691
|
function getMusicEnergyTerm(id) {
|
|
8544
8692
|
return resolveTerm(id ? getMusicEnergy(id) : void 0);
|
|
@@ -8795,16 +8943,16 @@ var PRODUCTION_BY_ID = new Map(PRODUCTION_STYLES.map((x) => [x.id, x]));
|
|
|
8795
8943
|
var VOCAL_BY_ID = new Map(VOCAL_PRESENCE.map((x) => [x.id, x]));
|
|
8796
8944
|
var SINGING_STYLE_BY_ID = new Map(SINGING_STYLES.map((x) => [x.id, x]));
|
|
8797
8945
|
function getInstrument(id) {
|
|
8798
|
-
return id ? INSTRUMENT_BY_ID.get(id) : void 0;
|
|
8946
|
+
return id ? overlayEntry("instrumentation", id, INSTRUMENT_BY_ID.get(id)) : void 0;
|
|
8799
8947
|
}
|
|
8800
8948
|
function getProductionStyle(id) {
|
|
8801
|
-
return id ? PRODUCTION_BY_ID.get(id) : void 0;
|
|
8949
|
+
return id ? overlayEntry("instrumentation", id, PRODUCTION_BY_ID.get(id)) : void 0;
|
|
8802
8950
|
}
|
|
8803
8951
|
function getVocalPresence(id) {
|
|
8804
|
-
return id ? VOCAL_BY_ID.get(id) : void 0;
|
|
8952
|
+
return id ? overlayEntry("instrumentation", id, VOCAL_BY_ID.get(id)) : void 0;
|
|
8805
8953
|
}
|
|
8806
8954
|
function getSingingStyle(id) {
|
|
8807
|
-
return id ? SINGING_STYLE_BY_ID.get(id) : void 0;
|
|
8955
|
+
return id ? overlayEntry("instrumentation", id, SINGING_STYLE_BY_ID.get(id)) : void 0;
|
|
8808
8956
|
}
|
|
8809
8957
|
function getInstrumentTerm(id) {
|
|
8810
8958
|
return resolveTerm(id ? getInstrument(id) : void 0);
|
|
@@ -9010,19 +9158,19 @@ var LANGUAGE_BY_ID = new Map(VOICE_LANGUAGES.map((x) => [x.id, x]));
|
|
|
9010
9158
|
var ACCENT_BY_ID = new Map(VOICE_ACCENTS.map((x) => [x.id, x]));
|
|
9011
9159
|
var TIMBRE_BY_ID = new Map(VOICE_TIMBRES.map((x) => [x.id, x]));
|
|
9012
9160
|
function getVoiceAge(id) {
|
|
9013
|
-
return id ? AGE_BY_ID.get(id) : void 0;
|
|
9161
|
+
return id ? overlayEntry("voice-character", id, AGE_BY_ID.get(id)) : void 0;
|
|
9014
9162
|
}
|
|
9015
9163
|
function getVoiceGender(id) {
|
|
9016
|
-
return id ? GENDER_BY_ID.get(id) : void 0;
|
|
9164
|
+
return id ? overlayEntry("voice-character", id, GENDER_BY_ID.get(id)) : void 0;
|
|
9017
9165
|
}
|
|
9018
9166
|
function getVoiceLanguage(id) {
|
|
9019
|
-
return id ? LANGUAGE_BY_ID.get(id) : void 0;
|
|
9167
|
+
return id ? overlayEntry("voice-character", id, LANGUAGE_BY_ID.get(id)) : void 0;
|
|
9020
9168
|
}
|
|
9021
9169
|
function getVoiceAccent(id) {
|
|
9022
|
-
return id ? ACCENT_BY_ID.get(id) : void 0;
|
|
9170
|
+
return id ? overlayEntry("voice-character", id, ACCENT_BY_ID.get(id)) : void 0;
|
|
9023
9171
|
}
|
|
9024
9172
|
function getVoiceTimbre(id) {
|
|
9025
|
-
return id ? TIMBRE_BY_ID.get(id) : void 0;
|
|
9173
|
+
return id ? overlayEntry("voice-character", id, TIMBRE_BY_ID.get(id)) : void 0;
|
|
9026
9174
|
}
|
|
9027
9175
|
function getVoiceAgeTerm(id) {
|
|
9028
9176
|
return resolveTerm(getVoiceAge(id ?? void 0));
|
|
@@ -9169,13 +9317,13 @@ var PACE_BY_ID = new Map(VOICE_PACES.map((x) => [x.id, x]));
|
|
|
9169
9317
|
var EMOTION_BY_ID2 = new Map(VOICE_EMOTIONS.map((x) => [x.id, x]));
|
|
9170
9318
|
var ARCHETYPE_BY_ID = new Map(VOICE_ARCHETYPES.map((x) => [x.id, x]));
|
|
9171
9319
|
function getVoicePace(id) {
|
|
9172
|
-
return id ? PACE_BY_ID.get(id) : void 0;
|
|
9320
|
+
return id ? overlayEntry("voice-delivery", id, PACE_BY_ID.get(id)) : void 0;
|
|
9173
9321
|
}
|
|
9174
9322
|
function getVoiceEmotion(id) {
|
|
9175
|
-
return id ? EMOTION_BY_ID2.get(id) : void 0;
|
|
9323
|
+
return id ? overlayEntry("voice-delivery", id, EMOTION_BY_ID2.get(id)) : void 0;
|
|
9176
9324
|
}
|
|
9177
9325
|
function getVoiceArchetype(id) {
|
|
9178
|
-
return id ? ARCHETYPE_BY_ID.get(id) : void 0;
|
|
9326
|
+
return id ? overlayEntry("voice-delivery", id, ARCHETYPE_BY_ID.get(id)) : void 0;
|
|
9179
9327
|
}
|
|
9180
9328
|
function getVoicePaceTerm(id) {
|
|
9181
9329
|
return resolveTerm(getVoicePace(id ?? void 0));
|
|
@@ -9241,6 +9389,7 @@ function toOptions(arr, categoryField) {
|
|
|
9241
9389
|
};
|
|
9242
9390
|
if (e.description) opt.description = e.description;
|
|
9243
9391
|
if (categoryField) opt.category = e[categoryField];
|
|
9392
|
+
if (e.adultOnly) opt.adultOnly = true;
|
|
9244
9393
|
return opt;
|
|
9245
9394
|
});
|
|
9246
9395
|
}
|
|
@@ -9766,6 +9915,7 @@ function getPickerCatalog(nodeTypeOrCatalogId) {
|
|
|
9766
9915
|
const all = getRegisteredPickerCatalogs();
|
|
9767
9916
|
return all.find((c) => c.nodeType === nodeTypeOrCatalogId) ?? all.find((c) => c.catalogId === nodeTypeOrCatalogId);
|
|
9768
9917
|
}
|
|
9918
|
+
setComposedCatalogResolver(getPickerCatalog);
|
|
9769
9919
|
function listPickerCatalogs() {
|
|
9770
9920
|
return getRegisteredPickerCatalogs();
|
|
9771
9921
|
}
|
|
@@ -9856,9 +10006,6 @@ function readHintMode(data) {
|
|
|
9856
10006
|
function byMode(mode, full, compact) {
|
|
9857
10007
|
return mode === "compact" ? compact : full;
|
|
9858
10008
|
}
|
|
9859
|
-
function objectEntityTerm(entry) {
|
|
9860
|
-
return entry.term ?? deriveTerm(entry.label);
|
|
9861
|
-
}
|
|
9862
10009
|
function getParameterPromptHint(node, ctx) {
|
|
9863
10010
|
return resolveParameterHint(node, ctx);
|
|
9864
10011
|
}
|
|
@@ -9983,36 +10130,23 @@ function resolveBaseHint(type, data, mode = "full") {
|
|
|
9983
10130
|
return withCustomText(data, byMode(mode, getLoopSubjectPromptHint, getLoopSubjectTerm)(asStr(data.loopSubject)));
|
|
9984
10131
|
case "material":
|
|
9985
10132
|
return withCustomText(data, buildMaterialHints(data.material, mode));
|
|
9986
|
-
//
|
|
9987
|
-
//
|
|
9988
|
-
// the
|
|
9989
|
-
// miss, so the entry lookup
|
|
9990
|
-
// getters' job now, not this switch's.
|
|
10133
|
+
// The four object-entity catalogs are owned by @nodaro/shared and overlaid
|
|
10134
|
+
// in shared-catalog-overlay.ts — the ONE module every prompt-text read of
|
|
10135
|
+
// them goes through (the subject fold uses it too). Each returns "" on a
|
|
10136
|
+
// miss, so the entry lookup is the module's job, not this switch's.
|
|
9991
10137
|
case "animal":
|
|
9992
|
-
return withCustomText(
|
|
9993
|
-
data,
|
|
9994
|
-
byMode(mode, getAnimalPromptHint, getAnimalTerm)(asStr(data.animal))
|
|
9995
|
-
);
|
|
10138
|
+
return withCustomText(data, byMode(mode, curatedAnimalPromptHint, curatedAnimalTerm)(asStr(data.animal)));
|
|
9996
10139
|
case "vehicle": {
|
|
9997
|
-
const
|
|
9998
|
-
return withCustomText(
|
|
9999
|
-
data,
|
|
10000
|
-
vehicle ? byMode(mode, `featuring a ${vehicle.label.toLowerCase()}, ${vehicle.description}`, objectEntityTerm(vehicle)) : ""
|
|
10001
|
-
);
|
|
10140
|
+
const t = curatedVehicleText(asStr(data.vehicle));
|
|
10141
|
+
return withCustomText(data, byMode(mode, t.hint, t.term));
|
|
10002
10142
|
}
|
|
10003
10143
|
case "weapon": {
|
|
10004
|
-
const
|
|
10005
|
-
return withCustomText(
|
|
10006
|
-
data,
|
|
10007
|
-
weapon ? byMode(mode, `with a ${weapon.label.toLowerCase()}, ${weapon.description}`, objectEntityTerm(weapon)) : ""
|
|
10008
|
-
);
|
|
10144
|
+
const t = curatedWeaponText(asStr(data.weapon));
|
|
10145
|
+
return withCustomText(data, byMode(mode, t.hint, t.term));
|
|
10009
10146
|
}
|
|
10010
10147
|
case "furniture": {
|
|
10011
|
-
const
|
|
10012
|
-
return withCustomText(
|
|
10013
|
-
data,
|
|
10014
|
-
furniture ? byMode(mode, `including a ${furniture.label.toLowerCase()}, ${furniture.description}`, objectEntityTerm(furniture)) : ""
|
|
10015
|
-
);
|
|
10148
|
+
const t = curatedFurnitureText(asStr(data.furniture));
|
|
10149
|
+
return withCustomText(data, byMode(mode, t.hint, t.term));
|
|
10016
10150
|
}
|
|
10017
10151
|
case "photo-genre":
|
|
10018
10152
|
return withCustomText(data, byMode(mode, getPhotoGenrePromptHint, getPhotoGenreTerm)(asStr(data.photoGenre)));
|
|
@@ -11483,7 +11617,7 @@ ${directives}`;
|
|
|
11483
11617
|
}
|
|
11484
11618
|
}
|
|
11485
11619
|
const styleText2 = style?.trim();
|
|
11486
|
-
const styleLine2 = styleText2 ? `Style: ${getStylePromptHint(styleText2) || styleText2}` : "";
|
|
11620
|
+
const styleLine2 = styleText2 && !isDeniedStyleId(styleText2) ? `Style: ${getStylePromptHint(styleText2) || styleText2}` : "";
|
|
11487
11621
|
const negPrompt2 = negativePrompt?.trim();
|
|
11488
11622
|
let nativeNegativePrompt2;
|
|
11489
11623
|
let avoidLine2 = "";
|
|
@@ -11565,7 +11699,7 @@ ${directives}`;
|
|
|
11565
11699
|
prompt = section.length > 0 ? `${wrapped}${STYLE_SECTION_GAP}${section}` : wrapped;
|
|
11566
11700
|
}
|
|
11567
11701
|
const styleText = style?.trim();
|
|
11568
|
-
const styleLine = styleText ? `Style: ${getStylePromptHint(styleText) || styleText}` : "";
|
|
11702
|
+
const styleLine = styleText && !isDeniedStyleId(styleText) ? `Style: ${getStylePromptHint(styleText) || styleText}` : "";
|
|
11569
11703
|
const negPrompt = negativePrompt?.trim();
|
|
11570
11704
|
let nativeNegativePrompt;
|
|
11571
11705
|
let avoidLine = "";
|
|
@@ -12037,6 +12171,8 @@ function renderLens(l) {
|
|
|
12037
12171
|
if (l.aperture) bits.push(`f/${l.aperture}`);
|
|
12038
12172
|
return bits.length > 0 ? `Lens: ${bits.join(", ")}.` : "";
|
|
12039
12173
|
}
|
|
12174
|
+
|
|
12175
|
+
// src/subject-registry.ts
|
|
12040
12176
|
var viaFragmentBuilder = (build) => (subject, mode) => {
|
|
12041
12177
|
const clause = build(subject, mode).filter((s) => s.length > 0).join(", ");
|
|
12042
12178
|
return clause.length > 0 ? [clause] : [];
|
|
@@ -12059,7 +12195,7 @@ var SUBJECT_FIELDS = [
|
|
|
12059
12195
|
{ key: "styling", kind: "group", surface: "both", render: viaFragmentBuilder(buildStylingHints) },
|
|
12060
12196
|
{ key: "heldProp", kind: "ids", surface: "both", maxPicks: 2, render: viaListBuilder2(buildHeldPropHints) },
|
|
12061
12197
|
{ key: "material", kind: "ids", surface: "both", maxPicks: 2, render: viaStringBuilder2(buildMaterialHints) },
|
|
12062
|
-
{ key: "animal", kind: "ids", surface: "both", maxPicks: 1, render: perId2(
|
|
12198
|
+
{ key: "animal", kind: "ids", surface: "both", maxPicks: 1, render: perId2(curatedAnimalPromptHint, curatedAnimalTerm) }
|
|
12063
12199
|
];
|
|
12064
12200
|
var SUBJECT_FOLD_KEYS = SUBJECT_FIELDS.map((f) => f.key);
|
|
12065
12201
|
var IDS_ROWS = SUBJECT_FIELDS.filter((f) => f.kind === "ids");
|
|
@@ -13071,6 +13207,114 @@ function resolveVeoI2vInputs(args) {
|
|
|
13071
13207
|
droppedEndFrame: Boolean(args.endFrameUrl)
|
|
13072
13208
|
};
|
|
13073
13209
|
}
|
|
13210
|
+
|
|
13211
|
+
// src/catalog-id-guard.ts
|
|
13212
|
+
var SIDE_FIELDS = [
|
|
13213
|
+
// pose.ts resolves all four sub-picks through getPosePromptHint
|
|
13214
|
+
["pose", "handPosition", "pose"],
|
|
13215
|
+
["pose", "bodyLean", "pose"],
|
|
13216
|
+
["pose", "headTilt", "pose"],
|
|
13217
|
+
["pose", "activity", "pose"]
|
|
13218
|
+
];
|
|
13219
|
+
var DIRECTION_ALIASES = {
|
|
13220
|
+
framingId: "framing",
|
|
13221
|
+
framingAngleId: "framing",
|
|
13222
|
+
lightingId: "lighting",
|
|
13223
|
+
lensId: "lens",
|
|
13224
|
+
cameraFormatId: "camera-format"
|
|
13225
|
+
};
|
|
13226
|
+
var tableMemo = null;
|
|
13227
|
+
function fieldTable() {
|
|
13228
|
+
if (tableMemo) return tableMemo;
|
|
13229
|
+
const byNodeType = /* @__PURE__ */ new Map();
|
|
13230
|
+
const byField = /* @__PURE__ */ new Map();
|
|
13231
|
+
const put = (nodeType, field, catalogId) => {
|
|
13232
|
+
let m = byNodeType.get(nodeType);
|
|
13233
|
+
if (!m) byNodeType.set(nodeType, m = /* @__PURE__ */ new Map());
|
|
13234
|
+
m.set(field, catalogId);
|
|
13235
|
+
if (!byField.has(field)) byField.set(field, catalogId);
|
|
13236
|
+
};
|
|
13237
|
+
for (const c of PICKER_CATALOGS) {
|
|
13238
|
+
if (c.valueField) put(c.nodeType, c.valueField, c.catalogId);
|
|
13239
|
+
for (const d of c.dimensions ?? []) put(c.nodeType, d.field, c.catalogId);
|
|
13240
|
+
for (const f of c.fields ?? []) put(c.nodeType, f, c.catalogId);
|
|
13241
|
+
}
|
|
13242
|
+
for (const [nodeType, field, catalogId] of SIDE_FIELDS) put(nodeType, field, catalogId);
|
|
13243
|
+
for (const [alias, catalogId] of Object.entries(DIRECTION_ALIASES)) if (!byField.has(alias)) byField.set(alias, catalogId);
|
|
13244
|
+
tableMemo = { byNodeType, byField };
|
|
13245
|
+
return tableMemo;
|
|
13246
|
+
}
|
|
13247
|
+
var idsMemo = null;
|
|
13248
|
+
function composedIds(catalogId) {
|
|
13249
|
+
const v = catalogPacksVersion();
|
|
13250
|
+
if (!idsMemo || idsMemo.v !== v) idsMemo = { v, byCatalog: /* @__PURE__ */ new Map() };
|
|
13251
|
+
const hit = idsMemo.byCatalog.get(catalogId);
|
|
13252
|
+
if (hit) return hit;
|
|
13253
|
+
const cat = getPickerCatalog(catalogId);
|
|
13254
|
+
const ids = /* @__PURE__ */ new Set();
|
|
13255
|
+
for (const o of cat?.options ?? []) ids.add(o.id);
|
|
13256
|
+
for (const d of cat?.dimensions ?? []) for (const o of d.options) ids.add(o.id);
|
|
13257
|
+
idsMemo.byCatalog.set(catalogId, ids);
|
|
13258
|
+
return ids;
|
|
13259
|
+
}
|
|
13260
|
+
function values(v) {
|
|
13261
|
+
if (typeof v === "string") return v ? [v] : [];
|
|
13262
|
+
if (Array.isArray(v)) return v.filter((x) => typeof x === "string" && x.length > 0);
|
|
13263
|
+
return [];
|
|
13264
|
+
}
|
|
13265
|
+
function catalogGuardActive() {
|
|
13266
|
+
return getRegisteredCatalogPacks().length > 0;
|
|
13267
|
+
}
|
|
13268
|
+
function checkRecord(nodeType, nodeId, data, fields, out) {
|
|
13269
|
+
for (const [field, catalogId] of fields) {
|
|
13270
|
+
const raw = data[field];
|
|
13271
|
+
if (raw === void 0 || raw === null) continue;
|
|
13272
|
+
const offered = composedIds(catalogId);
|
|
13273
|
+
for (const id of values(raw)) {
|
|
13274
|
+
if (!offered.has(id)) out.push({ nodeId, nodeType, field, id, catalogId });
|
|
13275
|
+
}
|
|
13276
|
+
}
|
|
13277
|
+
}
|
|
13278
|
+
function findForeignCatalogIds(nodes) {
|
|
13279
|
+
if (!catalogGuardActive() || !nodes) return [];
|
|
13280
|
+
const table = fieldTable();
|
|
13281
|
+
const out = [];
|
|
13282
|
+
for (const node of nodes) {
|
|
13283
|
+
const type = typeof node.type === "string" ? node.type : "";
|
|
13284
|
+
const nodeId = typeof node.id === "string" ? node.id : void 0;
|
|
13285
|
+
const data = node.data && typeof node.data === "object" ? node.data : null;
|
|
13286
|
+
if (!type || !data) continue;
|
|
13287
|
+
const own = table.byNodeType.get(type);
|
|
13288
|
+
if (own) checkRecord(type, nodeId, data, own, out);
|
|
13289
|
+
for (const key of ["direction", "subject"]) {
|
|
13290
|
+
const rec = data[key];
|
|
13291
|
+
if (rec && typeof rec === "object" && !Array.isArray(rec)) {
|
|
13292
|
+
checkRecord(type, nodeId, rec, table.byField, out);
|
|
13293
|
+
}
|
|
13294
|
+
}
|
|
13295
|
+
}
|
|
13296
|
+
return out;
|
|
13297
|
+
}
|
|
13298
|
+
function findForeignCatalogIdsInBody(nodeType, body) {
|
|
13299
|
+
if (!catalogGuardActive() || !body) return [];
|
|
13300
|
+
const table = fieldTable();
|
|
13301
|
+
const out = [];
|
|
13302
|
+
for (const key of ["direction", "subject"]) {
|
|
13303
|
+
const rec = body[key];
|
|
13304
|
+
if (rec && typeof rec === "object" && !Array.isArray(rec)) {
|
|
13305
|
+
checkRecord(nodeType, void 0, rec, table.byField, out);
|
|
13306
|
+
}
|
|
13307
|
+
}
|
|
13308
|
+
return out;
|
|
13309
|
+
}
|
|
13310
|
+
function foreignCatalogIdMessage(found) {
|
|
13311
|
+
const parts = [...new Set(found.map((f) => `${f.field}="${f.id}"`))];
|
|
13312
|
+
return `This deployment does not offer the following picker value${parts.length === 1 ? "" : "s"}: ${parts.join(", ")}. Choose from the options shown in the picker.`;
|
|
13313
|
+
}
|
|
13314
|
+
function __resetCatalogIdGuardForTests() {
|
|
13315
|
+
tableMemo = null;
|
|
13316
|
+
idsMemo = null;
|
|
13317
|
+
}
|
|
13074
13318
|
function packOptionIds(pack) {
|
|
13075
13319
|
if (pack.options) return pack.options.map((o) => o.id);
|
|
13076
13320
|
if (pack.dimensions) return pack.dimensions.flatMap((d) => d.options.map((o) => o.id));
|
|
@@ -13094,6 +13338,108 @@ function computePackSidecarCoverage(pack) {
|
|
|
13094
13338
|
return { total: ids.length * NON_EN_LOCALE_IDS.length, missing, exempted };
|
|
13095
13339
|
}
|
|
13096
13340
|
|
|
13341
|
+
// src/age-floor.ts
|
|
13342
|
+
var ADULT_SWEPT_CATALOG_IDS = ["styling", "mood", "pose", "photo-genre"];
|
|
13343
|
+
var ADULT_SWEPT_CATALOG_ID_SET = new Set(ADULT_SWEPT_CATALOG_IDS);
|
|
13344
|
+
function optionsOf(catalog) {
|
|
13345
|
+
if (catalog.kind === "single") return catalog.options ?? [];
|
|
13346
|
+
return (catalog.dimensions ?? []).flatMap((d) => d.options);
|
|
13347
|
+
}
|
|
13348
|
+
function getAdultOnlyEntries() {
|
|
13349
|
+
const catalogEntries = getRegisteredPickerCatalogs().filter((c) => ADULT_SWEPT_CATALOG_ID_SET.has(c.catalogId)).flatMap(optionsOf);
|
|
13350
|
+
const all = [...getRegisteredPeople(), ...catalogEntries];
|
|
13351
|
+
return all.filter((e) => e.adultOnly === true);
|
|
13352
|
+
}
|
|
13353
|
+
function getAdultOnlyIds() {
|
|
13354
|
+
return new Set(getAdultOnlyEntries().map((e) => e.id));
|
|
13355
|
+
}
|
|
13356
|
+
function getAdultOnlyHintStrings() {
|
|
13357
|
+
const out = /* @__PURE__ */ new Set();
|
|
13358
|
+
for (const e of getAdultOnlyEntries()) {
|
|
13359
|
+
if (e.promptHint) out.add(e.promptHint.toLowerCase());
|
|
13360
|
+
}
|
|
13361
|
+
return [...out].filter((s) => s.length >= 8).sort((a, b) => b.length - a.length);
|
|
13362
|
+
}
|
|
13363
|
+
var cachedMinorHints = null;
|
|
13364
|
+
var cachedMinorHintSourceCount = -1;
|
|
13365
|
+
function getMinorAgeHintStrings() {
|
|
13366
|
+
const people = getRegisteredPeople();
|
|
13367
|
+
if (cachedMinorHints && cachedMinorHintSourceCount === people.length) return cachedMinorHints;
|
|
13368
|
+
const out = /* @__PURE__ */ new Set();
|
|
13369
|
+
for (const e of people) {
|
|
13370
|
+
const minorAge = e.dimension === "age" && !ADULT_AGE_IDS.has(e.id);
|
|
13371
|
+
const minorType = e.dimension === "type" && MINOR_IMPLYING_TYPE_IDS.has(e.id);
|
|
13372
|
+
if (!minorAge && !minorType) continue;
|
|
13373
|
+
if (e.promptHint) out.add(e.promptHint.toLowerCase());
|
|
13374
|
+
}
|
|
13375
|
+
cachedMinorHintSourceCount = people.length;
|
|
13376
|
+
cachedMinorHints = [...out].filter((s) => s.length >= 8).sort((a, b) => b.length - a.length);
|
|
13377
|
+
return cachedMinorHints;
|
|
13378
|
+
}
|
|
13379
|
+
function escapeReSource(s) {
|
|
13380
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
13381
|
+
}
|
|
13382
|
+
function needleTokenSource(needle) {
|
|
13383
|
+
return needle.trim().split(/[\s-]+/).filter((t) => t.length > 0).map(escapeReSource).join("[\\s-]+");
|
|
13384
|
+
}
|
|
13385
|
+
function buildNeedleAlternationSource(needles) {
|
|
13386
|
+
const alts = needles.map(needleTokenSource).filter((s) => s.length > 0);
|
|
13387
|
+
if (alts.length === 0) return null;
|
|
13388
|
+
return `(?<![\\w-])(?:${alts.join("|")})(?![\\w-])`;
|
|
13389
|
+
}
|
|
13390
|
+
var cachedMinorNeedleRe = null;
|
|
13391
|
+
var cachedMinorNeedleCount = -1;
|
|
13392
|
+
function minorNeedleRegex() {
|
|
13393
|
+
const needles = getMinorAgeHintStrings();
|
|
13394
|
+
if (cachedMinorNeedleRe && cachedMinorNeedleCount === needles.length) return cachedMinorNeedleRe;
|
|
13395
|
+
cachedMinorNeedleCount = needles.length;
|
|
13396
|
+
const src = buildNeedleAlternationSource(needles);
|
|
13397
|
+
cachedMinorNeedleRe = src === null ? null : new RegExp(src, "i");
|
|
13398
|
+
return cachedMinorNeedleRe;
|
|
13399
|
+
}
|
|
13400
|
+
var NUMERIC_AGE_RE = /(?<![\w-])(\d{1,3})(?:\s*-\s*\d{1,3})?\s*-?\s*(?:years?\s*-?\s*old|yrs?\s*-?\s*old|y(?:\.\s*o\.?|\/o|o)|years?\s+of\s+age)(?![\w-])/gi;
|
|
13401
|
+
var PREFIXED_AGE_RE = /(?<![\w-])aged?\s+(?:of\s+)?(\d{1,3})(?![\w-])/gi;
|
|
13402
|
+
var AGE_NUMBER_RULES = [NUMERIC_AGE_RE, PREFIXED_AGE_RE];
|
|
13403
|
+
var IN_THEIR_TEENS_RE = /(?<![\w-])in[\s-]+their[\s-]+teens(?![\w-])/i;
|
|
13404
|
+
function containsMinorAgeHint(text) {
|
|
13405
|
+
if (typeof text !== "string" || text.trim().length === 0) return false;
|
|
13406
|
+
const re = minorNeedleRegex();
|
|
13407
|
+
if (re && re.test(text)) return true;
|
|
13408
|
+
for (const rule of AGE_NUMBER_RULES) {
|
|
13409
|
+
for (const m of text.matchAll(rule)) {
|
|
13410
|
+
const n = Number(m[1]);
|
|
13411
|
+
if (Number.isFinite(n) && n < 20) return true;
|
|
13412
|
+
}
|
|
13413
|
+
}
|
|
13414
|
+
return IN_THEIR_TEENS_RE.test(text);
|
|
13415
|
+
}
|
|
13416
|
+
var FLOORED_PICKER_KEYS = ["person", ...ADULT_SWEPT_CATALOG_IDS];
|
|
13417
|
+
function stripIds(obj, drop) {
|
|
13418
|
+
const out = {};
|
|
13419
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
13420
|
+
if (typeof v === "string") {
|
|
13421
|
+
if (!drop.has(v)) out[k] = v;
|
|
13422
|
+
} else if (Array.isArray(v)) {
|
|
13423
|
+
const kept = v.filter((x) => !(typeof x === "string" && drop.has(x)));
|
|
13424
|
+
if (kept.length > 0) out[k] = kept;
|
|
13425
|
+
} else {
|
|
13426
|
+
out[k] = v;
|
|
13427
|
+
}
|
|
13428
|
+
}
|
|
13429
|
+
return out;
|
|
13430
|
+
}
|
|
13431
|
+
function applyMinorAgeFloorToPickerValues(values2) {
|
|
13432
|
+
const person = values2.person;
|
|
13433
|
+
if (!person || typeof person !== "object" || !isMinorAge(person)) return values2;
|
|
13434
|
+
const drop = getAdultOnlyIds();
|
|
13435
|
+
const out = { ...values2 };
|
|
13436
|
+
for (const key of FLOORED_PICKER_KEYS) {
|
|
13437
|
+
const v = out[key];
|
|
13438
|
+
if (v && typeof v === "object" && !Array.isArray(v)) out[key] = stripIds(v, drop);
|
|
13439
|
+
}
|
|
13440
|
+
return out;
|
|
13441
|
+
}
|
|
13442
|
+
|
|
13097
13443
|
// ../../node_modules/zod/v4/classic/external.js
|
|
13098
13444
|
var external_exports = {};
|
|
13099
13445
|
__export(external_exports, {
|
|
@@ -13775,8 +14121,8 @@ function assert(_) {
|
|
|
13775
14121
|
}
|
|
13776
14122
|
function getEnumValues(entries) {
|
|
13777
14123
|
const numericValues = Object.values(entries).filter((v) => typeof v === "number");
|
|
13778
|
-
const
|
|
13779
|
-
return
|
|
14124
|
+
const values2 = Object.entries(entries).filter(([k, _]) => numericValues.indexOf(+k) === -1).map(([_, v]) => v);
|
|
14125
|
+
return values2;
|
|
13780
14126
|
}
|
|
13781
14127
|
function joinValues(array2, separator = "|") {
|
|
13782
14128
|
return array2.map((val) => stringifyPrimitive(val)).join(separator);
|
|
@@ -16434,10 +16780,10 @@ var $ZodDiscriminatedUnion = /* @__PURE__ */ $constructor("$ZodDiscriminatedUnio
|
|
|
16434
16780
|
const opts = def.options;
|
|
16435
16781
|
const map2 = /* @__PURE__ */ new Map();
|
|
16436
16782
|
for (const o of opts) {
|
|
16437
|
-
const
|
|
16438
|
-
if (!
|
|
16783
|
+
const values2 = o._zod.propValues?.[def.discriminator];
|
|
16784
|
+
if (!values2 || values2.size === 0)
|
|
16439
16785
|
throw new Error(`Invalid discriminated union option at index "${def.options.indexOf(o)}"`);
|
|
16440
|
-
for (const v of
|
|
16786
|
+
for (const v of values2) {
|
|
16441
16787
|
if (map2.has(v)) {
|
|
16442
16788
|
throw new Error(`Duplicate discriminator value "${String(v)}"`);
|
|
16443
16789
|
}
|
|
@@ -16695,11 +17041,11 @@ var $ZodRecord = /* @__PURE__ */ $constructor("$ZodRecord", (inst, def) => {
|
|
|
16695
17041
|
return payload;
|
|
16696
17042
|
}
|
|
16697
17043
|
const proms = [];
|
|
16698
|
-
const
|
|
16699
|
-
if (
|
|
17044
|
+
const values2 = def.keyType._zod.values;
|
|
17045
|
+
if (values2) {
|
|
16700
17046
|
payload.value = {};
|
|
16701
17047
|
const recordKeys = /* @__PURE__ */ new Set();
|
|
16702
|
-
for (const key of
|
|
17048
|
+
for (const key of values2) {
|
|
16703
17049
|
if (typeof key === "string" || typeof key === "number" || typeof key === "symbol") {
|
|
16704
17050
|
recordKeys.add(typeof key === "number" ? key.toString() : key);
|
|
16705
17051
|
const keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx);
|
|
@@ -16903,10 +17249,10 @@ function handleSetResult(result, final) {
|
|
|
16903
17249
|
}
|
|
16904
17250
|
var $ZodEnum = /* @__PURE__ */ $constructor("$ZodEnum", (inst, def) => {
|
|
16905
17251
|
$ZodType.init(inst, def);
|
|
16906
|
-
const
|
|
16907
|
-
const valuesSet = new Set(
|
|
17252
|
+
const values2 = getEnumValues(def.entries);
|
|
17253
|
+
const valuesSet = new Set(values2);
|
|
16908
17254
|
inst._zod.values = valuesSet;
|
|
16909
|
-
inst._zod.pattern = new RegExp(`^(${
|
|
17255
|
+
inst._zod.pattern = new RegExp(`^(${values2.filter((k) => propertyKeyTypes.has(typeof k)).map((o) => typeof o === "string" ? escapeRegex(o) : o.toString()).join("|")})$`);
|
|
16910
17256
|
inst._zod.parse = (payload, _ctx) => {
|
|
16911
17257
|
const input = payload.value;
|
|
16912
17258
|
if (valuesSet.has(input)) {
|
|
@@ -16914,7 +17260,7 @@ var $ZodEnum = /* @__PURE__ */ $constructor("$ZodEnum", (inst, def) => {
|
|
|
16914
17260
|
}
|
|
16915
17261
|
payload.issues.push({
|
|
16916
17262
|
code: "invalid_value",
|
|
16917
|
-
values,
|
|
17263
|
+
values: values2,
|
|
16918
17264
|
input,
|
|
16919
17265
|
inst
|
|
16920
17266
|
});
|
|
@@ -16926,12 +17272,12 @@ var $ZodLiteral = /* @__PURE__ */ $constructor("$ZodLiteral", (inst, def) => {
|
|
|
16926
17272
|
if (def.values.length === 0) {
|
|
16927
17273
|
throw new Error("Cannot create literal schema with no valid values");
|
|
16928
17274
|
}
|
|
16929
|
-
const
|
|
16930
|
-
inst._zod.values =
|
|
17275
|
+
const values2 = new Set(def.values);
|
|
17276
|
+
inst._zod.values = values2;
|
|
16931
17277
|
inst._zod.pattern = new RegExp(`^(${def.values.map((o) => typeof o === "string" ? escapeRegex(o) : o ? escapeRegex(o.toString()) : String(o)).join("|")})$`);
|
|
16932
17278
|
inst._zod.parse = (payload, _ctx) => {
|
|
16933
17279
|
const input = payload.value;
|
|
16934
|
-
if (
|
|
17280
|
+
if (values2.has(input)) {
|
|
16935
17281
|
return payload;
|
|
16936
17282
|
}
|
|
16937
17283
|
payload.issues.push({
|
|
@@ -24232,8 +24578,8 @@ function _set(Class2, valueType, params) {
|
|
|
24232
24578
|
});
|
|
24233
24579
|
}
|
|
24234
24580
|
// @__NO_SIDE_EFFECTS__
|
|
24235
|
-
function _enum(Class2,
|
|
24236
|
-
const entries = Array.isArray(
|
|
24581
|
+
function _enum(Class2, values2, params) {
|
|
24582
|
+
const entries = Array.isArray(values2) ? Object.fromEntries(values2.map((v) => [v, v])) : values2;
|
|
24237
24583
|
return new Class2({
|
|
24238
24584
|
type: "enum",
|
|
24239
24585
|
entries,
|
|
@@ -24977,12 +25323,12 @@ var dateProcessor = (_schema, ctx, _json, _params) => {
|
|
|
24977
25323
|
};
|
|
24978
25324
|
var enumProcessor = (schema, _ctx, json2, _params) => {
|
|
24979
25325
|
const def = schema._zod.def;
|
|
24980
|
-
const
|
|
24981
|
-
if (
|
|
25326
|
+
const values2 = getEnumValues(def.entries);
|
|
25327
|
+
if (values2.every((v) => typeof v === "number"))
|
|
24982
25328
|
json2.type = "number";
|
|
24983
|
-
if (
|
|
25329
|
+
if (values2.every((v) => typeof v === "string"))
|
|
24984
25330
|
json2.type = "string";
|
|
24985
|
-
json2.enum =
|
|
25331
|
+
json2.enum = values2;
|
|
24986
25332
|
};
|
|
24987
25333
|
var literalProcessor = (schema, ctx, json2, _params) => {
|
|
24988
25334
|
const def = schema._zod.def;
|
|
@@ -26665,9 +27011,9 @@ var ZodEnum = /* @__PURE__ */ $constructor("ZodEnum", (inst, def) => {
|
|
|
26665
27011
|
inst.enum = def.entries;
|
|
26666
27012
|
inst.options = Object.values(def.entries);
|
|
26667
27013
|
const keys = new Set(Object.keys(def.entries));
|
|
26668
|
-
inst.extract = (
|
|
27014
|
+
inst.extract = (values2, params) => {
|
|
26669
27015
|
const newEntries = {};
|
|
26670
|
-
for (const value of
|
|
27016
|
+
for (const value of values2) {
|
|
26671
27017
|
if (keys.has(value)) {
|
|
26672
27018
|
newEntries[value] = def.entries[value];
|
|
26673
27019
|
} else
|
|
@@ -26680,9 +27026,9 @@ var ZodEnum = /* @__PURE__ */ $constructor("ZodEnum", (inst, def) => {
|
|
|
26680
27026
|
entries: newEntries
|
|
26681
27027
|
});
|
|
26682
27028
|
};
|
|
26683
|
-
inst.exclude = (
|
|
27029
|
+
inst.exclude = (values2, params) => {
|
|
26684
27030
|
const newEntries = { ...def.entries };
|
|
26685
|
-
for (const value of
|
|
27031
|
+
for (const value of values2) {
|
|
26686
27032
|
if (keys.has(value)) {
|
|
26687
27033
|
delete newEntries[value];
|
|
26688
27034
|
} else
|
|
@@ -26696,8 +27042,8 @@ var ZodEnum = /* @__PURE__ */ $constructor("ZodEnum", (inst, def) => {
|
|
|
26696
27042
|
});
|
|
26697
27043
|
};
|
|
26698
27044
|
});
|
|
26699
|
-
function _enum2(
|
|
26700
|
-
const entries = Array.isArray(
|
|
27045
|
+
function _enum2(values2, params) {
|
|
27046
|
+
const entries = Array.isArray(values2) ? Object.fromEntries(values2.map((v) => [v, v])) : values2;
|
|
26701
27047
|
return new ZodEnum({
|
|
26702
27048
|
type: "enum",
|
|
26703
27049
|
entries,
|
|
@@ -27611,6 +27957,13 @@ var personCleanup = (patch, mode) => {
|
|
|
27611
27957
|
} else if ("age" in patch && patch.age !== "age-custom") {
|
|
27612
27958
|
patch.customAge = void 0;
|
|
27613
27959
|
}
|
|
27960
|
+
if (isMinorAge(patch)) {
|
|
27961
|
+
const drop = getAdultOnlyIds();
|
|
27962
|
+
for (const [k, v] of Object.entries(patch)) {
|
|
27963
|
+
if (typeof v === "string" && drop.has(v)) patch[k] = void 0;
|
|
27964
|
+
else if (Array.isArray(v)) patch[k] = v.filter((x) => !(typeof x === "string" && drop.has(x)));
|
|
27965
|
+
}
|
|
27966
|
+
}
|
|
27614
27967
|
};
|
|
27615
27968
|
var PICKER_ANALYZER_REGISTRY = {
|
|
27616
27969
|
person: {
|
|
@@ -34240,6 +34593,6 @@ function buildSurroundFillPrompt(direction, userPrompt) {
|
|
|
34240
34593
|
return `${scene}This is a partial frame: the ${carried} portion contains real, finished pixels and the ${painted} portion is flat gray that MUST be painted in. Paint ONLY the ${painted} gray region as a natural, seamless continuation of the ${carried} portion \u2014 same scene, same perspective, continuing the horizon, geometry, and content across the boundary with no break. Keep the ${carried} portion completely unchanged. CRITICAL: do NOT change the lighting, exposure, white balance, or time of day. Match the ${carried} portion's EXACT light, color temperature, and contrast across the whole frame \u2014 if it is flat overcast daylight, keep flat overcast daylight. No golden hour, no sunset, no warm relight, no cinematic regrade. The seam between the ${carried} and ${painted} portions must be invisible. No people, no text, no labels, no watermarks.`;
|
|
34241
34594
|
}
|
|
34242
34595
|
|
|
34243
|
-
export { ACTION_FX, ACTION_FX_CATEGORY_LABELS, ACTION_FX_CATEGORY_ORDER, ACTION_FX_IDS, AESTHETICS, AESTHETIC_CATEGORY_LABELS, AESTHETIC_CATEGORY_ORDER, AESTHETIC_IDS, ALL_PICKER_WIRING, ANALYZABLE_PICKER_TYPES, ANGLE_LABELS, ASPECT_RATIO_LABELS, ATMOSPHERES, ATMOSPHERE_IDS, AUDIO_WIZARD_CATEGORIES, BACKDROPS, BACKDROP_CATEGORY_LABELS, BACKDROP_CATEGORY_ORDER, BACKDROP_IDS, BRAND_PRESETS, BRAND_PRESET_IDS, BRAND_PRESET_META, CAMERA_FORMATS, CAMERA_FORMAT_IDS, CAMERA_MOTIONS, CAMERA_MOTION_CATEGORY_LABELS, CAMERA_MOTION_CATEGORY_ORDER, CAMERA_MOTION_IDS, CHARACTER_FX, CHARACTER_FX_CATEGORY_LABELS, CHARACTER_FX_CATEGORY_ORDER, CHARACTER_FX_DURATIONS, CHARACTER_FX_IDS, CHARACTER_FX_INTENSITIES, CHARACTER_FX_POSITIONS, CINEMATIC_LOOK_TAIL, COLOR_LOOKS, COLOR_LOOK_CATEGORY_LABELS, COLOR_LOOK_CATEGORY_ORDER, COLOR_LOOK_IDS, COMPOSITION_EFFECTS, COMPOSITION_EFFECT_IDS, DEFAULT_IDENTITY_LOCK, DEFAULT_TEMPLATES, DIRECTION_ARRAY_CEILING, DIRECTION_FIELDS, DIRECTION_ID_MAX_CHARS, DIRECTION_KEYS, ERAS, ERA_CATEGORY_LABELS, ERA_CATEGORY_ORDER, ERA_IDS, EXPOSURE_CATEGORY_LABELS, EXPOSURE_CATEGORY_ORDER, EXPOSURE_FIELD_BY_CATEGORY, EXPOSURE_IDS, EXPOSURE_SETTINGS, FACTORY_PRESETS, FACTORY_SNIPPETS, FILM_STILL_PREFIX, FILM_STYLE_KEYS, FRAMINGS, FRAMING_CATEGORY_LABELS, FRAMING_CATEGORY_ORDER, FRAMING_FIELD_BY_CATEGORY, FRAMING_IDS, GAPS_SCHEMA, HELD_PROPS, HELD_PROP_CATEGORY_LABELS, HELD_PROP_CATEGORY_ORDER, HELD_PROP_IDS, IMAGE_HINT_MODE_DEFAULT, IMAGE_REFERENCE_PROMPT_DOCTRINE, IMAGE_WIZARD_CATEGORIES, INSTRUMENTATION_DEFAULT_DATA, INSTRUMENTS, INSTRUMENT_CATEGORY_LABELS, INSTRUMENT_CATEGORY_ORDER, LENSES, LENS_IDS, LIGHTINGS, LIGHTING_CATEGORY_LABELS, LIGHTING_CATEGORY_ORDER, LIGHTING_FIELD_BY_CATEGORY, LIGHTING_IDS, LLM_CHAT_WIZARD_CATEGORIES, LOOP_SUBJECTS, LOOP_SUBJECT_CATEGORY_LABELS, LOOP_SUBJECT_CATEGORY_ORDER, MATERIALS, MATERIAL_CATEGORY_LABELS, MATERIAL_CATEGORY_ORDER, MATERIAL_IDS, MAX_SELECTED_BY_DIMENSION, MAX_SELECTED_BY_FRAMING_CATEGORY, MAX_SELECTED_BY_STYLING_DIMENSION, MAX_SUBJECT_KEYS, MOODS, MOOD_CATEGORY_LABELS, MOOD_CATEGORY_ORDER, MOOD_IDS, MOVEMENT_LABELS, MULTI_PICKER_WIRING, MUSIC_EMOTIONS, MUSIC_ENERGIES, MUSIC_ERAS, MUSIC_GENRES, MUSIC_GENRE_CATEGORY_LABELS, MUSIC_GENRE_CATEGORY_ORDER, MUSIC_GENRE_DEFAULT_DATA, MUSIC_MOOD_DEFAULT_DATA, MUSIC_VIBES, MUSIC_WIZARD_CATEGORIES, NODE_PROMPT_CANDIDATE_FIELDS, NODE_PROMPT_FIELDS, OBJECT_ANGLE_PRESETS, OBJECT_ANGLE_PROMPTS, OBJECT_ASSET_PRESETS, OBJECT_ASSET_PROMPTS, OBJECT_MATERIAL_PRESETS, OBJECT_MATERIAL_PROMPTS, OBJECT_VARIATION_PRESETS, OBJECT_VARIATION_PROMPTS, PEOPLE, PERSON_DIMENSION_LABELS, PERSON_DIMENSION_ORDER, PERSON_DIMENSION_SECTIONS, PERSON_FIELD_BY_DIMENSION, PERSON_IDS, PHOTOGRAPHERS, PHOTOGRAPHER_CATEGORY_LABELS, PHOTOGRAPHER_CATEGORY_ORDER, PHOTOGRAPHER_IDS, PHOTO_GENRES, PHOTO_GENRE_CATEGORY_LABELS, PHOTO_GENRE_CATEGORY_ORDER, PHOTO_GENRE_IDS, PICKER_ANALYZER_FAMILIES, PICKER_ANALYZER_REGISTRY, PICKER_CATALOGS, PICKER_TYPES, POSES, POSE_CATEGORY_LABELS, POSE_CATEGORY_ORDER, POSE_IDS, POST_PROCESS_EFFECTS, POST_PROCESS_EFFECT_IDS, PRODUCTION_STYLES, PROMPT_AFFIX_CORE_FIELD_OVERRIDES, PROMPT_AFFIX_NODE_TYPES, PROMPT_HINT_SEPARATOR, PROVIDER_CAPABILITIES, PROVIDER_PROMPT_DOCTRINES, REFERENCE_IMAGE_ROLES, REFERENCE_RULES, REFERENCE_RULES_MULTI_PERSON, REF_BINDING, RENDER_QUALITIES, RENDER_QUALITY_IDS, SCENE_FRAME_RULE, SCENE_PROMPT_MAX_LENGTH, SETTINGS, SETTING_CATEGORY_LABELS, SETTING_IDS, SHOT_LABELS, SINGING_STYLES, SINGLE_PICKER_WIRING, SNIPPET_MEDIA_VALUES, STYLES, STYLE_IDS, STYLE_PRESETS, STYLE_SECTION_GAP, STYLE_SECTION_HEADER, STYLINGS, STYLING_DIMENSION_LABELS, STYLING_DIMENSION_ORDER, STYLING_FIELD_BY_DIMENSION, STYLING_IDS, SUBJECT_ARRAY_CEILING, SUBJECT_CUSTOM_AGE_KEY, SUBJECT_FIELDS, SUBJECT_FOLD_KEYS, SUBJECT_ID_MAX_CHARS, SUBJECT_IMAGE_HINT_MODE_DEFAULT, SUBJECT_KEYS, SUBJECT_KEY_MAX_CHARS, SUBJECT_VIDEO_HINT_MODE_DEFAULT, TEMPORALS, TEMPORAL_CATEGORY_LABELS, TEMPORAL_CATEGORY_ORDER, TEMPORAL_FIELD_BY_CATEGORY, TEMPORAL_IDS, TERM_MAX_CHARS, TEXT_WIZARD_CATEGORIES, TRANSITIONS, TRANSITION_CATEGORY_LABELS, TRANSITION_CATEGORY_ORDER, TRANSITION_DURATIONS, TRANSITION_IDS, TRANSITION_INTENSITIES, TRANSITION_POSITIONS, VIDEO_HINT_MODE_DEFAULT, VIDEO_WIZARD_CATEGORIES, VOCAL_PRESENCE, VOCAL_PRESENCE_INSTRUMENTAL_ID, VOICE_ACCENTS, VOICE_AGES, VOICE_ARCHETYPES, VOICE_CHARACTER_DEFAULT_DATA, VOICE_DELIVERY_DEFAULT_DATA, VOICE_EMOTIONS, VOICE_GENDERS, VOICE_LANGUAGES, VOICE_PACES, VOICE_TIMBRES, WARDROBE, WARDROBE_CATEGORY_LABELS, WARDROBE_DIMENSION_ORDER, WARDROBE_FIELD_BY_DIMENSION, appendField, appendMusicMeta, applyPickerJson, applyPromptAffixes, applyReferenceOrderToVideo, applyTemplate, asBodyClauses, assembleImageInput, assembleSunoInput, buildActionFxHints, buildActionFxTerms, buildAestheticHints, buildAestheticTerms, buildAgeHint, buildAtmosphereHints, buildAtmosphereTerms, buildCharacterPrompt, buildCreaturePrompt, buildExposureHints, buildExposureTerms, buildFaceTemplateInputs, buildFramingHints, buildFramingTerms, buildHeldPropHints, buildHeldPropTerms, buildIdentityDirectives, buildIdentityLockLine, buildImagePrompt, buildImagePromptSegments, buildImagePromptWithOverflow, buildInstrumentationHints, buildInstrumentationTerms, buildLightingHints, buildLightingTerms, buildLocationMotionPrompt, buildLocationPrompt, buildLocationRefinePrompt, buildMaterialHints, buildMaterialTerms, buildMoodHints, buildMoodTerms, buildMotionPrompt, buildMultiPickerAnalyzerSpec, buildMusicGenreHints, buildMusicGenreTerms, buildMusicMoodHints, buildMusicMoodTerms, buildObjectMotionPrompt, buildObjectPrompt, buildPersonHints, buildPersonTerms, buildPhotographerHints, buildPhotographerTerms, buildPickerAnalyzerSpec, buildPickerLegend, buildPickerZodSchema, buildPoseHints, buildPoseTerms, buildPostProcessHints, buildPostProcessTerms, buildReferenceBlocks, buildScenePrompt, buildStylingHints, buildStylingTerms, buildSurroundFillPrompt, buildTemporalHints, buildTemporalTerms, buildVoiceCharacterHints, buildVoiceCharacterTerms, buildVoiceDeliveryHints, buildVoiceDeliveryTerms, buildWardrobeHints, catalogPacksVersion, characterLockToRefLock, collectIdentityLockClause, composeCameraMotionHintFromConnections, composeCameraMotionTermFromConnections, composeCharacterFxHintFromConnections, composeNegative, composePickerCatalogs, composeSectionedPrompt, composeSoundHintFromConnections, composeTransitionHintFromConnections, composeVideoPromptText, computeLlmChatFields, computeNodePrompt, computePackSidecarCoverage, deriveTerm, directionFieldsForSurface, endsInsideStyleSection, expandImagePositionRefs, expandImageRefTokens, filmStillPrefix, getActionFx, getActionFxLabel, getActionFxPromptHint, getActionFxTerm, getAesthetic, getAestheticLabel, getAestheticPromptHint, getAestheticTerm, getAtmosphere, getAtmosphereLabel, getAtmospherePromptHint, getAtmosphereTerm, getBackdrop, getBackdropLabel, getBackdropPromptHint, getBackdropTerm, getCameraFormat, getCameraFormatLabel, getCameraFormatPromptHint, getCameraFormatTerm, getCameraMotion, getCameraMotionLabel, getCameraMotionPromptHint, getCameraMotionTerm, getCategoriesForNodeType, getCharacterFx, getCharacterFxLabel, getCharacterFxPromptHint, getCharacterFxTerm, getColorLook, getColorLookLabel, getColorLookPromptHint, getColorLookTerm, getCompositionEffect, getCompositionEffectLabel, getCompositionEffectPromptHint, getCompositionEffectTerm, getEffectiveSunoCustomMode, getEra, getEraLabel, getEraPromptHint, getEraTerm, getExposure, getExposureLabel, getExposurePromptHint, getExposureTerm, getFactoryPresets, getFactorySnippets, getFraming, getFramingCategoryLimit, getFramingLabel, getFramingPromptHint, getFramingTerm, getHeldProp, getHeldPropLabel, getHeldPropPromptHint, getHeldPropTerm, getIdentityLockClause, getInstrument, getInstrumentTerm, getLens, getLensLabel, getLensPromptHint, getLensTerm, getLighting, getLightingLabel, getLightingPromptHint, getLightingTerm, getLoopSubject, getLoopSubjectLabel, getLoopSubjectPromptHint, getLoopSubjectTerm, getMaterial, getMaterialLabel, getMaterialPromptHint, getMaterialTerm, getMood, getMoodLabel, getMoodPromptHint, getMoodTerm, getMusicEmotion, getMusicEmotionTerm, getMusicEnergy, getMusicEnergyTerm, getMusicEra, getMusicEraTerm, getMusicGenre, getMusicGenreLabel, getMusicGenreTerm, getMusicSubgenre, getMusicSubgenreTerm, getMusicVibe, getMusicVibeTerm, getParameterPromptHint, getPerson, getPersonDimensionLimit, getPersonLabel, getPersonPromptHint, getPersonTerm, getPhotoGenre, getPhotoGenreLabel, getPhotoGenrePromptHint, getPhotoGenreTerm, getPhotographer, getPhotographerLabel, getPhotographerPromptHint, getPhotographerTerm, getPickerAnalyzer, getPickerCatalog, getPickerWiring, getPose, getPoseLabel, getPosePromptHint, getPoseTerm, getPostProcessEffect, getPostProcessEffectLabel, getPostProcessEffectPromptHint, getPostProcessEffectTerm, getProductionStyle, getProductionStyleTerm, getPromptDoctrine, getPromptFields, getPromptTips, getRegisteredCatalogPacks, getRegisteredPeople, getRegisteredPersonDimensionLabels, getRegisteredPersonDimensionOrder, getRegisteredPersonFieldByDimension, getRegisteredPickerCatalogs, getRegisteredSubjectKeys, getRenderQuality, getRenderQualityLabel, getRenderQualityPromptHint, getRenderQualityTerm, getSetting, getSettingLabel, getSettingPromptHint, getSettingTerm, getSingingStyle, getSingingStyleTerm, getSnippetMedia, getStyle, getStyleLabel, getStylePreset, getStylePromptHint, getStyleTerm, getStyling, getStylingDimensionLimit, getStylingLabel, getStylingPromptHint, getStylingTerm, getTemporal, getTemporalLabel, getTemporalPromptHint, getTemporalTerm, getTransition, getTransitionLabel, getTransitionPromptHint, getTransitionTerm, getVocalPresence, getVocalPresenceTerm, getVoiceAccent, getVoiceAccentTerm, getVoiceAge, getVoiceAgeTerm, getVoiceArchetype, getVoiceArchetypeTerm, getVoiceEmotion, getVoiceEmotionTerm, getVoiceGender, getVoiceGenderTerm, getVoiceLanguage, getVoiceLanguageTerm, getVoicePace, getVoicePaceTerm, getVoiceTimbre, getVoiceTimbreTerm, getWardrobeEntriesByDimension, getWardrobeEntry, getWardrobePromptHint, groupFactoryPresets, hasUpstreamCharacter, identityRefsSentence, insertBeforeStyleSection, isAnalyzablePicker, isInstrumentalVocal, isSuspiciousDerivedTerm, isVantageFraming, isWizardSupported, joinPromptHints, joinPromptParts, keepableDirectionHints, listPickerCatalogs, migratePersonValue, modeForFamily, nodeHasInlinePrompt, nodeHasPromptField, nodeSupportsPromptAffixes, normalizeSubjectFields, partitionStyleClauses, personPacksVersion, pickerFanoutTargets, projectAllCatalogs, projectPickerCatalog, promptAffixCoreField, promptBindsFirstFrame, promptFieldCarriesAffixes, promptPartSeparator, readDirectionFields, readStructuredFields, readSubjectFields, referenceRulesBlock, registerCatalogPack, registerPersonPack, renderDirectionHintClauses, renderDirectionHints, renderStructuredFields, renderStyleSection, renderSubjectHints, resetCatalogPacks, resetPersonPacks, resolveBrandInput, resolveCharacterMentions, resolveGeminiOmniI2vInputs, resolveLocationMentions, resolvePrompt, resolveRefIdTokens, resolveReferenceTokens, resolveSeedance2Inputs, resolveTemplate, resolveTerm, resolveVeoI2vInputs, resolveVideoReferenceCore, sectionedClauseCosts, splitStyleSection, styleSectionFromClauses, styleSlotFor, subjectFieldsForSurface, summarizePickerCatalogs, toIdentityLockMode, truncateForField, truncateText, withForcedIdentityLock };
|
|
34596
|
+
export { ACTION_FX, ACTION_FX_CATEGORY_LABELS, ACTION_FX_CATEGORY_ORDER, ACTION_FX_IDS, ADULT_AGE_IDS, ADULT_ONLY_FLAG, ADULT_SWEPT_CATALOG_IDS, AESTHETICS, AESTHETIC_CATEGORY_LABELS, AESTHETIC_CATEGORY_ORDER, AESTHETIC_IDS, ALL_PICKER_WIRING, ANALYZABLE_PICKER_TYPES, ANGLE_LABELS, ASPECT_RATIO_LABELS, ATMOSPHERES, ATMOSPHERE_IDS, AUDIO_WIZARD_CATEGORIES, BACKDROPS, BACKDROP_CATEGORY_LABELS, BACKDROP_CATEGORY_ORDER, BACKDROP_IDS, BRAND_PRESETS, BRAND_PRESET_IDS, BRAND_PRESET_META, CAMERA_FORMATS, CAMERA_FORMAT_IDS, CAMERA_MOTIONS, CAMERA_MOTION_CATEGORY_LABELS, CAMERA_MOTION_CATEGORY_ORDER, CAMERA_MOTION_IDS, CHARACTER_FX, CHARACTER_FX_CATEGORY_LABELS, CHARACTER_FX_CATEGORY_ORDER, CHARACTER_FX_DURATIONS, CHARACTER_FX_IDS, CHARACTER_FX_INTENSITIES, CHARACTER_FX_POSITIONS, CINEMATIC_LOOK_TAIL, COLOR_LOOKS, COLOR_LOOK_CATEGORY_LABELS, COLOR_LOOK_CATEGORY_ORDER, COLOR_LOOK_IDS, COMPOSITION_EFFECTS, COMPOSITION_EFFECT_IDS, DEFAULT_IDENTITY_LOCK, DEFAULT_TEMPLATES, DIRECTION_ARRAY_CEILING, DIRECTION_FIELDS, DIRECTION_ID_MAX_CHARS, DIRECTION_KEYS, ERAS, ERA_CATEGORY_LABELS, ERA_CATEGORY_ORDER, ERA_IDS, EXPOSURE_CATEGORY_LABELS, EXPOSURE_CATEGORY_ORDER, EXPOSURE_FIELD_BY_CATEGORY, EXPOSURE_IDS, EXPOSURE_SETTINGS, FACTORY_PRESETS, FACTORY_SNIPPETS, FILM_STILL_PREFIX, FILM_STYLE_KEYS, FLOORED_PICKER_KEYS, FRAMINGS, FRAMING_CATEGORY_LABELS, FRAMING_CATEGORY_ORDER, FRAMING_FIELD_BY_CATEGORY, FRAMING_IDS, GAPS_SCHEMA, HELD_PROPS, HELD_PROP_CATEGORY_LABELS, HELD_PROP_CATEGORY_ORDER, HELD_PROP_IDS, IMAGE_HINT_MODE_DEFAULT, IMAGE_REFERENCE_PROMPT_DOCTRINE, IMAGE_WIZARD_CATEGORIES, INSTRUMENTATION_DEFAULT_DATA, INSTRUMENTS, INSTRUMENT_CATEGORY_LABELS, INSTRUMENT_CATEGORY_ORDER, LENSES, LENS_IDS, LIGHTINGS, LIGHTING_CATEGORY_LABELS, LIGHTING_CATEGORY_ORDER, LIGHTING_FIELD_BY_CATEGORY, LIGHTING_IDS, LLM_CHAT_WIZARD_CATEGORIES, LOOP_SUBJECTS, LOOP_SUBJECT_CATEGORY_LABELS, LOOP_SUBJECT_CATEGORY_ORDER, MATERIALS, MATERIAL_CATEGORY_LABELS, MATERIAL_CATEGORY_ORDER, MATERIAL_IDS, MAX_SELECTED_BY_DIMENSION, MAX_SELECTED_BY_FRAMING_CATEGORY, MAX_SELECTED_BY_STYLING_DIMENSION, MAX_SUBJECT_KEYS, MINOR_IMPLYING_TYPE_IDS, MOODS, MOOD_CATEGORY_LABELS, MOOD_CATEGORY_ORDER, MOOD_IDS, MOVEMENT_LABELS, MULTI_PICKER_WIRING, MUSIC_EMOTIONS, MUSIC_ENERGIES, MUSIC_ERAS, MUSIC_GENRES, MUSIC_GENRE_CATEGORY_LABELS, MUSIC_GENRE_CATEGORY_ORDER, MUSIC_GENRE_DEFAULT_DATA, MUSIC_MOOD_DEFAULT_DATA, MUSIC_VIBES, MUSIC_WIZARD_CATEGORIES, NODE_PROMPT_CANDIDATE_FIELDS, NODE_PROMPT_FIELDS, OBJECT_ANGLE_PRESETS, OBJECT_ANGLE_PROMPTS, OBJECT_ASSET_PRESETS, OBJECT_ASSET_PROMPTS, OBJECT_MATERIAL_PRESETS, OBJECT_MATERIAL_PROMPTS, OBJECT_VARIATION_PRESETS, OBJECT_VARIATION_PROMPTS, PEOPLE, PERSON_DIMENSION_LABELS, PERSON_DIMENSION_ORDER, PERSON_DIMENSION_SECTIONS, PERSON_FIELD_BY_DIMENSION, PERSON_IDS, PHOTOGRAPHERS, PHOTOGRAPHER_CATEGORY_LABELS, PHOTOGRAPHER_CATEGORY_ORDER, PHOTOGRAPHER_IDS, PHOTO_GENRES, PHOTO_GENRE_CATEGORY_LABELS, PHOTO_GENRE_CATEGORY_ORDER, PHOTO_GENRE_IDS, PICKER_ANALYZER_FAMILIES, PICKER_ANALYZER_REGISTRY, PICKER_CATALOGS, PICKER_TYPES, POSES, POSE_CATEGORY_LABELS, POSE_CATEGORY_ORDER, POSE_IDS, POST_PROCESS_EFFECTS, POST_PROCESS_EFFECT_IDS, PRODUCTION_STYLES, PROMPT_AFFIX_CORE_FIELD_OVERRIDES, PROMPT_AFFIX_NODE_TYPES, PROMPT_HINT_SEPARATOR, PROVIDER_CAPABILITIES, PROVIDER_PROMPT_DOCTRINES, REFERENCE_IMAGE_ROLES, REFERENCE_RULES, REFERENCE_RULES_MULTI_PERSON, REF_BINDING, RENDER_QUALITIES, RENDER_QUALITY_IDS, SCENE_FRAME_RULE, SCENE_PROMPT_MAX_LENGTH, SETTINGS, SETTING_CATEGORY_LABELS, SETTING_IDS, SHOT_LABELS, SINGING_STYLES, SINGLE_PICKER_WIRING, SNIPPET_MEDIA_VALUES, STYLES, STYLE_IDS, STYLE_PRESETS, STYLE_SECTION_GAP, STYLE_SECTION_HEADER, STYLINGS, STYLING_DIMENSION_LABELS, STYLING_DIMENSION_ORDER, STYLING_FIELD_BY_DIMENSION, STYLING_IDS, SUBJECT_ARRAY_CEILING, SUBJECT_CUSTOM_AGE_KEY, SUBJECT_FIELDS, SUBJECT_FOLD_KEYS, SUBJECT_ID_MAX_CHARS, SUBJECT_IMAGE_HINT_MODE_DEFAULT, SUBJECT_KEYS, SUBJECT_KEY_MAX_CHARS, SUBJECT_VIDEO_HINT_MODE_DEFAULT, TEMPORALS, TEMPORAL_CATEGORY_LABELS, TEMPORAL_CATEGORY_ORDER, TEMPORAL_FIELD_BY_CATEGORY, TEMPORAL_IDS, TERM_MAX_CHARS, TEXT_WIZARD_CATEGORIES, TRANSITIONS, TRANSITION_CATEGORY_LABELS, TRANSITION_CATEGORY_ORDER, TRANSITION_DURATIONS, TRANSITION_IDS, TRANSITION_INTENSITIES, TRANSITION_POSITIONS, VIDEO_HINT_MODE_DEFAULT, VIDEO_WIZARD_CATEGORIES, VOCAL_PRESENCE, VOCAL_PRESENCE_INSTRUMENTAL_ID, VOICE_ACCENTS, VOICE_AGES, VOICE_ARCHETYPES, VOICE_CHARACTER_DEFAULT_DATA, VOICE_DELIVERY_DEFAULT_DATA, VOICE_EMOTIONS, VOICE_GENDERS, VOICE_LANGUAGES, VOICE_PACES, VOICE_TIMBRES, WARDROBE, WARDROBE_CATEGORY_LABELS, WARDROBE_DIMENSION_ORDER, WARDROBE_FIELD_BY_DIMENSION, __resetCatalogIdGuardForTests, appendField, appendMusicMeta, applyMinorAgeFloorToPickerValues, applyPickerJson, applyPromptAffixes, applyReferenceOrderToVideo, applyTemplate, asBodyClauses, assembleImageInput, assembleSunoInput, buildActionFxHints, buildActionFxTerms, buildAestheticHints, buildAestheticTerms, buildAgeHint, buildAtmosphereHints, buildAtmosphereTerms, buildCharacterPrompt, buildCreaturePrompt, buildExposureHints, buildExposureTerms, buildFaceTemplateInputs, buildFramingHints, buildFramingTerms, buildHeldPropHints, buildHeldPropTerms, buildIdentityDirectives, buildIdentityLockLine, buildImagePrompt, buildImagePromptSegments, buildImagePromptWithOverflow, buildInstrumentationHints, buildInstrumentationTerms, buildLightingHints, buildLightingTerms, buildLocationMotionPrompt, buildLocationPrompt, buildLocationRefinePrompt, buildMaterialHints, buildMaterialTerms, buildMoodHints, buildMoodTerms, buildMotionPrompt, buildMultiPickerAnalyzerSpec, buildMusicGenreHints, buildMusicGenreTerms, buildMusicMoodHints, buildMusicMoodTerms, buildNeedleAlternationSource, buildObjectMotionPrompt, buildObjectPrompt, buildPersonHints, buildPersonTerms, buildPhotographerHints, buildPhotographerTerms, buildPickerAnalyzerSpec, buildPickerLegend, buildPickerZodSchema, buildPoseHints, buildPoseTerms, buildPostProcessHints, buildPostProcessTerms, buildReferenceBlocks, buildScenePrompt, buildStylingHints, buildStylingTerms, buildSurroundFillPrompt, buildTemporalHints, buildTemporalTerms, buildVoiceCharacterHints, buildVoiceCharacterTerms, buildVoiceDeliveryHints, buildVoiceDeliveryTerms, buildWardrobeHints, catalogGuardActive, catalogPacksVersion, characterLockToRefLock, collectIdentityLockClause, composeCameraMotionHintFromConnections, composeCameraMotionTermFromConnections, composeCharacterFxHintFromConnections, composeNegative, composePickerCatalogs, composeSectionedPrompt, composeSoundHintFromConnections, composeTransitionHintFromConnections, composeVideoPromptText, composedHas, composedOption, composedOptionIndex, computeLlmChatFields, computeNodePrompt, computePackSidecarCoverage, containsMinorAgeHint, curateEntries, curatedAnimalPromptHint, curatedAnimalTerm, curatedFurnitureText, curatedVehicleText, curatedWeaponText, deriveTerm, directionFieldsForSurface, endsInsideStyleSection, expandImagePositionRefs, expandImageRefTokens, filmStillPrefix, findForeignCatalogIds, findForeignCatalogIdsInBody, foreignCatalogIdMessage, getActionFx, getActionFxLabel, getActionFxPromptHint, getActionFxTerm, getAdultOnlyEntries, getAdultOnlyHintStrings, getAdultOnlyIds, getAesthetic, getAestheticLabel, getAestheticPromptHint, getAestheticTerm, getAtmosphere, getAtmosphereLabel, getAtmospherePromptHint, getAtmosphereTerm, getBackdrop, getBackdropLabel, getBackdropPromptHint, getBackdropTerm, getCameraFormat, getCameraFormatLabel, getCameraFormatPromptHint, getCameraFormatTerm, getCameraMotion, getCameraMotionLabel, getCameraMotionPromptHint, getCameraMotionTerm, getCategoriesForNodeType, getCharacterFx, getCharacterFxLabel, getCharacterFxPromptHint, getCharacterFxTerm, getColorLook, getColorLookLabel, getColorLookPromptHint, getColorLookTerm, getCompositionEffect, getCompositionEffectLabel, getCompositionEffectPromptHint, getCompositionEffectTerm, getEffectiveSunoCustomMode, getEra, getEraLabel, getEraPromptHint, getEraTerm, getExposure, getExposureLabel, getExposurePromptHint, getExposureTerm, getFactoryPresets, getFactorySnippets, getFraming, getFramingCategoryLimit, getFramingLabel, getFramingPromptHint, getFramingTerm, getHeldProp, getHeldPropLabel, getHeldPropPromptHint, getHeldPropTerm, getIdentityLockClause, getInstrument, getInstrumentTerm, getLens, getLensLabel, getLensPromptHint, getLensTerm, getLighting, getLightingLabel, getLightingPromptHint, getLightingTerm, getLoopSubject, getLoopSubjectLabel, getLoopSubjectPromptHint, getLoopSubjectTerm, getMaterial, getMaterialLabel, getMaterialPromptHint, getMaterialTerm, getMinorAgeHintStrings, getMood, getMoodLabel, getMoodPromptHint, getMoodTerm, getMusicEmotion, getMusicEmotionTerm, getMusicEnergy, getMusicEnergyTerm, getMusicEra, getMusicEraTerm, getMusicGenre, getMusicGenreLabel, getMusicGenreTerm, getMusicSubgenre, getMusicSubgenreTerm, getMusicVibe, getMusicVibeTerm, getParameterPromptHint, getPerson, getPersonDimensionLimit, getPersonLabel, getPersonPromptHint, getPersonTerm, getPhotoGenre, getPhotoGenreLabel, getPhotoGenrePromptHint, getPhotoGenreTerm, getPhotographer, getPhotographerLabel, getPhotographerPromptHint, getPhotographerTerm, getPickerAnalyzer, getPickerCatalog, getPickerWiring, getPose, getPoseLabel, getPosePromptHint, getPoseTerm, getPostProcessEffect, getPostProcessEffectLabel, getPostProcessEffectPromptHint, getPostProcessEffectTerm, getProductionStyle, getProductionStyleTerm, getPromptDoctrine, getPromptFields, getPromptTips, getRegisteredCatalogPacks, getRegisteredPeople, getRegisteredPersonDimensionLabels, getRegisteredPersonDimensionOrder, getRegisteredPersonFieldByDimension, getRegisteredPickerCatalogs, getRegisteredSubjectKeys, getRenderQuality, getRenderQualityLabel, getRenderQualityPromptHint, getRenderQualityTerm, getSetting, getSettingLabel, getSettingPromptHint, getSettingTerm, getSingingStyle, getSingingStyleTerm, getSnippetMedia, getStyle, getStyleLabel, getStylePreset, getStylePromptHint, getStyleTerm, getStyling, getStylingDimensionLimit, getStylingLabel, getStylingPromptHint, getStylingTerm, getTemporal, getTemporalLabel, getTemporalPromptHint, getTemporalTerm, getTransition, getTransitionLabel, getTransitionPromptHint, getTransitionTerm, getVocalPresence, getVocalPresenceTerm, getVoiceAccent, getVoiceAccentTerm, getVoiceAge, getVoiceAgeTerm, getVoiceArchetype, getVoiceArchetypeTerm, getVoiceEmotion, getVoiceEmotionTerm, getVoiceGender, getVoiceGenderTerm, getVoiceLanguage, getVoiceLanguageTerm, getVoicePace, getVoicePaceTerm, getVoiceTimbre, getVoiceTimbreTerm, getWardrobeEntriesByDimension, getWardrobeEntry, getWardrobePromptHint, groupFactoryPresets, hasCatalogPacksFor, hasUpstreamCharacter, identityRefsSentence, insertBeforeStyleSection, isAnalyzablePicker, isDeniedStyleId, isInstrumentalVocal, isMinorAge, isSuspiciousDerivedTerm, isVantageFraming, isWizardSupported, joinPromptHints, joinPromptParts, keepableDirectionHints, listPickerCatalogs, migratePersonValue, modeForFamily, nodeHasInlinePrompt, nodeHasPromptField, nodeSupportsPromptAffixes, normalizeSubjectFields, overlayEntry, partitionStyleClauses, personPacksVersion, pickerFanoutTargets, projectAllCatalogs, projectPickerCatalog, promptAffixCoreField, promptBindsFirstFrame, promptFieldCarriesAffixes, promptPartSeparator, readDirectionFields, readStructuredFields, readSubjectFields, referenceRulesBlock, registerCatalogPack, registerPersonPack, renderDirectionHintClauses, renderDirectionHints, renderStructuredFields, renderStyleSection, renderSubjectHints, resetCatalogPacks, resetPersonPacks, resolveBrandInput, resolveCharacterMentions, resolveGeminiOmniI2vInputs, resolveLocationMentions, resolvePrompt, resolveRefIdTokens, resolveReferenceTokens, resolveSeedance2Inputs, resolveTemplate, resolveTerm, resolveVeoI2vInputs, resolveVideoReferenceCore, sectionedClauseCosts, setComposedCatalogResolver, splitStyleSection, styleSectionFromClauses, styleSlotFor, subjectFieldsForSurface, subscribeCatalogPacks, summarizePickerCatalogs, toIdentityLockMode, truncateForField, truncateText, withForcedIdentityLock };
|
|
34244
34597
|
//# sourceMappingURL=index.js.map
|
|
34245
34598
|
//# sourceMappingURL=index.js.map
|