@nodaro/prompts 1.49.0 → 1.50.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/{catalog-packs-C--EzV3K.d.cts → catalog-packs-DeMcSVCR.d.cts} +1 -1
  2. package/dist/{catalog-packs-BzzZCjbz.d.ts → catalog-packs-DjqvicAR.d.ts} +1 -1
  3. package/dist/{chunk-RRHU6MD5.js → chunk-34JK2G34.js} +4 -4
  4. package/dist/{chunk-RRHU6MD5.js.map → chunk-34JK2G34.js.map} +1 -1
  5. package/dist/{chunk-4V4JJUEH.js → chunk-3XSB5YDY.js} +4 -4
  6. package/dist/chunk-3XSB5YDY.js.map +1 -0
  7. package/dist/{chunk-QN3OP6TG.js → chunk-5XPELUES.js} +4 -4
  8. package/dist/chunk-5XPELUES.js.map +1 -0
  9. package/dist/{chunk-3J52HGBL.js → chunk-BWDQEAX2.js} +4 -4
  10. package/dist/{chunk-3J52HGBL.js.map → chunk-BWDQEAX2.js.map} +1 -1
  11. package/dist/{chunk-MJ5OXUDF.js → chunk-C5LP7DAQ.js} +6 -6
  12. package/dist/{chunk-MJ5OXUDF.js.map → chunk-C5LP7DAQ.js.map} +1 -1
  13. package/dist/{chunk-PJPCNKEJ.js → chunk-DB6A5I6V.js} +3 -3
  14. package/dist/{chunk-PJPCNKEJ.js.map → chunk-DB6A5I6V.js.map} +1 -1
  15. package/dist/{chunk-FDTRN7OE.js → chunk-FEOVUTFC.js} +10 -7
  16. package/dist/{chunk-FDTRN7OE.js.map → chunk-FEOVUTFC.js.map} +1 -1
  17. package/dist/{chunk-WW7IHRIE.cjs → chunk-FFPFBNXH.cjs} +4 -4
  18. package/dist/chunk-FFPFBNXH.cjs.map +1 -0
  19. package/dist/{chunk-OXJ5GN57.cjs → chunk-HR4TFBU2.cjs} +35 -35
  20. package/dist/{chunk-OXJ5GN57.cjs.map → chunk-HR4TFBU2.cjs.map} +1 -1
  21. package/dist/{chunk-NBJR7JS4.cjs → chunk-IADAATZK.cjs} +49 -49
  22. package/dist/{chunk-NBJR7JS4.cjs.map → chunk-IADAATZK.cjs.map} +1 -1
  23. package/dist/{chunk-XVAVCHPJ.js → chunk-IXBTD2LW.js} +4 -4
  24. package/dist/{chunk-XVAVCHPJ.js.map → chunk-IXBTD2LW.js.map} +1 -1
  25. package/dist/{chunk-3HMMG6W4.cjs → chunk-JGEBO6L6.cjs} +8 -8
  26. package/dist/{chunk-3HMMG6W4.cjs.map → chunk-JGEBO6L6.cjs.map} +1 -1
  27. package/dist/{chunk-NET25TEQ.cjs → chunk-KYKCHOOS.cjs} +13 -13
  28. package/dist/{chunk-NET25TEQ.cjs.map → chunk-KYKCHOOS.cjs.map} +1 -1
  29. package/dist/{chunk-KBIA4R6X.cjs → chunk-MJIKM4YZ.cjs} +130 -127
  30. package/dist/{chunk-KBIA4R6X.cjs.map → chunk-MJIKM4YZ.cjs.map} +1 -1
  31. package/dist/chunk-MUTUHJIV.js +36 -0
  32. package/dist/chunk-MUTUHJIV.js.map +1 -0
  33. package/dist/chunk-PLQFXCBU.cjs +39 -0
  34. package/dist/chunk-PLQFXCBU.cjs.map +1 -0
  35. package/dist/{chunk-MGK6SFTV.cjs → chunk-RVBO63D5.cjs} +4 -4
  36. package/dist/{chunk-MGK6SFTV.cjs.map → chunk-RVBO63D5.cjs.map} +1 -1
  37. package/dist/{chunk-3AVLIA4B.cjs → chunk-TYJCCODP.cjs} +18 -18
  38. package/dist/{chunk-3AVLIA4B.cjs.map → chunk-TYJCCODP.cjs.map} +1 -1
  39. package/dist/{chunk-7C7XLZPU.js → chunk-VJYKE6AY.js} +3 -3
  40. package/dist/{chunk-7C7XLZPU.js.map → chunk-VJYKE6AY.js.map} +1 -1
  41. package/dist/{chunk-7VVVHIMH.cjs → chunk-VYCTRGJ7.cjs} +39 -39
  42. package/dist/{chunk-7VVVHIMH.cjs.map → chunk-VYCTRGJ7.cjs.map} +1 -1
  43. package/dist/{chunk-GTN3UO74.cjs → chunk-WLN2MJ7F.cjs} +7 -7
  44. package/dist/chunk-WLN2MJ7F.cjs.map +1 -0
  45. package/dist/{chunk-NRBO4I4G.js → chunk-ZZ6UOK2P.js} +4 -4
  46. package/dist/{chunk-NRBO4I4G.js.map → chunk-ZZ6UOK2P.js.map} +1 -1
  47. package/dist/entries/assembly.cjs +29 -29
  48. package/dist/entries/assembly.js +6 -6
  49. package/dist/entries/catalog-packs.d.cts +4 -4
  50. package/dist/entries/catalog-packs.d.ts +4 -4
  51. package/dist/entries/person.d.cts +3 -3
  52. package/dist/entries/person.d.ts +3 -3
  53. package/dist/entries/picker-art.cjs +28 -20
  54. package/dist/entries/picker-art.d.cts +13 -2
  55. package/dist/entries/picker-art.d.ts +13 -2
  56. package/dist/entries/picker-art.js +2 -2
  57. package/dist/entries/picker-catalogs.cjs +57 -57
  58. package/dist/entries/picker-catalogs.d.cts +5 -3
  59. package/dist/entries/picker-catalogs.d.ts +5 -3
  60. package/dist/entries/picker-catalogs.js +5 -5
  61. package/dist/entries/pickers.cjs +383 -383
  62. package/dist/entries/pickers.d.cts +7 -1
  63. package/dist/entries/pickers.d.ts +7 -1
  64. package/dist/entries/pickers.js +3 -3
  65. package/dist/entries/presets.cjs +35 -35
  66. package/dist/entries/presets.js +1 -1
  67. package/dist/entries/prompt-builder.cjs +76 -76
  68. package/dist/entries/prompt-builder.js +5 -5
  69. package/dist/{images-DrbQB9Yh.d.ts → images-ChAOLY5V.d.cts} +5 -4
  70. package/dist/{images-DrbQB9Yh.d.cts → images-ChAOLY5V.d.ts} +5 -4
  71. package/dist/index.cjs +597 -589
  72. package/dist/index.d.cts +4 -4
  73. package/dist/index.d.ts +4 -4
  74. package/dist/index.js +11 -11
  75. package/dist/{picker-catalogs-BylSIFKL.d.cts → picker-catalogs-DzLCu6qQ.d.cts} +1 -1
  76. package/dist/{picker-catalogs-DHRyjPXb.d.ts → picker-catalogs-SDSWrufc.d.ts} +1 -1
  77. package/package.json +2 -2
  78. package/src/__tests__/fixtures/root-exports.baseline.json +5 -0
  79. package/src/__tests__/picker-art-images.test.ts +40 -0
  80. package/src/__tests__/style-display-name.test.ts +153 -0
  81. package/src/__tests__/style-labels-offered-locales.test.ts +48 -0
  82. package/src/factory-presets/generate-image.ts +1 -1
  83. package/src/factory-presets/generate-video.ts +1 -1
  84. package/src/picker-analyzer-registry.ts +9 -2
  85. package/src/picker-art/images.ts +6 -5
  86. package/src/picker-art/index.ts +1 -0
  87. package/src/picker-art/restyle-previews.ts +53 -0
  88. package/src/setting.ts +1 -1
  89. package/src/style.ts +7 -1
  90. package/dist/chunk-4V4JJUEH.js.map +0 -1
  91. package/dist/chunk-GTN3UO74.cjs.map +0 -1
  92. package/dist/chunk-HOMR5XFP.js +0 -3
  93. package/dist/chunk-HOMR5XFP.js.map +0 -1
  94. package/dist/chunk-QN3OP6TG.js.map +0 -1
  95. package/dist/chunk-T4OJFIJK.cjs +0 -4
  96. package/dist/chunk-T4OJFIJK.cjs.map +0 -1
  97. package/dist/chunk-WW7IHRIE.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/read-node-direction.ts"],"names":["DIRECTION_FIELDS","DIRECTION_ID_MAX_CHARS","DIRECTION_ARRAY_CEILING","getRegisteredSubjectKeys","SUBJECT_CUSTOM_AGE_KEY","SUBJECT_ID_MAX_CHARS","SUBJECT_ARRAY_CEILING"],"mappings":"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","file":"chunk-NET25TEQ.cjs","sourcesContent":["/**\n * Narrow readers turning UNTRUSTED persisted node data (`workflows.nodes`\n * JSONB — import, MCP write, node preset, a Studio-emitted graph) into the\n * typed `subject` / `direction` / `structured` levers `assembleImageInput`\n * accepts.\n * `buildPayload` has no zod and workflow writes are\n * `z.record(z.string(), z.unknown())`, so this blob may have been written years\n * ago by any client.\n *\n * Used by ALL THREE image-assembly sites so what the canvas accepts cannot\n * drift between them: the frontend single-node executor (`execute-node.ts`),\n * the orchestrator (`payload-builder.ts`), and the config-panel final-prompt\n * preview (`build-image-assemble-input.ts`).\n *\n * `readDirectionFields` is DERIVED FROM `DIRECTION_FIELDS`, never a hand list:\n * a dimension added to the registry is honored here by construction, so the\n * reader can never silently drop a key the wire schema and the renderer both\n * know about. Anything unrecognised is DROPPED, never thrown on — a malformed\n * blob must not fail a canvas run, and an unknown catalog ID already degrades\n * to `\"\"` inside each `get*PromptHint`, so this validates SHAPE only.\n *\n * BOUNDS MATCH THE WIRE SCHEMA where both exist, by SHARED CONSTANT:\n * `DIRECTION_ID_MAX_CHARS` and `DIRECTION_ARRAY_CEILING` are the same two\n * literals the `generate-image` route's `directionSchema` enforces, imported\n * from the registry rather than re-typed here — a body the route accepts and a\n * node the canvas re-runs must not disagree about which strings are ids.\n *\n * DELIBERATELY STRICTER THAN THE WIRE SCHEMA on `structured` values: the\n * route's `structuredPromptFieldsSchema` declares every field as a bare\n * `z.string().optional()` (unbounded), while `MAX_STRUCTURED_VALUE_CHARS` below\n * bounds them at 200. Do not \"fix\" that asymmetry by loosening HERE — this\n * reads a blob any client may have written years ago, and the values land\n * verbatim in `jobs.input_data.prompt`. Tightening the ROUTE instead would be a\n * new 400 on currently-accepted input, so a >200-char structured value stored\n * on a node is dropped on a canvas run while `POST /v1/generate-image` still\n * renders it. That is the one known divergence; it is bounded to a field the\n * canvas UI never writes that long.\n *\n * RETURNS `undefined`, NEVER `{}`: an empty object would still be a *defined*\n * `direction`, and the call sites' `...(x !== undefined ? { x } : {})` spread\n * would then hand `assembleImageInput` a defined-but-empty lever. Returning\n * `undefined` keeps that spread honest and the exact no-op branch taken.\n */\nimport {\n DIRECTION_ARRAY_CEILING,\n DIRECTION_FIELDS,\n DIRECTION_ID_MAX_CHARS,\n type DirectionFields,\n} from \"./direction-registry.js\"\nimport {\n SUBJECT_ARRAY_CEILING,\n SUBJECT_CUSTOM_AGE_KEY,\n SUBJECT_ID_MAX_CHARS,\n getRegisteredSubjectKeys,\n type SubjectFields,\n} from \"./subject-registry.js\"\nimport type { StructuredPromptFields } from \"./prompt-builder-structured-fields.js\"\n\n/**\n * Read a node's stored cinematic-direction ids. Accepts a single id OR an array\n * on every key (multi-pick dimensions carry arrays; a single-pick key may\n * legitimately carry one).\n *\n * The SEMANTIC per-dimension cap stays the renderer's slice (`maxPicks`) — this\n * reader does not know a row's pick budget and must not guess it. But it DOES\n * bound cardinality at `DIRECTION_ARRAY_CEILING`, the same ceiling the wire\n * schema enforces: the value is untrusted persisted JSONB (a node blob is\n * validated only as `z.record(z.string(), z.unknown())` on write), and handing\n * an unbounded array to `renderDirectionHints` would put an `includes`-dedupe\n * scan in front of that slice. Keeping the FIRST `DIRECTION_ARRAY_CEILING`\n * survivors is what the wire door already does to the same input.\n *\n * Junk is filtered BEFORE the cap, so valid ids sitting behind malformed\n * entries survive rather than being crowded out by them.\n */\nexport function readDirectionFields(value: unknown): DirectionFields | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined\n const src = value as Record<string, unknown>\n const out: Record<string, string | string[]> = {}\n for (const spec of DIRECTION_FIELDS) {\n const v = src[spec.key]\n if (typeof v === \"string\") {\n if (v.length > 0 && v.length <= DIRECTION_ID_MAX_CHARS) out[spec.key] = v\n } else if (Array.isArray(v)) {\n const kept: string[] = []\n for (const x of v) {\n if (kept.length >= DIRECTION_ARRAY_CEILING) break\n if (typeof x === \"string\" && x.length > 0 && x.length <= DIRECTION_ID_MAX_CHARS) {\n kept.push(x)\n }\n }\n if (kept.length > 0) out[spec.key] = kept\n }\n }\n return Object.keys(out).length > 0 ? (out as DirectionFields) : undefined\n}\n\n// ── subject ──────────────────────────────────────────────────────────────────\n\n/**\n * Read a node's stored SUBJECT ids — the flat Person / Styling / prop bag the\n * `subject` channel carries. Same three contracts as `readDirectionFields`:\n * drop-never-throw, `undefined` never `{}`, and bounds shared with the wire\n * door by CONSTANT (`SUBJECT_ID_MAX_CHARS` / `SUBJECT_ARRAY_CEILING`, which are\n * defined AS the direction constants) so a body the route accepts and the same\n * node re-run from the canvas cannot disagree about which strings are ids.\n *\n * DERIVED from `getRegisteredSubjectKeys()`, never a hand-authored field list —\n * that is the whole lesson of `readStructuredFields` below, whose hand table is\n * only viable because `StructuredPromptFields` is a small hand-authored type.\n * The subject vocabulary is ~54 catalog-derived fields PLUS deployment-registered\n * pack dimensions unknown at compile time, so it is read from the registry at\n * call time. Iterating the KEY SET (never `Object.keys(value)`) is also what\n * keeps an adversarial blob's key count off the hot path.\n *\n * The SEMANTIC per-dimension cap stays the renderer's job\n * (`normalizeSubjectFields`), exactly as `maxPicks` does for direction: this\n * reader bounds cardinality only. `customAge` is the one number on the wire and\n * is passed through finite-only — the renderer clamps it.\n */\nexport function readSubjectFields(value: unknown): SubjectFields | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined\n const src = value as Record<string, unknown>\n const out: Record<string, string | string[] | number> = {}\n for (const key of getRegisteredSubjectKeys()) {\n const v = src[key]\n if (key === SUBJECT_CUSTOM_AGE_KEY) {\n if (typeof v === \"number\" && Number.isFinite(v)) out[key] = v\n continue\n }\n if (typeof v === \"string\") {\n if (v.length > 0 && v.length <= SUBJECT_ID_MAX_CHARS) out[key] = v\n } else if (Array.isArray(v)) {\n // Junk is filtered BEFORE the cap, so valid ids sitting behind malformed\n // entries survive rather than being crowded out by them.\n const kept: string[] = []\n for (const x of v) {\n if (kept.length >= SUBJECT_ARRAY_CEILING) break\n if (typeof x === \"string\" && x.length > 0 && x.length <= SUBJECT_ID_MAX_CHARS) {\n kept.push(x)\n }\n }\n if (kept.length > 0) out[key] = kept\n }\n }\n return Object.keys(out).length > 0 ? (out as SubjectFields) : undefined\n}\n\n// ── structured ───────────────────────────────────────────────────────────────\n\ntype FieldKind = \"string\" | \"number\" | \"gender\"\nconst GENDERS = [\"man\", \"woman\", \"child\", \"non-binary\"] as const\nconst MAX_STRUCTURED_VALUE_CHARS = 200\n\ntype Group = Exclude<keyof StructuredPromptFields, \"mood\">\ntype GroupFields<K extends Group> = Record<keyof NonNullable<StructuredPromptFields[K]>, FieldKind>\n\n/**\n * A FIELD-BY-FIELD table (not a registry walk) on purpose:\n * `StructuredPromptFields` is a small HAND-AUTHORED type, not catalog-derived,\n * and the table is what blocks `person: { age: \"drop table\" }` from rendering\n * verbatim into `jobs.input_data.prompt` — `renderStructuredFields` never\n * throws on junk, but it does render it. Totality is enforced by the\n * `GroupFields<K>` / `{ [K in Group]: … }` mapped types: a new field or group\n * on the published type fails to typecheck here.\n */\nconst PERSON_FIELDS: GroupFields<\"person\"> = {\n age: \"number\",\n gender: \"gender\",\n hair: \"string\",\n eyes: \"string\",\n expression: \"string\",\n profession: \"string\",\n warriorType: \"string\",\n}\nconst STYLING_FIELDS: GroupFields<\"styling\"> = {\n mood: \"string\",\n lighting: \"string\",\n aesthetic: \"string\",\n colorLook: \"string\",\n}\nconst SETTING_FIELDS: GroupFields<\"setting\"> = {\n era: \"string\",\n atmosphere: \"string\",\n backdrop: \"string\",\n}\nconst CAMERA_FIELDS: GroupFields<\"camera\"> = {\n framing: \"string\",\n motion: \"string\",\n format: \"string\",\n}\nconst LENS_FIELDS: GroupFields<\"lens\"> = { focalLength: \"string\", aperture: \"string\" }\n\nconst STRUCTURED_GROUPS: { [K in Group]: GroupFields<K> } = {\n person: PERSON_FIELDS,\n styling: STYLING_FIELDS,\n setting: SETTING_FIELDS,\n camera: CAMERA_FIELDS,\n lens: LENS_FIELDS,\n}\n\nfunction readField(v: unknown, kind: FieldKind): string | number | undefined {\n if (kind === \"number\") return typeof v === \"number\" && Number.isFinite(v) ? v : undefined\n if (typeof v !== \"string\" || v.length === 0 || v.length > MAX_STRUCTURED_VALUE_CHARS) {\n return undefined\n }\n if (kind === \"gender\") return (GENDERS as readonly string[]).includes(v) ? v : undefined\n return v\n}\n\n/** Read a node's stored Path-1 structured prompt fields. Same drop-never-throw\n * and `undefined`-never-`{}` contract as `readDirectionFields`. */\nexport function readStructuredFields(value: unknown): StructuredPromptFields | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined\n const src = value as Record<string, unknown>\n const out: Record<string, unknown> = {}\n for (const group of Object.keys(STRUCTURED_GROUPS) as Group[]) {\n const raw = src[group]\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) continue\n const rawRec = raw as Record<string, unknown>\n const kept: Record<string, unknown> = {}\n for (const [field, kind] of Object.entries(\n STRUCTURED_GROUPS[group] as Record<string, FieldKind>,\n )) {\n const v = readField(rawRec[field], kind)\n if (v !== undefined) kept[field] = v\n }\n if (Object.keys(kept).length > 0) out[group] = kept\n }\n const mood = readField(src.mood, \"string\")\n if (mood !== undefined) out.mood = mood\n return Object.keys(out).length > 0 ? (out as StructuredPromptFields) : undefined\n}\n"]}
1
+ {"version":3,"sources":["../src/read-node-direction.ts"],"names":["DIRECTION_FIELDS","DIRECTION_ID_MAX_CHARS","DIRECTION_ARRAY_CEILING","getRegisteredSubjectKeys","SUBJECT_CUSTOM_AGE_KEY","SUBJECT_ID_MAX_CHARS","SUBJECT_ARRAY_CEILING"],"mappings":"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","file":"chunk-KYKCHOOS.cjs","sourcesContent":["/**\n * Narrow readers turning UNTRUSTED persisted node data (`workflows.nodes`\n * JSONB — import, MCP write, node preset, a Studio-emitted graph) into the\n * typed `subject` / `direction` / `structured` levers `assembleImageInput`\n * accepts.\n * `buildPayload` has no zod and workflow writes are\n * `z.record(z.string(), z.unknown())`, so this blob may have been written years\n * ago by any client.\n *\n * Used by ALL THREE image-assembly sites so what the canvas accepts cannot\n * drift between them: the frontend single-node executor (`execute-node.ts`),\n * the orchestrator (`payload-builder.ts`), and the config-panel final-prompt\n * preview (`build-image-assemble-input.ts`).\n *\n * `readDirectionFields` is DERIVED FROM `DIRECTION_FIELDS`, never a hand list:\n * a dimension added to the registry is honored here by construction, so the\n * reader can never silently drop a key the wire schema and the renderer both\n * know about. Anything unrecognised is DROPPED, never thrown on — a malformed\n * blob must not fail a canvas run, and an unknown catalog ID already degrades\n * to `\"\"` inside each `get*PromptHint`, so this validates SHAPE only.\n *\n * BOUNDS MATCH THE WIRE SCHEMA where both exist, by SHARED CONSTANT:\n * `DIRECTION_ID_MAX_CHARS` and `DIRECTION_ARRAY_CEILING` are the same two\n * literals the `generate-image` route's `directionSchema` enforces, imported\n * from the registry rather than re-typed here — a body the route accepts and a\n * node the canvas re-runs must not disagree about which strings are ids.\n *\n * DELIBERATELY STRICTER THAN THE WIRE SCHEMA on `structured` values: the\n * route's `structuredPromptFieldsSchema` declares every field as a bare\n * `z.string().optional()` (unbounded), while `MAX_STRUCTURED_VALUE_CHARS` below\n * bounds them at 200. Do not \"fix\" that asymmetry by loosening HERE — this\n * reads a blob any client may have written years ago, and the values land\n * verbatim in `jobs.input_data.prompt`. Tightening the ROUTE instead would be a\n * new 400 on currently-accepted input, so a >200-char structured value stored\n * on a node is dropped on a canvas run while `POST /v1/generate-image` still\n * renders it. That is the one known divergence; it is bounded to a field the\n * canvas UI never writes that long.\n *\n * RETURNS `undefined`, NEVER `{}`: an empty object would still be a *defined*\n * `direction`, and the call sites' `...(x !== undefined ? { x } : {})` spread\n * would then hand `assembleImageInput` a defined-but-empty lever. Returning\n * `undefined` keeps that spread honest and the exact no-op branch taken.\n */\nimport {\n DIRECTION_ARRAY_CEILING,\n DIRECTION_FIELDS,\n DIRECTION_ID_MAX_CHARS,\n type DirectionFields,\n} from \"./direction-registry.js\"\nimport {\n SUBJECT_ARRAY_CEILING,\n SUBJECT_CUSTOM_AGE_KEY,\n SUBJECT_ID_MAX_CHARS,\n getRegisteredSubjectKeys,\n type SubjectFields,\n} from \"./subject-registry.js\"\nimport type { StructuredPromptFields } from \"./prompt-builder-structured-fields.js\"\n\n/**\n * Read a node's stored cinematic-direction ids. Accepts a single id OR an array\n * on every key (multi-pick dimensions carry arrays; a single-pick key may\n * legitimately carry one).\n *\n * The SEMANTIC per-dimension cap stays the renderer's slice (`maxPicks`) — this\n * reader does not know a row's pick budget and must not guess it. But it DOES\n * bound cardinality at `DIRECTION_ARRAY_CEILING`, the same ceiling the wire\n * schema enforces: the value is untrusted persisted JSONB (a node blob is\n * validated only as `z.record(z.string(), z.unknown())` on write), and handing\n * an unbounded array to `renderDirectionHints` would put an `includes`-dedupe\n * scan in front of that slice. Keeping the FIRST `DIRECTION_ARRAY_CEILING`\n * survivors is what the wire door already does to the same input.\n *\n * Junk is filtered BEFORE the cap, so valid ids sitting behind malformed\n * entries survive rather than being crowded out by them.\n */\nexport function readDirectionFields(value: unknown): DirectionFields | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined\n const src = value as Record<string, unknown>\n const out: Record<string, string | string[]> = {}\n for (const spec of DIRECTION_FIELDS) {\n const v = src[spec.key]\n if (typeof v === \"string\") {\n if (v.length > 0 && v.length <= DIRECTION_ID_MAX_CHARS) out[spec.key] = v\n } else if (Array.isArray(v)) {\n const kept: string[] = []\n for (const x of v) {\n if (kept.length >= DIRECTION_ARRAY_CEILING) break\n if (typeof x === \"string\" && x.length > 0 && x.length <= DIRECTION_ID_MAX_CHARS) {\n kept.push(x)\n }\n }\n if (kept.length > 0) out[spec.key] = kept\n }\n }\n return Object.keys(out).length > 0 ? (out as DirectionFields) : undefined\n}\n\n// ── subject ──────────────────────────────────────────────────────────────────\n\n/**\n * Read a node's stored SUBJECT ids — the flat Person / Styling / prop bag the\n * `subject` channel carries. Same three contracts as `readDirectionFields`:\n * drop-never-throw, `undefined` never `{}`, and bounds shared with the wire\n * door by CONSTANT (`SUBJECT_ID_MAX_CHARS` / `SUBJECT_ARRAY_CEILING`, which are\n * defined AS the direction constants) so a body the route accepts and the same\n * node re-run from the canvas cannot disagree about which strings are ids.\n *\n * DERIVED from `getRegisteredSubjectKeys()`, never a hand-authored field list —\n * that is the whole lesson of `readStructuredFields` below, whose hand table is\n * only viable because `StructuredPromptFields` is a small hand-authored type.\n * The subject vocabulary is ~54 catalog-derived fields PLUS deployment-registered\n * pack dimensions unknown at compile time, so it is read from the registry at\n * call time. Iterating the KEY SET (never `Object.keys(value)`) is also what\n * keeps an adversarial blob's key count off the hot path.\n *\n * The SEMANTIC per-dimension cap stays the renderer's job\n * (`normalizeSubjectFields`), exactly as `maxPicks` does for direction: this\n * reader bounds cardinality only. `customAge` is the one number on the wire and\n * is passed through finite-only — the renderer clamps it.\n */\nexport function readSubjectFields(value: unknown): SubjectFields | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined\n const src = value as Record<string, unknown>\n const out: Record<string, string | string[] | number> = {}\n for (const key of getRegisteredSubjectKeys()) {\n const v = src[key]\n if (key === SUBJECT_CUSTOM_AGE_KEY) {\n if (typeof v === \"number\" && Number.isFinite(v)) out[key] = v\n continue\n }\n if (typeof v === \"string\") {\n if (v.length > 0 && v.length <= SUBJECT_ID_MAX_CHARS) out[key] = v\n } else if (Array.isArray(v)) {\n // Junk is filtered BEFORE the cap, so valid ids sitting behind malformed\n // entries survive rather than being crowded out by them.\n const kept: string[] = []\n for (const x of v) {\n if (kept.length >= SUBJECT_ARRAY_CEILING) break\n if (typeof x === \"string\" && x.length > 0 && x.length <= SUBJECT_ID_MAX_CHARS) {\n kept.push(x)\n }\n }\n if (kept.length > 0) out[key] = kept\n }\n }\n return Object.keys(out).length > 0 ? (out as SubjectFields) : undefined\n}\n\n// ── structured ───────────────────────────────────────────────────────────────\n\ntype FieldKind = \"string\" | \"number\" | \"gender\"\nconst GENDERS = [\"man\", \"woman\", \"child\", \"non-binary\"] as const\nconst MAX_STRUCTURED_VALUE_CHARS = 200\n\ntype Group = Exclude<keyof StructuredPromptFields, \"mood\">\ntype GroupFields<K extends Group> = Record<keyof NonNullable<StructuredPromptFields[K]>, FieldKind>\n\n/**\n * A FIELD-BY-FIELD table (not a registry walk) on purpose:\n * `StructuredPromptFields` is a small HAND-AUTHORED type, not catalog-derived,\n * and the table is what blocks `person: { age: \"drop table\" }` from rendering\n * verbatim into `jobs.input_data.prompt` — `renderStructuredFields` never\n * throws on junk, but it does render it. Totality is enforced by the\n * `GroupFields<K>` / `{ [K in Group]: … }` mapped types: a new field or group\n * on the published type fails to typecheck here.\n */\nconst PERSON_FIELDS: GroupFields<\"person\"> = {\n age: \"number\",\n gender: \"gender\",\n hair: \"string\",\n eyes: \"string\",\n expression: \"string\",\n profession: \"string\",\n warriorType: \"string\",\n}\nconst STYLING_FIELDS: GroupFields<\"styling\"> = {\n mood: \"string\",\n lighting: \"string\",\n aesthetic: \"string\",\n colorLook: \"string\",\n}\nconst SETTING_FIELDS: GroupFields<\"setting\"> = {\n era: \"string\",\n atmosphere: \"string\",\n backdrop: \"string\",\n}\nconst CAMERA_FIELDS: GroupFields<\"camera\"> = {\n framing: \"string\",\n motion: \"string\",\n format: \"string\",\n}\nconst LENS_FIELDS: GroupFields<\"lens\"> = { focalLength: \"string\", aperture: \"string\" }\n\nconst STRUCTURED_GROUPS: { [K in Group]: GroupFields<K> } = {\n person: PERSON_FIELDS,\n styling: STYLING_FIELDS,\n setting: SETTING_FIELDS,\n camera: CAMERA_FIELDS,\n lens: LENS_FIELDS,\n}\n\nfunction readField(v: unknown, kind: FieldKind): string | number | undefined {\n if (kind === \"number\") return typeof v === \"number\" && Number.isFinite(v) ? v : undefined\n if (typeof v !== \"string\" || v.length === 0 || v.length > MAX_STRUCTURED_VALUE_CHARS) {\n return undefined\n }\n if (kind === \"gender\") return (GENDERS as readonly string[]).includes(v) ? v : undefined\n return v\n}\n\n/** Read a node's stored Path-1 structured prompt fields. Same drop-never-throw\n * and `undefined`-never-`{}` contract as `readDirectionFields`. */\nexport function readStructuredFields(value: unknown): StructuredPromptFields | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined\n const src = value as Record<string, unknown>\n const out: Record<string, unknown> = {}\n for (const group of Object.keys(STRUCTURED_GROUPS) as Group[]) {\n const raw = src[group]\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) continue\n const rawRec = raw as Record<string, unknown>\n const kept: Record<string, unknown> = {}\n for (const [field, kind] of Object.entries(\n STRUCTURED_GROUPS[group] as Record<string, FieldKind>,\n )) {\n const v = readField(rawRec[field], kind)\n if (v !== undefined) kept[field] = v\n }\n if (Object.keys(kept).length > 0) out[group] = kept\n }\n const mood = readField(src.mood, \"string\")\n if (mood !== undefined) out.mood = mood\n return Object.keys(out).length > 0 ? (out as StructuredPromptFields) : undefined\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunkNBJR7JS4_cjs = require('./chunk-NBJR7JS4.cjs');
4
- var chunkOXJ5GN57_cjs = require('./chunk-OXJ5GN57.cjs');
5
- var chunkGTN3UO74_cjs = require('./chunk-GTN3UO74.cjs');
3
+ var chunkIADAATZK_cjs = require('./chunk-IADAATZK.cjs');
4
+ var chunkHR4TFBU2_cjs = require('./chunk-HR4TFBU2.cjs');
5
+ var chunkWLN2MJ7F_cjs = require('./chunk-WLN2MJ7F.cjs');
6
6
  var chunkK6NT635Z_cjs = require('./chunk-K6NT635Z.cjs');
7
7
  var chunkFY4AMIDB_cjs = require('./chunk-FY4AMIDB.cjs');
8
8
  var chunkQ7SFCCGT_cjs = require('./chunk-Q7SFCCGT.cjs');
@@ -34,7 +34,7 @@ function fieldTable() {
34
34
  m.set(field, catalogId);
35
35
  if (!byField.has(field)) byField.set(field, catalogId);
36
36
  };
37
- for (const c of chunkGTN3UO74_cjs.PICKER_CATALOGS) {
37
+ for (const c of chunkWLN2MJ7F_cjs.PICKER_CATALOGS) {
38
38
  if (c.valueField) put(c.nodeType, c.valueField, c.catalogId);
39
39
  for (const d of c.dimensions ?? []) put(c.nodeType, d.field, c.catalogId);
40
40
  for (const f of c.fields ?? []) put(c.nodeType, f, c.catalogId);
@@ -50,7 +50,7 @@ function composedIds(catalogId) {
50
50
  if (!idsMemo || idsMemo.v !== v) idsMemo = { v, byCatalog: /* @__PURE__ */ new Map() };
51
51
  const hit = idsMemo.byCatalog.get(catalogId);
52
52
  if (hit) return hit;
53
- const cat = chunkGTN3UO74_cjs.getPickerCatalog(catalogId);
53
+ const cat = chunkWLN2MJ7F_cjs.getPickerCatalog(catalogId);
54
54
  const ids = /* @__PURE__ */ new Set();
55
55
  for (const o of cat?.options ?? []) ids.add(o.id);
56
56
  for (const d of cat?.dimensions ?? []) for (const o of d.options) ids.add(o.id);
@@ -66,8 +66,8 @@ function catalogGuardActive() {
66
66
  return chunkFY4AMIDB_cjs.getRegisteredCatalogPacks().length > 0;
67
67
  }
68
68
  function isOwnUserRef(field, id) {
69
- const ref = chunkOXJ5GN57_cjs.parseUserDirectionRef(id);
70
- return ref !== null && chunkOXJ5GN57_cjs.userRefKindOfDirectionKey(field) === ref.kind;
69
+ const ref = chunkHR4TFBU2_cjs.parseUserDirectionRef(id);
70
+ return ref !== null && chunkHR4TFBU2_cjs.userRefKindOfDirectionKey(field) === ref.kind;
71
71
  }
72
72
  function checkRecord(nodeType, nodeId, data, fields, out, skip) {
73
73
  for (const [field, catalogId] of fields) {
@@ -14627,6 +14627,9 @@ function date4(params) {
14627
14627
 
14628
14628
  // ../../node_modules/zod/v4/classic/external.js
14629
14629
  config(en_default());
14630
+ function legendRow(e) {
14631
+ return { id: e.id, label: e.promptLabel ?? e.label, description: e.description };
14632
+ }
14630
14633
  var PERSON_EXCLUDED = /* @__PURE__ */ new Set(["age-custom"]);
14631
14634
  function tagDim(arr, dimension) {
14632
14635
  return arr.map((e) => ({ id: e.id, label: e.label, description: e.description, dimension }));
@@ -14639,7 +14642,7 @@ var personCleanup = (patch, mode) => {
14639
14642
  patch.customAge = void 0;
14640
14643
  }
14641
14644
  if (chunkK6NT635Z_cjs.isMinorAge(patch)) {
14642
- const drop = chunkNBJR7JS4_cjs.getAdultOnlyIds();
14645
+ const drop = chunkIADAATZK_cjs.getAdultOnlyIds();
14643
14646
  for (const [k, v] of Object.entries(patch)) {
14644
14647
  if (typeof v === "string" && drop.has(v)) patch[k] = void 0;
14645
14648
  else if (Array.isArray(v)) patch[k] = v.filter((x) => !(typeof x === "string" && drop.has(x)));
@@ -14663,61 +14666,61 @@ var PICKER_ANALYZER_REGISTRY = {
14663
14666
  kind: "discriminated",
14664
14667
  toolName: "emit_styling",
14665
14668
  discriminator: "dimension",
14666
- order: chunkGTN3UO74_cjs.STYLING_DIMENSION_ORDER,
14667
- fieldByKey: chunkGTN3UO74_cjs.STYLING_FIELD_BY_DIMENSION,
14668
- labels: chunkGTN3UO74_cjs.STYLING_DIMENSION_LABELS,
14669
- entries: chunkGTN3UO74_cjs.STYLINGS,
14670
- limitFn: (k) => chunkGTN3UO74_cjs.getStylingDimensionLimit(k)
14669
+ order: chunkWLN2MJ7F_cjs.STYLING_DIMENSION_ORDER,
14670
+ fieldByKey: chunkWLN2MJ7F_cjs.STYLING_FIELD_BY_DIMENSION,
14671
+ labels: chunkWLN2MJ7F_cjs.STYLING_DIMENSION_LABELS,
14672
+ entries: chunkWLN2MJ7F_cjs.STYLINGS,
14673
+ limitFn: (k) => chunkWLN2MJ7F_cjs.getStylingDimensionLimit(k)
14671
14674
  },
14672
14675
  framing: {
14673
14676
  kind: "discriminated",
14674
14677
  toolName: "emit_framing",
14675
14678
  discriminator: "category",
14676
- order: chunkGTN3UO74_cjs.FRAMING_CATEGORY_ORDER,
14677
- fieldByKey: chunkGTN3UO74_cjs.FRAMING_FIELD_BY_CATEGORY,
14678
- labels: chunkGTN3UO74_cjs.FRAMING_CATEGORY_LABELS,
14679
- entries: chunkGTN3UO74_cjs.FRAMINGS,
14680
- limitFn: (k) => chunkGTN3UO74_cjs.getFramingCategoryLimit(k)
14679
+ order: chunkWLN2MJ7F_cjs.FRAMING_CATEGORY_ORDER,
14680
+ fieldByKey: chunkWLN2MJ7F_cjs.FRAMING_FIELD_BY_CATEGORY,
14681
+ labels: chunkWLN2MJ7F_cjs.FRAMING_CATEGORY_LABELS,
14682
+ entries: chunkWLN2MJ7F_cjs.FRAMINGS,
14683
+ limitFn: (k) => chunkWLN2MJ7F_cjs.getFramingCategoryLimit(k)
14681
14684
  },
14682
14685
  lens: {
14683
14686
  kind: "flat",
14684
14687
  toolName: "emit_lens",
14685
14688
  field: "lens",
14686
14689
  label: "Lens",
14687
- entries: chunkGTN3UO74_cjs.LENSES
14690
+ entries: chunkWLN2MJ7F_cjs.LENSES
14688
14691
  },
14689
14692
  "camera-format": {
14690
14693
  kind: "flat",
14691
14694
  toolName: "emit_camera_format",
14692
14695
  field: "cameraFormat",
14693
14696
  label: "Camera / Film Stock",
14694
- entries: chunkGTN3UO74_cjs.CAMERA_FORMATS
14697
+ entries: chunkWLN2MJ7F_cjs.CAMERA_FORMATS
14695
14698
  },
14696
14699
  // ─── Text-to-picker expansion (Cine AI Fill): every remaining catalog ─────
14697
14700
  // Flat single-value pickers — field names match the picker wiring's
14698
14701
  // valueField (and the node-data shape the published-app input card writes).
14699
- setting: { kind: "flat", toolName: "emit_setting", field: "setting", label: "Setting", entries: chunkGTN3UO74_cjs.SETTINGS },
14700
- atmosphere: { kind: "flat", toolName: "emit_atmosphere", field: "atmosphere", label: "Atmosphere", entries: chunkGTN3UO74_cjs.ATMOSPHERES },
14701
- style: { kind: "flat", toolName: "emit_style", field: "style", label: "Style", entries: chunkGTN3UO74_cjs.STYLES },
14702
- mood: { kind: "flat", toolName: "emit_mood", field: "mood", label: "Mood", entries: chunkGTN3UO74_cjs.MOODS },
14703
- "color-look": { kind: "flat", toolName: "emit_color_look", field: "colorLook", label: "Color / Look", entries: chunkGTN3UO74_cjs.COLOR_LOOKS },
14704
- photographer: { kind: "flat", toolName: "emit_photographer", field: "photographer", label: "Photographer / Artist", entries: chunkGTN3UO74_cjs.PHOTOGRAPHERS },
14705
- aesthetic: { kind: "flat", toolName: "emit_aesthetic", field: "aesthetic", label: "Aesthetic / Microtrend", entries: chunkGTN3UO74_cjs.AESTHETICS },
14706
- era: { kind: "flat", toolName: "emit_era", field: "era", label: "Era / Period", entries: chunkGTN3UO74_cjs.ERAS },
14707
- "photo-genre": { kind: "flat", toolName: "emit_photo_genre", field: "photoGenre", label: "Photo Genre", entries: chunkGTN3UO74_cjs.PHOTO_GENRES },
14708
- backdrop: { kind: "flat", toolName: "emit_backdrop", field: "backdrop", label: "Backdrop", entries: chunkGTN3UO74_cjs.BACKDROPS },
14709
- "render-quality": { kind: "flat", toolName: "emit_render_quality", field: "renderQuality", label: "Render Quality", entries: chunkGTN3UO74_cjs.RENDER_QUALITIES },
14710
- "composition-effects": { kind: "flat", toolName: "emit_composition_effects", field: "compositionEffect", label: "Composition Effect", entries: chunkGTN3UO74_cjs.COMPOSITION_EFFECTS },
14711
- "post-process-effects": { kind: "flat", toolName: "emit_post_process_effects", field: "postProcess", label: "Post-Process Effect", entries: chunkGTN3UO74_cjs.POST_PROCESS_EFFECTS },
14712
- "action-fx": { kind: "flat", toolName: "emit_action_fx", field: "actionFx", label: "Action FX", entries: chunkGTN3UO74_cjs.ACTION_FX },
14713
- "loop-subject": { kind: "flat", toolName: "emit_loop_subject", field: "loopSubject", label: "Loop Subject", entries: chunkGTN3UO74_cjs.LOOP_SUBJECTS },
14714
- transition: { kind: "flat", toolName: "emit_transition", field: "transition", label: "Transition", entries: chunkGTN3UO74_cjs.TRANSITIONS },
14715
- "character-fx": { kind: "flat", toolName: "emit_character_fx", field: "characterFx", label: "Character FX", entries: chunkGTN3UO74_cjs.CHARACTER_FX },
14716
- "character-motion": { kind: "flat", toolName: "emit_character_motion", field: "characterMotion", label: "Character Motion", entries: chunkGTN3UO74_cjs.CHARACTER_MOTIONS },
14717
- pose: { kind: "flat", toolName: "emit_pose", field: "pose", label: "Pose", entries: chunkGTN3UO74_cjs.POSES },
14718
- material: { kind: "flat", toolName: "emit_material", field: "material", label: "Material", entries: chunkGTN3UO74_cjs.MATERIALS },
14719
- "held-prop": { kind: "flat", toolName: "emit_held_prop", field: "heldProp", label: "Held Prop", entries: chunkGTN3UO74_cjs.HELD_PROPS },
14720
- "camera-motion": { kind: "flat", toolName: "emit_camera_motion", field: "cameraMotion", label: "Camera Motion", entries: chunkGTN3UO74_cjs.CAMERA_MOTIONS },
14702
+ setting: { kind: "flat", toolName: "emit_setting", field: "setting", label: "Setting", entries: chunkWLN2MJ7F_cjs.SETTINGS },
14703
+ atmosphere: { kind: "flat", toolName: "emit_atmosphere", field: "atmosphere", label: "Atmosphere", entries: chunkWLN2MJ7F_cjs.ATMOSPHERES },
14704
+ style: { kind: "flat", toolName: "emit_style", field: "style", label: "Style", entries: chunkWLN2MJ7F_cjs.STYLES },
14705
+ mood: { kind: "flat", toolName: "emit_mood", field: "mood", label: "Mood", entries: chunkWLN2MJ7F_cjs.MOODS },
14706
+ "color-look": { kind: "flat", toolName: "emit_color_look", field: "colorLook", label: "Color / Look", entries: chunkWLN2MJ7F_cjs.COLOR_LOOKS },
14707
+ photographer: { kind: "flat", toolName: "emit_photographer", field: "photographer", label: "Photographer / Artist", entries: chunkWLN2MJ7F_cjs.PHOTOGRAPHERS },
14708
+ aesthetic: { kind: "flat", toolName: "emit_aesthetic", field: "aesthetic", label: "Aesthetic / Microtrend", entries: chunkWLN2MJ7F_cjs.AESTHETICS },
14709
+ era: { kind: "flat", toolName: "emit_era", field: "era", label: "Era / Period", entries: chunkWLN2MJ7F_cjs.ERAS },
14710
+ "photo-genre": { kind: "flat", toolName: "emit_photo_genre", field: "photoGenre", label: "Photo Genre", entries: chunkWLN2MJ7F_cjs.PHOTO_GENRES },
14711
+ backdrop: { kind: "flat", toolName: "emit_backdrop", field: "backdrop", label: "Backdrop", entries: chunkWLN2MJ7F_cjs.BACKDROPS },
14712
+ "render-quality": { kind: "flat", toolName: "emit_render_quality", field: "renderQuality", label: "Render Quality", entries: chunkWLN2MJ7F_cjs.RENDER_QUALITIES },
14713
+ "composition-effects": { kind: "flat", toolName: "emit_composition_effects", field: "compositionEffect", label: "Composition Effect", entries: chunkWLN2MJ7F_cjs.COMPOSITION_EFFECTS },
14714
+ "post-process-effects": { kind: "flat", toolName: "emit_post_process_effects", field: "postProcess", label: "Post-Process Effect", entries: chunkWLN2MJ7F_cjs.POST_PROCESS_EFFECTS },
14715
+ "action-fx": { kind: "flat", toolName: "emit_action_fx", field: "actionFx", label: "Action FX", entries: chunkWLN2MJ7F_cjs.ACTION_FX },
14716
+ "loop-subject": { kind: "flat", toolName: "emit_loop_subject", field: "loopSubject", label: "Loop Subject", entries: chunkWLN2MJ7F_cjs.LOOP_SUBJECTS },
14717
+ transition: { kind: "flat", toolName: "emit_transition", field: "transition", label: "Transition", entries: chunkWLN2MJ7F_cjs.TRANSITIONS },
14718
+ "character-fx": { kind: "flat", toolName: "emit_character_fx", field: "characterFx", label: "Character FX", entries: chunkWLN2MJ7F_cjs.CHARACTER_FX },
14719
+ "character-motion": { kind: "flat", toolName: "emit_character_motion", field: "characterMotion", label: "Character Motion", entries: chunkWLN2MJ7F_cjs.CHARACTER_MOTIONS },
14720
+ pose: { kind: "flat", toolName: "emit_pose", field: "pose", label: "Pose", entries: chunkWLN2MJ7F_cjs.POSES },
14721
+ material: { kind: "flat", toolName: "emit_material", field: "material", label: "Material", entries: chunkWLN2MJ7F_cjs.MATERIALS },
14722
+ "held-prop": { kind: "flat", toolName: "emit_held_prop", field: "heldProp", label: "Held Prop", entries: chunkWLN2MJ7F_cjs.HELD_PROPS },
14723
+ "camera-motion": { kind: "flat", toolName: "emit_camera_motion", field: "cameraMotion", label: "Camera Motion", entries: chunkWLN2MJ7F_cjs.CAMERA_MOTIONS },
14721
14724
  animal: { kind: "flat", toolName: "emit_animal", field: "animal", label: "Animal", entries: catalogs.ANIMALS },
14722
14725
  vehicle: { kind: "flat", toolName: "emit_vehicle", field: "vehicle", label: "Vehicle", entries: catalogs.VEHICLES },
14723
14726
  weapon: { kind: "flat", toolName: "emit_weapon", field: "weapon", label: "Weapon", entries: catalogs.WEAPONS },
@@ -14730,10 +14733,10 @@ var PICKER_ANALYZER_REGISTRY = {
14730
14733
  kind: "discriminated",
14731
14734
  toolName: "emit_lighting",
14732
14735
  discriminator: "category",
14733
- order: chunkGTN3UO74_cjs.LIGHTING_CATEGORY_ORDER,
14734
- fieldByKey: chunkGTN3UO74_cjs.LIGHTING_FIELD_BY_CATEGORY,
14735
- labels: chunkGTN3UO74_cjs.LIGHTING_CATEGORY_LABELS,
14736
- entries: chunkGTN3UO74_cjs.LIGHTINGS,
14736
+ order: chunkWLN2MJ7F_cjs.LIGHTING_CATEGORY_ORDER,
14737
+ fieldByKey: chunkWLN2MJ7F_cjs.LIGHTING_FIELD_BY_CATEGORY,
14738
+ labels: chunkWLN2MJ7F_cjs.LIGHTING_CATEGORY_LABELS,
14739
+ entries: chunkWLN2MJ7F_cjs.LIGHTINGS,
14737
14740
  limitFn: () => 1
14738
14741
  },
14739
14742
  temporal: {
@@ -14743,7 +14746,7 @@ var PICKER_ANALYZER_REGISTRY = {
14743
14746
  order: ["speed", "freeze", "direction", "shutter"],
14744
14747
  fieldByKey: { speed: "temporalSpeed", freeze: "temporalFreeze", direction: "temporalDirection", shutter: "temporalShutter" },
14745
14748
  labels: { speed: "Playback Speed", freeze: "Freeze", direction: "Direction", shutter: "Shutter" },
14746
- entries: chunkGTN3UO74_cjs.TEMPORALS,
14749
+ entries: chunkWLN2MJ7F_cjs.TEMPORALS,
14747
14750
  limitFn: () => 1
14748
14751
  },
14749
14752
  "exposure-settings": {
@@ -14753,7 +14756,7 @@ var PICKER_ANALYZER_REGISTRY = {
14753
14756
  order: ["aperture", "shutter-speed", "iso"],
14754
14757
  fieldByKey: { aperture: "aperture", "shutter-speed": "shutterSpeed", iso: "isoValue" },
14755
14758
  labels: { aperture: "Aperture", "shutter-speed": "Shutter Speed", iso: "ISO" },
14756
- entries: chunkGTN3UO74_cjs.EXPOSURE_SETTINGS,
14759
+ entries: chunkWLN2MJ7F_cjs.EXPOSURE_SETTINGS,
14757
14760
  limitFn: () => 1
14758
14761
  },
14759
14762
  "music-genre": {
@@ -14764,13 +14767,13 @@ var PICKER_ANALYZER_REGISTRY = {
14764
14767
  fieldByKey: { genre: "genre", subgenre: "subgenre", era: "era" },
14765
14768
  labels: { genre: "Genre", subgenre: "Subgenre", era: "Era" },
14766
14769
  entries: [
14767
- ...tagDim(chunkGTN3UO74_cjs.MUSIC_GENRES, "genre"),
14770
+ ...tagDim(chunkWLN2MJ7F_cjs.MUSIC_GENRES, "genre"),
14768
14771
  // Subgenres carry promptHint but no description — the hint doubles as
14769
14772
  // the legend text (it describes the sound well enough for matching).
14770
- ...chunkGTN3UO74_cjs.MUSIC_GENRES.flatMap(
14773
+ ...chunkWLN2MJ7F_cjs.MUSIC_GENRES.flatMap(
14771
14774
  (g) => g.subgenres.map((s) => ({ id: s.id, label: s.label, description: s.promptHint, dimension: "subgenre" }))
14772
14775
  ),
14773
- ...tagDim(chunkGTN3UO74_cjs.MUSIC_ERAS, "era")
14776
+ ...tagDim(chunkWLN2MJ7F_cjs.MUSIC_ERAS, "era")
14774
14777
  ],
14775
14778
  limitFn: (k) => k === "genre" ? 2 : 1
14776
14779
  },
@@ -14781,7 +14784,7 @@ var PICKER_ANALYZER_REGISTRY = {
14781
14784
  order: ["energy", "emotion", "vibe"],
14782
14785
  fieldByKey: { energy: "energy", emotion: "emotion", vibe: "vibe" },
14783
14786
  labels: { energy: "Energy", emotion: "Emotion", vibe: "Vibe" },
14784
- entries: [...tagDim(chunkGTN3UO74_cjs.MUSIC_ENERGIES, "energy"), ...tagDim(chunkGTN3UO74_cjs.MUSIC_EMOTIONS, "emotion"), ...tagDim(chunkGTN3UO74_cjs.MUSIC_VIBES, "vibe")],
14787
+ entries: [...tagDim(chunkWLN2MJ7F_cjs.MUSIC_ENERGIES, "energy"), ...tagDim(chunkWLN2MJ7F_cjs.MUSIC_EMOTIONS, "emotion"), ...tagDim(chunkWLN2MJ7F_cjs.MUSIC_VIBES, "vibe")],
14785
14788
  limitFn: (k) => k === "energy" ? 1 : 2
14786
14789
  },
14787
14790
  instrumentation: {
@@ -14792,10 +14795,10 @@ var PICKER_ANALYZER_REGISTRY = {
14792
14795
  fieldByKey: { instruments: "instruments", production: "production", vocalPresence: "vocalPresence", singingStyle: "singingStyle" },
14793
14796
  labels: { instruments: "Instruments", production: "Production Style", vocalPresence: "Vocal Presence", singingStyle: "Singing Style" },
14794
14797
  entries: [
14795
- ...tagDim(chunkGTN3UO74_cjs.INSTRUMENTS, "instruments"),
14796
- ...tagDim(chunkGTN3UO74_cjs.PRODUCTION_STYLES, "production"),
14797
- ...tagDim(chunkGTN3UO74_cjs.VOCAL_PRESENCE, "vocalPresence"),
14798
- ...tagDim(chunkGTN3UO74_cjs.SINGING_STYLES, "singingStyle")
14798
+ ...tagDim(chunkWLN2MJ7F_cjs.INSTRUMENTS, "instruments"),
14799
+ ...tagDim(chunkWLN2MJ7F_cjs.PRODUCTION_STYLES, "production"),
14800
+ ...tagDim(chunkWLN2MJ7F_cjs.VOCAL_PRESENCE, "vocalPresence"),
14801
+ ...tagDim(chunkWLN2MJ7F_cjs.SINGING_STYLES, "singingStyle")
14799
14802
  ],
14800
14803
  limitFn: (k) => k === "instruments" ? 3 : k === "production" ? 1 : 2
14801
14804
  },
@@ -14807,11 +14810,11 @@ var PICKER_ANALYZER_REGISTRY = {
14807
14810
  fieldByKey: { age: "age", gender: "gender", language: "language", accent: "accent", timbre: "timbre" },
14808
14811
  labels: { age: "Age", gender: "Gender", language: "Language", accent: "Accent", timbre: "Timbre" },
14809
14812
  entries: [
14810
- ...tagDim(chunkGTN3UO74_cjs.VOICE_AGES, "age"),
14811
- ...tagDim(chunkGTN3UO74_cjs.VOICE_GENDERS, "gender"),
14812
- ...tagDim(chunkGTN3UO74_cjs.VOICE_LANGUAGES, "language"),
14813
- ...tagDim(chunkGTN3UO74_cjs.VOICE_ACCENTS, "accent"),
14814
- ...tagDim(chunkGTN3UO74_cjs.VOICE_TIMBRES, "timbre")
14813
+ ...tagDim(chunkWLN2MJ7F_cjs.VOICE_AGES, "age"),
14814
+ ...tagDim(chunkWLN2MJ7F_cjs.VOICE_GENDERS, "gender"),
14815
+ ...tagDim(chunkWLN2MJ7F_cjs.VOICE_LANGUAGES, "language"),
14816
+ ...tagDim(chunkWLN2MJ7F_cjs.VOICE_ACCENTS, "accent"),
14817
+ ...tagDim(chunkWLN2MJ7F_cjs.VOICE_TIMBRES, "timbre")
14815
14818
  ],
14816
14819
  limitFn: (k) => k === "language" ? 2 : 1
14817
14820
  },
@@ -14822,7 +14825,7 @@ var PICKER_ANALYZER_REGISTRY = {
14822
14825
  order: ["pace", "emotion", "archetype"],
14823
14826
  fieldByKey: { pace: "pace", emotion: "emotion", archetype: "archetype" },
14824
14827
  labels: { pace: "Pace", emotion: "Emotion", archetype: "Archetype" },
14825
- entries: [...tagDim(chunkGTN3UO74_cjs.VOICE_PACES, "pace"), ...tagDim(chunkGTN3UO74_cjs.VOICE_EMOTIONS, "emotion"), ...tagDim(chunkGTN3UO74_cjs.VOICE_ARCHETYPES, "archetype")],
14828
+ entries: [...tagDim(chunkWLN2MJ7F_cjs.VOICE_PACES, "pace"), ...tagDim(chunkWLN2MJ7F_cjs.VOICE_EMOTIONS, "emotion"), ...tagDim(chunkWLN2MJ7F_cjs.VOICE_ARCHETYPES, "archetype")],
14826
14829
  limitFn: () => 1
14827
14830
  }
14828
14831
  };
@@ -14852,7 +14855,7 @@ function buildPickerAnalyzerSpec(pickerType) {
14852
14855
  label: d.label,
14853
14856
  limit: 1,
14854
14857
  entryIds: d.entries.map((e) => e.id),
14855
- legend: d.entries.map((e) => ({ id: e.id, label: e.label, description: e.description }))
14858
+ legend: d.entries.map(legendRow)
14856
14859
  }
14857
14860
  ]
14858
14861
  };
@@ -14867,7 +14870,7 @@ function buildPickerAnalyzerSpec(pickerType) {
14867
14870
  label: d.labels[key] ?? key,
14868
14871
  limit: d.limitFn(key),
14869
14872
  entryIds: entries.map((e) => e.id),
14870
- legend: entries.map((e) => ({ id: e.id, label: e.label, description: e.description }))
14873
+ legend: entries.map(legendRow)
14871
14874
  };
14872
14875
  });
14873
14876
  return { pickerType, toolName: d.toolName, dimensions, cleanup: d.cleanup };
@@ -15018,41 +15021,41 @@ function optionsByDiscriminator(arr, keyOf, fieldByKey) {
15018
15021
  }
15019
15022
  var SINGLE_PICKER_WIRING = [
15020
15023
  // -------- "Look" family --------
15021
- { kind: "single", nodeType: "setting", label: "Setting", valueField: "setting", defaultValue: "forest", catalogId: "setting", entries: mapCat(chunkGTN3UO74_cjs.SETTINGS, "category"), groupOrder: ["indoor", "urban", "nature", "fantastical"], groupLabels: chunkGTN3UO74_cjs.SETTING_CATEGORY_LABELS },
15022
- { kind: "single", nodeType: "atmosphere", label: "Atmosphere", valueField: "atmosphere", defaultValue: "clear", catalogId: "atmosphere", entries: mapCat(chunkGTN3UO74_cjs.ATMOSPHERES) },
15023
- { kind: "single", nodeType: "style", label: "Style", valueField: "style", defaultValue: "cinematic", catalogId: "style", entries: mapCat(chunkGTN3UO74_cjs.STYLES) },
15024
- { kind: "single", nodeType: "color-look", label: "Color / Look", valueField: "colorLook", defaultValue: "warm", catalogId: "color-look", entries: mapCat(chunkGTN3UO74_cjs.COLOR_LOOKS, "category"), groupOrder: chunkGTN3UO74_cjs.COLOR_LOOK_CATEGORY_ORDER, groupLabels: chunkGTN3UO74_cjs.COLOR_LOOK_CATEGORY_LABELS },
15025
- { kind: "single", nodeType: "mood", label: "Mood", valueField: "mood", defaultValue: "calm", catalogId: "mood", entries: mapCat(chunkGTN3UO74_cjs.MOODS, "category"), groupOrder: chunkGTN3UO74_cjs.MOOD_CATEGORY_ORDER, groupLabels: chunkGTN3UO74_cjs.MOOD_CATEGORY_LABELS },
15026
- { kind: "single", nodeType: "photographer", label: "Photographer / Artist", valueField: "photographer", defaultValue: "tim-walker", catalogId: "photographer", entries: mapCat(chunkGTN3UO74_cjs.PHOTOGRAPHERS, "category"), groupOrder: chunkGTN3UO74_cjs.PHOTOGRAPHER_CATEGORY_ORDER, groupLabels: chunkGTN3UO74_cjs.PHOTOGRAPHER_CATEGORY_LABELS },
15027
- { kind: "single", nodeType: "aesthetic", label: "Aesthetic / Microtrend", valueField: "aesthetic", defaultValue: "y2k", catalogId: "aesthetic", entries: mapCat(chunkGTN3UO74_cjs.AESTHETICS, "category"), groupOrder: chunkGTN3UO74_cjs.AESTHETIC_CATEGORY_ORDER, groupLabels: chunkGTN3UO74_cjs.AESTHETIC_CATEGORY_LABELS },
15028
- { kind: "single", nodeType: "era", label: "Era / Period", valueField: "era", defaultValue: "1990s-mall", catalogId: "era", entries: mapCat(chunkGTN3UO74_cjs.ERAS, "category"), groupOrder: chunkGTN3UO74_cjs.ERA_CATEGORY_ORDER, groupLabels: chunkGTN3UO74_cjs.ERA_CATEGORY_LABELS },
15029
- { kind: "single", nodeType: "photo-genre", label: "Photo Genre", valueField: "photoGenre", defaultValue: "fashion-editorial", catalogId: "photo-genre", entries: mapCat(chunkGTN3UO74_cjs.PHOTO_GENRES, "category"), groupOrder: chunkGTN3UO74_cjs.PHOTO_GENRE_CATEGORY_ORDER, groupLabels: chunkGTN3UO74_cjs.PHOTO_GENRE_CATEGORY_LABELS },
15030
- { kind: "single", nodeType: "backdrop", label: "Backdrop", valueField: "backdrop", defaultValue: "white-seamless", catalogId: "backdrop", entries: mapCat(chunkGTN3UO74_cjs.BACKDROPS, "category"), groupOrder: chunkGTN3UO74_cjs.BACKDROP_CATEGORY_ORDER, groupLabels: chunkGTN3UO74_cjs.BACKDROP_CATEGORY_LABELS },
15031
- { kind: "single", nodeType: "render-quality", label: "Render Quality", valueField: "renderQuality", defaultValue: "raytracing", catalogId: "render-quality", entries: mapCat(chunkGTN3UO74_cjs.RENDER_QUALITIES) },
15024
+ { kind: "single", nodeType: "setting", label: "Setting", valueField: "setting", defaultValue: "forest", catalogId: "setting", entries: mapCat(chunkWLN2MJ7F_cjs.SETTINGS, "category"), groupOrder: ["indoor", "urban", "nature", "fantastical"], groupLabels: chunkWLN2MJ7F_cjs.SETTING_CATEGORY_LABELS },
15025
+ { kind: "single", nodeType: "atmosphere", label: "Atmosphere", valueField: "atmosphere", defaultValue: "clear", catalogId: "atmosphere", entries: mapCat(chunkWLN2MJ7F_cjs.ATMOSPHERES) },
15026
+ { kind: "single", nodeType: "style", label: "Style", valueField: "style", defaultValue: "cinematic", catalogId: "style", entries: mapCat(chunkWLN2MJ7F_cjs.STYLES) },
15027
+ { kind: "single", nodeType: "color-look", label: "Color / Look", valueField: "colorLook", defaultValue: "warm", catalogId: "color-look", entries: mapCat(chunkWLN2MJ7F_cjs.COLOR_LOOKS, "category"), groupOrder: chunkWLN2MJ7F_cjs.COLOR_LOOK_CATEGORY_ORDER, groupLabels: chunkWLN2MJ7F_cjs.COLOR_LOOK_CATEGORY_LABELS },
15028
+ { kind: "single", nodeType: "mood", label: "Mood", valueField: "mood", defaultValue: "calm", catalogId: "mood", entries: mapCat(chunkWLN2MJ7F_cjs.MOODS, "category"), groupOrder: chunkWLN2MJ7F_cjs.MOOD_CATEGORY_ORDER, groupLabels: chunkWLN2MJ7F_cjs.MOOD_CATEGORY_LABELS },
15029
+ { kind: "single", nodeType: "photographer", label: "Photographer / Artist", valueField: "photographer", defaultValue: "tim-walker", catalogId: "photographer", entries: mapCat(chunkWLN2MJ7F_cjs.PHOTOGRAPHERS, "category"), groupOrder: chunkWLN2MJ7F_cjs.PHOTOGRAPHER_CATEGORY_ORDER, groupLabels: chunkWLN2MJ7F_cjs.PHOTOGRAPHER_CATEGORY_LABELS },
15030
+ { kind: "single", nodeType: "aesthetic", label: "Aesthetic / Microtrend", valueField: "aesthetic", defaultValue: "y2k", catalogId: "aesthetic", entries: mapCat(chunkWLN2MJ7F_cjs.AESTHETICS, "category"), groupOrder: chunkWLN2MJ7F_cjs.AESTHETIC_CATEGORY_ORDER, groupLabels: chunkWLN2MJ7F_cjs.AESTHETIC_CATEGORY_LABELS },
15031
+ { kind: "single", nodeType: "era", label: "Era / Period", valueField: "era", defaultValue: "1990s-mall", catalogId: "era", entries: mapCat(chunkWLN2MJ7F_cjs.ERAS, "category"), groupOrder: chunkWLN2MJ7F_cjs.ERA_CATEGORY_ORDER, groupLabels: chunkWLN2MJ7F_cjs.ERA_CATEGORY_LABELS },
15032
+ { kind: "single", nodeType: "photo-genre", label: "Photo Genre", valueField: "photoGenre", defaultValue: "fashion-editorial", catalogId: "photo-genre", entries: mapCat(chunkWLN2MJ7F_cjs.PHOTO_GENRES, "category"), groupOrder: chunkWLN2MJ7F_cjs.PHOTO_GENRE_CATEGORY_ORDER, groupLabels: chunkWLN2MJ7F_cjs.PHOTO_GENRE_CATEGORY_LABELS },
15033
+ { kind: "single", nodeType: "backdrop", label: "Backdrop", valueField: "backdrop", defaultValue: "white-seamless", catalogId: "backdrop", entries: mapCat(chunkWLN2MJ7F_cjs.BACKDROPS, "category"), groupOrder: chunkWLN2MJ7F_cjs.BACKDROP_CATEGORY_ORDER, groupLabels: chunkWLN2MJ7F_cjs.BACKDROP_CATEGORY_LABELS },
15034
+ { kind: "single", nodeType: "render-quality", label: "Render Quality", valueField: "renderQuality", defaultValue: "raytracing", catalogId: "render-quality", entries: mapCat(chunkWLN2MJ7F_cjs.RENDER_QUALITIES) },
15032
15035
  // No default effect — see the note in picker-catalogs.ts.
15033
- { kind: "single", nodeType: "composition-effects", label: "Composition Effect", valueField: "compositionEffect", defaultValue: "none", catalogId: "composition-effects", entries: mapCat(chunkGTN3UO74_cjs.COMPOSITION_EFFECTS) },
15034
- { kind: "single", nodeType: "action-fx", label: "Action FX", valueField: "actionFx", defaultValue: "earthquake-tremor", catalogId: "action-fx", entries: mapCat(chunkGTN3UO74_cjs.ACTION_FX, "category"), groupOrder: chunkGTN3UO74_cjs.ACTION_FX_CATEGORY_ORDER, groupLabels: chunkGTN3UO74_cjs.ACTION_FX_CATEGORY_LABELS },
15035
- { kind: "single", nodeType: "loop-subject", label: "Loop Subject", valueField: "loopSubject", defaultValue: "tunnel", catalogId: "loop-subject", entries: mapCat(chunkGTN3UO74_cjs.LOOP_SUBJECTS, "category"), groupOrder: chunkGTN3UO74_cjs.LOOP_SUBJECT_CATEGORY_ORDER, groupLabels: chunkGTN3UO74_cjs.LOOP_SUBJECT_CATEGORY_LABELS },
15036
- { kind: "single", nodeType: "post-process-effects", label: "Post-Process Effect", valueField: "postProcess", defaultValue: "vignette-soft", catalogId: "post-process-effects", entries: mapCat(chunkGTN3UO74_cjs.POST_PROCESS_EFFECTS) },
15036
+ { kind: "single", nodeType: "composition-effects", label: "Composition Effect", valueField: "compositionEffect", defaultValue: "none", catalogId: "composition-effects", entries: mapCat(chunkWLN2MJ7F_cjs.COMPOSITION_EFFECTS) },
15037
+ { kind: "single", nodeType: "action-fx", label: "Action FX", valueField: "actionFx", defaultValue: "earthquake-tremor", catalogId: "action-fx", entries: mapCat(chunkWLN2MJ7F_cjs.ACTION_FX, "category"), groupOrder: chunkWLN2MJ7F_cjs.ACTION_FX_CATEGORY_ORDER, groupLabels: chunkWLN2MJ7F_cjs.ACTION_FX_CATEGORY_LABELS },
15038
+ { kind: "single", nodeType: "loop-subject", label: "Loop Subject", valueField: "loopSubject", defaultValue: "tunnel", catalogId: "loop-subject", entries: mapCat(chunkWLN2MJ7F_cjs.LOOP_SUBJECTS, "category"), groupOrder: chunkWLN2MJ7F_cjs.LOOP_SUBJECT_CATEGORY_ORDER, groupLabels: chunkWLN2MJ7F_cjs.LOOP_SUBJECT_CATEGORY_LABELS },
15039
+ { kind: "single", nodeType: "post-process-effects", label: "Post-Process Effect", valueField: "postProcess", defaultValue: "vignette-soft", catalogId: "post-process-effects", entries: mapCat(chunkWLN2MJ7F_cjs.POST_PROCESS_EFFECTS) },
15037
15040
  // -------- "Camera" family --------
15038
- { kind: "single", nodeType: "camera-motion", label: "Camera Motion", valueField: "cameraMotion", defaultValue: "static", catalogId: "camera-motions", entries: mapCat(chunkGTN3UO74_cjs.CAMERA_MOTIONS, "category"), groupOrder: chunkGTN3UO74_cjs.CAMERA_MOTION_CATEGORY_ORDER, groupLabels: chunkGTN3UO74_cjs.CAMERA_MOTION_CATEGORY_LABELS },
15039
- { kind: "single", nodeType: "lens", label: "Lens", valueField: "lens", defaultValue: "normal-50mm", catalogId: "lens", entries: mapCat(chunkGTN3UO74_cjs.LENSES) },
15040
- { kind: "single", nodeType: "camera-format", label: "Camera / Film", valueField: "cameraFormat", defaultValue: "35mm-film", catalogId: "camera-format", entries: mapCat(chunkGTN3UO74_cjs.CAMERA_FORMATS) },
15041
- { kind: "single", nodeType: "transition", label: "Transition", valueField: "transition", defaultValue: "auto", catalogId: "transitions", entries: mapCat(chunkGTN3UO74_cjs.TRANSITIONS, "category"), groupOrder: chunkGTN3UO74_cjs.TRANSITION_CATEGORY_ORDER, groupLabels: chunkGTN3UO74_cjs.TRANSITION_CATEGORY_LABELS },
15042
- { kind: "single", nodeType: "character-fx", label: "Character FX", valueField: "characterFx", defaultValue: "auto", catalogId: "character-fx", entries: mapCat(chunkGTN3UO74_cjs.CHARACTER_FX, "category"), groupOrder: chunkGTN3UO74_cjs.CHARACTER_FX_CATEGORY_ORDER, groupLabels: chunkGTN3UO74_cjs.CHARACTER_FX_CATEGORY_LABELS },
15043
- { kind: "single", nodeType: "character-motion", label: "Character Motion", valueField: "characterMotion", defaultValue: "auto", catalogId: "character-motion", entries: mapCat(chunkGTN3UO74_cjs.CHARACTER_MOTIONS, "category"), groupOrder: chunkGTN3UO74_cjs.CHARACTER_MOTION_CATEGORY_ORDER, groupLabels: chunkGTN3UO74_cjs.CHARACTER_MOTION_CATEGORY_LABELS },
15041
+ { kind: "single", nodeType: "camera-motion", label: "Camera Motion", valueField: "cameraMotion", defaultValue: "static", catalogId: "camera-motions", entries: mapCat(chunkWLN2MJ7F_cjs.CAMERA_MOTIONS, "category"), groupOrder: chunkWLN2MJ7F_cjs.CAMERA_MOTION_CATEGORY_ORDER, groupLabels: chunkWLN2MJ7F_cjs.CAMERA_MOTION_CATEGORY_LABELS },
15042
+ { kind: "single", nodeType: "lens", label: "Lens", valueField: "lens", defaultValue: "normal-50mm", catalogId: "lens", entries: mapCat(chunkWLN2MJ7F_cjs.LENSES) },
15043
+ { kind: "single", nodeType: "camera-format", label: "Camera / Film", valueField: "cameraFormat", defaultValue: "35mm-film", catalogId: "camera-format", entries: mapCat(chunkWLN2MJ7F_cjs.CAMERA_FORMATS) },
15044
+ { kind: "single", nodeType: "transition", label: "Transition", valueField: "transition", defaultValue: "auto", catalogId: "transitions", entries: mapCat(chunkWLN2MJ7F_cjs.TRANSITIONS, "category"), groupOrder: chunkWLN2MJ7F_cjs.TRANSITION_CATEGORY_ORDER, groupLabels: chunkWLN2MJ7F_cjs.TRANSITION_CATEGORY_LABELS },
15045
+ { kind: "single", nodeType: "character-fx", label: "Character FX", valueField: "characterFx", defaultValue: "auto", catalogId: "character-fx", entries: mapCat(chunkWLN2MJ7F_cjs.CHARACTER_FX, "category"), groupOrder: chunkWLN2MJ7F_cjs.CHARACTER_FX_CATEGORY_ORDER, groupLabels: chunkWLN2MJ7F_cjs.CHARACTER_FX_CATEGORY_LABELS },
15046
+ { kind: "single", nodeType: "character-motion", label: "Character Motion", valueField: "characterMotion", defaultValue: "auto", catalogId: "character-motion", entries: mapCat(chunkWLN2MJ7F_cjs.CHARACTER_MOTIONS, "category"), groupOrder: chunkWLN2MJ7F_cjs.CHARACTER_MOTION_CATEGORY_ORDER, groupLabels: chunkWLN2MJ7F_cjs.CHARACTER_MOTION_CATEGORY_LABELS },
15044
15047
  // -------- "Subject / Object" family --------
15045
- { kind: "single", nodeType: "pose", label: "Pose", valueField: "pose", defaultValue: "standing-upright", catalogId: "pose", entries: mapCat(chunkGTN3UO74_cjs.POSES, "category"), groupOrder: chunkGTN3UO74_cjs.POSE_CATEGORY_ORDER, groupLabels: chunkGTN3UO74_cjs.POSE_CATEGORY_LABELS },
15046
- { kind: "single", nodeType: "material", label: "Material", valueField: "material", defaultValue: "silk", catalogId: "materials", entries: mapCat(chunkGTN3UO74_cjs.MATERIALS, "category"), groupOrder: chunkGTN3UO74_cjs.MATERIAL_CATEGORY_ORDER, groupLabels: chunkGTN3UO74_cjs.MATERIAL_CATEGORY_LABELS },
15048
+ { kind: "single", nodeType: "pose", label: "Pose", valueField: "pose", defaultValue: "standing-upright", catalogId: "pose", entries: mapCat(chunkWLN2MJ7F_cjs.POSES, "category"), groupOrder: chunkWLN2MJ7F_cjs.POSE_CATEGORY_ORDER, groupLabels: chunkWLN2MJ7F_cjs.POSE_CATEGORY_LABELS },
15049
+ { kind: "single", nodeType: "material", label: "Material", valueField: "material", defaultValue: "silk", catalogId: "materials", entries: mapCat(chunkWLN2MJ7F_cjs.MATERIALS, "category"), groupOrder: chunkWLN2MJ7F_cjs.MATERIAL_CATEGORY_ORDER, groupLabels: chunkWLN2MJ7F_cjs.MATERIAL_CATEGORY_LABELS },
15047
15050
  { kind: "single", nodeType: "animal", label: "Animal", valueField: "animal", defaultValue: "dog-golden-retriever", catalogId: "animals", entries: mapCat(catalogs.ANIMALS, "subcategory"), groupOrder: catalogs.ANIMAL_SUBCATEGORY_ORDER, groupLabels: catalogs.ANIMAL_SUBCATEGORY_LABELS },
15048
15051
  { kind: "single", nodeType: "vehicle", label: "Vehicle", valueField: "vehicle", defaultValue: "sedan", catalogId: "vehicles", entries: mapCat(catalogs.VEHICLES, "subcategory"), groupOrder: catalogs.VEHICLE_SUBCATEGORY_ORDER, groupLabels: catalogs.VEHICLE_SUBCATEGORY_LABELS },
15049
15052
  { kind: "single", nodeType: "weapon", label: "Weapon", valueField: "weapon", defaultValue: "katana", catalogId: "weapons", entries: mapCat(catalogs.WEAPONS, "subcategory"), groupOrder: catalogs.WEAPON_SUBCATEGORY_ORDER, groupLabels: catalogs.WEAPON_SUBCATEGORY_LABELS },
15050
15053
  { kind: "single", nodeType: "furniture", label: "Furniture", valueField: "furniture", defaultValue: "sofa", catalogId: "furniture", entries: mapCat(catalogs.FURNITURE, "subcategory"), groupOrder: catalogs.FURNITURE_SUBCATEGORY_ORDER, groupLabels: catalogs.FURNITURE_SUBCATEGORY_LABELS },
15051
- { kind: "single", nodeType: "held-prop", label: "Held Prop", valueField: "heldProp", defaultValue: "smartphone", catalogId: "held-prop", entries: mapCat(chunkGTN3UO74_cjs.HELD_PROPS, "category"), groupOrder: chunkGTN3UO74_cjs.HELD_PROP_CATEGORY_ORDER, groupLabels: chunkGTN3UO74_cjs.HELD_PROP_CATEGORY_LABELS }
15054
+ { kind: "single", nodeType: "held-prop", label: "Held Prop", valueField: "heldProp", defaultValue: "smartphone", catalogId: "held-prop", entries: mapCat(chunkWLN2MJ7F_cjs.HELD_PROPS, "category"), groupOrder: chunkWLN2MJ7F_cjs.HELD_PROP_CATEGORY_ORDER, groupLabels: chunkWLN2MJ7F_cjs.HELD_PROP_CATEGORY_LABELS }
15052
15055
  ];
15053
- var STYLING_FIELDS = chunkGTN3UO74_cjs.STYLING_DIMENSION_ORDER.map((d) => chunkGTN3UO74_cjs.STYLING_FIELD_BY_DIMENSION[d]);
15056
+ var STYLING_FIELDS = chunkWLN2MJ7F_cjs.STYLING_DIMENSION_ORDER.map((d) => chunkWLN2MJ7F_cjs.STYLING_FIELD_BY_DIMENSION[d]);
15054
15057
  var PERSON_FIELDS = chunkK6NT635Z_cjs.PERSON_DIMENSION_ORDER.map((d) => chunkK6NT635Z_cjs.PERSON_FIELD_BY_DIMENSION[d]);
15055
- var LIGHTING_FIELDS = chunkGTN3UO74_cjs.LIGHTING_CATEGORY_ORDER.map((c) => chunkGTN3UO74_cjs.LIGHTING_FIELD_BY_CATEGORY[c]);
15058
+ var LIGHTING_FIELDS = chunkWLN2MJ7F_cjs.LIGHTING_CATEGORY_ORDER.map((c) => chunkWLN2MJ7F_cjs.LIGHTING_FIELD_BY_CATEGORY[c]);
15056
15059
  var TEMPORAL_FIELD_BY_CATEGORY = {
15057
15060
  speed: "temporalSpeed",
15058
15061
  freeze: "temporalFreeze",
@@ -15071,8 +15074,8 @@ var MULTI_PICKER_WIRING = [
15071
15074
  label: "Framing",
15072
15075
  fields: ["shotSize", "angle", "coverage", "composition", "vantage"],
15073
15076
  catalogId: "framing",
15074
- catalogEntries: flatCat(chunkGTN3UO74_cjs.FRAMINGS),
15075
- fieldOptions: optionsByDiscriminator(chunkGTN3UO74_cjs.FRAMINGS, (e) => e.category, chunkGTN3UO74_cjs.FRAMING_FIELD_BY_CATEGORY)
15077
+ catalogEntries: flatCat(chunkWLN2MJ7F_cjs.FRAMINGS),
15078
+ fieldOptions: optionsByDiscriminator(chunkWLN2MJ7F_cjs.FRAMINGS, (e) => e.category, chunkWLN2MJ7F_cjs.FRAMING_FIELD_BY_CATEGORY)
15076
15079
  },
15077
15080
  {
15078
15081
  kind: "multi",
@@ -15080,8 +15083,8 @@ var MULTI_PICKER_WIRING = [
15080
15083
  label: "Lighting",
15081
15084
  fields: LIGHTING_FIELDS,
15082
15085
  catalogId: "lighting",
15083
- catalogEntries: flatCat(chunkGTN3UO74_cjs.LIGHTINGS),
15084
- fieldOptions: optionsByDiscriminator(chunkGTN3UO74_cjs.LIGHTINGS, (e) => e.category, chunkGTN3UO74_cjs.LIGHTING_FIELD_BY_CATEGORY)
15086
+ catalogEntries: flatCat(chunkWLN2MJ7F_cjs.LIGHTINGS),
15087
+ fieldOptions: optionsByDiscriminator(chunkWLN2MJ7F_cjs.LIGHTINGS, (e) => e.category, chunkWLN2MJ7F_cjs.LIGHTING_FIELD_BY_CATEGORY)
15085
15088
  },
15086
15089
  {
15087
15090
  kind: "multi",
@@ -15098,8 +15101,8 @@ var MULTI_PICKER_WIRING = [
15098
15101
  label: "Styling",
15099
15102
  fields: STYLING_FIELDS,
15100
15103
  catalogId: "styling",
15101
- catalogEntries: flatCat(chunkGTN3UO74_cjs.STYLINGS),
15102
- fieldOptions: optionsByDiscriminator(chunkGTN3UO74_cjs.STYLINGS, (e) => e.dimension, chunkGTN3UO74_cjs.STYLING_FIELD_BY_DIMENSION)
15104
+ catalogEntries: flatCat(chunkWLN2MJ7F_cjs.STYLINGS),
15105
+ fieldOptions: optionsByDiscriminator(chunkWLN2MJ7F_cjs.STYLINGS, (e) => e.dimension, chunkWLN2MJ7F_cjs.STYLING_FIELD_BY_DIMENSION)
15103
15106
  },
15104
15107
  {
15105
15108
  kind: "multi",
@@ -15107,8 +15110,8 @@ var MULTI_PICKER_WIRING = [
15107
15110
  label: "Temporal",
15108
15111
  fields: ["temporalSpeed", "temporalFreeze", "temporalDirection", "temporalShutter"],
15109
15112
  catalogId: "temporal",
15110
- catalogEntries: flatCat(chunkGTN3UO74_cjs.TEMPORALS),
15111
- fieldOptions: optionsByDiscriminator(chunkGTN3UO74_cjs.TEMPORALS, (e) => e.category, TEMPORAL_FIELD_BY_CATEGORY)
15113
+ catalogEntries: flatCat(chunkWLN2MJ7F_cjs.TEMPORALS),
15114
+ fieldOptions: optionsByDiscriminator(chunkWLN2MJ7F_cjs.TEMPORALS, (e) => e.category, TEMPORAL_FIELD_BY_CATEGORY)
15112
15115
  },
15113
15116
  {
15114
15117
  kind: "multi",
@@ -15116,8 +15119,8 @@ var MULTI_PICKER_WIRING = [
15116
15119
  label: "Exposure Settings",
15117
15120
  fields: ["aperture", "shutterSpeed", "isoValue"],
15118
15121
  catalogId: "exposure-settings",
15119
- catalogEntries: flatCat(chunkGTN3UO74_cjs.EXPOSURE_SETTINGS),
15120
- fieldOptions: optionsByDiscriminator(chunkGTN3UO74_cjs.EXPOSURE_SETTINGS, (e) => e.category, EXPOSURE_FIELD_BY_CATEGORY)
15122
+ catalogEntries: flatCat(chunkWLN2MJ7F_cjs.EXPOSURE_SETTINGS),
15123
+ fieldOptions: optionsByDiscriminator(chunkWLN2MJ7F_cjs.EXPOSURE_SETTINGS, (e) => e.category, EXPOSURE_FIELD_BY_CATEGORY)
15121
15124
  },
15122
15125
  // -------- "Sound" family --------
15123
15126
  // Music Genre catalog is hierarchical: flatten genres + every subgenre +
@@ -15129,14 +15132,14 @@ var MULTI_PICKER_WIRING = [
15129
15132
  fields: ["genre", "subgenre", "era"],
15130
15133
  catalogId: "music-genre",
15131
15134
  catalogEntries: [
15132
- ...flatCat(chunkGTN3UO74_cjs.MUSIC_GENRES),
15133
- ...chunkGTN3UO74_cjs.MUSIC_GENRES.flatMap((g) => g.subgenres.map((s) => ({ id: s.id, label: s.label }))),
15134
- ...flatCat(chunkGTN3UO74_cjs.MUSIC_ERAS)
15135
+ ...flatCat(chunkWLN2MJ7F_cjs.MUSIC_GENRES),
15136
+ ...chunkWLN2MJ7F_cjs.MUSIC_GENRES.flatMap((g) => g.subgenres.map((s) => ({ id: s.id, label: s.label }))),
15137
+ ...flatCat(chunkWLN2MJ7F_cjs.MUSIC_ERAS)
15135
15138
  ],
15136
15139
  fieldOptions: {
15137
- genre: flatCat(chunkGTN3UO74_cjs.MUSIC_GENRES),
15138
- subgenre: chunkGTN3UO74_cjs.MUSIC_GENRES.flatMap((g) => g.subgenres.map((s) => ({ id: s.id, label: s.label }))),
15139
- era: flatCat(chunkGTN3UO74_cjs.MUSIC_ERAS)
15140
+ genre: flatCat(chunkWLN2MJ7F_cjs.MUSIC_GENRES),
15141
+ subgenre: chunkWLN2MJ7F_cjs.MUSIC_GENRES.flatMap((g) => g.subgenres.map((s) => ({ id: s.id, label: s.label }))),
15142
+ era: flatCat(chunkWLN2MJ7F_cjs.MUSIC_ERAS)
15140
15143
  }
15141
15144
  },
15142
15145
  {
@@ -15145,11 +15148,11 @@ var MULTI_PICKER_WIRING = [
15145
15148
  label: "Music Mood",
15146
15149
  fields: ["energy", "emotion", "vibe"],
15147
15150
  catalogId: "music-mood",
15148
- catalogEntries: [...flatCat(chunkGTN3UO74_cjs.MUSIC_ENERGIES), ...flatCat(chunkGTN3UO74_cjs.MUSIC_EMOTIONS), ...flatCat(chunkGTN3UO74_cjs.MUSIC_VIBES)],
15151
+ catalogEntries: [...flatCat(chunkWLN2MJ7F_cjs.MUSIC_ENERGIES), ...flatCat(chunkWLN2MJ7F_cjs.MUSIC_EMOTIONS), ...flatCat(chunkWLN2MJ7F_cjs.MUSIC_VIBES)],
15149
15152
  fieldOptions: {
15150
- energy: flatCat(chunkGTN3UO74_cjs.MUSIC_ENERGIES),
15151
- emotion: flatCat(chunkGTN3UO74_cjs.MUSIC_EMOTIONS),
15152
- vibe: flatCat(chunkGTN3UO74_cjs.MUSIC_VIBES)
15153
+ energy: flatCat(chunkWLN2MJ7F_cjs.MUSIC_ENERGIES),
15154
+ emotion: flatCat(chunkWLN2MJ7F_cjs.MUSIC_EMOTIONS),
15155
+ vibe: flatCat(chunkWLN2MJ7F_cjs.MUSIC_VIBES)
15153
15156
  }
15154
15157
  },
15155
15158
  {
@@ -15158,12 +15161,12 @@ var MULTI_PICKER_WIRING = [
15158
15161
  label: "Instrumentation",
15159
15162
  fields: ["instruments", "production", "vocalPresence", "singingStyle"],
15160
15163
  catalogId: "instrumentation",
15161
- catalogEntries: [...flatCat(chunkGTN3UO74_cjs.INSTRUMENTS), ...flatCat(chunkGTN3UO74_cjs.PRODUCTION_STYLES), ...flatCat(chunkGTN3UO74_cjs.VOCAL_PRESENCE), ...flatCat(chunkGTN3UO74_cjs.SINGING_STYLES)],
15164
+ catalogEntries: [...flatCat(chunkWLN2MJ7F_cjs.INSTRUMENTS), ...flatCat(chunkWLN2MJ7F_cjs.PRODUCTION_STYLES), ...flatCat(chunkWLN2MJ7F_cjs.VOCAL_PRESENCE), ...flatCat(chunkWLN2MJ7F_cjs.SINGING_STYLES)],
15162
15165
  fieldOptions: {
15163
- instruments: flatCat(chunkGTN3UO74_cjs.INSTRUMENTS),
15164
- production: flatCat(chunkGTN3UO74_cjs.PRODUCTION_STYLES),
15165
- vocalPresence: flatCat(chunkGTN3UO74_cjs.VOCAL_PRESENCE),
15166
- singingStyle: flatCat(chunkGTN3UO74_cjs.SINGING_STYLES)
15166
+ instruments: flatCat(chunkWLN2MJ7F_cjs.INSTRUMENTS),
15167
+ production: flatCat(chunkWLN2MJ7F_cjs.PRODUCTION_STYLES),
15168
+ vocalPresence: flatCat(chunkWLN2MJ7F_cjs.VOCAL_PRESENCE),
15169
+ singingStyle: flatCat(chunkWLN2MJ7F_cjs.SINGING_STYLES)
15167
15170
  }
15168
15171
  },
15169
15172
  {
@@ -15172,13 +15175,13 @@ var MULTI_PICKER_WIRING = [
15172
15175
  label: "Voice Character",
15173
15176
  fields: ["age", "gender", "language", "accent", "timbre"],
15174
15177
  catalogId: "voice-character",
15175
- catalogEntries: [...flatCat(chunkGTN3UO74_cjs.VOICE_AGES), ...flatCat(chunkGTN3UO74_cjs.VOICE_GENDERS), ...flatCat(chunkGTN3UO74_cjs.VOICE_LANGUAGES), ...flatCat(chunkGTN3UO74_cjs.VOICE_ACCENTS), ...flatCat(chunkGTN3UO74_cjs.VOICE_TIMBRES)],
15178
+ catalogEntries: [...flatCat(chunkWLN2MJ7F_cjs.VOICE_AGES), ...flatCat(chunkWLN2MJ7F_cjs.VOICE_GENDERS), ...flatCat(chunkWLN2MJ7F_cjs.VOICE_LANGUAGES), ...flatCat(chunkWLN2MJ7F_cjs.VOICE_ACCENTS), ...flatCat(chunkWLN2MJ7F_cjs.VOICE_TIMBRES)],
15176
15179
  fieldOptions: {
15177
- age: flatCat(chunkGTN3UO74_cjs.VOICE_AGES),
15178
- gender: flatCat(chunkGTN3UO74_cjs.VOICE_GENDERS),
15179
- language: flatCat(chunkGTN3UO74_cjs.VOICE_LANGUAGES),
15180
- accent: flatCat(chunkGTN3UO74_cjs.VOICE_ACCENTS),
15181
- timbre: flatCat(chunkGTN3UO74_cjs.VOICE_TIMBRES)
15180
+ age: flatCat(chunkWLN2MJ7F_cjs.VOICE_AGES),
15181
+ gender: flatCat(chunkWLN2MJ7F_cjs.VOICE_GENDERS),
15182
+ language: flatCat(chunkWLN2MJ7F_cjs.VOICE_LANGUAGES),
15183
+ accent: flatCat(chunkWLN2MJ7F_cjs.VOICE_ACCENTS),
15184
+ timbre: flatCat(chunkWLN2MJ7F_cjs.VOICE_TIMBRES)
15182
15185
  }
15183
15186
  },
15184
15187
  {
@@ -15187,11 +15190,11 @@ var MULTI_PICKER_WIRING = [
15187
15190
  label: "Voice Delivery",
15188
15191
  fields: ["pace", "emotion", "archetype"],
15189
15192
  catalogId: "voice-delivery",
15190
- catalogEntries: [...flatCat(chunkGTN3UO74_cjs.VOICE_PACES), ...flatCat(chunkGTN3UO74_cjs.VOICE_EMOTIONS), ...flatCat(chunkGTN3UO74_cjs.VOICE_ARCHETYPES)],
15193
+ catalogEntries: [...flatCat(chunkWLN2MJ7F_cjs.VOICE_PACES), ...flatCat(chunkWLN2MJ7F_cjs.VOICE_EMOTIONS), ...flatCat(chunkWLN2MJ7F_cjs.VOICE_ARCHETYPES)],
15191
15194
  fieldOptions: {
15192
- pace: flatCat(chunkGTN3UO74_cjs.VOICE_PACES),
15193
- emotion: flatCat(chunkGTN3UO74_cjs.VOICE_EMOTIONS),
15194
- archetype: flatCat(chunkGTN3UO74_cjs.VOICE_ARCHETYPES)
15195
+ pace: flatCat(chunkWLN2MJ7F_cjs.VOICE_PACES),
15196
+ emotion: flatCat(chunkWLN2MJ7F_cjs.VOICE_EMOTIONS),
15197
+ archetype: flatCat(chunkWLN2MJ7F_cjs.VOICE_ARCHETYPES)
15195
15198
  }
15196
15199
  }
15197
15200
  ];
@@ -15227,5 +15230,5 @@ exports.getPickerAnalyzer = getPickerAnalyzer;
15227
15230
  exports.getPickerWiring = getPickerWiring;
15228
15231
  exports.isAnalyzablePicker = isAnalyzablePicker;
15229
15232
  exports.pickerFanoutTargets = pickerFanoutTargets;
15230
- //# sourceMappingURL=chunk-KBIA4R6X.cjs.map
15231
- //# sourceMappingURL=chunk-KBIA4R6X.cjs.map
15233
+ //# sourceMappingURL=chunk-MJIKM4YZ.cjs.map
15234
+ //# sourceMappingURL=chunk-MJIKM4YZ.cjs.map