@adminide-stack/yantra-mobile 12.0.129-alpha.0 → 12.0.129

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 (360) hide show
  1. package/lib/compute.js +57 -1
  2. package/lib/compute.js.map +1 -1
  3. package/lib/features/agent-chat/NativeAgentChat.js +3 -2
  4. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  5. package/lib/features/apps/AppsCatalog.js +10 -0
  6. package/lib/features/apps/AppsCatalog.js.map +1 -1
  7. package/lib/features/apps/mobileAppCatalog.js +11 -0
  8. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  9. package/lib/features/canvas/AudioEditorExperience.js +448 -105
  10. package/lib/features/canvas/AudioEditorExperience.js.map +1 -1
  11. package/lib/features/canvas/CanvasAgentChatPane.js +33 -14
  12. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
  13. package/lib/features/canvas/CanvasBoardsGrid.js +493 -41
  14. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  15. package/lib/features/canvas/CanvasChatResultCard.js.map +1 -1
  16. package/lib/features/canvas/CanvasEditToolsPanel.js +37 -1
  17. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
  18. package/lib/features/canvas/CanvasExperience.js +237 -22
  19. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  20. package/lib/features/canvas/CanvasGeneratePanel.js +119 -26
  21. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
  22. package/lib/features/canvas/CanvasLooksPanel.js +17 -6
  23. package/lib/features/canvas/CanvasLooksPanel.js.map +1 -1
  24. package/lib/features/canvas/CanvasTasksPanel.js +18 -1
  25. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
  26. package/lib/features/canvas/DesignCategoryGallery.js +423 -0
  27. package/lib/features/canvas/DesignCategoryGallery.js.map +1 -0
  28. package/lib/features/canvas/ImageEditorExperience.js +763 -187
  29. package/lib/features/canvas/ImageEditorExperience.js.map +1 -1
  30. package/lib/features/canvas/SetStudioExperience.js +199 -11
  31. package/lib/features/canvas/SetStudioExperience.js.map +1 -1
  32. package/lib/features/canvas/VideoEditorExperience.js +59 -40
  33. package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
  34. package/lib/features/canvas/VideoGeneratorExperience.js +134 -34
  35. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
  36. package/lib/features/canvas/aiEdit.js +4 -2
  37. package/lib/features/canvas/aiEdit.js.map +1 -1
  38. package/lib/features/canvas/audioEditor/AudioWaveform.js +96 -0
  39. package/lib/features/canvas/audioEditor/AudioWaveform.js.map +1 -0
  40. package/lib/features/canvas/audioEditor/audioPeaks.js +93 -0
  41. package/lib/features/canvas/audioEditor/audioPeaks.js.map +1 -0
  42. package/lib/features/canvas/canvasTaskSync.js +34 -7
  43. package/lib/features/canvas/canvasTaskSync.js.map +1 -1
  44. package/lib/features/canvas/canvasTasks.js +23 -3
  45. package/lib/features/canvas/canvasTasks.js.map +1 -1
  46. package/lib/features/canvas/canvasTheme.js +10 -24
  47. package/lib/features/canvas/canvasTheme.js.map +1 -1
  48. package/lib/features/canvas/canvasUi.js +1 -1
  49. package/lib/features/canvas/canvasUi.js.map +1 -1
  50. package/lib/features/canvas/createTiles.js +17 -9
  51. package/lib/features/canvas/createTiles.js.map +1 -1
  52. package/lib/features/canvas/deepLinks.js +35 -5
  53. package/lib/features/canvas/deepLinks.js.map +1 -1
  54. package/lib/features/canvas/designCatalog.js +165 -0
  55. package/lib/features/canvas/designCatalog.js.map +1 -0
  56. package/lib/features/canvas/designCategories.js +262 -0
  57. package/lib/features/canvas/designCategories.js.map +1 -0
  58. package/lib/features/canvas/editorControls.js +406 -0
  59. package/lib/features/canvas/editorControls.js.map +1 -0
  60. package/lib/features/canvas/generationModels.js +5 -3
  61. package/lib/features/canvas/generationModels.js.map +1 -1
  62. package/lib/features/canvas/generationTasks.js +162 -0
  63. package/lib/features/canvas/generationTasks.js.map +1 -0
  64. package/lib/features/canvas/generator/BottomSheet.js +167 -0
  65. package/lib/features/canvas/generator/BottomSheet.js.map +1 -0
  66. package/lib/features/canvas/generator/BusinessCardChatCard.js +155 -0
  67. package/lib/features/canvas/generator/BusinessCardChatCard.js.map +1 -0
  68. package/lib/features/canvas/generator/DirectorSheet.js +163 -0
  69. package/lib/features/canvas/generator/DirectorSheet.js.map +1 -0
  70. package/lib/features/canvas/generator/ReframePreview.js +122 -0
  71. package/lib/features/canvas/generator/ReframePreview.js.map +1 -0
  72. package/lib/features/canvas/generator/RunLogCard.js +119 -0
  73. package/lib/features/canvas/generator/RunLogCard.js.map +1 -0
  74. package/lib/features/canvas/generator/ShotPanel.js +261 -0
  75. package/lib/features/canvas/generator/ShotPanel.js.map +1 -0
  76. package/lib/features/canvas/generator/businessCardWidget.js +117 -0
  77. package/lib/features/canvas/generator/businessCardWidget.js.map +1 -0
  78. package/lib/features/canvas/generator/cameraVocabulary.js +142 -0
  79. package/lib/features/canvas/generator/cameraVocabulary.js.map +1 -0
  80. package/lib/features/canvas/generator/cinematicVocabulary.js +416 -0
  81. package/lib/features/canvas/generator/cinematicVocabulary.js.map +1 -0
  82. package/lib/features/canvas/generator/direction.js +41 -0
  83. package/lib/features/canvas/generator/direction.js.map +1 -0
  84. package/lib/features/canvas/generator/reframeGeometry.js +108 -0
  85. package/lib/features/canvas/generator/reframeGeometry.js.map +1 -0
  86. package/lib/features/canvas/generator/runLog.js +71 -0
  87. package/lib/features/canvas/generator/runLog.js.map +1 -0
  88. package/lib/features/canvas/generator/shot.js +133 -0
  89. package/lib/features/canvas/generator/shot.js.map +1 -0
  90. package/lib/features/canvas/generator/useShotSpec.js +87 -0
  91. package/lib/features/canvas/generator/useShotSpec.js.map +1 -0
  92. package/lib/features/canvas/home/HeroComposer.js +214 -0
  93. package/lib/features/canvas/home/HeroComposer.js.map +1 -0
  94. package/lib/features/canvas/home/HeroMonitor.js +225 -0
  95. package/lib/features/canvas/home/HeroMonitor.js.map +1 -0
  96. package/lib/features/canvas/home/LookDetail.js +185 -0
  97. package/lib/features/canvas/home/LookDetail.js.map +1 -0
  98. package/lib/features/canvas/home/LoopingVideo.js +37 -0
  99. package/lib/features/canvas/home/LoopingVideo.js.map +1 -0
  100. package/lib/features/canvas/home/TemplatesGallery.js +253 -0
  101. package/lib/features/canvas/home/TemplatesGallery.js.map +1 -0
  102. package/lib/features/canvas/home/heroShots.js +100 -0
  103. package/lib/features/canvas/home/heroShots.js.map +1 -0
  104. package/lib/features/canvas/homeWork.js +62 -3
  105. package/lib/features/canvas/homeWork.js.map +1 -1
  106. package/lib/features/canvas/imageEditor/ImageMarkup.js +195 -0
  107. package/lib/features/canvas/imageEditor/ImageMarkup.js.map +1 -0
  108. package/lib/features/canvas/imageEditor/imageEditOps.js +367 -0
  109. package/lib/features/canvas/imageEditor/imageEditOps.js.map +1 -0
  110. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  111. package/lib/features/canvas/rankedCatalogSearch.js +375 -0
  112. package/lib/features/canvas/rankedCatalogSearch.js.map +1 -0
  113. package/lib/features/canvas/recorder/CameraRecorderExperience.js +68 -20
  114. package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -1
  115. package/lib/features/canvas/recorder/RecordingReview.js +272 -0
  116. package/lib/features/canvas/recorder/RecordingReview.js.map +1 -0
  117. package/lib/features/canvas/recorder/RecordingsList.js +179 -0
  118. package/lib/features/canvas/recorder/RecordingsList.js.map +1 -0
  119. package/lib/features/canvas/recorder/recorderOps.js +99 -0
  120. package/lib/features/canvas/recorder/recorderOps.js.map +1 -0
  121. package/lib/features/canvas/seedanceShowcase.js +314 -0
  122. package/lib/features/canvas/seedanceShowcase.js.map +1 -0
  123. package/lib/features/canvas/serverTasks.js +149 -15
  124. package/lib/features/canvas/serverTasks.js.map +1 -1
  125. package/lib/features/canvas/sessionRenewal.js +114 -0
  126. package/lib/features/canvas/sessionRenewal.js.map +1 -0
  127. package/lib/features/canvas/set/SetViewportWebView.js +34 -1
  128. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
  129. package/lib/features/canvas/set/agent/setTurn.js +4 -2
  130. package/lib/features/canvas/set/agent/setTurn.js.map +1 -1
  131. package/lib/features/canvas/set/setPresets.js +85 -0
  132. package/lib/features/canvas/set/setPresets.js.map +1 -0
  133. package/lib/features/canvas/set/setProject.js +4 -1
  134. package/lib/features/canvas/set/setProject.js.map +1 -1
  135. package/lib/features/canvas/studioCatalog.js +59 -4
  136. package/lib/features/canvas/studioCatalog.js.map +1 -1
  137. package/lib/features/canvas/studioLooks.js +31 -4
  138. package/lib/features/canvas/studioLooks.js.map +1 -1
  139. package/lib/features/canvas/surfaceIndex.js +1 -14
  140. package/lib/features/canvas/surfaceIndex.js.map +1 -1
  141. package/lib/features/canvas/templateSearch.js +489 -0
  142. package/lib/features/canvas/templateSearch.js.map +1 -0
  143. package/lib/features/canvas/useCanvasSession.js +28 -6
  144. package/lib/features/canvas/useCanvasSession.js.map +1 -1
  145. package/lib/features/canvas/useStudioCatalogTemplates.js +41 -5
  146. package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -1
  147. package/lib/features/canvas/videoEditor/EditorPanels.js +531 -0
  148. package/lib/features/canvas/videoEditor/EditorPanels.js.map +1 -0
  149. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +48 -4
  150. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
  151. package/lib/features/canvas/videoEditor/agent/agentLoop.js +2 -0
  152. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
  153. package/lib/features/canvas/videoEditor/agent/brainClient.js +97 -27
  154. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
  155. package/lib/features/canvas/videoEditor/agent/cutTools.js +707 -3
  156. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
  157. package/lib/features/canvas/videoEditor/audioServices.js +165 -0
  158. package/lib/features/canvas/videoEditor/audioServices.js.map +1 -0
  159. package/lib/features/canvas/videoEditor/captions.js +144 -0
  160. package/lib/features/canvas/videoEditor/captions.js.map +1 -0
  161. package/lib/features/canvas/videoEditor/compileTimeline.js +24 -16
  162. package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -1
  163. package/lib/features/canvas/videoEditor/editorModel.js +12 -2
  164. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
  165. package/lib/features/canvas/videoEditor/exportTask.js +89 -7
  166. package/lib/features/canvas/videoEditor/exportTask.js.map +1 -1
  167. package/lib/features/canvas/videoEditor/layers.js +117 -0
  168. package/lib/features/canvas/videoEditor/layers.js.map +1 -0
  169. package/lib/features/canvas/videoEditor/remoteMediaClient.js +45 -18
  170. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
  171. package/lib/features/canvas/videoEditor/renderTimeline.js +18 -6
  172. package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -1
  173. package/lib/features/canvas/videoEditor/revoice.js +138 -0
  174. package/lib/features/canvas/videoEditor/revoice.js.map +1 -0
  175. package/lib/features/canvas/videoEditor/storageUpload.js +34 -0
  176. package/lib/features/canvas/videoEditor/storageUpload.js.map +1 -0
  177. package/lib/features/canvas/videoEditor/textMotion.js +109 -0
  178. package/lib/features/canvas/videoEditor/textMotion.js.map +1 -0
  179. package/lib/features/canvas/videoEditor/transitions.js +31 -0
  180. package/lib/features/canvas/videoEditor/transitions.js.map +1 -0
  181. package/lib/features/chat/TemplatesChatCards.js +8 -3
  182. package/lib/features/chat/TemplatesChatCards.js.map +1 -1
  183. package/lib/features/design/DesignEditorExperience.js +674 -644
  184. package/lib/features/design/DesignEditorExperience.js.map +1 -1
  185. package/lib/features/design/DesignExperience.js +285 -538
  186. package/lib/features/design/DesignExperience.js.map +1 -1
  187. package/lib/features/design/designCore.js +2 -212
  188. package/lib/features/design/designCore.js.map +1 -1
  189. package/lib/features/design/designIndex.js +1 -50
  190. package/lib/features/design/designIndex.js.map +1 -1
  191. package/lib/features/design/doc/aiDesign.js +247 -0
  192. package/lib/features/design/doc/aiDesign.js.map +1 -0
  193. package/lib/features/design/doc/artifacts.js +280 -0
  194. package/lib/features/design/doc/artifacts.js.map +1 -0
  195. package/lib/features/design/doc/chart.js +98 -0
  196. package/lib/features/design/doc/chart.js.map +1 -0
  197. package/lib/features/design/doc/crop.js +104 -0
  198. package/lib/features/design/doc/crop.js.map +1 -0
  199. package/lib/features/design/doc/curve.js +49 -0
  200. package/lib/features/design/doc/curve.js.map +1 -0
  201. package/lib/features/design/doc/docOps.js +397 -0
  202. package/lib/features/design/doc/docOps.js.map +1 -0
  203. package/lib/features/design/doc/findReplace.js +112 -0
  204. package/lib/features/design/doc/findReplace.js.map +1 -0
  205. package/lib/features/design/doc/fonts.js +79 -0
  206. package/lib/features/design/doc/fonts.js.map +1 -0
  207. package/lib/features/design/doc/frames.js +17 -0
  208. package/lib/features/design/doc/frames.js.map +1 -0
  209. package/lib/features/design/doc/geometry.js +133 -0
  210. package/lib/features/design/doc/geometry.js.map +1 -0
  211. package/lib/features/design/doc/imageAdjust.js +203 -0
  212. package/lib/features/design/doc/imageAdjust.js.map +1 -0
  213. package/lib/features/design/doc/legacyDoc.js +107 -0
  214. package/lib/features/design/doc/legacyDoc.js.map +1 -0
  215. package/lib/features/design/doc/newDoc.js +335 -0
  216. package/lib/features/design/doc/newDoc.js.map +1 -0
  217. package/lib/features/design/doc/pageRange.js +17 -0
  218. package/lib/features/design/doc/pageRange.js.map +1 -0
  219. package/lib/features/design/doc/pathScale.js +68 -0
  220. package/lib/features/design/doc/pathScale.js.map +1 -0
  221. package/lib/features/design/doc/qr.js +62 -0
  222. package/lib/features/design/doc/qr.js.map +1 -0
  223. package/lib/features/design/doc/shapes.js +366 -0
  224. package/lib/features/design/doc/shapes.js.map +1 -0
  225. package/lib/features/design/doc/sizes.js +230 -0
  226. package/lib/features/design/doc/sizes.js.map +1 -0
  227. package/lib/features/design/doc/textEffects.js +134 -0
  228. package/lib/features/design/doc/textEffects.js.map +1 -0
  229. package/lib/features/design/doc/textLayout.js +182 -0
  230. package/lib/features/design/doc/textLayout.js.map +1 -0
  231. package/lib/features/design/doc/types.js +30 -0
  232. package/lib/features/design/doc/types.js.map +1 -0
  233. package/lib/features/design/editor/AiPanel.js +194 -0
  234. package/lib/features/design/editor/AiPanel.js.map +1 -0
  235. package/lib/features/design/editor/ChartDataPanel.js +182 -0
  236. package/lib/features/design/editor/ChartDataPanel.js.map +1 -0
  237. package/lib/features/design/editor/CropOverlay.js +199 -0
  238. package/lib/features/design/editor/CropOverlay.js.map +1 -0
  239. package/lib/features/design/editor/DesignCanvas.js +363 -0
  240. package/lib/features/design/editor/DesignCanvas.js.map +1 -0
  241. package/lib/features/design/editor/ExportSheet.js +123 -0
  242. package/lib/features/design/editor/ExportSheet.js.map +1 -0
  243. package/lib/features/design/editor/FindReplacePanel.js +93 -0
  244. package/lib/features/design/editor/FindReplacePanel.js.map +1 -0
  245. package/lib/features/design/editor/ImageTools.js +188 -0
  246. package/lib/features/design/editor/ImageTools.js.map +1 -0
  247. package/lib/features/design/editor/LayerTools.js +485 -0
  248. package/lib/features/design/editor/LayerTools.js.map +1 -0
  249. package/lib/features/design/editor/PageStrip.js +203 -0
  250. package/lib/features/design/editor/PageStrip.js.map +1 -0
  251. package/lib/features/design/editor/Slideshow.js +97 -0
  252. package/lib/features/design/editor/Slideshow.js.map +1 -0
  253. package/lib/features/design/editor/ToolPanels.js +695 -0
  254. package/lib/features/design/editor/ToolPanels.js.map +1 -0
  255. package/lib/features/design/editor/controls.js +630 -0
  256. package/lib/features/design/editor/controls.js.map +1 -0
  257. package/lib/features/design/editor/useDesignSave.js +91 -0
  258. package/lib/features/design/editor/useDesignSave.js.map +1 -0
  259. package/lib/features/design/export/exportDesign.js +170 -0
  260. package/lib/features/design/export/exportDesign.js.map +1 -0
  261. package/lib/features/design/export/pdf.js +143 -0
  262. package/lib/features/design/export/pdf.js.map +1 -0
  263. package/lib/features/design/home/DesignHome.js +688 -0
  264. package/lib/features/design/home/DesignHome.js.map +1 -0
  265. package/lib/features/design/home/studioHome.js +61 -0
  266. package/lib/features/design/home/studioHome.js.map +1 -0
  267. package/lib/features/design/pickDesignImage.js +60 -0
  268. package/lib/features/design/pickDesignImage.js.map +1 -0
  269. package/lib/features/design/render/DesignPageView.js +69 -0
  270. package/lib/features/design/render/DesignPageView.js.map +1 -0
  271. package/lib/features/design/render/PageCapture.js +288 -0
  272. package/lib/features/design/render/PageCapture.js.map +1 -0
  273. package/lib/features/design/render/TextMeasure.js +115 -0
  274. package/lib/features/design/render/TextMeasure.js.map +1 -0
  275. package/lib/features/design/render/fontRegistry.js +110 -0
  276. package/lib/features/design/render/fontRegistry.js.map +1 -0
  277. package/lib/features/design/render/layers.js +392 -0
  278. package/lib/features/design/render/layers.js.map +1 -0
  279. package/lib/features/design/render/svg.js +35 -0
  280. package/lib/features/design/render/svg.js.map +1 -0
  281. package/lib/features/design/render/svgParts.js +435 -0
  282. package/lib/features/design/render/svgParts.js.map +1 -0
  283. package/lib/features/design/surface/BoardScreen.js +529 -0
  284. package/lib/features/design/surface/BoardScreen.js.map +1 -0
  285. package/lib/features/design/surface/CompareView.js +138 -0
  286. package/lib/features/design/surface/CompareView.js.map +1 -0
  287. package/lib/features/design/surface/CreationScreen.js +294 -0
  288. package/lib/features/design/surface/CreationScreen.js.map +1 -0
  289. package/lib/features/design/surface/DesignAgentChatPane.js +444 -0
  290. package/lib/features/design/surface/DesignAgentChatPane.js.map +1 -0
  291. package/lib/features/design/surface/DesignBoards.js +441 -0
  292. package/lib/features/design/surface/DesignBoards.js.map +1 -0
  293. package/lib/features/design/surface/DesignPreview.js +159 -0
  294. package/lib/features/design/surface/DesignPreview.js.map +1 -0
  295. package/lib/features/design/surface/DesignSurfaceExperience.js +80 -0
  296. package/lib/features/design/surface/DesignSurfaceExperience.js.map +1 -0
  297. package/lib/features/design/surface/FullScreenPreview.js +59 -0
  298. package/lib/features/design/surface/FullScreenPreview.js.map +1 -0
  299. package/lib/features/design/surface/NewSystemDialog.js +122 -0
  300. package/lib/features/design/surface/NewSystemDialog.js.map +1 -0
  301. package/lib/features/design/surface/PickerSheet.js +175 -0
  302. package/lib/features/design/surface/PickerSheet.js.map +1 -0
  303. package/lib/features/design/surface/TemplatesGallery.js +156 -0
  304. package/lib/features/design/surface/TemplatesGallery.js.map +1 -0
  305. package/lib/features/design/surface/WetPaint.js +140 -0
  306. package/lib/features/design/surface/WetPaint.js.map +1 -0
  307. package/lib/features/design/surface/agentTurn.js +229 -0
  308. package/lib/features/design/surface/agentTurn.js.map +1 -0
  309. package/lib/features/design/surface/designBoard.js +218 -0
  310. package/lib/features/design/surface/designBoard.js.map +1 -0
  311. package/lib/features/design/surface/designChannel.js +186 -0
  312. package/lib/features/design/surface/designChannel.js.map +1 -0
  313. package/lib/features/design/surface/designChat.js +141 -0
  314. package/lib/features/design/surface/designChat.js.map +1 -0
  315. package/lib/features/design/surface/designConnector.js +266 -0
  316. package/lib/features/design/surface/designConnector.js.map +1 -0
  317. package/lib/features/design/surface/designDocument.js +40 -0
  318. package/lib/features/design/surface/designDocument.js.map +1 -0
  319. package/lib/features/design/surface/designExport.js +55 -0
  320. package/lib/features/design/surface/designExport.js.map +1 -0
  321. package/lib/features/design/surface/designLinks.js +64 -0
  322. package/lib/features/design/surface/designLinks.js.map +1 -0
  323. package/lib/features/design/surface/designPalette.js +24 -0
  324. package/lib/features/design/surface/designPalette.js.map +1 -0
  325. package/lib/features/design/surface/designRun.js +161 -0
  326. package/lib/features/design/surface/designRun.js.map +1 -0
  327. package/lib/features/design/surface/designTheme.js +119 -0
  328. package/lib/features/design/surface/designTheme.js.map +1 -0
  329. package/lib/features/design/surface/execStream.js +206 -0
  330. package/lib/features/design/surface/execStream.js.map +1 -0
  331. package/lib/features/design/surface/metaball.js +48 -0
  332. package/lib/features/design/surface/metaball.js.map +1 -0
  333. package/lib/features/design/surface/pickReferenceFiles.js +35 -0
  334. package/lib/features/design/surface/pickReferenceFiles.js.map +1 -0
  335. package/lib/features/design/surface/useDesignSurface.js +379 -0
  336. package/lib/features/design/surface/useDesignSurface.js.map +1 -0
  337. package/lib/features/docs/DocBlockRow.js +336 -0
  338. package/lib/features/docs/DocBlockRow.js.map +1 -0
  339. package/lib/features/docs/DocsEditorExperience.js +949 -0
  340. package/lib/features/docs/DocsEditorExperience.js.map +1 -0
  341. package/lib/features/docs/DocsToolbar.js +247 -0
  342. package/lib/features/docs/DocsToolbar.js.map +1 -0
  343. package/lib/features/docs/blocks.js +560 -0
  344. package/lib/features/docs/blocks.js.map +1 -0
  345. package/lib/features/docs/docArtifacts.js +129 -0
  346. package/lib/features/docs/docArtifacts.js.map +1 -0
  347. package/lib/features/docs/docEdits.js +201 -0
  348. package/lib/features/docs/docEdits.js.map +1 -0
  349. package/lib/features/docs/docExport.js +235 -0
  350. package/lib/features/docs/docExport.js.map +1 -0
  351. package/lib/features/docs/docShare.js +62 -0
  352. package/lib/features/docs/docShare.js.map +1 -0
  353. package/lib/features/links/openInApp.js +38 -2
  354. package/lib/features/links/openInApp.js.map +1 -1
  355. package/lib/routes.json +54 -0
  356. package/lib/screens/DesignNative/index.js +35 -0
  357. package/lib/screens/DesignNative/index.js.map +1 -0
  358. package/package.json +4 -4
  359. package/lib/features/design/exportDesign.js +0 -133
  360. package/lib/features/design/exportDesign.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacyDoc.js","sources":["../../../../src/features/design/doc/legacyDoc.ts"],"sourcesContent":["/**\n * The first native design format (designCore.ts `PersistedDesignDoc`, rows on\n * the `design` surface) as a Design Studio document, so a design made before\n * the studio still opens - and saves on as a studio design the web can read.\n *\n * Layers were page px with a z-index; the studio's are page fractions in\n * paint order. Every page takes the first page's size (the studio's pages\n * share one), each layer re-anchored by fraction.\n *\n * Pure: runs under jest as-is.\n */\nimport type { PersistedDesignDoc } from '../designCore';\nimport { blankDoc } from './newDoc';\nimport { newLayerId, type DesignDoc, type DesignKind, type EditorLayer } from './types';\n\n/** Printed kinds save as flyers, the rest as decks. */\nexport function legacyKind(doc: Pick<PersistedDesignDoc, 'kind'>): DesignKind {\n return doc.kind === 'tshirt' || doc.kind === 'postcard' ? 'flyer' : 'deck';\n}\n\nexport function legacyToDoc(legacy: PersistedDesignDoc): DesignDoc {\n const first = legacy.pages[0];\n const width = first?.width || 1080;\n const height = first?.height || 1080;\n const kind = legacyKind(legacy);\n const base = blankDoc({\n width,\n height,\n platform: legacy.kind === 'carousel' ? 'Instagram' : kind === 'flyer' ? 'Print' : 'Custom',\n kind,\n pageNames: legacy.pages.map((p, i) => p.name || `Page ${i + 1}`),\n });\n // A legacy print design has no trim size to print at: keep it a screen-sized page with no print spec.\n delete base.print;\n return {\n ...base,\n ...(legacy.title ? { title: legacy.title } : {}),\n pages: base.pages.map((page, i) => {\n const source = legacy.pages[i];\n const pw = source?.width || width;\n const ph = source?.height || height;\n const layers = [...(source?.layers ?? [])]\n .sort((a, b) => a.zIndex - b.zIndex)\n .map((l): EditorLayer => {\n const box = { id: newLayerId(), x: l.x / pw, y: l.y / ph, w: l.width / pw, h: l.height / ph };\n const opacity = l.opacity ?? 1;\n if (l.type === 'text') {\n return {\n ...box,\n kind: 'text',\n content: l.text,\n fontToken: 'body',\n fontWeight: l.bold ? 700 : 400,\n fontSizeFrac: l.fontSize / pw,\n color: l.color,\n align: l.align,\n lineHeight: 1.2,\n ...(opacity !== 1 ? { opacity } : {}),\n };\n }\n if (l.type === 'image') {\n return {\n ...box,\n kind: 'image',\n prompt: '',\n src: l.src,\n imageStatus: 'ready',\n uploaded: true,\n ...(opacity !== 1 ? { opacity } : {}),\n };\n }\n if (l.shape === 'line') {\n return {\n ...box,\n kind: 'shape',\n shape: 'line',\n fill: l.fill,\n radiusFrac: 0,\n opacity,\n strokeWidthFrac: l.height / pw,\n };\n }\n const short = Math.min(l.width, l.height) || 1;\n return {\n ...box,\n kind: 'shape',\n shape: 'rect',\n fill: l.fill,\n radiusFrac: Math.min(0.5, (l.cornerRadius || 0) / short),\n opacity,\n };\n });\n return { ...page, background: { kind: 'color', color: source?.background || '#ffffff' }, layers };\n }),\n };\n}\n"],"names":["_a"],"mappings":"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"}
@@ -0,0 +1,335 @@
1
+ import {DESIGN_CATALOG_QUERY,groupOfTemplate,designCatalogFilter}from'../../canvas/designCatalog.js';import {snapAspect,toPx,PRINT_PLATFORM}from'./sizes.js';import {newLayerId,DEFAULT_FONT_PAIR,defaultPageName,newPageId}from'./types.js';var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj2, key, value) => key in obj2 ? __defProp(obj2, key, { enumerable: true, configurable: true, writable: true, value }) : obj2[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ const DEFAULT_BLEED_MM = 4;
21
+ const DEFAULT_SAFE_AREA_MM = 4;
22
+ function defaultPrintSpec(trimMm) {
23
+ return __spreadValues({
24
+ bleedMm: DEFAULT_BLEED_MM,
25
+ safeAreaMm: DEFAULT_SAFE_AREA_MM
26
+ }, trimMm ? {
27
+ trimMm
28
+ } : {});
29
+ }
30
+ const BLANK_PALETTE = {
31
+ background: "#ffffff",
32
+ surface: "#f1f5f9",
33
+ primary: "#0f172a",
34
+ text: "#020817",
35
+ muted: "#64748b"
36
+ };
37
+ function templateBrief(topic, aspectRatio, pageCount) {
38
+ return {
39
+ platform: "Instagram",
40
+ format: aspectRatio,
41
+ pageCount,
42
+ topic,
43
+ audience: "a general audience",
44
+ tone: "Professional"
45
+ };
46
+ }
47
+ function blankPage(index, name) {
48
+ return {
49
+ id: `page-${index + 1}-${Date.now().toString(36)}`,
50
+ name: name != null ? name : defaultPageName("cover", index),
51
+ prompt: "",
52
+ src: null,
53
+ status: "ready",
54
+ role: "cover",
55
+ background: {
56
+ kind: "color",
57
+ color: BLANK_PALETTE.background
58
+ },
59
+ layers: []
60
+ };
61
+ }
62
+ function blankDoc({
63
+ width,
64
+ height,
65
+ platform,
66
+ kind,
67
+ trimMm,
68
+ pageNames
69
+ }) {
70
+ const aspectRatio = snapAspect(width, height);
71
+ const names = (pageNames == null ? void 0 : pageNames.length) ? pageNames : [void 0];
72
+ const pages = names.map((name, i) => {
73
+ const page = blankPage(i, name);
74
+ return name ? page : kind === "flyer" ? __spreadProps(__spreadValues({}, page), {
75
+ name: ""
76
+ }) : page;
77
+ });
78
+ return __spreadValues({
79
+ version: 2,
80
+ brief: __spreadProps(__spreadValues({}, templateBrief("Untitled design", aspectRatio, pages.length)), {
81
+ platform
82
+ }),
83
+ aspectRatio,
84
+ pageWidth: width,
85
+ pageHeight: height,
86
+ palette: BLANK_PALETTE,
87
+ fontPair: __spreadValues({}, DEFAULT_FONT_PAIR),
88
+ pages
89
+ }, kind === "flyer" ? {
90
+ print: defaultPrintSpec(trimMm)
91
+ } : {});
92
+ }
93
+ function blankDocForSize(size) {
94
+ return blankDoc({
95
+ width: size.width,
96
+ height: size.height,
97
+ platform: size.platform,
98
+ kind: size.kind,
99
+ trimMm: size.trimMm,
100
+ pageNames: size.pageNames
101
+ });
102
+ }
103
+ function blankDocCustom(width, height, trimMm) {
104
+ return blankDoc({
105
+ width,
106
+ height,
107
+ platform: "Custom",
108
+ kind: "deck",
109
+ trimMm
110
+ });
111
+ }
112
+ const str = (v) => typeof v === "string" ? v.trim() : "";
113
+ const obj = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : {};
114
+ const isHttps = (v) => typeof v === "string" && /^https:\/\//.test(v);
115
+ function designTemplateFromRow(row, group) {
116
+ let formData = obj(row == null ? void 0 : row.formData);
117
+ if (typeof (row == null ? void 0 : row.formData) === "string") {
118
+ try {
119
+ formData = obj(JSON.parse(row.formData));
120
+ } catch (e) {
121
+ return null;
122
+ }
123
+ }
124
+ const details = obj(formData.generationDetails);
125
+ const design = obj(formData.design);
126
+ const pages = Array.isArray(design.pages) ? design.pages.filter((p) => isHttps(p) || Boolean(p) && typeof p === "object" && Array.isArray(p.layers)) : [];
127
+ const previews = Array.isArray(design.previews) ? design.previews.filter(isHttps) : [];
128
+ const fonts = Array.isArray(design.fonts) ? design.fonts.filter((f) => typeof (f == null ? void 0 : f.family) === "string" && isHttps(f == null ? void 0 : f.url)) : [];
129
+ const pageWidth = Number(design.pageWidth);
130
+ const pageHeight = Number(design.pageHeight);
131
+ const trim = obj(design.trimMm);
132
+ const trimMm = Number(trim.w) > 0 && Number(trim.h) > 0 ? {
133
+ w: Number(trim.w),
134
+ h: Number(trim.h)
135
+ } : null;
136
+ const id = str(row == null ? void 0 : row.name);
137
+ const coverUrl = isHttps(details.previewUrl) ? str(details.previewUrl) : "";
138
+ if (!id || !coverUrl || pages.length === 0 || !(pageWidth > 0) || !(pageHeight > 0)) return null;
139
+ const title = str(details.title) || id;
140
+ return __spreadValues(__spreadProps(__spreadValues(__spreadValues(__spreadValues({
141
+ id,
142
+ group,
143
+ title,
144
+ summary: str(details.summary) || str(row == null ? void 0 : row.description),
145
+ coverUrl,
146
+ aspectRatio: str(design.aspectRatio) || str(obj(formData.generation).aspectRatio),
147
+ pageWidth,
148
+ pageHeight,
149
+ pages
150
+ }, previews.length ? {
151
+ previews
152
+ } : {}), fonts.length ? {
153
+ fonts
154
+ } : {}), trimMm ? {
155
+ trimMm
156
+ } : {}), {
157
+ prompt: str(obj(formData.generation).prompt) || title
158
+ }), Array.isArray(row == null ? void 0 : row.tags) ? {
159
+ tags: row.tags.filter((t) => typeof t === "string")
160
+ } : {});
161
+ }
162
+ async function findDesignTemplate(id, readRows) {
163
+ const group = groupOfTemplate(id);
164
+ if (!group) return null;
165
+ const rows = await readRows(designCatalogFilter(group, {
166
+ search: id,
167
+ limit: 10,
168
+ offset: 0,
169
+ anyRecord: true
170
+ }));
171
+ for (const row of rows) {
172
+ if (str(row == null ? void 0 : row.name) !== id) continue;
173
+ const template = designTemplateFromRow(row, group);
174
+ if (template) return template;
175
+ }
176
+ return null;
177
+ }
178
+ function backendCatalogRows(graphqlUrl, token) {
179
+ return async (filter) => {
180
+ var _a, _b, _c, _d;
181
+ const res = await fetch(graphqlUrl, {
182
+ method: "POST",
183
+ headers: __spreadValues({
184
+ "content-type": "application/json"
185
+ }, token ? {
186
+ authorization: `Bearer ${token}`
187
+ } : {}),
188
+ body: JSON.stringify({
189
+ query: DESIGN_CATALOG_QUERY,
190
+ variables: {
191
+ filter
192
+ }
193
+ })
194
+ });
195
+ if (!res.ok) throw new Error(`Template read failed (${res.status})`);
196
+ const json = await res.json().catch(() => ({}));
197
+ if ((_a = json.errors) == null ? void 0 : _a.length) throw new Error(((_b = json.errors[0]) == null ? void 0 : _b.message) || "Template read failed");
198
+ const nodes = (_d = (_c = json.data) == null ? void 0 : _c.formTemplateSubmissions) == null ? void 0 : _d.nodes;
199
+ return Array.isArray(nodes) ? nodes : [];
200
+ };
201
+ }
202
+ const PALETTE = {
203
+ background: "#ffffff",
204
+ surface: "#f1f5f9",
205
+ primary: "#0f172a",
206
+ text: "#020817",
207
+ muted: "#64748b"
208
+ };
209
+ const SCREEN = {
210
+ "canvas-presentation": "Presentation",
211
+ "canvas-carousel": "Instagram",
212
+ "canvas-logo": "Logo",
213
+ "canvas-banner": "Banner",
214
+ "canvas-social-post": "Social",
215
+ "canvas-infographic": "Infographic"
216
+ };
217
+ const PRINT = {
218
+ "canvas-brochure": PRINT_PLATFORM.brochure,
219
+ "canvas-branding": PRINT_PLATFORM.branding,
220
+ "canvas-certificate": PRINT_PLATFORM.certificate,
221
+ "canvas-worksheet": PRINT_PLATFORM.worksheet,
222
+ "canvas-proposal": PRINT_PLATFORM.proposal,
223
+ "canvas-newsletter": PRINT_PLATFORM.newsletter,
224
+ "canvas-menu": PRINT_PLATFORM.menu
225
+ };
226
+ const catalogKind = (template) => SCREEN[template.group] ? "deck" : "flyer";
227
+ const platformOf = (group) => {
228
+ var _a, _b;
229
+ return (_b = (_a = SCREEN[group]) != null ? _a : PRINT[group]) != null ? _b : "Print";
230
+ };
231
+ function catalogGroupOf(doc) {
232
+ var _a;
233
+ const platform = (_a = doc.brief) == null ? void 0 : _a.platform;
234
+ const groups = Object.keys(__spreadValues(__spreadValues({}, SCREEN), PRINT));
235
+ const named = groups.find((g) => platformOf(g) === platform);
236
+ if (named) return named;
237
+ if (platform !== "Print") return null;
238
+ const ratio = Math.max(doc.pageWidth, doc.pageHeight) / Math.min(doc.pageWidth, doc.pageHeight);
239
+ return ratio > 1.52 ? "canvas-business-card" : "canvas-flyer";
240
+ }
241
+ const SIDES = {
242
+ "canvas-business-card": ["Front", "Back"],
243
+ "canvas-brochure": ["Outside", "Inside"]
244
+ };
245
+ function pageSizeOf(template) {
246
+ if (catalogKind(template) === "flyer" && template.trimMm) return {
247
+ width: toPx(template.trimMm.w, "mm"),
248
+ height: toPx(template.trimMm.h, "mm"),
249
+ trimMm: template.trimMm
250
+ };
251
+ return {
252
+ width: template.pageWidth,
253
+ height: template.pageHeight
254
+ };
255
+ }
256
+ function catalogToDoc(template) {
257
+ var _a;
258
+ const stamp = Date.now().toString(36);
259
+ const last = template.pages.length - 1;
260
+ const size = pageSizeOf(template);
261
+ const sides = template.pages.length === 2 ? SIDES[template.group] : void 0;
262
+ const print = catalogKind(template) === "flyer";
263
+ const nameOf = (role, i) => {
264
+ var _a2;
265
+ return (_a2 = sides == null ? void 0 : sides[i]) != null ? _a2 : print ? "" : defaultPageName(role, i);
266
+ };
267
+ return __spreadProps(__spreadValues(__spreadProps(__spreadValues({
268
+ version: 2,
269
+ brief: {
270
+ platform: platformOf(template.group),
271
+ format: template.aspectRatio || `${template.pageWidth}x${template.pageHeight}`,
272
+ pageCount: template.pages.length,
273
+ topic: template.title,
274
+ audience: "a general audience",
275
+ tone: "Professional",
276
+ templateNotes: template.prompt
277
+ },
278
+ aspectRatio: template.aspectRatio || `${template.pageWidth}:${template.pageHeight}`,
279
+ pageWidth: size.width,
280
+ pageHeight: size.height
281
+ }, size.trimMm ? {
282
+ print: defaultPrintSpec(size.trimMm)
283
+ } : {}), {
284
+ palette: PALETTE,
285
+ fontPair: {
286
+ display: "Inter",
287
+ body: "Inter"
288
+ }
289
+ }), ((_a = template.fonts) == null ? void 0 : _a.length) ? {
290
+ fonts: template.fonts
291
+ } : {}), {
292
+ pages: template.pages.map((page, i) => {
293
+ var _a2, _b;
294
+ const fallbackRole = i === 0 ? "cover" : i === last && last > 0 ? "cta" : "content";
295
+ const base = {
296
+ id: `page-${i + 1}-${stamp}`,
297
+ prompt: "",
298
+ src: null,
299
+ status: "ready"
300
+ };
301
+ if (typeof page === "string") {
302
+ return __spreadProps(__spreadValues({}, base), {
303
+ name: nameOf(fallbackRole, i),
304
+ role: fallbackRole,
305
+ background: {
306
+ kind: "image",
307
+ src: page,
308
+ imageStatus: "ready"
309
+ },
310
+ layers: []
311
+ });
312
+ }
313
+ const role = (_a2 = page.role) != null ? _a2 : fallbackRole;
314
+ return __spreadProps(__spreadValues({}, base), {
315
+ name: nameOf(role, i),
316
+ role,
317
+ background: (_b = page.background) != null ? _b : {
318
+ kind: "color",
319
+ color: "#ffffff"
320
+ },
321
+ layers: page.layers.map((layer) => __spreadValues(__spreadProps(__spreadValues({}, layer), {
322
+ id: newLayerId()
323
+ }), layer.kind === "image" ? {
324
+ imageStatus: "ready",
325
+ uploaded: true
326
+ } : {}))
327
+ });
328
+ })
329
+ });
330
+ }
331
+ function templatePagesFor(template) {
332
+ return catalogToDoc(template).pages.map((page) => __spreadProps(__spreadValues({}, page), {
333
+ id: newPageId()
334
+ }));
335
+ }export{DEFAULT_BLEED_MM,DEFAULT_SAFE_AREA_MM,backendCatalogRows,blankDoc,blankDocCustom,blankDocForSize,catalogGroupOf,catalogKind,catalogToDoc,defaultPrintSpec,designTemplateFromRow,findDesignTemplate,templatePagesFor};//# sourceMappingURL=newDoc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newDoc.js","sources":["../../../../src/features/design/doc/newDoc.ts"],"sourcesContent":["/**\n * Where a design starts: a blank size, or a catalog template.\n *\n * Native twin of canvas-surface `utils/templates.ts` (`blankDoc`),\n * `utils/catalogDoc.ts` (`catalogToDoc`, `catalogKind`, `catalogGroupOf`) and\n * surface-kit `templateCatalogs/designCatalog.ts` (the full card a template\n * opens from). The canvas home's `DesignCatalogCard` carries only what a\n * cover needs; opening a template reads its row again, pages and all.\n *\n * Pure apart from the injected catalog read: runs under jest as-is.\n */\nimport {\n DESIGN_CATALOG_QUERY,\n designCatalogFilter,\n groupOfTemplate,\n type DesignCatalogGroup,\n} from '../../canvas/designCatalog';\nimport { PRINT_PLATFORM, snapAspect, toPx, type DesignSize } from './sizes';\nimport {\n DEFAULT_FONT_PAIR,\n defaultPageName,\n newLayerId,\n newPageId,\n type DesignBrief,\n type DesignDoc,\n type DesignKind,\n type DesignPage,\n type DesignPalette,\n type EditorLayer,\n type PrintSpec,\n} from './types';\n\nexport const DEFAULT_BLEED_MM = 4;\nexport const DEFAULT_SAFE_AREA_MM = 4;\n\nexport function defaultPrintSpec(trimMm?: { w: number; h: number }): PrintSpec {\n return { bleedMm: DEFAULT_BLEED_MM, safeAreaMm: DEFAULT_SAFE_AREA_MM, ...(trimMm ? { trimMm } : {}) };\n}\n\nconst BLANK_PALETTE: DesignPalette = {\n background: '#ffffff',\n surface: '#f1f5f9',\n primary: '#0f172a',\n text: '#020817',\n muted: '#64748b',\n};\n\n/** Templates have no wizard answers behind them - this stands in until the user edits. */\nfunction templateBrief(topic: string, aspectRatio: string, pageCount: number): DesignBrief {\n return {\n platform: 'Instagram',\n format: aspectRatio,\n pageCount,\n topic,\n audience: 'a general audience',\n tone: 'Professional',\n };\n}\n\n/** A blank white page (what web's `designToPages` makes of a blank design page). */\nfunction blankPage(index: number, name?: string): DesignPage {\n return {\n id: `page-${index + 1}-${Date.now().toString(36)}`,\n name: name ?? defaultPageName('cover', index),\n prompt: '',\n src: null,\n status: 'ready',\n role: 'cover',\n background: { kind: 'color', color: BLANK_PALETTE.background },\n layers: [],\n };\n}\n\n/**\n * Blank pages on a white ground, at any pixel size: one per `pageNames` entry (a business\n * card's Front and Back), else one. A print size (`kind: 'flyer'`) also gets a print spec.\n */\nexport function blankDoc({\n width,\n height,\n platform,\n kind,\n trimMm,\n pageNames,\n}: {\n width: number;\n height: number;\n platform: string;\n kind?: DesignKind;\n trimMm?: { w: number; h: number };\n pageNames?: string[];\n}): DesignDoc {\n const aspectRatio = snapAspect(width, height);\n const names = pageNames?.length ? pageNames : [undefined];\n const pages = names.map((name, i) => {\n // a deck's page starts as its Hook; a printed one has no such word (print PDFs name pages by it)\n const page = blankPage(i, name);\n return name ? page : kind === 'flyer' ? { ...page, name: '' } : page;\n });\n return {\n version: 2,\n brief: { ...templateBrief('Untitled design', aspectRatio, pages.length), platform },\n aspectRatio,\n pageWidth: width,\n pageHeight: height,\n palette: BLANK_PALETTE,\n fontPair: { ...DEFAULT_FONT_PAIR },\n pages,\n ...(kind === 'flyer' ? { print: defaultPrintSpec(trimMm) } : {}),\n };\n}\n\n/** A blank design at one of the create screen's sizes. */\nexport function blankDocForSize(size: DesignSize): DesignDoc {\n return blankDoc({\n width: size.width,\n height: size.height,\n platform: size.platform,\n kind: size.kind,\n trimMm: size.trimMm,\n pageNames: size.pageNames,\n });\n}\n\n/** A blank at a size the person typed (Custom size): a screen design unless it came in a physical unit. */\nexport function blankDocCustom(width: number, height: number, trimMm?: { w: number; h: number }): DesignDoc {\n return blankDoc({ width, height, platform: trimMm ? 'Print' : 'Custom', kind: trimMm ? 'flyer' : 'deck', trimMm });\n}\n\n// ── Catalog templates ────────────────────────────────────────────────────\n\n/** One converted template page: editable layers minus the ids and image bookkeeping the editor assigns. */\nexport interface DesignTemplateLayerPage {\n role?: 'cover' | 'content' | 'cta';\n background?: { kind: 'color'; color: string };\n layers: Array<Record<string, unknown>>;\n}\n\n/** A catalog template with everything it opens with (surface-kit `DesignCatalogCard`). */\nexport interface DesignTemplate {\n id: string;\n group: DesignCatalogGroup;\n title: string;\n summary: string;\n coverUrl: string;\n aspectRatio: string;\n pageWidth: number;\n pageHeight: number;\n /** Converted layer pages, or one full-size page image per page (older rows). */\n pages: Array<string | DesignTemplateLayerPage>;\n previews?: string[];\n fonts?: Array<{ family: string; url: string; weight?: number; italic?: boolean }>;\n /** A print template's finished size in mm. */\n trimMm?: { w: number; h: number };\n prompt: string;\n tags?: string[];\n}\n\nconst str = (v: unknown): string => (typeof v === 'string' ? v.trim() : '');\nconst obj = (v: unknown): Record<string, any> =>\n v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, any>) : {};\nconst isHttps = (v: unknown): v is string => typeof v === 'string' && /^https:\\/\\//.test(v);\n\n/** One row -> one template; a row without a cover, a size or pages is not a usable template. */\nexport function designTemplateFromRow(row: Record<string, any>, group: DesignCatalogGroup): DesignTemplate | null {\n let formData: Record<string, any> = obj(row?.formData);\n if (typeof row?.formData === 'string') {\n try {\n formData = obj(JSON.parse(row.formData));\n } catch {\n return null;\n }\n }\n const details = obj(formData.generationDetails);\n const design = obj(formData.design);\n const pages: Array<string | DesignTemplateLayerPage> = Array.isArray(design.pages)\n ? design.pages.filter(\n (p: unknown): p is string | DesignTemplateLayerPage =>\n isHttps(p) ||\n (Boolean(p) && typeof p === 'object' && Array.isArray((p as DesignTemplateLayerPage).layers)),\n )\n : [];\n const previews: string[] = Array.isArray(design.previews) ? design.previews.filter(isHttps) : [];\n const fonts = Array.isArray(design.fonts)\n ? design.fonts.filter((f: any) => typeof f?.family === 'string' && isHttps(f?.url))\n : [];\n const pageWidth = Number(design.pageWidth);\n const pageHeight = Number(design.pageHeight);\n const trim = obj(design.trimMm);\n const trimMm = Number(trim.w) > 0 && Number(trim.h) > 0 ? { w: Number(trim.w), h: Number(trim.h) } : null;\n const id = str(row?.name);\n const coverUrl = isHttps(details.previewUrl) ? str(details.previewUrl) : '';\n if (!id || !coverUrl || pages.length === 0 || !(pageWidth > 0) || !(pageHeight > 0)) return null;\n const title = str(details.title) || id;\n return {\n id,\n group,\n title,\n summary: str(details.summary) || str(row?.description),\n coverUrl,\n aspectRatio: str(design.aspectRatio) || str(obj(formData.generation).aspectRatio),\n pageWidth,\n pageHeight,\n pages,\n ...(previews.length ? { previews } : {}),\n ...(fonts.length ? { fonts } : {}),\n ...(trimMm ? { trimMm } : {}),\n prompt: str(obj(formData.generation).prompt) || title,\n ...(Array.isArray(row?.tags) ? { tags: row.tags.filter((t: unknown) => typeof t === 'string') } : {}),\n };\n}\n\n/** Rows a catalog read returns for a filter. */\nexport type ReadCatalogRows = (filter: ReturnType<typeof designCatalogFilter>) => Promise<Array<Record<string, any>>>;\n\n/** One template by id (`?design=<id>`, a gallery tap), or null when it is not in the catalog. */\nexport async function findDesignTemplate(id: string, readRows: ReadCatalogRows): Promise<DesignTemplate | null> {\n const group = groupOfTemplate(id);\n if (!group) return null;\n // The resolver searches names, so the id finds its row; match it exactly. Any row of the\n // group: a template a listing no longer shows still opens by its id.\n const rows = await readRows(designCatalogFilter(group, { search: id, limit: 10, offset: 0, anyRecord: true }));\n for (const row of rows) {\n if (str(row?.name) !== id) continue;\n const template = designTemplateFromRow(row, group);\n if (template) return template;\n }\n return null;\n}\n\n/** The backend read `findDesignTemplate` uses on a phone: plain fetch, bearer when there is one. */\nexport function backendCatalogRows(graphqlUrl: string, token?: string | null): ReadCatalogRows {\n return async (filter) => {\n const res = await fetch(graphqlUrl, {\n method: 'POST',\n headers: { 'content-type': 'application/json', ...(token ? { authorization: `Bearer ${token}` } : {}) },\n body: JSON.stringify({ query: DESIGN_CATALOG_QUERY, variables: { filter } }),\n });\n if (!res.ok) throw new Error(`Template read failed (${res.status})`);\n const json = (await res.json().catch(() => ({}))) as {\n data?: { formTemplateSubmissions?: { nodes?: Array<Record<string, any>> | null } };\n errors?: Array<{ message?: string }>;\n };\n if (json.errors?.length) throw new Error(json.errors[0]?.message || 'Template read failed');\n const nodes = json.data?.formTemplateSubmissions?.nodes;\n return Array.isArray(nodes) ? nodes : [];\n };\n}\n\nconst PALETTE: DesignPalette = {\n background: '#ffffff',\n surface: '#f1f5f9',\n primary: '#0f172a',\n text: '#020817',\n muted: '#64748b',\n};\n\n/** Screen designs save as decks; the rest are printed (flyers, business cards, brochures, stationery). */\nconst SCREEN: Partial<Record<DesignCatalogGroup, string>> = {\n 'canvas-presentation': 'Presentation',\n 'canvas-carousel': 'Instagram',\n 'canvas-logo': 'Logo',\n 'canvas-banner': 'Banner',\n 'canvas-social-post': 'Social',\n 'canvas-infographic': 'Infographic',\n};\n\n/** Printed formats a flyer's shape can't tell apart name their own platform. */\nconst PRINT: Partial<Record<DesignCatalogGroup, string>> = {\n 'canvas-brochure': PRINT_PLATFORM.brochure,\n 'canvas-branding': PRINT_PLATFORM.branding,\n 'canvas-certificate': PRINT_PLATFORM.certificate,\n 'canvas-worksheet': PRINT_PLATFORM.worksheet,\n 'canvas-proposal': PRINT_PLATFORM.proposal,\n 'canvas-newsletter': PRINT_PLATFORM.newsletter,\n 'canvas-menu': PRINT_PLATFORM.menu,\n};\n\nexport const catalogKind = (template: Pick<DesignTemplate, 'group'>): DesignKind =>\n SCREEN[template.group] ? 'deck' : 'flyer';\n\nconst platformOf = (group: DesignCatalogGroup): string => SCREEN[group] ?? PRINT[group] ?? 'Print';\n\n/** The catalog group whose templates fit a design; null for formats the catalog has none for (custom). */\nexport function catalogGroupOf(doc: Pick<DesignDoc, 'brief' | 'pageWidth' | 'pageHeight'>): DesignCatalogGroup | null {\n const platform = doc.brief?.platform;\n const groups = Object.keys({ ...SCREEN, ...PRINT }) as DesignCatalogGroup[];\n const named = groups.find((g) => platformOf(g) === platform);\n if (named) return named;\n if (platform !== 'Print') return null;\n // Business cards run 1.55-1.8 long side to short; the widest flyer preset (postcard) is 1.5.\n const ratio = Math.max(doc.pageWidth, doc.pageHeight) / Math.min(doc.pageWidth, doc.pageHeight);\n return ratio > 1.52 ? 'canvas-business-card' : 'canvas-flyer';\n}\n\n/** Sides a two-page print template is named by, as its blank opens. */\nconst SIDES: Partial<Record<DesignCatalogGroup, [string, string]>> = {\n 'canvas-business-card': ['Front', 'Back'],\n 'canvas-brochure': ['Outside', 'Inside'],\n};\n\n/** A print template with its finished size opens at that size in print px (150 per inch); layers are fractions. */\nfunction pageSizeOf(template: DesignTemplate): { width: number; height: number; trimMm?: { w: number; h: number } } {\n if (catalogKind(template) === 'flyer' && template.trimMm)\n return {\n width: toPx(template.trimMm.w, 'mm'),\n height: toPx(template.trimMm.h, 'mm'),\n trimMm: template.trimMm,\n };\n return { width: template.pageWidth, height: template.pageHeight };\n}\n\n/** A catalog template as a Design Studio document - web `catalogToDoc`, field for field. */\nexport function catalogToDoc(template: DesignTemplate): DesignDoc {\n const stamp = Date.now().toString(36);\n const last = template.pages.length - 1;\n const size = pageSizeOf(template);\n const sides = template.pages.length === 2 ? SIDES[template.group] : undefined;\n const print = catalogKind(template) === 'flyer';\n const nameOf = (role: DesignPage['role'], i: number) => sides?.[i] ?? (print ? '' : defaultPageName(role, i));\n return {\n version: 2,\n brief: {\n platform: platformOf(template.group),\n format: template.aspectRatio || `${template.pageWidth}x${template.pageHeight}`,\n pageCount: template.pages.length,\n topic: template.title,\n audience: 'a general audience',\n tone: 'Professional',\n templateNotes: template.prompt,\n },\n aspectRatio: template.aspectRatio || `${template.pageWidth}:${template.pageHeight}`,\n pageWidth: size.width,\n pageHeight: size.height,\n ...(size.trimMm ? { print: defaultPrintSpec(size.trimMm) } : {}),\n palette: PALETTE,\n fontPair: { display: 'Inter', body: 'Inter' },\n ...(template.fonts?.length ? { fonts: template.fonts } : {}),\n pages: template.pages.map((page, i): DesignPage => {\n const fallbackRole = i === 0 ? 'cover' : i === last && last > 0 ? 'cta' : 'content';\n const base = { id: `page-${i + 1}-${stamp}`, prompt: '', src: null, status: 'ready' as const };\n // An older row: the page image as the page background.\n if (typeof page === 'string') {\n return {\n ...base,\n name: nameOf(fallbackRole, i),\n role: fallbackRole,\n background: { kind: 'image', src: page, imageStatus: 'ready' },\n layers: [],\n };\n }\n const role = page.role ?? fallbackRole;\n return {\n ...base,\n name: nameOf(role, i),\n role,\n background: page.background ?? { kind: 'color', color: '#ffffff' },\n layers: page.layers.map(\n (layer) =>\n ({\n ...layer,\n id: newLayerId(),\n ...(layer.kind === 'image' ? { imageStatus: 'ready', uploaded: true } : {}),\n }) as unknown as EditorLayer,\n ),\n };\n }),\n };\n}\n\n/**\n * A template's pages added to an open design (the Templates tool on a design that already has\n * work): fresh page and layer ids, the layers re-anchored by fraction, so they fit the page size.\n */\nexport function templatePagesFor(template: DesignTemplate): DesignPage[] {\n return catalogToDoc(template).pages.map((page) => ({ ...page, id: newPageId() }));\n}\n"],"names":["_a"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ function parsePageRange(text, count) {
2
+ const t = text.trim();
3
+ if (!t) return Array.from({
4
+ length: count
5
+ }, (_, i) => i);
6
+ const picked = /* @__PURE__ */ new Set();
7
+ for (const part of t.split(",")) {
8
+ const m = /^\s*(\d+)\s*(?:[-–]\s*(\d+)\s*)?$/.exec(part);
9
+ if (!m) return null;
10
+ const a = Number(m[1]);
11
+ const b = m[2] != null ? Number(m[2]) : a;
12
+ const [lo, hi] = a <= b ? [a, b] : [b, a];
13
+ if (lo < 1 || hi > count) return null;
14
+ for (let n = lo; n <= hi; n += 1) picked.add(n - 1);
15
+ }
16
+ return [...picked].sort((x, y) => x - y);
17
+ }export{parsePageRange};//# sourceMappingURL=pageRange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageRange.js","sources":["../../../../src/features/design/doc/pageRange.ts"],"sourcesContent":["/**\n * Which pages an export takes, typed as people type them in a print dialog:\n * \"1-3, 5\" - native twin of canvas-surface `carousel-editor/utils/pageRange.ts`.\n * Pages are numbered from 1 for people and indexed from 0 here.\n *\n * Pure: runs under jest as-is.\n */\n\n/** Page indices (0-based, sorted, unique) for `text`; blank means every page, null means it doesn't parse. */\nexport function parsePageRange(text: string, count: number): number[] | null {\n const t = text.trim();\n if (!t) return Array.from({ length: count }, (_, i) => i);\n const picked = new Set<number>();\n for (const part of t.split(',')) {\n const m = /^\\s*(\\d+)\\s*(?:[-–]\\s*(\\d+)\\s*)?$/.exec(part);\n if (!m) return null;\n const a = Number(m[1]);\n const b = m[2] != null ? Number(m[2]) : a;\n const [lo, hi] = a <= b ? [a, b] : [b, a];\n if (lo < 1 || hi > count) return null;\n for (let n = lo; n <= hi; n += 1) picked.add(n - 1);\n }\n return [...picked].sort((x, y) => x - y);\n}\n\n/** Indices back to the shortest text that names them: [0,1,2,4] -> \"1-3, 5\". */\nexport function formatPageRange(indices: number[]): string {\n const nums = [...new Set(indices)].sort((a, b) => a - b).map((i) => i + 1);\n const parts: string[] = [];\n for (let i = 0; i < nums.length; ) {\n let j = i;\n while (j + 1 < nums.length && nums[j + 1] === nums[j] + 1) j += 1;\n parts.push(i === j ? String(nums[i]) : `${nums[i]}-${nums[j]}`);\n i = j + 1;\n }\n return parts.join(', ');\n}\n"],"names":[],"mappings":"AASgB,SAAA,cAAA,CAAe,MAAc,KAAgC,EAAA;AAC3E,EAAM,MAAA,CAAA,GAAI,KAAK,IAAK,EAAA;AACpB,EAAA,IAAI,CAAC,CAAA,EAAU,OAAA,KAAA,CAAM,IAAK,CAAA;AAAA,IACxB,MAAQ,EAAA;AAAA,GACP,EAAA,CAAC,CAAG,EAAA,CAAA,KAAM,CAAC,CAAA;AACd,EAAM,MAAA,MAAA,uBAAa,GAAY,EAAA;AAC/B,EAAA,KAAA,MAAW,IAAQ,IAAA,CAAA,CAAE,KAAM,CAAA,GAAG,CAAG,EAAA;AAC/B,IAAM,MAAA,CAAA,GAAI,mCAAoC,CAAA,IAAA,CAAK,IAAI,CAAA;AACvD,IAAI,IAAA,CAAC,GAAU,OAAA,IAAA;AACf,IAAA,MAAM,CAAI,GAAA,MAAA,CAAO,CAAE,CAAA,CAAC,CAAC,CAAA;AACrB,IAAM,MAAA,CAAA,GAAI,EAAE,CAAC,CAAA,IAAK,OAAO,MAAO,CAAA,CAAA,CAAE,CAAC,CAAC,CAAI,GAAA,CAAA;AACxC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,CAAK,IAAA,CAAA,GAAI,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,CAAA,EAAG,CAAC,CAAA;AACxC,IAAA,IAAI,EAAK,GAAA,CAAA,IAAK,EAAK,GAAA,KAAA,EAAc,OAAA,IAAA;AACjC,IAAS,KAAA,IAAA,CAAA,GAAI,IAAI,CAAK,IAAA,EAAA,EAAI,KAAK,CAAG,EAAA,MAAA,CAAO,GAAI,CAAA,CAAA,GAAI,CAAC,CAAA;AAAA;AAEpD,EAAO,OAAA,CAAC,GAAG,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,GAAI,CAAC,CAAA;AACzC"}
@@ -0,0 +1,68 @@
1
+ const PARAMS = {
2
+ M: 2,
3
+ L: 2,
4
+ H: 1,
5
+ V: 1,
6
+ C: 6,
7
+ S: 4,
8
+ Q: 4,
9
+ T: 2,
10
+ A: 7,
11
+ Z: 0
12
+ };
13
+ const TOKEN = /([MLHVCSQTAZmlhvcsqtaz])|(-?(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)/g;
14
+ const fmt = (n) => String(Number(n.toFixed(3)));
15
+ const cache = /* @__PURE__ */ new Map();
16
+ function scalePath(d, w, h) {
17
+ const key = `${w}|${h}|${d}`;
18
+ const hit = cache.get(key);
19
+ if (hit !== void 0) return hit;
20
+ const out = [];
21
+ let cmd = "";
22
+ let args = [];
23
+ const flush = () => {
24
+ var _a;
25
+ if (!cmd) return;
26
+ const upper = cmd.toUpperCase();
27
+ const n = (_a = PARAMS[upper]) != null ? _a : 0;
28
+ if (n === 0) {
29
+ out.push(cmd);
30
+ args = [];
31
+ return;
32
+ }
33
+ for (let i = 0; i + n <= args.length; i += n) {
34
+ const g = args.slice(i, i + n);
35
+ let scaled;
36
+ switch (upper) {
37
+ case "H":
38
+ scaled = [g[0] * w];
39
+ break;
40
+ case "V":
41
+ scaled = [g[0] * h];
42
+ break;
43
+ case "A":
44
+ scaled = [g[0] * w, g[1] * h, g[2], g[3], g[4], g[5] * w, g[6] * h];
45
+ break;
46
+ default:
47
+ scaled = g.map((v, j) => j % 2 === 0 ? v * w : v * h);
48
+ }
49
+ out.push(`${cmd}${scaled.map(fmt).join(" ")}`);
50
+ }
51
+ args = [];
52
+ };
53
+ TOKEN.lastIndex = 0;
54
+ let m;
55
+ while (m = TOKEN.exec(d)) {
56
+ if (m[1]) {
57
+ flush();
58
+ cmd = m[1];
59
+ } else if (m[2] !== void 0) {
60
+ args.push(Number(m[2]));
61
+ }
62
+ }
63
+ flush();
64
+ const result = out.join("");
65
+ if (cache.size > 500) cache.clear();
66
+ cache.set(key, result);
67
+ return result;
68
+ }export{scalePath};//# sourceMappingURL=pathScale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathScale.js","sources":["../../../../src/features/design/doc/pathScale.ts"],"sourcesContent":["/**\n * Scale an SVG path drawn in a 0..1 box into a w x h box.\n *\n * Shape outlines and image frames (`clipPath`) are unit-box paths. The web\n * scales them through the path's own matrix so a non-uniform scale never\n * squashes the stroke; react-native-svg has no such matrix on a path, and a\n * stretched viewBox would squash the outline, so the numbers are scaled\n * here instead: x-like values by w, y-like by h, arc radii each by their own\n * axis, arc flags and rotation untouched.\n *\n * Pure: runs under jest as-is.\n */\n\nconst PARAMS: Record<string, number> = { M: 2, L: 2, H: 1, V: 1, C: 6, S: 4, Q: 4, T: 2, A: 7, Z: 0 };\n\nconst TOKEN = /([MLHVCSQTAZmlhvcsqtaz])|(-?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?)/g;\n\nconst fmt = (n: number) => String(Number(n.toFixed(3)));\n\nconst cache = new Map<string, string>();\n\nexport function scalePath(d: string, w: number, h: number): string {\n const key = `${w}|${h}|${d}`;\n const hit = cache.get(key);\n if (hit !== undefined) return hit;\n const out: string[] = [];\n let cmd = '';\n let args: number[] = [];\n const flush = () => {\n if (!cmd) return;\n const upper = cmd.toUpperCase();\n const n = PARAMS[upper] ?? 0;\n if (n === 0) {\n out.push(cmd);\n args = [];\n return;\n }\n // A command may repeat its parameter groups (`M0 0 1 1` is a move then a line).\n for (let i = 0; i + n <= args.length; i += n) {\n const g = args.slice(i, i + n);\n let scaled: number[];\n switch (upper) {\n case 'H':\n scaled = [g[0] * w];\n break;\n case 'V':\n scaled = [g[0] * h];\n break;\n case 'A':\n scaled = [g[0] * w, g[1] * h, g[2], g[3], g[4], g[5] * w, g[6] * h];\n break;\n default:\n scaled = g.map((v, j) => (j % 2 === 0 ? v * w : v * h));\n }\n out.push(`${cmd}${scaled.map(fmt).join(' ')}`);\n }\n args = [];\n };\n TOKEN.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = TOKEN.exec(d))) {\n if (m[1]) {\n flush();\n cmd = m[1];\n } else if (m[2] !== undefined) {\n args.push(Number(m[2]));\n }\n }\n flush();\n const result = out.join('');\n if (cache.size > 500) cache.clear();\n cache.set(key, result);\n return result;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ const DEFAULT_QR_STYLE = {
2
+ foreground: "#000000",
3
+ background: "#ffffff",
4
+ margin: 2
5
+ };
6
+ function normaliseQrText(text) {
7
+ const t = text.trim();
8
+ if (!t) return "";
9
+ if (/^[a-z][a-z0-9+.-]*:/i.test(t)) return t;
10
+ if (/^[\w-]+(\.[\w-]+)+(\/.*)?$/.test(t)) return `https://${t}`;
11
+ return t;
12
+ }
13
+ function ensureTextEncoder() {
14
+ const g = globalThis;
15
+ if (typeof g.TextEncoder === "function") return;
16
+ g.TextEncoder = class {
17
+ encode(str) {
18
+ const utf8 = unescape(encodeURIComponent(str));
19
+ const out = new Uint8Array(utf8.length);
20
+ for (let i = 0; i < utf8.length; i += 1) out[i] = utf8.charCodeAt(i);
21
+ return out;
22
+ }
23
+ };
24
+ }
25
+ function core() {
26
+ try {
27
+ const mod = require("qrcode/lib/core/qrcode");
28
+ return typeof (mod == null ? void 0 : mod.create) === "function" ? mod : null;
29
+ } catch (e) {
30
+ return null;
31
+ }
32
+ }
33
+ function qrMatrix(text) {
34
+ const enc = core();
35
+ if (!enc) throw new Error("QR codes need a newer version of the app.");
36
+ ensureTextEncoder();
37
+ const {
38
+ modules
39
+ } = enc.create(text, {
40
+ errorCorrectionLevel: "M"
41
+ });
42
+ return {
43
+ size: modules.size,
44
+ dark: (x, y) => Boolean(modules.data[y * modules.size + x])
45
+ };
46
+ }
47
+ function qrPath(m, margin) {
48
+ let d = "";
49
+ for (let y = 0; y < m.size; y += 1) {
50
+ let x = 0;
51
+ while (x < m.size) {
52
+ if (!m.dark(x, y)) {
53
+ x += 1;
54
+ continue;
55
+ }
56
+ const start = x;
57
+ while (x < m.size && m.dark(x, y)) x += 1;
58
+ d += `M${start + margin} ${y + margin}h${x - start}v1h${start - x}z`;
59
+ }
60
+ }
61
+ return d;
62
+ }export{DEFAULT_QR_STYLE,normaliseQrText,qrMatrix,qrPath};//# sourceMappingURL=qr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr.js","sources":["../../../../src/features/design/doc/qr.ts"],"sourcesContent":["/**\n * QR codes - native twin of canvas-surface `components/QrCodeCategory.tsx`'s\n * maths: the same typed-link normalising, error correction 'M' and quiet\n * zone. The module grid comes from the `qrcode` package's core encoder (pure\n * JS; its canvas renderers are never touched), and the editor draws it as one\n * svg path, rasterises it on the phone and places it as a picture - like\n * Canva's, a plain image layer once placed.\n *\n * Pure: runs under jest as-is.\n */\n\nexport interface QrStyle {\n foreground: string;\n background: string;\n /** Quiet zone in modules. */\n margin: number;\n}\n\nexport const DEFAULT_QR_STYLE: QrStyle = { foreground: '#000000', background: '#ffffff', margin: 2 };\n\n/** A typed link as Canva takes it: bare domains get https://, so the code opens in a phone's browser. */\nexport function normaliseQrText(text: string): string {\n const t = text.trim();\n if (!t) return '';\n if (/^[a-z][a-z0-9+.-]*:/i.test(t)) return t;\n if (/^[\\w-]+(\\.[\\w-]+)+(\\/.*)?$/.test(t)) return `https://${t}`;\n return t;\n}\n\nexport interface QrMatrix {\n size: number;\n /** Row-major, 1 = dark. */\n dark: (x: number, y: number) => boolean;\n}\n\ninterface QrCore {\n create: (\n text: string,\n opts: { errorCorrectionLevel: string },\n ) => { modules: { size: number; data: ArrayLike<number> } };\n}\n\n/** The encoder reads bytes through TextEncoder; a runtime without one gets a UTF-8 stand-in. */\nfunction ensureTextEncoder(): void {\n const g = globalThis as { TextEncoder?: unknown };\n if (typeof g.TextEncoder === 'function') return;\n g.TextEncoder = class {\n encode(str: string): Uint8Array {\n const utf8 = unescape(encodeURIComponent(str));\n const out = new Uint8Array(utf8.length);\n for (let i = 0; i < utf8.length; i += 1) out[i] = utf8.charCodeAt(i);\n return out;\n }\n };\n}\n\nfunction core(): QrCore | null {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires, global-require\n const mod = require('qrcode/lib/core/qrcode') as QrCore;\n return typeof mod?.create === 'function' ? mod : null;\n } catch {\n return null;\n }\n}\n\n/** The module grid for a text; throws when it will not fit a QR code, or the encoder is missing. */\nexport function qrMatrix(text: string): QrMatrix {\n const enc = core();\n if (!enc) throw new Error('QR codes need a newer version of the app.');\n ensureTextEncoder();\n const { modules } = enc.create(text, { errorCorrectionLevel: 'M' });\n return { size: modules.size, dark: (x, y) => Boolean(modules.data[y * modules.size + x]) };\n}\n\n/** Every dark module as one path, in module units offset by the quiet zone; runs merge along a row. */\nexport function qrPath(m: QrMatrix, margin: number): string {\n let d = '';\n for (let y = 0; y < m.size; y += 1) {\n let x = 0;\n while (x < m.size) {\n if (!m.dark(x, y)) {\n x += 1;\n continue;\n }\n const start = x;\n while (x < m.size && m.dark(x, y)) x += 1;\n d += `M${start + margin} ${y + margin}h${x - start}v1h${start - x}z`;\n }\n }\n return d;\n}\n"],"names":[],"mappings":"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"}