@adminide-stack/yantra-mobile 12.0.121 → 12.0.123-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/lib/features/apps/appArt.js +1 -1
  2. package/lib/features/apps/appArt.js.map +1 -1
  3. package/lib/features/apps/mobileAppCatalog.js +15 -11
  4. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  5. package/lib/features/canvas/CanvasAgentChatPane.js +82 -20
  6. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
  7. package/lib/features/canvas/CanvasBoardsGrid.js +291 -100
  8. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  9. package/lib/features/canvas/CanvasEditToolsPanel.js +105 -12
  10. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
  11. package/lib/features/canvas/CanvasExperience.js +266 -68
  12. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  13. package/lib/features/canvas/CanvasGeneratePanel.js +204 -66
  14. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
  15. package/lib/features/canvas/CanvasLibrarySheet.js +31 -13
  16. package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -1
  17. package/lib/features/canvas/CanvasModelPicker.js +176 -0
  18. package/lib/features/canvas/CanvasModelPicker.js.map +1 -0
  19. package/lib/features/canvas/CanvasTasksPanel.js +325 -29
  20. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
  21. package/lib/features/canvas/CanvasTemplatesPanel.js +5 -4
  22. package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -1
  23. package/lib/features/canvas/CanvasToolDock.js +137 -61
  24. package/lib/features/canvas/CanvasToolDock.js.map +1 -1
  25. package/lib/features/canvas/FrameExtractorExperience.js +33 -2
  26. package/lib/features/canvas/FrameExtractorExperience.js.map +1 -1
  27. package/lib/features/canvas/GeneratorReferenceSlots.js +197 -0
  28. package/lib/features/canvas/GeneratorReferenceSlots.js.map +1 -0
  29. package/lib/features/canvas/NativeCanvasViewer.js +89 -11
  30. package/lib/features/canvas/NativeCanvasViewer.js.map +1 -1
  31. package/lib/features/canvas/PromoContextFields.js +55 -2
  32. package/lib/features/canvas/PromoContextFields.js.map +1 -1
  33. package/lib/features/canvas/SetStudioExperience.js +323 -13
  34. package/lib/features/canvas/SetStudioExperience.js.map +1 -1
  35. package/lib/features/canvas/VideoEditExperience.js +1 -53
  36. package/lib/features/canvas/VideoEditExperience.js.map +1 -1
  37. package/lib/features/canvas/VideoEditorExperience.js +697 -506
  38. package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
  39. package/lib/features/canvas/VideoGeneratorExperience.js +22 -5
  40. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
  41. package/lib/features/canvas/canvasAgentChat.js +125 -11
  42. package/lib/features/canvas/canvasAgentChat.js.map +1 -1
  43. package/lib/features/canvas/canvasCore.js +117 -12
  44. package/lib/features/canvas/canvasCore.js.map +1 -1
  45. package/lib/features/canvas/canvasEditOps.js +148 -111
  46. package/lib/features/canvas/canvasEditOps.js.map +1 -1
  47. package/lib/features/canvas/canvasTaskSync.js +235 -0
  48. package/lib/features/canvas/canvasTaskSync.js.map +1 -0
  49. package/lib/features/canvas/canvasTasks.js +98 -11
  50. package/lib/features/canvas/canvasTasks.js.map +1 -1
  51. package/lib/features/canvas/createTiles.js +247 -0
  52. package/lib/features/canvas/createTiles.js.map +1 -0
  53. package/lib/features/canvas/deepLinks.js +83 -0
  54. package/lib/features/canvas/deepLinks.js.map +1 -0
  55. package/lib/features/canvas/frameExtract.js +13 -1
  56. package/lib/features/canvas/frameExtract.js.map +1 -1
  57. package/lib/features/canvas/generationModels.js +36 -8
  58. package/lib/features/canvas/generationModels.js.map +1 -1
  59. package/lib/features/canvas/generatorCommands.js +106 -0
  60. package/lib/features/canvas/generatorCommands.js.map +1 -0
  61. package/lib/features/canvas/generatorReferences.js +82 -0
  62. package/lib/features/canvas/generatorReferences.js.map +1 -0
  63. package/lib/features/canvas/homeWork.js +74 -0
  64. package/lib/features/canvas/homeWork.js.map +1 -0
  65. package/lib/features/canvas/linksRpc.js +130 -0
  66. package/lib/features/canvas/linksRpc.js.map +1 -0
  67. package/lib/features/canvas/mediaRecheck.js +176 -0
  68. package/lib/features/canvas/mediaRecheck.js.map +1 -0
  69. package/lib/features/canvas/mediaUrls.js +258 -0
  70. package/lib/features/canvas/mediaUrls.js.map +1 -0
  71. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  72. package/lib/features/canvas/promoProjectImport.js +80 -13
  73. package/lib/features/canvas/promoProjectImport.js.map +1 -1
  74. package/lib/features/canvas/promoVideo.js +106 -15
  75. package/lib/features/canvas/promoVideo.js.map +1 -1
  76. package/lib/features/canvas/reframe.js +228 -0
  77. package/lib/features/canvas/reframe.js.map +1 -0
  78. package/lib/features/canvas/serverTasks.js +697 -0
  79. package/lib/features/canvas/serverTasks.js.map +1 -0
  80. package/lib/features/canvas/set/SetViewportWebView.js +207 -28
  81. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
  82. package/lib/features/canvas/set/agent/prompt.js +66 -0
  83. package/lib/features/canvas/set/agent/prompt.js.map +1 -0
  84. package/lib/features/canvas/set/agent/setOps.js +203 -0
  85. package/lib/features/canvas/set/agent/setOps.js.map +1 -0
  86. package/lib/features/canvas/set/agent/setTurn.js +128 -0
  87. package/lib/features/canvas/set/agent/setTurn.js.map +1 -0
  88. package/lib/features/canvas/set/agent/snapshot.js +43 -0
  89. package/lib/features/canvas/set/agent/snapshot.js.map +1 -0
  90. package/lib/features/canvas/set/agent/tools.js +580 -0
  91. package/lib/features/canvas/set/agent/tools.js.map +1 -0
  92. package/lib/features/canvas/set/setProject.js +43 -4
  93. package/lib/features/canvas/set/setProject.js.map +1 -1
  94. package/lib/features/canvas/set/supplyLibrary.js +397 -0
  95. package/lib/features/canvas/set/supplyLibrary.js.map +1 -0
  96. package/lib/features/canvas/storageLibrary.js +113 -52
  97. package/lib/features/canvas/storageLibrary.js.map +1 -1
  98. package/lib/features/canvas/studioCatalog.js +15 -2
  99. package/lib/features/canvas/studioCatalog.js.map +1 -1
  100. package/lib/features/canvas/studioLooks.js +1 -8
  101. package/lib/features/canvas/studioLooks.js.map +1 -1
  102. package/lib/features/canvas/useBoardMediaRefresh.js +66 -0
  103. package/lib/features/canvas/useBoardMediaRefresh.js.map +1 -0
  104. package/lib/features/canvas/useMediaSource.js +84 -0
  105. package/lib/features/canvas/useMediaSource.js.map +1 -0
  106. package/lib/features/canvas/video3d.js +11 -10
  107. package/lib/features/canvas/video3d.js.map +1 -1
  108. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +46 -0
  109. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js.map +1 -0
  110. package/lib/features/canvas/videoEditor/ExportTaskCard.js +134 -0
  111. package/lib/features/canvas/videoEditor/ExportTaskCard.js.map +1 -0
  112. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +45 -7
  113. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
  114. package/lib/features/canvas/videoEditor/agent/agentLoop.js +4 -2
  115. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
  116. package/lib/features/canvas/videoEditor/agent/attachments.js +304 -0
  117. package/lib/features/canvas/videoEditor/agent/attachments.js.map +1 -0
  118. package/lib/features/canvas/videoEditor/agent/brainClient.js +3 -2
  119. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
  120. package/lib/features/canvas/videoEditor/agent/cutTools.js +207 -7
  121. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
  122. package/lib/features/canvas/videoEditor/blurBox.js +34 -0
  123. package/lib/features/canvas/videoEditor/blurBox.js.map +1 -0
  124. package/lib/features/canvas/videoEditor/compileTimeline.js +668 -0
  125. package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -0
  126. package/lib/features/canvas/videoEditor/editorModel.js +56 -22
  127. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
  128. package/lib/features/canvas/videoEditor/exportPipeline.js +77 -0
  129. package/lib/features/canvas/videoEditor/exportPipeline.js.map +1 -0
  130. package/lib/features/canvas/videoEditor/exportRenderer.js +19 -12
  131. package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -1
  132. package/lib/features/canvas/videoEditor/exportTask.js +216 -0
  133. package/lib/features/canvas/videoEditor/exportTask.js.map +1 -0
  134. package/lib/features/canvas/videoEditor/formWidgets.js +142 -0
  135. package/lib/features/canvas/videoEditor/formWidgets.js.map +1 -0
  136. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js +195 -0
  137. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js.map +1 -0
  138. package/lib/features/canvas/videoEditor/produce/produceScenes.js +158 -0
  139. package/lib/features/canvas/videoEditor/produce/produceScenes.js.map +1 -0
  140. package/lib/features/canvas/videoEditor/remoteMediaClient.js +17 -5
  141. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
  142. package/lib/features/canvas/videoEditor/renderTimeline.js +207 -0
  143. package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -0
  144. package/lib/features/canvas/videoEditor/renewLinks.js +64 -0
  145. package/lib/features/canvas/videoEditor/renewLinks.js.map +1 -0
  146. package/lib/features/canvas/videoEditor/sceneLayers.js +101 -0
  147. package/lib/features/canvas/videoEditor/sceneLayers.js.map +1 -0
  148. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js +283 -0
  149. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js.map +1 -0
  150. package/lib/features/canvas/videoEditor/tools/catalog.js +576 -0
  151. package/lib/features/canvas/videoEditor/tools/catalog.js.map +1 -0
  152. package/lib/features/canvas/videoEditor/videoProjectsStore.js +27 -3
  153. package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -1
  154. package/lib/features/webbuilder/WebBuilderExperience.js +29 -1
  155. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  156. package/lib/features/webbuilder/buildFragments.js +8 -4
  157. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  158. package/lib/features/webbuilder/codezenHandoff.js +108 -0
  159. package/lib/features/webbuilder/codezenHandoff.js.map +1 -0
  160. package/lib/features/webbuilder/workflow.js.map +1 -1
  161. package/lib/hooks/useChatApi.js +1 -2
  162. package/lib/hooks/useChatApi.js.map +1 -1
  163. package/lib/screens/CanvasBoard/index.js +12 -1
  164. package/lib/screens/CanvasBoard/index.js.map +1 -1
  165. package/lib/screens/Home/HomeScreen.js.map +1 -1
  166. package/lib/screens/Home/components/HomeSuggestions.js +3 -3
  167. package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
  168. package/lib/screens/WebBuilder/index.js +4 -2
  169. package/lib/screens/WebBuilder/index.js.map +1 -1
  170. package/lib/screens/WebBuilderNative/index.js +29 -2
  171. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  172. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +30 -6
  173. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  174. package/package.json +4 -4
  175. /package/lib/assets/apps/{paper2poster.webp → poster.webp} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sources":["../../../../../src/features/canvas/set/agent/tools.ts"],"sourcesContent":["/**\n * Twin of web `editors/set-editor/agent/tools.ts`.\n *\n * The tools the set agent calls, and what each does to the set.\n *\n * Two halves, like the studio agent's: `SET_AGENT_TOOLS` is the schema the\n * model sees, and `executeSetTool` runs one call against the live set through\n * {@link SetAgentContext} - read the set, hand back a replacement (one undo\n * step), say what is happening. The two network tools (a GLB, a 360 world) go\n * through `services` so a test can script them.\n *\n * Every tool answers in plain text and, when it changed anything, hands back a\n * fresh read of the objects. A model that has just placed nine things and been\n * told their real ids can put the tenth ON one of them; a model told only \"ok\"\n * starts guessing.\n */\nimport type { BrainTool } from '../../videoEditor/agent/brainClient';\nimport { KIT_ENTRIES } from '../supplyLibrary';\nimport {\n DEFAULT_CAMERA,\n MESH_TARGET_HEIGHT_M,\n SET_ASPECTS,\n newObjectId,\n vec3,\n type SetCamera,\n type SetProject,\n type Vec3,\n lightingOf,\n} from '../setProject';\nimport { describeObjects, describeSet, type StillRef } from './snapshot';\n\n/** What one tool call answers the model (`result`) and shows the user (`label`, `detail`). */\nexport interface ToolOutcome {\n result: string;\n label: string;\n detail?: string;\n}\nimport {\n cameraFromShot,\n placeObjects,\n removeObjects,\n tidySet,\n updateObjects,\n uniqueName,\n type PlacementSpec,\n type ShotSpec,\n type UpdateSpec,\n} from './setOps';\n\n/** A still on the canvas board, which `generate_object` can turn into a mesh. */\nexport interface AgentStill extends StillRef {\n src: string;\n}\n\nexport interface SetAgentServices {\n /** A GLB from a prompt or a still. Resolves when the mesh is ready to place. */\n generateObject: (args: {\n prompt?: string;\n imageUrl?: string;\n onProgress?: (message: string) => void;\n signal?: AbortSignal;\n }) => Promise<{ modelUrl: string; previewUrl?: string }>;\n /** A 360 panorama from a prompt. */\n generateWorld: (prompt: string) => Promise<{ imageUrl: string; model?: string }>;\n}\n\nexport interface SetAgentContext {\n /** The set as it is NOW - after every commit so far this turn. */\n project: () => SetProject;\n /** Replace the set; the reducer records it as one undo step. */\n commit: (project: SetProject) => void;\n /** A live status line under the transcript while a tool works. */\n progress: (text: string) => void;\n /** Stills the board is holding. */\n stills: readonly AgentStill[];\n /**\n * Push a camera to the live stage. State alone does not move the viewport -\n * the stage owns the camera while you orbit - so a set_camera the user\n * cannot see happening is a set_camera that did not happen.\n */\n applyCamera?: (camera: SetCamera) => void;\n signal?: AbortSignal;\n services: SetAgentServices;\n}\n\n/** Bad arguments are the model's to fix, and read differently from a failure. */\nclass ToolInputError extends Error {}\n\ntype Args = Record<string, unknown>;\n\nconst argsOf = (raw: unknown): Args => (raw && typeof raw === 'object' ? (raw as Args) : {});\n\nconst isNum = (v: unknown): v is number => typeof v === 'number' && Number.isFinite(v);\nconst str = (v: unknown): string => (typeof v === 'string' ? v.trim() : '');\nconst list = (v: unknown): unknown[] => (Array.isArray(v) ? v : []);\n\nconst point = (v: unknown): Partial<Vec3> | undefined => {\n if (!v || typeof v !== 'object') return undefined;\n const raw = v as Args;\n const out: Partial<Vec3> = {};\n if (isNum(raw.x)) out.x = raw.x;\n if (isNum(raw.y)) out.y = raw.y;\n if (isNum(raw.z)) out.z = raw.z;\n return Object.keys(out).length > 0 ? out : undefined;\n};\n\n/** The size fields every placement and update share. */\nfunction sizing(raw: Args): Pick<PlacementSpec, 'scale' | 'scaleXyz' | 'heightM'> {\n const scaleXyz = point(raw.scale_xyz);\n return {\n ...(scaleXyz ? { scaleXyz } : {}),\n ...(isNum(raw.scale) ? { scale: raw.scale } : {}),\n ...(isNum(raw.height_m) ? { heightM: raw.height_m } : {}),\n };\n}\n\nfunction toPlacement(raw: unknown): PlacementSpec | null {\n const o = argsOf(raw);\n const kit = str(o.kit) || str(o.kit_id) || str(o.kitId);\n if (!kit) return null;\n const position = point(o.position);\n const rotation = point(o.rotation);\n return {\n kit,\n ...(str(o.name) ? { name: str(o.name) } : {}),\n ...(position ? { position } : {}),\n ...(rotation ? { rotation } : {}),\n ...(isNum(o.rotation_y) ? { rotationY: o.rotation_y } : {}),\n ...sizing(o),\n ...(str(o.color) ? { color: str(o.color) } : {}),\n ...(o.locked === true ? { locked: true } : {}),\n };\n}\n\nfunction toUpdate(raw: unknown): UpdateSpec | null {\n const o = argsOf(raw);\n const id = str(o.id);\n if (!id) return null;\n const position = point(o.position);\n const rotation = point(o.rotation);\n return {\n id,\n ...(str(o.name) ? { name: str(o.name) } : {}),\n ...(position ? { position } : {}),\n ...(rotation ? { rotation } : {}),\n ...(isNum(o.rotation_y) ? { rotationY: o.rotation_y } : {}),\n ...sizing(o),\n ...(str(o.color) ? { color: str(o.color) } : {}),\n ...(typeof o.hidden === 'boolean' ? { hidden: o.hidden } : {}),\n ...(typeof o.locked === 'boolean' ? { locked: o.locked } : {}),\n };\n}\n\nconst KIT_IDS = KIT_ENTRIES.map((entry) => entry.id).join(', ');\nconst plural = (n: number, word: string): string => `${n} ${word}${n === 1 ? '' : 's'}`;\n\n// ─── The schema the model sees ────────────────────────────────────────────────\n\nfunction tool(\n name: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[] = [],\n): BrainTool {\n return { type: 'function', function: { name, description, parameters: { type: 'object', properties, required } } };\n}\n\nconst VEC3 = {\n type: 'object',\n description: 'Metres. x is right, y is up, z is toward the default camera.',\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\n} as const;\n\nconst SIZING = {\n height_m: {\n type: 'number',\n description: 'The height this piece should end up, in metres. The simplest way to size anything.',\n },\n scale: { type: 'number', description: 'Uniform multiplier on the kit size. Ignored when height_m is given.' },\n scale_xyz: {\n ...VEC3,\n description: 'Non-uniform scale, when a piece has to be stretched (a plank into a 2m shelf).',\n },\n} as const;\n\nconst PLACEMENT = {\n type: 'object',\n properties: {\n kit: { type: 'string', description: `Supply library id: ${KIT_IDS}.` },\n name: { type: 'string', description: 'What this is in the shot (\"Counter\", \"Barista\"), not the shape.' },\n position: {\n ...VEC3,\n description: 'Where the BASE of the piece sits. Floor level is y 0; on a table is y 0.77.',\n },\n rotation_y: { type: 'number', description: 'Turn around the vertical axis, in degrees.' },\n ...SIZING,\n color: { type: 'string', description: 'Hex tint, e.g. \"#c9b79c\". Omit to keep the kit colour.' },\n locked: {\n type: 'boolean',\n description: 'Lock set dressing the user should not drag by accident - floors and walls.',\n },\n },\n required: ['kit'],\n} as const;\n\nexport const SET_AGENT_TOOLS: BrainTool[] = [\n tool(\n 'block_set',\n 'Place stock geometry. mode \"replace\" blocks a whole new set in one call (use this for a fresh brief); mode \"add\" keeps what is there and adds to it.',\n {\n mode: { type: 'string', enum: ['replace', 'add'], description: 'Default \"add\".' },\n objects: { type: 'array', items: PLACEMENT, description: 'The pieces to place, in the order they matter.' },\n },\n ['objects'],\n ),\n tool(\n 'update_objects',\n 'Move, turn, resize, recolour, hide or lock objects already in the set. Every field is optional: send only what changes.',\n {\n updates: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Object id, copied from the snapshot.' },\n name: { type: 'string' },\n position: VEC3,\n rotation_y: { type: 'number' },\n ...SIZING,\n color: { type: 'string' },\n hidden: { type: 'boolean' },\n locked: { type: 'boolean' },\n },\n required: ['id'],\n },\n },\n },\n ['updates'],\n ),\n tool(\n 'remove_objects',\n 'Take objects out of the set.',\n {\n ids: { type: 'array', items: { type: 'string' }, description: 'Object ids.' },\n },\n ['ids'],\n ),\n tool(\n 'set_camera',\n 'Put the camera on a shot. Describe it as distance, height and lens rather than coordinates where you can - distance is measured on the ground from the target.',\n {\n target: {\n ...VEC3,\n description:\n \"What the camera looks at. Aim at the interesting height: a standing figure's chest is ~1.2m.\",\n },\n distance: {\n type: 'number',\n description: 'Metres from the target: wide room 5-7, full figure 4, product 1.2-1.8, portrait 1.3.',\n },\n height: {\n type: 'number',\n description: 'Lens height in metres: 1.6 standing, 1.2 seated, below 0.8 is a low angle.',\n },\n azimuth_deg: {\n type: 'number',\n description:\n 'Where the camera stands around the target. 0 is straight in front (+Z), 90 is to the right (+X).',\n },\n lens_mm: {\n type: 'number',\n description: '35mm-equivalent focal length: 24 wide, 35 normal, 50 product, 85 portrait.',\n },\n fov: {\n type: 'number',\n description: 'Vertical field of view in degrees, if you would rather set it directly.',\n },\n position: { ...VEC3, description: 'An exact camera position; overrides distance/height/azimuth.' },\n },\n ),\n tool('set_light', 'Aim the key light and set the ambient fill.', {\n azimuth_deg: { type: 'number', description: 'Direction around the set, in degrees.' },\n elevation_deg: {\n type: 'number',\n description: 'Height above the horizon: 40+ is flattering, 15-25 throws long shadows.',\n },\n key: { type: 'number', description: 'Key intensity, 0-10. 2.6 is a normal key.' },\n ambient: { type: 'number', description: 'Fill intensity, 0-5. Raise it for a soft overcast look.' },\n }),\n tool('set_world', 'The backdrop behind the set, and the ground under it.', {\n background: { type: 'string', description: 'Hex backdrop colour, used when there is no panorama.' },\n show_ground: {\n type: 'boolean',\n description: 'The ground plane that catches contact shadows. Almost always true.',\n },\n rotation_deg: { type: 'number', description: 'Turn a generated panorama to place its sun or landmark.' },\n }),\n tool('set_format', \"The aspect the render is framed to, and the set's name.\", {\n aspect: {\n type: 'string',\n enum: [...SET_ASPECTS],\n description: 'Decide this before blocking: it changes where things go.',\n },\n title: { type: 'string', description: 'A short name for the set.' },\n }),\n tool(\n 'generate_object',\n 'Turn a prompt, or a still already on the board, into a real 3D object and place it. Takes 45-120 seconds - use it for the one or two pieces the shot is about.',\n {\n prompt: {\n type: 'string',\n description:\n 'The object alone, plainly described: \"a chipped enamel coffee mug\". No scene, no background.',\n },\n still_id: { type: 'string', description: 'A still from the board to generate from instead of a prompt.' },\n name: { type: 'string', description: 'What it is in the shot.' },\n position: { ...VEC3, description: 'Where its base sits. Defaults to the camera target.' },\n height_m: {\n type: 'number',\n description: `The height it should end up. Generated meshes arrive normalised to ${MESH_TARGET_HEIGHT_M}m, so always say.`,\n },\n },\n ),\n tool(\n 'generate_world',\n 'Paint the 360 panorama behind the set. A few seconds.',\n {\n prompt: {\n type: 'string',\n description: 'The place, plainly: \"a rain-slicked city street at night, neon signage\". No subject.',\n },\n },\n ['prompt'],\n ),\n tool('get_set', 'Read the set back as it stands now.', {}),\n];\n\n// ─── Running one call ─────────────────────────────────────────────────────────\n\n/** Commit a change and answer with a fresh read, so the next call sees the truth. */\nfunction committed(\n ctx: SetAgentContext,\n project: SetProject,\n said: string,\n label: string,\n detail?: string,\n): ToolOutcome {\n const tidy = tidySet(project);\n ctx.commit(tidy);\n return { result: `${said}\\n\\n${describeObjects(tidy)}`, label, ...(detail ? { detail } : {}) };\n}\n\nfunction blockSet(args: Args, ctx: SetAgentContext): ToolOutcome {\n const specs = list(args.objects)\n .map(toPlacement)\n .filter((s): s is PlacementSpec => s !== null);\n if (specs.length === 0)\n throw new ToolInputError(`no placeable objects - every entry needs a \"kit\" from: ${KIT_IDS}`);\n const mode = args.mode === 'replace' ? 'replace' : 'add';\n const { project, placed, unknownKits } = placeObjects(ctx.project(), specs, mode);\n if (placed.length === 0)\n throw new ToolInputError(`none of those kit ids exist (${unknownKits.join(', ')}); use one of: ${KIT_IDS}`);\n\n const dropped =\n unknownKits.length > 0\n ? ` Dropped ${plural(unknownKits.length, 'entry')} with an unknown kit (${unknownKits.join(', ')}); the library is: ${KIT_IDS}.`\n : '';\n const verb = mode === 'replace' ? 'Replaced the set with' : 'Added';\n // The camera is the half of a shot that is easy to describe and forget to\n // set. Saying so HERE - in the result, mid-turn, while the model is still\n // acting - is what stops a reply that claims a 35mm from 4m over a set\n // still sitting on the default camera.\n const camera = project.camera;\n const untouched =\n camera.position.x === DEFAULT_CAMERA.position.x &&\n camera.position.y === DEFAULT_CAMERA.position.y &&\n camera.position.z === DEFAULT_CAMERA.position.z;\n const nextStep = untouched\n ? ' The camera has NOT been set - it is still on the default angle. Call set_camera now; the shot is not blocked until you do.'\n : '';\n return committed(\n ctx,\n project,\n `${verb} ${plural(placed.length, 'object')}.${dropped}${nextStep}`,\n `${mode === 'replace' ? 'Blocked' : 'Added'} ${plural(placed.length, 'object')}`,\n placed\n .slice(0, 6)\n .map((o) => o.name)\n .join(', '),\n );\n}\n\nfunction updateTool(args: Args, ctx: SetAgentContext): ToolOutcome {\n const specs = list(args.updates)\n .map(toUpdate)\n .filter((s): s is UpdateSpec => s !== null);\n if (specs.length === 0) throw new ToolInputError('no updates - every entry needs the \"id\" of an object in the set');\n const { project, updated, missing } = updateObjects(ctx.project(), specs);\n if (updated.length === 0)\n throw new ToolInputError(\n `no object in the set has ${missing.length === 1 ? `id ${missing[0]}` : `any of those ids (${missing.join(', ')})`}`,\n );\n const note =\n missing.length > 0\n ? ` No object has ${missing.length === 1 ? `id ${missing[0]}` : `ids ${missing.join(', ')}`}.`\n : '';\n return committed(\n ctx,\n project,\n `Updated ${plural(updated.length, 'object')}.${note}`,\n `Updated ${plural(updated.length, 'object')}`,\n updated\n .map((o) => o.name)\n .slice(0, 6)\n .join(', '),\n );\n}\n\nfunction removeTool(args: Args, ctx: SetAgentContext): ToolOutcome {\n const ids = list(args.ids)\n .map((v) => str(v))\n .filter(Boolean);\n if (ids.length === 0) throw new ToolInputError('no ids given');\n const { project, removed, missing } = removeObjects(ctx.project(), ids);\n if (removed.length === 0)\n throw new ToolInputError(\n `no object in the set has ${missing.length === 1 ? `id ${missing[0]}` : `any of those ids (${missing.join(', ')})`}`,\n );\n const note = missing.length > 0 ? ` ${plural(missing.length, 'id')} matched nothing.` : '';\n return committed(\n ctx,\n project,\n `Removed ${plural(removed.length, 'object')}.${note}`,\n `Removed ${plural(removed.length, 'object')}`,\n removed.map((o) => o.name).join(', '),\n );\n}\n\nfunction cameraTool(args: Args, ctx: SetAgentContext): ToolOutcome {\n const spec: ShotSpec = {\n ...(point(args.target) ? { target: point(args.target)! } : {}),\n ...(point(args.position) ? { position: point(args.position)! } : {}),\n ...(isNum(args.distance) ? { distance: args.distance } : {}),\n ...(isNum(args.height) ? { height: args.height } : {}),\n ...(isNum(args.azimuth_deg) ? { azimuthDeg: args.azimuth_deg } : {}),\n ...(isNum(args.lens_mm) ? { lensMm: args.lens_mm } : {}),\n ...(isNum(args.fov) ? { fov: args.fov } : {}),\n };\n if (Object.keys(spec).length === 0)\n throw new ToolInputError('nothing to change - give a distance, a height, an azimuth, a lens or a target');\n\n const project = ctx.project();\n const camera = cameraFromShot(project.camera, spec);\n const next = tidySet({ ...project, camera });\n ctx.commit(next);\n // The stage owns the camera while the user orbits, so state alone would\n // leave the viewport where it was and the move would look ignored.\n ctx.applyCamera?.(next.camera);\n const mm = isNum(args.lens_mm) ? `${Math.round(args.lens_mm)}mm` : `${Math.round(next.camera.fov)}°`;\n const away = Math.hypot(\n next.camera.position.x - next.camera.target.x,\n next.camera.position.z - next.camera.target.z,\n );\n return {\n result: `Camera at ${[next.camera.position.x, next.camera.position.y, next.camera.position.z].map((v) => Math.round(v * 100) / 100).join(',')} looking at ${[next.camera.target.x, next.camera.target.y, next.camera.target.z].map((v) => Math.round(v * 100) / 100).join(',')}, ${Math.round(next.camera.fov)}° fov.`,\n label: 'Set the camera',\n detail: `${mm} · ${Math.round(away * 10) / 10}m out · ${Math.round(next.camera.position.y * 100) / 100}m up`,\n };\n}\n\nfunction lightTool(args: Args, ctx: SetAgentContext): ToolOutcome {\n const project = ctx.project();\n const lighting = { ...lightingOf(project) };\n let touched = false;\n if (isNum(args.azimuth_deg)) {\n lighting.keyAzimuthDeg = ((args.azimuth_deg % 360) + 360) % 360;\n touched = true;\n }\n if (isNum(args.elevation_deg)) {\n lighting.keyElevationDeg = Math.min(89, Math.max(1, args.elevation_deg));\n touched = true;\n }\n if (isNum(args.key)) {\n lighting.keyIntensity = Math.min(10, Math.max(0, args.key));\n touched = true;\n }\n if (isNum(args.ambient)) {\n lighting.ambientIntensity = Math.min(5, Math.max(0, args.ambient));\n touched = true;\n }\n if (!touched) throw new ToolInputError('nothing to change - give an azimuth, an elevation, a key or an ambient');\n ctx.commit({ ...project, lighting });\n return {\n result: `Key light from ${Math.round(lighting.keyAzimuthDeg)}° at ${Math.round(lighting.keyElevationDeg)}° above the horizon, intensity ${lighting.keyIntensity}, ambient ${lighting.ambientIntensity}.`,\n label: 'Set the light',\n detail: `${Math.round(lighting.keyAzimuthDeg)}° / ${Math.round(lighting.keyElevationDeg)}°`,\n };\n}\n\nfunction worldTool(args: Args, ctx: SetAgentContext): ToolOutcome {\n const project = ctx.project();\n const world = { ...project.world };\n let touched = false;\n if (/^#[0-9a-f]{3,8}$/i.test(str(args.background))) {\n world.background = str(args.background);\n touched = true;\n }\n if (typeof args.show_ground === 'boolean') {\n world.showGround = args.show_ground;\n touched = true;\n }\n if (isNum(args.rotation_deg)) {\n world.rotationDeg = ((args.rotation_deg % 360) + 360) % 360;\n touched = true;\n }\n if (!touched) throw new ToolInputError('nothing to change - give a background colour, show_ground, or a rotation');\n ctx.commit({ ...project, world });\n return {\n result: `Backdrop ${world.background}, ground ${world.showGround ? 'on' : 'off'}, panorama turned ${Math.round(world.rotationDeg)}°.`,\n label: 'Set the world',\n };\n}\n\nfunction formatTool(args: Args, ctx: SetAgentContext): ToolOutcome {\n const project = ctx.project();\n const aspect = str(args.aspect);\n const title = str(args.title);\n if (aspect && !SET_ASPECTS.includes(aspect as (typeof SET_ASPECTS)[number])) {\n throw new ToolInputError(`aspect must be one of ${SET_ASPECTS.join(', ')}`);\n }\n if (!aspect && !title) throw new ToolInputError('nothing to change - give an aspect or a title');\n ctx.commit({ ...project, ...(aspect ? { aspect } : {}), ...(title ? { title } : {}) });\n return {\n result: `Framed ${aspect || project.aspect}${title ? `, called \"${title}\"` : ''}.`,\n label: aspect ? `Framed ${aspect}` : 'Renamed the set',\n };\n}\n\nasync function generateObjectTool(args: Args, ctx: SetAgentContext): Promise<ToolOutcome> {\n const prompt = str(args.prompt);\n const stillId = str(args.still_id);\n const still = stillId ? ctx.stills.find((s) => s.id === stillId) : undefined;\n if (stillId && !still) {\n throw new ToolInputError(\n ctx.stills.length > 0\n ? `no still with id ${stillId}; the board has ${ctx.stills.map((s) => s.id).join(', ')}`\n : 'there are no stills on the board to generate from',\n );\n }\n if (!prompt && !still)\n throw new ToolInputError('give a prompt describing the object, or a still_id from the board');\n\n const name = str(args.name) || (prompt ? prompt.slice(0, 28) : (still?.label ?? 'Object'));\n ctx.progress(`Generating ${name}…`);\n const result = await ctx.services.generateObject({\n ...(prompt ? { prompt } : {}),\n ...(still ? { imageUrl: still.src } : {}),\n onProgress: (message) => ctx.progress(`${name}: ${message}`),\n ...(ctx.signal ? { signal: ctx.signal } : {}),\n });\n if (!result.modelUrl) throw new Error('the generator returned no model');\n\n const project = ctx.project();\n const height = isNum(args.height_m) && args.height_m > 0 ? args.height_m : null;\n const factor = height ? height / MESH_TARGET_HEIGHT_M : 1;\n const position = point(args.position);\n const next: SetProject = {\n ...project,\n objects: [\n ...project.objects,\n {\n id: newObjectId(),\n name: uniqueName(\n project.objects.map((o) => o.name),\n name,\n ),\n source: 'mesh',\n modelUrl: result.modelUrl,\n ...(result.previewUrl ? { previewUrl: result.previewUrl } : {}),\n ...(still ? { sourceImageUrl: still.src } : {}),\n position: {\n x: isNum(position?.x) ? position.x : project.camera.target.x,\n y: isNum(position?.y) ? position.y : 0,\n z: isNum(position?.z) ? position.z : project.camera.target.z,\n },\n rotation: vec3(),\n scale: vec3(factor, factor, factor),\n },\n ],\n };\n return committed(\n ctx,\n next,\n `Generated \"${name}\" and placed it${height ? ` at ${height}m tall` : ` at its default ${MESH_TARGET_HEIGHT_M}m - set height_m if that is wrong`}.`,\n `Generated ${name}`,\n result.modelUrl.split('/').pop()?.slice(0, 40),\n );\n}\n\nasync function generateWorldTool(args: Args, ctx: SetAgentContext): Promise<ToolOutcome> {\n const prompt = str(args.prompt);\n if (!prompt) throw new ToolInputError('give a prompt describing the place');\n ctx.progress('Painting the world…');\n const result = await ctx.services.generateWorld(prompt);\n if (!result.imageUrl) throw new Error('the generator returned no panorama');\n const project = ctx.project();\n ctx.commit({\n ...project,\n world: {\n ...project.world,\n imageUrl: result.imageUrl,\n prompt,\n ...(result.model ? { model: result.model } : {}),\n },\n });\n return { result: `The set now stands in: ${prompt}.`, label: 'Generated the world', detail: prompt.slice(0, 60) };\n}\n\nexport async function executeSetTool(name: string, rawArgs: unknown, ctx: SetAgentContext): Promise<ToolOutcome> {\n const args = argsOf(rawArgs);\n try {\n switch (name) {\n case 'block_set':\n return blockSet(args, ctx);\n case 'update_objects':\n return updateTool(args, ctx);\n case 'remove_objects':\n return removeTool(args, ctx);\n case 'set_camera':\n return cameraTool(args, ctx);\n case 'set_light':\n return lightTool(args, ctx);\n case 'set_world':\n return worldTool(args, ctx);\n case 'set_format':\n return formatTool(args, ctx);\n case 'generate_object':\n return await generateObjectTool(args, ctx);\n case 'generate_world':\n return await generateWorldTool(args, ctx);\n case 'get_set':\n return { result: describeSet(ctx.project(), ctx.stills), label: 'Read the set' };\n default:\n return { result: `error: unknown tool \"${name}\"`, label: `Unknown tool ${name}` };\n }\n } catch (err) {\n // The user's stop must end the turn, not become a tool result.\n if (err instanceof Error && err.name === 'AbortError') throw err;\n if (ctx.signal?.aborted) throw err;\n const message = err instanceof Error ? err.message : String(err);\n const kind = err instanceof ToolInputError ? 'bad arguments' : 'failed';\n return {\n result: `error (${kind}): ${message}`,\n label: `${name.replace(/_/g, ' ')} ${kind}`,\n detail: message.length > 80 ? `${message.slice(0, 79)}…` : message,\n };\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,8 +1,46 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __spreadValues = (a, b) => {
7
+ for (var prop in b || (b = {}))
8
+ if (__hasOwnProp.call(b, prop))
9
+ __defNormalProp(a, prop, b[prop]);
10
+ if (__getOwnPropSymbols)
11
+ for (var prop of __getOwnPropSymbols(b)) {
12
+ if (__propIsEnum.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ }
15
+ return a;
16
+ };
1
17
  const vec3 = (x = 0, y = 0, z = 0) => ({
2
18
  x,
3
19
  y,
4
20
  z
5
21
  });
22
+ const DEFAULT_CAMERA = {
23
+ position: vec3(0, 1.4, 3.2),
24
+ target: vec3(0, 0.9, 0),
25
+ fov: 35
26
+ };
27
+ const DEFAULT_LIGHTING = {
28
+ keyAzimuthDeg: 135,
29
+ keyElevationDeg: 42,
30
+ keyIntensity: 2.6,
31
+ ambientIntensity: 0.55
32
+ };
33
+ const MESH_TARGET_HEIGHT_M = 1.2;
34
+ const SET_ASPECTS = ["16:9", "9:16", "1:1", "4:3", "3:4", "21:9"];
35
+ let objectSeq = 0;
36
+ const newObjectId = () => `so-${Date.now().toString(36)}-${objectSeq++}`;
37
+ function focalLengthFromFov(fovDeg) {
38
+ return Math.round(24 / 2 / Math.tan(fovDeg * Math.PI / 360));
39
+ }
40
+ const lightingOf = (project) => {
41
+ var _a;
42
+ return (_a = project.lighting) != null ? _a : DEFAULT_LIGHTING;
43
+ };
6
44
  function newSet(title = "Untitled set") {
7
45
  return {
8
46
  version: 1,
@@ -15,10 +53,11 @@ function newSet(title = "Untitled set") {
15
53
  showGround: true
16
54
  },
17
55
  camera: {
18
- position: vec3(0, 1.4, 3.2),
19
- target: vec3(0, 0.9, 0),
20
- fov: 35
56
+ position: __spreadValues({}, DEFAULT_CAMERA.position),
57
+ target: __spreadValues({}, DEFAULT_CAMERA.target),
58
+ fov: DEFAULT_CAMERA.fov
21
59
  },
60
+ lighting: __spreadValues({}, DEFAULT_LIGHTING),
22
61
  aspect: "16:9"
23
62
  };
24
- }export{newSet,vec3};//# sourceMappingURL=setProject.js.map
63
+ }export{DEFAULT_CAMERA,DEFAULT_LIGHTING,MESH_TARGET_HEIGHT_M,SET_ASPECTS,focalLengthFromFov,lightingOf,newObjectId,newSet,vec3};//# sourceMappingURL=setProject.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setProject.js","sources":["../../../../src/features/canvas/set/setProject.ts"],"sourcesContent":["/** Minimal SetProject types for native set studio + cameraPath. */\nexport interface Vec3 {\n x: number;\n y: number;\n z: number;\n}\n\nexport const vec3 = (x = 0, y = 0, z = 0): Vec3 => ({ x, y, z });\n\nexport interface SetCamera {\n position: Vec3;\n target: Vec3;\n fov: number;\n}\n\nexport interface SetWorld {\n imageUrl?: string;\n prompt?: string;\n rotationDeg: number;\n background: string;\n showGround: boolean;\n}\n\nexport interface SetObject {\n id: string;\n name: string;\n source: 'kit' | 'mesh' | 'image';\n modelUrl?: string;\n imageUrl?: string;\n previewUrl?: string;\n position: Vec3;\n rotation: Vec3;\n scale: Vec3;\n}\n\nexport interface SetProject {\n version: 1;\n id: string;\n title: string;\n objects: SetObject[];\n world: SetWorld;\n camera: SetCamera;\n aspect: string;\n}\n\nexport function newSet(title = 'Untitled set'): SetProject {\n return {\n version: 1,\n id: `set-${Date.now().toString(36)}`,\n title,\n objects: [],\n world: { rotationDeg: 0, background: '#1a1a1e', showGround: true },\n camera: { position: vec3(0, 1.4, 3.2), target: vec3(0, 0.9, 0), fov: 35 },\n aspect: '16:9',\n };\n}\n"],"names":[],"mappings":"AAMO,MAAM,OAAO,CAAC,CAAA,GAAI,GAAG,CAAI,GAAA,CAAA,EAAG,IAAI,CAAa,MAAA;AAAA,EAClD,CAAA;AAAA,EACA,CAAA;AAAA,EACA;AACF,CAAA;AAiCgB,SAAA,MAAA,CAAO,QAAQ,cAA4B,EAAA;AACzD,EAAO,OAAA;AAAA,IACL,OAAS,EAAA,CAAA;AAAA,IACT,IAAI,CAAO,IAAA,EAAA,IAAA,CAAK,KAAM,CAAA,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAAA,IAClC,KAAA;AAAA,IACA,SAAS,EAAC;AAAA,IACV,KAAO,EAAA;AAAA,MACL,WAAa,EAAA,CAAA;AAAA,MACb,UAAY,EAAA,SAAA;AAAA,MACZ,UAAY,EAAA;AAAA,KACd;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,QAAU,EAAA,IAAA,CAAK,CAAG,EAAA,GAAA,EAAK,GAAG,CAAA;AAAA,MAC1B,MAAQ,EAAA,IAAA,CAAK,CAAG,EAAA,GAAA,EAAK,CAAC,CAAA;AAAA,MACtB,GAAK,EAAA;AAAA,KACP;AAAA,IACA,MAAQ,EAAA;AAAA,GACV;AACF"}
1
+ {"version":3,"file":"setProject.js","sources":["../../../../src/features/canvas/set/setProject.ts"],"sourcesContent":["/**\n * SetProject types for native set studio + cameraPath — twin of web\n * `editors/set-editor/types.ts` (plain JSON; the WebView stage is rebuilt from it).\n */\nexport interface Vec3 {\n x: number;\n y: number;\n z: number;\n}\n\nexport const vec3 = (x = 0, y = 0, z = 0): Vec3 => ({ x, y, z });\n\nexport interface SetCamera {\n position: Vec3;\n target: Vec3;\n fov: number;\n}\n\nexport interface SetWorld {\n imageUrl?: string;\n prompt?: string;\n model?: string;\n rotationDeg: number;\n background: string;\n showGround: boolean;\n}\n\nexport interface SetObject {\n id: string;\n name: string;\n source: 'kit' | 'mesh' | 'image';\n /** Supply-library entry id when `source` is 'kit'. */\n kitId?: string;\n modelUrl?: string;\n imageUrl?: string;\n /** Width in metres of an image plane; its height follows the image's aspect. */\n imageWidthM?: number;\n billboard?: boolean;\n previewUrl?: string;\n /** The image this object was generated from, if any. */\n sourceImageUrl?: string;\n position: Vec3;\n /** Euler angles in degrees. */\n rotation: Vec3;\n scale: Vec3;\n /** Tint for kit primitives; ignored for textured meshes. */\n color?: string;\n hidden?: boolean;\n locked?: boolean;\n}\n\nexport interface SetLighting {\n keyAzimuthDeg: number;\n keyElevationDeg: number;\n keyIntensity: number;\n ambientIntensity: number;\n}\n\nexport interface SetProject {\n version: 1;\n id: string;\n title: string;\n objects: SetObject[];\n world: SetWorld;\n camera: SetCamera;\n /** Optional on native so sets saved before lighting existed still open. */\n lighting?: SetLighting;\n aspect: string;\n}\n\nexport const DEFAULT_CAMERA: SetCamera = {\n position: vec3(0, 1.4, 3.2),\n target: vec3(0, 0.9, 0),\n fov: 35,\n};\n\nexport const DEFAULT_LIGHTING: SetLighting = {\n keyAzimuthDeg: 135,\n keyElevationDeg: 42,\n keyIntensity: 2.6,\n ambientIntensity: 0.55,\n};\n\n/** Height a generated GLB is normalised to before its own scale (web MESH_TARGET_HEIGHT_M). */\nexport const MESH_TARGET_HEIGHT_M = 1.2;\n\n/** Aspects the render can be framed to. */\nexport const SET_ASPECTS = ['16:9', '9:16', '1:1', '4:3', '3:4', '21:9'] as const;\n\nlet objectSeq = 0;\n\n/** Unique per object - `Date.now()` alone collides when two land in one tick. */\nexport const newObjectId = (): string => `so-${Date.now().toString(36)}-${objectSeq++}`;\n\n/** The 35mm-equivalent focal length for a vertical FOV. */\nexport function focalLengthFromFov(fovDeg: number): number {\n return Math.round(24 / 2 / Math.tan((fovDeg * Math.PI) / 360));\n}\n\nexport const lightingOf = (project: Pick<SetProject, 'lighting'>): SetLighting => project.lighting ?? DEFAULT_LIGHTING;\n\nexport function newSet(title = 'Untitled set'): SetProject {\n return {\n version: 1,\n id: `set-${Date.now().toString(36)}`,\n title,\n objects: [],\n world: { rotationDeg: 0, background: '#1a1a1e', showGround: true },\n camera: {\n position: { ...DEFAULT_CAMERA.position },\n target: { ...DEFAULT_CAMERA.target },\n fov: DEFAULT_CAMERA.fov,\n },\n lighting: { ...DEFAULT_LIGHTING },\n aspect: '16:9',\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AASO,MAAM,OAAO,CAAC,CAAA,GAAI,GAAG,CAAI,GAAA,CAAA,EAAG,IAAI,CAAa,MAAA;AAAA,EAClD,CAAA;AAAA,EACA,CAAA;AAAA,EACA;AACF,CAAA;AAsDO,MAAM,cAA4B,GAAA;AAAA,EACvC,QAAU,EAAA,IAAA,CAAK,CAAG,EAAA,GAAA,EAAK,GAAG,CAAA;AAAA,EAC1B,MAAQ,EAAA,IAAA,CAAK,CAAG,EAAA,GAAA,EAAK,CAAC,CAAA;AAAA,EACtB,GAAK,EAAA;AACP;AACO,MAAM,gBAAgC,GAAA;AAAA,EAC3C,aAAe,EAAA,GAAA;AAAA,EACf,eAAiB,EAAA,EAAA;AAAA,EACjB,YAAc,EAAA,GAAA;AAAA,EACd,gBAAkB,EAAA;AACpB;AAGO,MAAM,oBAAuB,GAAA;AAG7B,MAAM,cAAc,CAAC,MAAA,EAAQ,QAAQ,KAAO,EAAA,KAAA,EAAO,OAAO,MAAM;AACvE,IAAI,SAAY,GAAA,CAAA;AAGH,MAAA,WAAA,GAAc,MAAc,CAAA,GAAA,EAAM,IAAK,CAAA,GAAA,GAAM,QAAS,CAAA,EAAE,CAAC,CAAA,CAAA,EAAI,SAAW,EAAA,CAAA;AAG9E,SAAS,mBAAmB,MAAwB,EAAA;AACzD,EAAO,OAAA,IAAA,CAAK,KAAM,CAAA,EAAA,GAAK,CAAI,GAAA,IAAA,CAAK,IAAI,MAAS,GAAA,IAAA,CAAK,EAAK,GAAA,GAAG,CAAC,CAAA;AAC7D;AACa,MAAA,UAAA,GAAa,CAAC,OAAoD,KAAA;AA7F/E,EAAA,IAAA,EAAA;AA6FkF,EAAA,OAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,aAAR,IAAoB,GAAA,EAAA,GAAA,gBAAA;AAAA;AACtF,SAAA,MAAA,CAAO,QAAQ,cAA4B,EAAA;AACzD,EAAO,OAAA;AAAA,IACL,OAAS,EAAA,CAAA;AAAA,IACT,IAAI,CAAO,IAAA,EAAA,IAAA,CAAK,KAAM,CAAA,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAAA,IAClC,KAAA;AAAA,IACA,SAAS,EAAC;AAAA,IACV,KAAO,EAAA;AAAA,MACL,WAAa,EAAA,CAAA;AAAA,MACb,UAAY,EAAA,SAAA;AAAA,MACZ,UAAY,EAAA;AAAA,KACd;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,QAAA,EAAU,mBACL,cAAe,CAAA,QAAA,CAAA;AAAA,MAEpB,MAAA,EAAQ,mBACH,cAAe,CAAA,MAAA,CAAA;AAAA,MAEpB,KAAK,cAAe,CAAA;AAAA,KACtB;AAAA,IACA,UAAU,cACL,CAAA,EAAA,EAAA,gBAAA,CAAA;AAAA,IAEL,MAAQ,EAAA;AAAA,GACV;AACF"}
@@ -0,0 +1,397 @@
1
+ const GREY = "#9aa0aa";
2
+ const WARM = "#c9b79c";
3
+ const DARK = "#5c6069";
4
+ const KIT_ENTRIES = [
5
+ // ── Blocks: the vocabulary of a rough layout ──────────────────────────────
6
+ {
7
+ id: "cube",
8
+ label: "Cube",
9
+ category: "blocks",
10
+ hint: "A crate, a plinth, a stand-in for anything boxy",
11
+ parts: [{
12
+ shape: "box",
13
+ a: 1,
14
+ b: 1,
15
+ c: 1,
16
+ offset: [0, 0.5, 0]
17
+ }],
18
+ color: GREY,
19
+ heightM: 1
20
+ },
21
+ {
22
+ id: "plank",
23
+ label: "Plank",
24
+ category: "blocks",
25
+ hint: "A table top, a shelf, a step",
26
+ parts: [{
27
+ shape: "box",
28
+ a: 1.6,
29
+ b: 0.08,
30
+ c: 0.6,
31
+ offset: [0, 0.04, 0]
32
+ }],
33
+ color: WARM,
34
+ heightM: 0.08
35
+ },
36
+ {
37
+ id: "cylinder",
38
+ label: "Cylinder",
39
+ category: "blocks",
40
+ hint: "A barrel, a can, a bollard",
41
+ parts: [{
42
+ shape: "cylinder",
43
+ a: 0.35,
44
+ b: 0.9,
45
+ offset: [0, 0.45, 0]
46
+ }],
47
+ color: GREY,
48
+ heightM: 0.9
49
+ },
50
+ {
51
+ id: "sphere",
52
+ label: "Sphere",
53
+ category: "blocks",
54
+ hint: "A ball, or a light probe to read the key off",
55
+ parts: [{
56
+ shape: "sphere",
57
+ a: 0.4,
58
+ offset: [0, 0.4, 0]
59
+ }],
60
+ color: GREY,
61
+ heightM: 0.8
62
+ },
63
+ {
64
+ id: "cone",
65
+ label: "Cone",
66
+ category: "blocks",
67
+ hint: "A traffic cone, a tree stand-in",
68
+ parts: [{
69
+ shape: "cone",
70
+ a: 0.35,
71
+ b: 0.8,
72
+ offset: [0, 0.4, 0]
73
+ }],
74
+ color: "#d97b3f",
75
+ heightM: 0.8
76
+ },
77
+ {
78
+ id: "torus",
79
+ label: "Ring",
80
+ category: "blocks",
81
+ hint: "A hoop, a tyre, a halo",
82
+ parts: [{
83
+ shape: "torus",
84
+ a: 0.5,
85
+ b: 0.12,
86
+ offset: [0, 0.5, 0],
87
+ rotate: [90, 0, 0]
88
+ }],
89
+ color: DARK,
90
+ heightM: 1
91
+ },
92
+ // ── Set: the pieces that make a place ─────────────────────────────────────
93
+ {
94
+ id: "floor",
95
+ label: "Floor",
96
+ category: "set",
97
+ hint: "A 6m slab to stand everything on",
98
+ parts: [{
99
+ shape: "plane",
100
+ a: 6,
101
+ b: 6
102
+ }],
103
+ color: "#6f7480",
104
+ heightM: 0
105
+ },
106
+ {
107
+ id: "wall",
108
+ label: "Wall",
109
+ category: "set",
110
+ hint: "A 3m flat to put behind the subject",
111
+ parts: [{
112
+ shape: "box",
113
+ a: 4,
114
+ b: 3,
115
+ c: 0.12,
116
+ offset: [0, 1.5, 0]
117
+ }],
118
+ color: "#8b8f99",
119
+ heightM: 3
120
+ },
121
+ {
122
+ id: "doorway",
123
+ label: "Doorway",
124
+ category: "set",
125
+ hint: "A wall with a 2.05m hole to walk through",
126
+ parts: [{
127
+ shape: "box",
128
+ a: 0.9,
129
+ b: 2.4,
130
+ c: 0.14,
131
+ offset: [-1.35, 1.2, 0]
132
+ }, {
133
+ shape: "box",
134
+ a: 0.9,
135
+ b: 2.4,
136
+ c: 0.14,
137
+ offset: [1.35, 1.2, 0]
138
+ }, {
139
+ shape: "box",
140
+ a: 3.6,
141
+ b: 0.35,
142
+ c: 0.14,
143
+ offset: [0, 2.22, 0]
144
+ }],
145
+ color: "#8b8f99",
146
+ heightM: 2.4
147
+ },
148
+ {
149
+ id: "steps",
150
+ label: "Steps",
151
+ category: "set",
152
+ hint: "Four risers - gives a figure somewhere to be above the camera",
153
+ parts: [{
154
+ shape: "box",
155
+ a: 2,
156
+ b: 0.18,
157
+ c: 1.6,
158
+ offset: [0, 0.09, 0]
159
+ }, {
160
+ shape: "box",
161
+ a: 2,
162
+ b: 0.18,
163
+ c: 1.2,
164
+ offset: [0, 0.27, -0.2]
165
+ }, {
166
+ shape: "box",
167
+ a: 2,
168
+ b: 0.18,
169
+ c: 0.8,
170
+ offset: [0, 0.45, -0.4]
171
+ }, {
172
+ shape: "box",
173
+ a: 2,
174
+ b: 0.18,
175
+ c: 0.4,
176
+ offset: [0, 0.63, -0.6]
177
+ }],
178
+ color: "#7b8089",
179
+ heightM: 0.72
180
+ },
181
+ {
182
+ id: "column",
183
+ label: "Column",
184
+ category: "set",
185
+ hint: "A 3m pillar to break up the frame",
186
+ parts: [{
187
+ shape: "cylinder",
188
+ a: 0.28,
189
+ b: 2.7,
190
+ offset: [0, 1.35, 0]
191
+ }, {
192
+ shape: "box",
193
+ a: 0.8,
194
+ b: 0.16,
195
+ c: 0.8,
196
+ offset: [0, 0.08, 0]
197
+ }, {
198
+ shape: "box",
199
+ a: 0.8,
200
+ b: 0.16,
201
+ c: 0.8,
202
+ offset: [0, 2.78, 0]
203
+ }],
204
+ color: "#a7abb4",
205
+ heightM: 2.86
206
+ },
207
+ {
208
+ id: "table",
209
+ label: "Table",
210
+ category: "set",
211
+ hint: "Waist height - the surface a product sits on",
212
+ parts: [{
213
+ shape: "box",
214
+ a: 1.4,
215
+ b: 0.06,
216
+ c: 0.8,
217
+ offset: [0, 0.74, 0]
218
+ }, {
219
+ shape: "box",
220
+ a: 0.08,
221
+ b: 0.72,
222
+ c: 0.08,
223
+ offset: [-0.62, 0.36, -0.34]
224
+ }, {
225
+ shape: "box",
226
+ a: 0.08,
227
+ b: 0.72,
228
+ c: 0.08,
229
+ offset: [0.62, 0.36, -0.34]
230
+ }, {
231
+ shape: "box",
232
+ a: 0.08,
233
+ b: 0.72,
234
+ c: 0.08,
235
+ offset: [-0.62, 0.36, 0.34]
236
+ }, {
237
+ shape: "box",
238
+ a: 0.08,
239
+ b: 0.72,
240
+ c: 0.08,
241
+ offset: [0.62, 0.36, 0.34]
242
+ }],
243
+ color: WARM,
244
+ heightM: 0.77
245
+ },
246
+ // ── Stand-ins: where the people and the kit go ────────────────────────────
247
+ {
248
+ id: "figure",
249
+ label: "Figure",
250
+ category: "standins",
251
+ hint: "1.75m mannequin - block where a person stands before you generate one",
252
+ parts: [{
253
+ shape: "sphere",
254
+ a: 0.115,
255
+ offset: [0, 1.63, 0]
256
+ }, {
257
+ shape: "capsule",
258
+ a: 0.055,
259
+ b: 0.1,
260
+ offset: [0, 1.47, 0]
261
+ }, {
262
+ shape: "capsule",
263
+ a: 0.17,
264
+ b: 0.42,
265
+ offset: [0, 1.15, 0]
266
+ }, {
267
+ shape: "capsule",
268
+ a: 0.055,
269
+ b: 0.5,
270
+ offset: [-0.25, 1.15, 0],
271
+ rotate: [0, 0, 8]
272
+ }, {
273
+ shape: "capsule",
274
+ a: 0.055,
275
+ b: 0.5,
276
+ offset: [0.25, 1.15, 0],
277
+ rotate: [0, 0, -8]
278
+ }, {
279
+ shape: "capsule",
280
+ a: 0.08,
281
+ b: 0.78,
282
+ offset: [-0.1, 0.44, 0]
283
+ }, {
284
+ shape: "capsule",
285
+ a: 0.08,
286
+ b: 0.78,
287
+ offset: [0.1, 0.44, 0]
288
+ }],
289
+ color: "#c8ccd4",
290
+ heightM: 1.75
291
+ },
292
+ {
293
+ id: "bust",
294
+ label: "Bust",
295
+ category: "standins",
296
+ hint: "Head and shoulders on a stand - for framing a portrait",
297
+ parts: [{
298
+ shape: "sphere",
299
+ a: 0.125,
300
+ offset: [0, 1.42, 0]
301
+ }, {
302
+ shape: "capsule",
303
+ a: 0.06,
304
+ b: 0.09,
305
+ offset: [0, 1.27, 0]
306
+ }, {
307
+ shape: "capsule",
308
+ a: 0.19,
309
+ b: 0.2,
310
+ offset: [0, 1.08, 0]
311
+ }, {
312
+ shape: "cylinder",
313
+ a: 0.09,
314
+ b: 0.95,
315
+ offset: [0, 0.48, 0]
316
+ }, {
317
+ shape: "cylinder",
318
+ a: 0.3,
319
+ b: 0.05,
320
+ offset: [0, 0.02, 0]
321
+ }],
322
+ color: "#c8ccd4",
323
+ heightM: 1.55
324
+ },
325
+ {
326
+ id: "camera-standin",
327
+ label: "Camera",
328
+ category: "standins",
329
+ hint: "A camera on sticks at eye height - for shots that show the crew",
330
+ parts: [{
331
+ shape: "box",
332
+ a: 0.34,
333
+ b: 0.22,
334
+ c: 0.5,
335
+ offset: [0, 1.52, 0]
336
+ }, {
337
+ shape: "cylinder",
338
+ a: 0.08,
339
+ b: 0.2,
340
+ offset: [0, 1.52, 0.3],
341
+ rotate: [90, 0, 0]
342
+ }, {
343
+ shape: "cylinder",
344
+ a: 0.035,
345
+ b: 1.4,
346
+ offset: [0, 0.7, -0.12],
347
+ rotate: [10, 0, 0]
348
+ }, {
349
+ shape: "cylinder",
350
+ a: 0.035,
351
+ b: 1.4,
352
+ offset: [-0.18, 0.7, 0.12],
353
+ rotate: [-8, 0, -8]
354
+ }, {
355
+ shape: "cylinder",
356
+ a: 0.035,
357
+ b: 1.4,
358
+ offset: [0.18, 0.7, 0.12],
359
+ rotate: [-8, 0, 8]
360
+ }],
361
+ color: "#41454d",
362
+ heightM: 1.63
363
+ },
364
+ {
365
+ id: "light-stand",
366
+ label: "Light",
367
+ category: "standins",
368
+ hint: "A softbox on a stand - dresses the frame, does not light the set",
369
+ parts: [{
370
+ shape: "box",
371
+ a: 0.9,
372
+ b: 0.9,
373
+ c: 0.12,
374
+ offset: [0, 1.95, 0],
375
+ rotate: [20, 0, 0],
376
+ color: "#f4f1e8"
377
+ }, {
378
+ shape: "cylinder",
379
+ a: 0.03,
380
+ b: 1.9,
381
+ offset: [0, 0.95, -0.1]
382
+ }, {
383
+ shape: "cylinder",
384
+ a: 0.32,
385
+ b: 0.04,
386
+ offset: [0, 0.02, -0.1]
387
+ }],
388
+ color: "#41454d",
389
+ heightM: 2.35
390
+ }
391
+ ];
392
+ const KIT_CATEGORY_LABEL = {
393
+ blocks: "Blocks",
394
+ set: "Set pieces",
395
+ standins: "Stand-ins"
396
+ };
397
+ const findKitEntry = (id) => id ? KIT_ENTRIES.find((entry) => entry.id === id) : void 0;export{KIT_CATEGORY_LABEL,KIT_ENTRIES,findKitEntry};//# sourceMappingURL=supplyLibrary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supplyLibrary.js","sources":["../../../../src/features/canvas/set/supplyLibrary.ts"],"sourcesContent":["/**\n * The supply library - twin of web `editors/set-editor/supplyLibrary.ts`; the\n * set viewport WebView builds each entry from three.js primitives.\n *\n * The supply library: the stock geometry you block a shot with.\n *\n * Every entry here is built in the browser from three.js primitives. Nothing is\n * fetched, nothing expires, and there is no catalogue of somebody else's asset\n * URLs to rot - which matters, because the alternative was a list of links to\n * sample models that would quietly 404 one day and leave a user's saved set\n * full of holes. Generated meshes and uploads live alongside these in the same\n * panel; they are just `source: 'mesh'` instead of `source: 'kit'`.\n *\n * Sizes are in metres and are deliberately real: a door is 2.05m, a figure is\n * 1.75m. A camera that frames a 2m doorway correctly frames a real one, so the\n * still that comes out of the render has believable proportions.\n */\n\nexport type KitCategory = 'blocks' | 'set' | 'standins';\n\n/** A part of a kit entry: one primitive with an offset. Composites are a list of these. */\nexport interface KitPart {\n shape: 'box' | 'sphere' | 'cylinder' | 'cone' | 'torus' | 'plane' | 'capsule';\n /** Box: width/height/depth. Sphere: radius in `a`. Cylinder/cone: radius `a`, height `b`.\n * Torus: radius `a`, tube `b`. Capsule: radius `a`, length `b`. Plane: width `a`, depth `b`. */\n a: number;\n b?: number;\n c?: number;\n offset?: [number, number, number];\n /** Euler degrees. */\n rotate?: [number, number, number];\n /** Overrides the entry colour for this part. */\n color?: string;\n}\n\nexport interface KitEntry {\n id: string;\n label: string;\n category: KitCategory;\n /** One line in the picker; says what it is FOR, not what shape it is. */\n hint: string;\n parts: KitPart[];\n color: string;\n /** Height in metres, shown in the picker so scale is never a surprise. */\n heightM: number;\n}\n\nconst GREY = '#9aa0aa';\nconst WARM = '#c9b79c';\nconst DARK = '#5c6069';\n\nexport const KIT_ENTRIES: readonly KitEntry[] = [\n // ── Blocks: the vocabulary of a rough layout ──────────────────────────────\n {\n id: 'cube',\n label: 'Cube',\n category: 'blocks',\n hint: 'A crate, a plinth, a stand-in for anything boxy',\n parts: [{ shape: 'box', a: 1, b: 1, c: 1, offset: [0, 0.5, 0] }],\n color: GREY,\n heightM: 1,\n },\n {\n id: 'plank',\n label: 'Plank',\n category: 'blocks',\n hint: 'A table top, a shelf, a step',\n parts: [{ shape: 'box', a: 1.6, b: 0.08, c: 0.6, offset: [0, 0.04, 0] }],\n color: WARM,\n heightM: 0.08,\n },\n {\n id: 'cylinder',\n label: 'Cylinder',\n category: 'blocks',\n hint: 'A barrel, a can, a bollard',\n parts: [{ shape: 'cylinder', a: 0.35, b: 0.9, offset: [0, 0.45, 0] }],\n color: GREY,\n heightM: 0.9,\n },\n {\n id: 'sphere',\n label: 'Sphere',\n category: 'blocks',\n hint: 'A ball, or a light probe to read the key off',\n parts: [{ shape: 'sphere', a: 0.4, offset: [0, 0.4, 0] }],\n color: GREY,\n heightM: 0.8,\n },\n {\n id: 'cone',\n label: 'Cone',\n category: 'blocks',\n hint: 'A traffic cone, a tree stand-in',\n parts: [{ shape: 'cone', a: 0.35, b: 0.8, offset: [0, 0.4, 0] }],\n color: '#d97b3f',\n heightM: 0.8,\n },\n {\n id: 'torus',\n label: 'Ring',\n category: 'blocks',\n hint: 'A hoop, a tyre, a halo',\n parts: [{ shape: 'torus', a: 0.5, b: 0.12, offset: [0, 0.5, 0], rotate: [90, 0, 0] }],\n color: DARK,\n heightM: 1,\n },\n\n // ── Set: the pieces that make a place ─────────────────────────────────────\n {\n id: 'floor',\n label: 'Floor',\n category: 'set',\n hint: 'A 6m slab to stand everything on',\n parts: [{ shape: 'plane', a: 6, b: 6 }],\n color: '#6f7480',\n heightM: 0,\n },\n {\n id: 'wall',\n label: 'Wall',\n category: 'set',\n hint: 'A 3m flat to put behind the subject',\n parts: [{ shape: 'box', a: 4, b: 3, c: 0.12, offset: [0, 1.5, 0] }],\n color: '#8b8f99',\n heightM: 3,\n },\n {\n id: 'doorway',\n label: 'Doorway',\n category: 'set',\n hint: 'A wall with a 2.05m hole to walk through',\n parts: [\n { shape: 'box', a: 0.9, b: 2.4, c: 0.14, offset: [-1.35, 1.2, 0] },\n { shape: 'box', a: 0.9, b: 2.4, c: 0.14, offset: [1.35, 1.2, 0] },\n { shape: 'box', a: 3.6, b: 0.35, c: 0.14, offset: [0, 2.22, 0] },\n ],\n color: '#8b8f99',\n heightM: 2.4,\n },\n {\n id: 'steps',\n label: 'Steps',\n category: 'set',\n hint: 'Four risers - gives a figure somewhere to be above the camera',\n parts: [\n { shape: 'box', a: 2, b: 0.18, c: 1.6, offset: [0, 0.09, 0] },\n { shape: 'box', a: 2, b: 0.18, c: 1.2, offset: [0, 0.27, -0.2] },\n { shape: 'box', a: 2, b: 0.18, c: 0.8, offset: [0, 0.45, -0.4] },\n { shape: 'box', a: 2, b: 0.18, c: 0.4, offset: [0, 0.63, -0.6] },\n ],\n color: '#7b8089',\n heightM: 0.72,\n },\n {\n id: 'column',\n label: 'Column',\n category: 'set',\n hint: 'A 3m pillar to break up the frame',\n parts: [\n { shape: 'cylinder', a: 0.28, b: 2.7, offset: [0, 1.35, 0] },\n { shape: 'box', a: 0.8, b: 0.16, c: 0.8, offset: [0, 0.08, 0] },\n { shape: 'box', a: 0.8, b: 0.16, c: 0.8, offset: [0, 2.78, 0] },\n ],\n color: '#a7abb4',\n heightM: 2.86,\n },\n {\n id: 'table',\n label: 'Table',\n category: 'set',\n hint: 'Waist height - the surface a product sits on',\n parts: [\n { shape: 'box', a: 1.4, b: 0.06, c: 0.8, offset: [0, 0.74, 0] },\n { shape: 'box', a: 0.08, b: 0.72, c: 0.08, offset: [-0.62, 0.36, -0.34] },\n { shape: 'box', a: 0.08, b: 0.72, c: 0.08, offset: [0.62, 0.36, -0.34] },\n { shape: 'box', a: 0.08, b: 0.72, c: 0.08, offset: [-0.62, 0.36, 0.34] },\n { shape: 'box', a: 0.08, b: 0.72, c: 0.08, offset: [0.62, 0.36, 0.34] },\n ],\n color: WARM,\n heightM: 0.77,\n },\n\n // ── Stand-ins: where the people and the kit go ────────────────────────────\n {\n id: 'figure',\n label: 'Figure',\n category: 'standins',\n hint: '1.75m mannequin - block where a person stands before you generate one',\n parts: [\n { shape: 'sphere', a: 0.115, offset: [0, 1.63, 0] },\n { shape: 'capsule', a: 0.055, b: 0.1, offset: [0, 1.47, 0] },\n { shape: 'capsule', a: 0.17, b: 0.42, offset: [0, 1.15, 0] },\n { shape: 'capsule', a: 0.055, b: 0.5, offset: [-0.25, 1.15, 0], rotate: [0, 0, 8] },\n { shape: 'capsule', a: 0.055, b: 0.5, offset: [0.25, 1.15, 0], rotate: [0, 0, -8] },\n { shape: 'capsule', a: 0.08, b: 0.78, offset: [-0.1, 0.44, 0] },\n { shape: 'capsule', a: 0.08, b: 0.78, offset: [0.1, 0.44, 0] },\n ],\n color: '#c8ccd4',\n heightM: 1.75,\n },\n {\n id: 'bust',\n label: 'Bust',\n category: 'standins',\n hint: 'Head and shoulders on a stand - for framing a portrait',\n parts: [\n { shape: 'sphere', a: 0.125, offset: [0, 1.42, 0] },\n { shape: 'capsule', a: 0.06, b: 0.09, offset: [0, 1.27, 0] },\n { shape: 'capsule', a: 0.19, b: 0.2, offset: [0, 1.08, 0] },\n { shape: 'cylinder', a: 0.09, b: 0.95, offset: [0, 0.48, 0] },\n { shape: 'cylinder', a: 0.3, b: 0.05, offset: [0, 0.02, 0] },\n ],\n color: '#c8ccd4',\n heightM: 1.55,\n },\n {\n id: 'camera-standin',\n label: 'Camera',\n category: 'standins',\n hint: 'A camera on sticks at eye height - for shots that show the crew',\n parts: [\n { shape: 'box', a: 0.34, b: 0.22, c: 0.5, offset: [0, 1.52, 0] },\n { shape: 'cylinder', a: 0.08, b: 0.2, offset: [0, 1.52, 0.3], rotate: [90, 0, 0] },\n { shape: 'cylinder', a: 0.035, b: 1.4, offset: [0, 0.7, -0.12], rotate: [10, 0, 0] },\n { shape: 'cylinder', a: 0.035, b: 1.4, offset: [-0.18, 0.7, 0.12], rotate: [-8, 0, -8] },\n { shape: 'cylinder', a: 0.035, b: 1.4, offset: [0.18, 0.7, 0.12], rotate: [-8, 0, 8] },\n ],\n color: '#41454d',\n heightM: 1.63,\n },\n {\n id: 'light-stand',\n label: 'Light',\n category: 'standins',\n hint: 'A softbox on a stand - dresses the frame, does not light the set',\n parts: [\n { shape: 'box', a: 0.9, b: 0.9, c: 0.12, offset: [0, 1.95, 0], rotate: [20, 0, 0], color: '#f4f1e8' },\n { shape: 'cylinder', a: 0.03, b: 1.9, offset: [0, 0.95, -0.1] },\n { shape: 'cylinder', a: 0.32, b: 0.04, offset: [0, 0.02, -0.1] },\n ],\n color: '#41454d',\n heightM: 2.35,\n },\n];\n\nexport const KIT_CATEGORY_LABEL: Record<KitCategory, string> = {\n blocks: 'Blocks',\n set: 'Set pieces',\n standins: 'Stand-ins',\n};\n\nexport const findKitEntry = (id: string | undefined): KitEntry | undefined =>\n id ? KIT_ENTRIES.find((entry) => entry.id === id) : undefined;\n\n/** Entries grouped for the picker, in the order the categories are declared. */\nexport function kitByCategory(): { category: KitCategory; label: string; entries: KitEntry[] }[] {\n const categories: KitCategory[] = ['blocks', 'set', 'standins'];\n return categories.map((category) => ({\n category,\n label: KIT_CATEGORY_LABEL[category],\n entries: KIT_ENTRIES.filter((entry) => entry.category === category),\n }));\n}\n"],"names":[],"mappings":"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"}