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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +3 -3
  359. package/lib/features/design/exportDesign.js +0 -133
  360. package/lib/features/design/exportDesign.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"canvasTheme.js","sources":["../../../src/features/canvas/canvasTheme.tsx"],"sourcesContent":["/**\n * Canvas light/dark theming — the native port of the web canvas theme\n * (yantra-surface packages/canvas/src/styles/theme.css + surface.css).\n *\n * Two sets of tokens:\n * - Surface tokens (background, card, foreground, muted, border, primary,\n * accent, destructive …) are the tweakcn export's `:root` / `.dark` values,\n * used by the boards home, the viewer chrome, sheets and panels.\n * - Editor-grade tokens (`ed*`) mirror the web `[data-editor]` design layer:\n * the dark grade keeps the native editors' existing near-black chassis, the\n * light grade is the web `[data-editor='light']` set.\n *\n * The mode follows the OS (`useColorScheme`), or a host-provided mode, unless\n * the person picked light/dark with the toggle — that pick is persisted under\n * AsyncStorage key `canvas.theme`.\n *\n * Remote-safe: this module ships OTA inside the federated canvas remote, so\n * AsyncStorage is required in a try/catch (see canvasBoardsSnapshot.ts) and\n * `useCanvasTheme()` never throws without a provider — it falls back to the\n * OS scheme.\n */\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';\nimport { Pressable, StyleSheet, useColorScheme, type StyleProp, type ViewStyle } from 'react-native';\n\nexport type CanvasThemeMode = 'light' | 'dark';\nexport type CanvasThemePreference = CanvasThemeMode | 'system';\n\nexport const CANVAS_THEME_STORAGE_KEY = 'canvas.theme';\n\nexport type CanvasPalette = {\n mode: CanvasThemeMode;\n isDark: boolean;\n\n // ── Web surface tokens (tweakcn theme.css) ───────────────────────────\n background: string;\n foreground: string;\n card: string;\n cardForeground: string;\n popover: string;\n popoverForeground: string;\n primary: string;\n primaryForeground: string;\n secondary: string;\n secondaryForeground: string;\n muted: string;\n mutedForeground: string;\n accent: string;\n accentForeground: string;\n destructive: string;\n destructiveForeground: string;\n border: string;\n input: string;\n ring: string;\n\n // ── Native extras derived from the tokens (accessible on background) ─\n /** Raised sheets, cards and fields: white in light, the card step in dark. */\n surface: string;\n /** Secondary body text, one step softer than foreground. */\n inkSoft: string;\n /** A stronger hairline for dashed drop zones and field edges. */\n borderStrong: string;\n /** The primary hue as text on the background (lime is unreadable on white). */\n primaryText: string;\n destructiveText: string;\n destructiveSoft: string;\n destructiveBorder: string;\n successText: string;\n successSoft: string;\n warningText: string;\n info: string;\n infoSoft: string;\n /** Translucent page ground for sticky / frosted bars. */\n backgroundAlpha: (alpha: number) => string;\n /** Foreground at `alpha`, for hairlines and tints that must flip with the mode. */\n tint: (alpha: number) => string;\n\n // ── Editor grade (web [data-editor] / [data-editor='light']) ─────────\n edWell: string;\n edBg: string;\n edPanel: string;\n edRaised: string;\n edRaisedHi: string;\n edLine: string;\n edLineHi: string;\n edInk: string;\n edInk2: string;\n edInk3: string;\n /** Ink on an edInk or edAccent solid. */\n edOnInk: string;\n edAccent: string;\n edAccentSoft: string;\n edDanger: string;\n edDangerSoft: string;\n edOk: string;\n edWarn: string;\n /** edInk at `alpha` (white veil on dark, black veil on light). */\n edTint: (alpha: number) => string;\n};\n\nconst rgba = (rgb: string) => (alpha: number) => `rgba(${rgb},${alpha})`;\n\nexport const CANVAS_LIGHT: CanvasPalette = {\n mode: 'light',\n isDark: false,\n\n background: '#ffffff',\n foreground: '#141414',\n card: '#f4f4f5',\n cardForeground: '#141414',\n popover: '#ffffff',\n popoverForeground: '#141414',\n primary: '#e1ff00',\n primaryForeground: '#000000',\n secondary: '#27272a',\n secondaryForeground: '#ffffff',\n muted: '#f1f1f1',\n mutedForeground: '#71717a',\n accent: '#e1ff00',\n accentForeground: '#000000',\n destructive: '#ef4444',\n destructiveForeground: '#ffffff',\n border: '#e4e4e7',\n input: '#e4e4e7',\n ring: '#d4e100',\n\n surface: '#ffffff',\n inkSoft: '#3f3f46',\n borderStrong: '#d4d4d8',\n primaryText: '#4d7c0f',\n destructiveText: '#b91c1c',\n destructiveSoft: '#fef2f2',\n destructiveBorder: '#fecaca',\n successText: '#15803d',\n successSoft: '#f0fdf4',\n warningText: '#92400e',\n info: '#2563eb',\n infoSoft: '#dbeafe',\n backgroundAlpha: rgba('255,255,255'),\n tint: rgba('20,20,20'),\n\n edWell: '#e4e4e7',\n edBg: '#f5f5f3',\n edPanel: '#ffffff',\n edRaised: '#f4f4f5',\n edRaisedHi: '#e9e9eb',\n edLine: '#e4e4e7',\n edLineHi: '#d4d4d8',\n edInk: '#18181b',\n edInk2: '#52525b',\n edInk3: '#6b6b76',\n edOnInk: '#ffffff',\n edAccent: '#6c5ce7',\n edAccentSoft: '#ece9ff',\n edDanger: '#b91c1c',\n edDangerSoft: '#fef2f2',\n edOk: '#15803d',\n edWarn: '#92400e',\n edTint: rgba('0,0,0'),\n};\n\nexport const CANVAS_DARK: CanvasPalette = {\n mode: 'dark',\n isDark: true,\n\n background: '#0d0d0d',\n foreground: '#f2f2f2',\n card: '#141414',\n cardForeground: '#f2f2f2',\n popover: '#0d0d0d',\n popoverForeground: '#f2f2f2',\n primary: '#d4ff00',\n primaryForeground: '#000000',\n secondary: '#262626',\n secondaryForeground: '#f2f2f2',\n muted: '#1a1a1a',\n mutedForeground: '#a1a1aa',\n accent: '#262626',\n accentForeground: '#d4ff00',\n destructive: '#7f1d1d',\n destructiveForeground: '#f2f2f2',\n border: '#262626',\n input: '#262626',\n ring: '#d4ff00',\n\n surface: '#141414',\n inkSoft: '#d4d4d8',\n borderStrong: '#3f3f46',\n primaryText: '#d4ff00',\n destructiveText: '#f87171',\n destructiveSoft: '#421f23',\n destructiveBorder: '#7f3336',\n successText: '#4ade80',\n successSoft: '#12261a',\n warningText: '#fbbf24',\n info: '#6ea8fe',\n infoSoft: '#243a5e',\n backgroundAlpha: rgba('13,13,13'),\n tint: rgba('242,242,242'),\n\n // Native editors' existing dark chassis.\n edWell: '#08080a',\n edBg: '#0a0a0c',\n edPanel: '#16161a',\n edRaised: '#1f1f24',\n edRaisedHi: '#2a2a32',\n edLine: '#26262c',\n edLineHi: '#32323a',\n edInk: '#f7f7fa',\n edInk2: '#9a9aa5',\n edInk3: '#7a7a88',\n edOnInk: '#0a0a0c',\n edAccent: '#8b7cff',\n edAccentSoft: 'rgba(139,124,255,0.2)',\n edDanger: '#f87171',\n edDangerSoft: 'rgba(248,113,113,0.14)',\n edOk: '#4ade80',\n edWarn: '#fbbf24',\n edTint: rgba('255,255,255'),\n};\n\nexport function canvasPalette(mode: CanvasThemeMode): CanvasPalette {\n return mode === 'dark' ? CANVAS_DARK : CANVAS_LIGHT;\n}\n\n/**\n * Wraps a `(theme) => StyleSheet.create(...)` factory so each palette's sheet\n * is built once per module, not once per mounted component instance.\n */\nexport function themedStyles<T>(factory: (theme: CanvasPalette) => T): (theme: CanvasPalette) => T {\n const cache = new Map<CanvasPalette, T>();\n return (theme) => {\n let sheet = cache.get(theme);\n if (!sheet) {\n sheet = factory(theme);\n cache.set(theme, sheet);\n }\n return sheet;\n };\n}\n\n// ── Persisted preference (shared by every provider in the process) ─────────\n\ntype StorageLike = { getItem(key: string): Promise<string | null>; setItem(key: string, value: string): Promise<void> };\nlet storage: StorageLike | null = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, global-require\n storage = require('@react-native-async-storage/async-storage').default ?? null;\n} catch {\n storage = null;\n}\n\nfunction isPreference(value: unknown): value is CanvasThemePreference {\n return value === 'light' || value === 'dark' || value === 'system';\n}\n\nlet currentPreference: CanvasThemePreference = 'system';\nlet loaded = false;\nconst listeners = new Set<(pref: CanvasThemePreference) => void>();\n\nfunction notify() {\n listeners.forEach((fn) => fn(currentPreference));\n}\n\nfunction loadPreference() {\n if (loaded || !storage) return;\n loaded = true;\n try {\n void storage\n .getItem(CANVAS_THEME_STORAGE_KEY)\n .then((raw) => {\n if (isPreference(raw) && raw !== currentPreference) {\n currentPreference = raw;\n notify();\n }\n })\n .catch(() => undefined);\n } catch {\n /* storage unavailable: memory only */\n }\n}\n\nexport function setCanvasThemePreference(next: CanvasThemePreference) {\n if (!isPreference(next)) return;\n loaded = true;\n currentPreference = next;\n notify();\n try {\n void storage?.setItem(CANVAS_THEME_STORAGE_KEY, next).catch(() => undefined);\n } catch {\n /* ignore */\n }\n}\n\n// ── Context ─────────────────────────────────────────────────────────────────\n\ntype CanvasThemeContextValue = {\n palette: CanvasPalette;\n preference: CanvasThemePreference;\n setPreference: (next: CanvasThemePreference) => void;\n};\n\nconst CanvasThemeContext = createContext<CanvasThemeContextValue | null>(null);\n\n/**\n * The OS scheme, or null where the host's react-native exposes no\n * useColorScheme (minimal mocks, exotic hosts). Its presence is constant for\n * the process, so the hook order stays stable.\n */\nfunction useOsScheme(): string | null | undefined {\n // eslint-disable-next-line react-hooks/rules-of-hooks -- process-constant branch\n return typeof useColorScheme === 'function' ? useColorScheme() : null;\n}\n\nfunction osMode(scheme: string | null | undefined): CanvasThemeMode {\n return scheme === 'dark' ? 'dark' : 'light';\n}\n\nexport type CanvasThemeProviderProps = {\n /** Host-provided mode; used while the preference is 'system'. Null/undefined follows the OS. */\n mode?: CanvasThemeMode | null;\n children?: React.ReactNode;\n};\n\n/**\n * Mount once at each exposed root. A nested provider without its own `mode`\n * passes through to the outer one, so the viewer inside the experience shares\n * the experience's theme.\n */\nexport function CanvasThemeProvider({ mode, children }: CanvasThemeProviderProps) {\n const parent = useContext(CanvasThemeContext);\n const scheme = useOsScheme();\n const [preference, setPreferenceState] = useState<CanvasThemePreference>(currentPreference);\n\n useEffect(() => {\n const listener = (pref: CanvasThemePreference) => setPreferenceState(pref);\n listeners.add(listener);\n // Catch a change that landed between render and subscribe.\n setPreferenceState(currentPreference);\n loadPreference();\n return () => {\n listeners.delete(listener);\n };\n }, []);\n\n const resolved: CanvasThemeMode = preference !== 'system' ? preference : (mode ?? osMode(scheme));\n const value = useMemo<CanvasThemeContextValue>(\n () => ({ palette: canvasPalette(resolved), preference, setPreference: setCanvasThemePreference }),\n [resolved, preference],\n );\n\n if (parent && mode == null) return <>{children}</>;\n return <CanvasThemeContext.Provider value={value}>{children}</CanvasThemeContext.Provider>;\n}\n\n/** The active palette. Never throws: without a provider it follows the OS scheme. */\nexport function useCanvasTheme(): CanvasPalette {\n const ctx = useContext(CanvasThemeContext);\n const scheme = useOsScheme();\n return ctx ? ctx.palette : canvasPalette(osMode(scheme));\n}\n\n/** Preference + setter for the toggle. Without a provider it still writes the shared store. */\nexport function useCanvasThemeControls(): CanvasThemeContextValue {\n const ctx = useContext(CanvasThemeContext);\n const palette = useCanvasTheme();\n return ctx ?? { palette, preference: currentPreference, setPreference: setCanvasThemePreference };\n}\n\n/** Wraps an exposed component in its own CanvasThemeProvider (pass-through when one is already above). */\nexport function withCanvasTheme<P extends object>(Component: React.ComponentType<P>): React.ComponentType<P> {\n function CanvasThemed(props: P) {\n return (\n <CanvasThemeProvider>\n <Component {...props} />\n </CanvasThemeProvider>\n );\n }\n CanvasThemed.displayName = `withCanvasTheme(${Component.displayName || Component.name || 'Component'})`;\n return CanvasThemed;\n}\n\nconst NEXT_PREFERENCE: Record<CanvasThemePreference, CanvasThemePreference> = {\n system: 'light',\n light: 'dark',\n dark: 'system',\n};\n\nconst PREFERENCE_ICON: Record<CanvasThemePreference, React.ComponentProps<typeof MaterialCommunityIcons>['name']> = {\n system: 'theme-light-dark',\n light: 'weather-sunny',\n dark: 'weather-night',\n};\n\nconst PREFERENCE_LABEL: Record<CanvasThemePreference, string> = {\n system: 'Theme: follows system',\n light: 'Theme: light',\n dark: 'Theme: dark',\n};\n\n/** Sun / moon / auto toggle — cycles system → light → dark (web ThemeToggleButton). */\nexport function CanvasThemeToggle({ style, size = 18 }: { style?: StyleProp<ViewStyle>; size?: number }) {\n const { palette, preference, setPreference } = useCanvasThemeControls();\n const onPress = useCallback(() => setPreference(NEXT_PREFERENCE[preference]), [preference, setPreference]);\n return (\n <Pressable\n onPress={onPress}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel={`${PREFERENCE_LABEL[preference]}. Tap to change.`}\n // A plain style, never a function: the host's NativeWind JSX wrapper\n // drops function styles inside the OTA remote (see canvasUi Pressable).\n style={StyleSheet.flatten([\n toggleStyles.button,\n { backgroundColor: palette.surface, borderColor: palette.border },\n style,\n ])}\n >\n <MaterialCommunityIcons name={PREFERENCE_ICON[preference]} size={size} color={palette.foreground} />\n </Pressable>\n );\n}\n\nconst toggleStyles = StyleSheet.create({\n button: {\n width: 36,\n height: 36,\n borderRadius: 18,\n borderWidth: StyleSheet.hairlineWidth,\n alignItems: 'center',\n justifyContent: 'center',\n },\n pressed: { opacity: 0.7 },\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canvasTheme.js","sources":["../../../src/features/canvas/canvasTheme.tsx"],"sourcesContent":["/**\n * Canvas light/dark theming — the native port of the web canvas theme\n * (yantra-surface packages/canvas/src/styles/theme.css + surface.css).\n *\n * Two sets of tokens:\n * - Surface tokens (background, card, foreground, muted, border, primary,\n * accent, destructive …) are the tweakcn export's `:root` / `.dark` values,\n * used by the boards home, the viewer chrome, sheets and panels.\n * - Editor-grade tokens (`ed*`) mirror the web `[data-editor]` design layer:\n * the dark grade keeps the native editors' existing near-black chassis, the\n * light grade is the web `[data-editor='light']` set.\n *\n * The mode follows the OS (`useColorScheme`), or a host-provided mode, unless\n * the person picked light/dark with the toggle — that pick is persisted under\n * AsyncStorage key `canvas.theme`.\n *\n * Remote-safe: this module ships OTA inside the federated canvas remote, so\n * AsyncStorage is required in a try/catch (see canvasBoardsSnapshot.ts) and\n * `useCanvasTheme()` never throws without a provider — it falls back to the\n * OS scheme.\n */\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';\nimport { Pressable, StyleSheet, useColorScheme, type StyleProp, type ViewStyle } from 'react-native';\n\nexport type CanvasThemeMode = 'light' | 'dark';\nexport type CanvasThemePreference = CanvasThemeMode | 'system';\n\nexport const CANVAS_THEME_STORAGE_KEY = 'canvas.theme';\n\nexport type CanvasPalette = {\n mode: CanvasThemeMode;\n isDark: boolean;\n\n // ── Web surface tokens (tweakcn theme.css) ───────────────────────────\n background: string;\n foreground: string;\n card: string;\n cardForeground: string;\n popover: string;\n popoverForeground: string;\n primary: string;\n primaryForeground: string;\n secondary: string;\n secondaryForeground: string;\n muted: string;\n mutedForeground: string;\n accent: string;\n accentForeground: string;\n destructive: string;\n destructiveForeground: string;\n border: string;\n input: string;\n ring: string;\n\n // ── Native extras derived from the tokens (accessible on background) ─\n /** Raised sheets, cards and fields: white in light, the card step in dark. */\n surface: string;\n /** Secondary body text, one step softer than foreground. */\n inkSoft: string;\n /** A stronger hairline for dashed drop zones and field edges. */\n borderStrong: string;\n /** The primary hue as text on the background (lime is unreadable on white). */\n primaryText: string;\n destructiveText: string;\n destructiveSoft: string;\n destructiveBorder: string;\n successText: string;\n successSoft: string;\n warningText: string;\n info: string;\n infoSoft: string;\n /** Translucent page ground for sticky / frosted bars. */\n backgroundAlpha: (alpha: number) => string;\n /** Foreground at `alpha`, for hairlines and tints that must flip with the mode. */\n tint: (alpha: number) => string;\n\n // ── Editor grade (web [data-editor] / [data-editor='light']) ─────────\n edWell: string;\n edBg: string;\n edPanel: string;\n edRaised: string;\n edRaisedHi: string;\n edLine: string;\n edLineHi: string;\n edInk: string;\n edInk2: string;\n edInk3: string;\n /** Ink on an edInk or edAccent solid. */\n edOnInk: string;\n edAccent: string;\n edAccentSoft: string;\n edDanger: string;\n edDangerSoft: string;\n edOk: string;\n edWarn: string;\n /** edInk at `alpha` (white veil on dark, black veil on light). */\n edTint: (alpha: number) => string;\n};\n\nconst rgba = (rgb: string) => (alpha: number) => `rgba(${rgb},${alpha})`;\n\nexport const CANVAS_LIGHT: CanvasPalette = {\n mode: 'light',\n isDark: false,\n\n background: '#ffffff',\n foreground: '#141414',\n card: '#f4f4f5',\n cardForeground: '#141414',\n popover: '#ffffff',\n popoverForeground: '#141414',\n primary: '#e1ff00',\n primaryForeground: '#000000',\n secondary: '#27272a',\n secondaryForeground: '#ffffff',\n muted: '#f1f1f1',\n mutedForeground: '#71717a',\n accent: '#e1ff00',\n accentForeground: '#000000',\n destructive: '#ef4444',\n destructiveForeground: '#ffffff',\n border: '#e4e4e7',\n input: '#e4e4e7',\n ring: '#d4e100',\n\n surface: '#ffffff',\n inkSoft: '#3f3f46',\n borderStrong: '#d4d4d8',\n primaryText: '#4d7c0f',\n destructiveText: '#b91c1c',\n destructiveSoft: '#fef2f2',\n destructiveBorder: '#fecaca',\n successText: '#15803d',\n successSoft: '#f0fdf4',\n warningText: '#92400e',\n info: '#2563eb',\n infoSoft: '#dbeafe',\n backgroundAlpha: rgba('255,255,255'),\n tint: rgba('20,20,20'),\n\n edWell: '#e4e4e7',\n edBg: '#f5f5f3',\n edPanel: '#ffffff',\n edRaised: '#f4f4f5',\n edRaisedHi: '#e9e9eb',\n edLine: '#e4e4e7',\n edLineHi: '#d4d4d8',\n edInk: '#18181b',\n edInk2: '#52525b',\n edInk3: '#6b6b76',\n edOnInk: '#ffffff',\n edAccent: '#6c5ce7',\n edAccentSoft: '#ece9ff',\n edDanger: '#b91c1c',\n edDangerSoft: '#fef2f2',\n edOk: '#15803d',\n edWarn: '#92400e',\n edTint: rgba('0,0,0'),\n};\n\nexport const CANVAS_DARK: CanvasPalette = {\n mode: 'dark',\n isDark: true,\n\n background: '#0d0d0d',\n foreground: '#f2f2f2',\n card: '#141414',\n cardForeground: '#f2f2f2',\n popover: '#0d0d0d',\n popoverForeground: '#f2f2f2',\n primary: '#d4ff00',\n primaryForeground: '#000000',\n secondary: '#262626',\n secondaryForeground: '#f2f2f2',\n muted: '#1a1a1a',\n mutedForeground: '#a1a1aa',\n accent: '#262626',\n accentForeground: '#d4ff00',\n destructive: '#7f1d1d',\n destructiveForeground: '#f2f2f2',\n border: '#262626',\n input: '#262626',\n ring: '#d4ff00',\n\n surface: '#141414',\n inkSoft: '#d4d4d8',\n borderStrong: '#3f3f46',\n primaryText: '#d4ff00',\n destructiveText: '#f87171',\n destructiveSoft: '#421f23',\n destructiveBorder: '#7f3336',\n successText: '#4ade80',\n successSoft: '#12261a',\n warningText: '#fbbf24',\n info: '#6ea8fe',\n infoSoft: '#243a5e',\n backgroundAlpha: rgba('13,13,13'),\n tint: rgba('242,242,242'),\n\n // Native editors' existing dark chassis.\n edWell: '#08080a',\n edBg: '#0a0a0c',\n edPanel: '#16161a',\n edRaised: '#1f1f24',\n edRaisedHi: '#2a2a32',\n edLine: '#26262c',\n edLineHi: '#32323a',\n edInk: '#f7f7fa',\n edInk2: '#9a9aa5',\n edInk3: '#7a7a88',\n edOnInk: '#0a0a0c',\n edAccent: '#8b7cff',\n edAccentSoft: 'rgba(139,124,255,0.2)',\n edDanger: '#f87171',\n edDangerSoft: 'rgba(248,113,113,0.14)',\n edOk: '#4ade80',\n edWarn: '#fbbf24',\n edTint: rgba('255,255,255'),\n};\n\nexport function canvasPalette(mode: CanvasThemeMode): CanvasPalette {\n return mode === 'dark' ? CANVAS_DARK : CANVAS_LIGHT;\n}\n\n/**\n * Wraps a `(theme) => StyleSheet.create(...)` factory so each palette's sheet\n * is built once per module, not once per mounted component instance.\n */\nexport function themedStyles<T>(factory: (theme: CanvasPalette) => T): (theme: CanvasPalette) => T {\n const cache = new Map<CanvasPalette, T>();\n return (theme) => {\n let sheet = cache.get(theme);\n if (!sheet) {\n sheet = factory(theme);\n cache.set(theme, sheet);\n }\n return sheet;\n };\n}\n\n// ── Persisted preference (shared by every provider in the process) ─────────\n\ntype StorageLike = { getItem(key: string): Promise<string | null>; setItem(key: string, value: string): Promise<void> };\nlet storage: StorageLike | null = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, global-require\n storage = require('@react-native-async-storage/async-storage').default ?? null;\n} catch {\n storage = null;\n}\n\nfunction isPreference(value: unknown): value is CanvasThemePreference {\n return value === 'light' || value === 'dark' || value === 'system';\n}\n\nlet currentPreference: CanvasThemePreference = 'system';\nlet loaded = false;\nconst listeners = new Set<(pref: CanvasThemePreference) => void>();\n\nfunction notify() {\n listeners.forEach((fn) => fn(currentPreference));\n}\n\nfunction loadPreference() {\n if (loaded || !storage) return;\n loaded = true;\n try {\n void storage\n .getItem(CANVAS_THEME_STORAGE_KEY)\n .then((raw) => {\n if (isPreference(raw) && raw !== currentPreference) {\n currentPreference = raw;\n notify();\n }\n })\n .catch(() => undefined);\n } catch {\n /* storage unavailable: memory only */\n }\n}\n\nexport function setCanvasThemePreference(next: CanvasThemePreference) {\n if (!isPreference(next)) return;\n loaded = true;\n currentPreference = next;\n notify();\n try {\n void storage?.setItem(CANVAS_THEME_STORAGE_KEY, next).catch(() => undefined);\n } catch {\n /* ignore */\n }\n}\n\n// ── Context ─────────────────────────────────────────────────────────────────\n\ntype CanvasThemeContextValue = {\n palette: CanvasPalette;\n preference: CanvasThemePreference;\n setPreference: (next: CanvasThemePreference) => void;\n};\n\nconst CanvasThemeContext = createContext<CanvasThemeContextValue | null>(null);\n\n/**\n * The OS scheme, or null where the host's react-native exposes no\n * useColorScheme (minimal mocks, exotic hosts). Its presence is constant for\n * the process, so the hook order stays stable.\n */\nfunction useOsScheme(): string | null | undefined {\n // eslint-disable-next-line react-hooks/rules-of-hooks -- process-constant branch\n return typeof useColorScheme === 'function' ? useColorScheme() : null;\n}\n\nfunction osMode(scheme: string | null | undefined): CanvasThemeMode {\n return scheme === 'dark' ? 'dark' : 'light';\n}\n\nexport type CanvasThemeProviderProps = {\n /** Host-provided mode; used while the preference is 'system'. Null/undefined follows the OS. */\n mode?: CanvasThemeMode | null;\n /**\n * A surface with its own look (the Design surface's teal theme) maps the\n * resolved light/dark palette to its own. Keep it a stable function: the\n * palette is memoised on it.\n */\n palette?: (mode: CanvasThemeMode) => CanvasPalette;\n children?: React.ReactNode;\n};\n\n/**\n * Mount once at each exposed root. A nested provider without its own `mode`\n * passes through to the outer one, so the viewer inside the experience shares\n * the experience's theme.\n */\nexport function CanvasThemeProvider({ mode, palette, children }: CanvasThemeProviderProps) {\n const parent = useContext(CanvasThemeContext);\n const scheme = useOsScheme();\n const [preference, setPreferenceState] = useState<CanvasThemePreference>(currentPreference);\n\n useEffect(() => {\n const listener = (pref: CanvasThemePreference) => setPreferenceState(pref);\n listeners.add(listener);\n // Catch a change that landed between render and subscribe.\n setPreferenceState(currentPreference);\n loadPreference();\n return () => {\n listeners.delete(listener);\n };\n }, []);\n\n // A palette-only provider inside another follows the outer light/dark choice.\n const resolved: CanvasThemeMode =\n parent && mode == null ? parent.palette.mode : preference !== 'system' ? preference : (mode ?? osMode(scheme));\n const value = useMemo<CanvasThemeContextValue>(\n () => ({ palette: (palette ?? canvasPalette)(resolved), preference, setPreference: setCanvasThemePreference }),\n [resolved, preference, palette],\n );\n\n if (parent && mode == null && !palette) return <>{children}</>;\n return <CanvasThemeContext.Provider value={value}>{children}</CanvasThemeContext.Provider>;\n}\n\n/** The active palette. Never throws: without a provider it follows the OS scheme. */\nexport function useCanvasTheme(): CanvasPalette {\n const ctx = useContext(CanvasThemeContext);\n const scheme = useOsScheme();\n return ctx ? ctx.palette : canvasPalette(osMode(scheme));\n}\n\n/** Preference + setter for the toggle. Without a provider it still writes the shared store. */\nexport function useCanvasThemeControls(): CanvasThemeContextValue {\n const ctx = useContext(CanvasThemeContext);\n const palette = useCanvasTheme();\n return ctx ?? { palette, preference: currentPreference, setPreference: setCanvasThemePreference };\n}\n\n/** Wraps an exposed component in its own CanvasThemeProvider (pass-through when one is already above). */\nexport function withCanvasTheme<P extends object>(Component: React.ComponentType<P>): React.ComponentType<P> {\n function CanvasThemed(props: P) {\n return (\n <CanvasThemeProvider>\n <Component {...props} />\n </CanvasThemeProvider>\n );\n }\n CanvasThemed.displayName = `withCanvasTheme(${Component.displayName || Component.name || 'Component'})`;\n return CanvasThemed;\n}\n\nexport function CanvasThemeToggle({ style, size = 18 }: { style?: StyleProp<ViewStyle>; size?: number }) {\n // Two states, one tap: show the mode a tap switches TO (moon in light, sun in dark).\n // Until the first tap the theme follows the OS; a tap pins the opposite of what is showing.\n const { palette, setPreference } = useCanvasThemeControls();\n const next: CanvasThemeMode = palette.isDark ? 'light' : 'dark';\n const onPress = useCallback(() => setPreference(next), [next, setPreference]);\n return (\n <Pressable\n onPress={onPress}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel={next === 'dark' ? 'Switch to dark mode' : 'Switch to light mode'}\n // A plain style, never a function: the host's NativeWind JSX wrapper\n // drops function styles inside the OTA remote (see canvasUi Pressable).\n style={StyleSheet.flatten([\n toggleStyles.button,\n { backgroundColor: palette.surface, borderColor: palette.border },\n style,\n ])}\n >\n <MaterialCommunityIcons\n name={next === 'dark' ? 'weather-night' : 'weather-sunny'}\n size={size}\n color={palette.foreground}\n />\n </Pressable>\n );\n}\n\nconst toggleStyles = StyleSheet.create({\n button: {\n width: 36,\n height: 36,\n borderRadius: 18,\n borderWidth: StyleSheet.hairlineWidth,\n alignItems: 'center',\n justifyContent: 'center',\n },\n pressed: { opacity: 0.7 },\n});\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import {jsx,jsxs}from'react/jsx-runtime';import {MaterialCommunityIcons}from'@expo/vector-icons';import {forwardRef,useState,useCallback,useRef,useEffect}from'react';import {Pressable as Pressable$1,StyleSheet,ScrollView,Text,View,Animated,Easing}from'react-native';import {themedStyles,useCanvasTheme}from'./canvasTheme.js';var __defProp = Object.defineProperty;
1
+ import {jsx,jsxs}from'react/jsx-runtime';import {MaterialCommunityIcons}from'@expo/vector-icons';import {forwardRef,useState,useCallback,useRef,useEffect}from'react';import {Pressable as Pressable$1,StyleSheet,Animated,Easing,ScrollView,Text,View}from'react-native';import {useCanvasTheme,themedStyles}from'./canvasTheme.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -1 +1 @@
1
- {"version":3,"file":"canvasUi.js","sources":["../../../src/features/canvas/canvasUi.tsx"],"sourcesContent":["/**\n * Canvas UI vocabulary - the shared spacing, radii, type ramp and the small\n * set of primitives every canvas screen builds from, so a section header, a\n * filter control or a primary button looks the same on the home, the board,\n * the generator and the panels.\n *\n * Colours come from `canvasTheme` (light / dark); this file only decides\n * shape and rhythm. Restrained by design: neutrals carry the surface, the\n * theme's primary (lime) marks the one main action, nothing else is accented.\n */\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\nimport {\n Animated,\n Easing,\n Pressable as RNPressable,\n ScrollView,\n StyleSheet,\n Text,\n View,\n type StyleProp,\n type TextStyle,\n type ViewStyle,\n} from 'react-native';\nimport { themedStyles, useCanvasTheme, type CanvasPalette } from './canvasTheme';\n\ntype IconName = React.ComponentProps<typeof MaterialCommunityIcons>['name'];\n\ntype RNPressableProps = React.ComponentProps<typeof RNPressable>;\n\n/** `StyleSheet.flatten` where the runtime has it (a test double may not). */\nconst flattenStyle = (style: RNPressableProps['style']) =>\n typeof StyleSheet.flatten === 'function' && typeof style !== 'function' ? StyleSheet.flatten(style) : style;\n\n/**\n * Drop-in `Pressable` for canvas screens. The host compiles JSX through\n * NativeWind (`jsxImportSource: 'nativewind'`), whose wrapper drops a style\n * passed as a FUNCTION (`style={({ pressed }) => [...]}`) inside this OTA\n * remote - the element then renders with no style at all (no width, no fill,\n * no row layout). This resolves function styles and children here, from its\n * own pressed state, and hands the wrapped Pressable plain values only.\n */\nexport const Pressable = forwardRef<React.ElementRef<typeof RNPressable>, RNPressableProps>(function Pressable(\n { style, children, onPressIn, onPressOut, ...rest },\n ref,\n) {\n const [pressed, setPressed] = useState(false);\n const handleIn = useCallback<NonNullable<RNPressableProps['onPressIn']>>(\n (event) => {\n setPressed(true);\n onPressIn?.(event);\n },\n [onPressIn],\n );\n const handleOut = useCallback<NonNullable<RNPressableProps['onPressOut']>>(\n (event) => {\n setPressed(false);\n onPressOut?.(event);\n },\n [onPressOut],\n );\n const state = { pressed, hovered: false };\n const resolvedStyle = typeof style === 'function' ? style(state) : style;\n const resolvedChildren = typeof children === 'function' ? children(state) : children;\n return (\n <RNPressable\n ref={ref}\n {...rest}\n onPressIn={handleIn}\n onPressOut={handleOut}\n style={flattenStyle(resolvedStyle)}\n >\n {resolvedChildren}\n </RNPressable>\n );\n});\n\n/** 4pt rhythm; sections breathe more than the items inside them. */\nexport const SPACE = { xs: 4, sm: 8, md: 12, lg: 16, xl: 24, xxl: 32 } as const;\n\nexport const RADIUS = { sm: 8, md: 12, lg: 16, xl: 20, pill: 999 } as const;\n\n/** Product ramp, ~1.2 between steps. */\nexport const TYPE = {\n caption: { fontSize: 12, lineHeight: 16, fontWeight: '500' },\n label: { fontSize: 13, lineHeight: 18, fontWeight: '600' },\n body: { fontSize: 15, lineHeight: 21, fontWeight: '400' },\n title: { fontSize: 17, lineHeight: 22, fontWeight: '600' },\n heading: { fontSize: 22, lineHeight: 28, fontWeight: '700' },\n display: { fontSize: 28, lineHeight: 34, fontWeight: '700' },\n} as const satisfies Record<string, TextStyle>;\n\n/** Minimum comfortable touch target. */\nexport const HIT = 44;\n\n/** A section's title with an optional trailing action (\"See all\", a count). */\nexport function SectionHeader({\n title,\n detail,\n action,\n onAction,\n style,\n}: {\n title: string;\n detail?: string;\n action?: string;\n onAction?: () => void;\n style?: StyleProp<ViewStyle>;\n}) {\n const styles = makeStyles(useCanvasTheme());\n return (\n <View style={[styles.sectionHeader, style]}>\n <View style={styles.sectionTitleRow}>\n <Text style={styles.sectionTitle} accessibilityRole=\"header\">\n {title}\n </Text>\n {detail ? <Text style={styles.sectionDetail}>{detail}</Text> : null}\n </View>\n {action && onAction ? (\n <Pressable onPress={onAction} hitSlop={10} accessibilityRole=\"button\">\n <Text style={styles.sectionAction}>{action}</Text>\n </Pressable>\n ) : null}\n </View>\n );\n}\n\n/** A single-choice filter: one rounded track, the chosen option raised. */\nexport function Segmented<T extends string>({\n options,\n value,\n onChange,\n style,\n}: {\n options: ReadonlyArray<{ id: T; label: string }>;\n value: T;\n onChange: (id: T) => void;\n style?: StyleProp<ViewStyle>;\n}) {\n const styles = makeStyles(useCanvasTheme());\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n // flexGrow 0: a horizontal ScrollView otherwise swells into any spare height.\n style={[styles.segmentScroll, style]}\n contentContainerStyle={styles.segmentTrack}\n >\n {options.map((option) => {\n const on = option.id === value;\n return (\n <Pressable\n key={option.id}\n onPress={() => onChange(option.id)}\n style={[styles.segment, on && styles.segmentOn]}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: on }}\n >\n <Text style={[styles.segmentLabel, on && styles.segmentLabelOn]}>{option.label}</Text>\n </Pressable>\n );\n })}\n </ScrollView>\n );\n}\n\n/** Round icon-only control (theme toggle, close, more). */\nexport function IconButton({\n icon,\n onPress,\n label,\n tone = 'plain',\n size = 40,\n}: {\n icon: IconName;\n onPress: () => void;\n label: string;\n tone?: 'plain' | 'filled';\n size?: number;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n return (\n <Pressable\n onPress={onPress}\n hitSlop={Math.max(0, (HIT - size) / 2)}\n style={({ pressed }) => [\n styles.iconButton,\n { width: size, height: size, borderRadius: size / 2 },\n tone === 'filled' && styles.iconButtonFilled,\n pressed && styles.pressed,\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n >\n <MaterialCommunityIcons name={icon} size={Math.round(size * 0.5)} color={theme.foreground} />\n </Pressable>\n );\n}\n\n/** The one main action on a surface: lime, dark ink. `secondary` is the quiet neutral twin. */\nexport function ActionButton({\n label,\n icon,\n onPress,\n variant = 'primary',\n disabled,\n style,\n}: {\n label: string;\n icon?: IconName;\n onPress: () => void;\n variant?: 'primary' | 'secondary';\n disabled?: boolean;\n style?: StyleProp<ViewStyle>;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n const primary = variant === 'primary';\n const ink = primary ? theme.primaryForeground : theme.foreground;\n return (\n <Pressable\n onPress={onPress}\n disabled={disabled}\n style={({ pressed }) => [\n styles.action,\n primary ? styles.actionPrimary : styles.actionSecondary,\n disabled && styles.disabled,\n pressed && !disabled && styles.pressed,\n style,\n ]}\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: Boolean(disabled) }}\n >\n {icon ? <MaterialCommunityIcons name={icon} size={18} color={ink} /> : null}\n <Text style={[styles.actionLabel, { color: ink }]}>{label}</Text>\n </Pressable>\n );\n}\n\n/**\n * A loading block that breathes (opacity 0.45 to 1, 900ms each way) in place\n * of the content it stands for. Absolute-fills its parent unless given a size.\n */\nexport function Skeleton({ style, radius = 0 }: { style?: StyleProp<ViewStyle>; radius?: number }) {\n const theme = useCanvasTheme();\n const pulse = useRef(new Animated.Value(0.45)).current;\n useEffect(() => {\n const loop = Animated.loop(\n Animated.sequence([\n Animated.timing(pulse, {\n toValue: 1,\n duration: 900,\n easing: Easing.out(Easing.quad),\n useNativeDriver: true,\n }),\n Animated.timing(pulse, {\n toValue: 0.45,\n duration: 900,\n easing: Easing.in(Easing.quad),\n useNativeDriver: true,\n }),\n ]),\n );\n loop.start();\n return () => loop.stop();\n }, [pulse]);\n return (\n <Animated.View\n pointerEvents=\"none\"\n style={[\n style ?? StyleSheet.absoluteFillObject,\n { borderRadius: radius, backgroundColor: theme.isDark ? '#262626' : '#e7e7ea', opacity: pulse },\n ]}\n />\n );\n}\n\n/**\n * Soft cover washes for media that has no picture to show (a video whose frame\n * is not in, a link that will not load). Picked by a stable hash of `seed`, so\n * the same board always wears the same colour.\n */\nconst COVER_WASHES: Array<{ light: [string, string]; dark: [string, string] }> = [\n { light: ['#fde7d9', '#c2410c'], dark: ['#3a2418', '#fdba74'] },\n { light: ['#e0ecff', '#1d4ed8'], dark: ['#1a2540', '#93c5fd'] },\n { light: ['#e6f6ec', '#047857'], dark: ['#15291f', '#6ee7b7'] },\n { light: ['#efe7ff', '#6d28d9'], dark: ['#261d3d', '#c4b5fd'] },\n { light: ['#fde4ec', '#be185d'], dark: ['#3a1a27', '#f9a8d4'] },\n { light: ['#fdf3d4', '#a16207'], dark: ['#33290f', '#fcd34d'] },\n];\n\nexport function coverWash(seed: string, isDark: boolean): { wash: string; ink: string } {\n let h = 0;\n for (let i = 0; i < seed.length; i += 1) h = (h * 31 + seed.charCodeAt(i)) | 0;\n const pick = COVER_WASHES[Math.abs(h) % COVER_WASHES.length];\n const [wash, ink] = isDark ? pick.dark : pick.light;\n return { wash, ink };\n}\n\n/** A tinted cover with a frosted icon badge: the \"no picture\" state that still looks intended. */\nexport function CoverPlaceholder({ seed, icon, label }: { seed: string; icon: IconName; label?: string }) {\n const theme = useCanvasTheme();\n const { wash, ink } = coverWash(seed, theme.isDark);\n return (\n <View style={[StyleSheet.absoluteFillObject, placeholderStyles.wrap, { backgroundColor: wash }]}>\n <View\n style={[\n placeholderStyles.badge,\n { backgroundColor: theme.isDark ? 'rgba(255,255,255,0.08)' : 'rgba(255,255,255,0.7)' },\n ]}\n >\n <MaterialCommunityIcons name={icon} size={26} color={ink} />\n </View>\n {label ? <Text style={[placeholderStyles.label, { color: ink }]}>{label}</Text> : null}\n </View>\n );\n}\n\nconst placeholderStyles = StyleSheet.create({\n wrap: { alignItems: 'center', justifyContent: 'center', gap: SPACE.sm },\n badge: { width: 56, height: 56, borderRadius: 28, alignItems: 'center', justifyContent: 'center' },\n label: { ...TYPE.caption, fontWeight: '600' },\n});\n\n/** Press feedback every canvas pressable shares. */\nexport const pressedStyle = (pressed: boolean): ViewStyle | null =>\n pressed ? { opacity: 0.72, transform: [{ scale: 0.98 }] } : null;\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n sectionHeader: {\n flexDirection: 'row',\n alignItems: 'baseline',\n justifyContent: 'space-between',\n gap: SPACE.md,\n marginBottom: SPACE.md,\n },\n sectionTitleRow: { flexDirection: 'row', alignItems: 'baseline', gap: SPACE.sm, flexShrink: 1 },\n sectionTitle: { ...TYPE.title, color: theme.foreground },\n sectionDetail: { ...TYPE.caption, color: theme.mutedForeground },\n sectionAction: { ...TYPE.label, color: theme.mutedForeground },\n segmentScroll: { flexGrow: 0, alignSelf: 'flex-start' },\n segmentTrack: {\n flexDirection: 'row',\n padding: 3,\n gap: 2,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.card,\n },\n segment: {\n minHeight: 34,\n paddingHorizontal: SPACE.lg,\n borderRadius: RADIUS.pill,\n alignItems: 'center',\n justifyContent: 'center',\n },\n segmentOn: {\n backgroundColor: theme.isDark ? theme.secondary : theme.surface,\n shadowColor: '#000',\n shadowOpacity: theme.isDark ? 0 : 0.08,\n shadowRadius: 4,\n shadowOffset: { width: 0, height: 1 },\n elevation: theme.isDark ? 0 : 1,\n },\n segmentLabel: { ...TYPE.label, color: theme.mutedForeground },\n segmentLabelOn: { color: theme.foreground },\n iconButton: { alignItems: 'center', justifyContent: 'center' },\n iconButtonFilled: { backgroundColor: theme.card },\n action: {\n minHeight: HIT,\n paddingHorizontal: SPACE.lg + 2,\n borderRadius: RADIUS.pill,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: SPACE.sm,\n },\n actionPrimary: { backgroundColor: theme.primary },\n actionSecondary: { backgroundColor: theme.card },\n actionLabel: { ...TYPE.label, fontSize: 15 },\n disabled: { opacity: 0.4 },\n pressed: { opacity: 0.72, transform: [{ scale: 0.98 }] },\n }),\n);\n"],"names":["Pressable","RNPressable"],"mappings":"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"}
1
+ {"version":3,"file":"canvasUi.js","sources":["../../../src/features/canvas/canvasUi.tsx"],"sourcesContent":["/**\n * Canvas UI vocabulary - the shared spacing, radii, type ramp and the small\n * set of primitives every canvas screen builds from, so a section header, a\n * filter control or a primary button looks the same on the home, the board,\n * the generator and the panels.\n *\n * Colours come from `canvasTheme` (light / dark); this file only decides\n * shape and rhythm. Restrained by design: neutrals carry the surface, the\n * theme's primary (lime) marks the one main action, nothing else is accented.\n */\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\nimport {\n Animated,\n Easing,\n Pressable as RNPressable,\n ScrollView,\n StyleSheet,\n Text,\n View,\n type StyleProp,\n type TextStyle,\n type ViewStyle,\n} from 'react-native';\nimport { themedStyles, useCanvasTheme, type CanvasPalette } from './canvasTheme';\n\ntype IconName = React.ComponentProps<typeof MaterialCommunityIcons>['name'];\n\ntype RNPressableProps = React.ComponentProps<typeof RNPressable>;\n\n/** `StyleSheet.flatten` where the runtime has it (a test double may not). */\nconst flattenStyle = (style: RNPressableProps['style']) =>\n typeof StyleSheet.flatten === 'function' && typeof style !== 'function' ? StyleSheet.flatten(style) : style;\n\n/**\n * Drop-in `Pressable` for canvas screens. The host compiles JSX through\n * NativeWind (`jsxImportSource: 'nativewind'`), whose wrapper drops a style\n * passed as a FUNCTION (`style={({ pressed }) => [...]}`) inside this OTA\n * remote - the element then renders with no style at all (no width, no fill,\n * no row layout). This resolves function styles and children here, from its\n * own pressed state, and hands the wrapped Pressable plain values only.\n */\nexport const Pressable = forwardRef<React.ElementRef<typeof RNPressable>, RNPressableProps>(function Pressable(\n { style, children, onPressIn, onPressOut, ...rest },\n ref,\n) {\n const [pressed, setPressed] = useState(false);\n const handleIn = useCallback<NonNullable<RNPressableProps['onPressIn']>>(\n (event) => {\n setPressed(true);\n onPressIn?.(event);\n },\n [onPressIn],\n );\n const handleOut = useCallback<NonNullable<RNPressableProps['onPressOut']>>(\n (event) => {\n setPressed(false);\n onPressOut?.(event);\n },\n [onPressOut],\n );\n const state = { pressed, hovered: false };\n const resolvedStyle = typeof style === 'function' ? style(state) : style;\n const resolvedChildren = typeof children === 'function' ? children(state) : children;\n return (\n <RNPressable\n ref={ref}\n {...rest}\n onPressIn={handleIn}\n onPressOut={handleOut}\n style={flattenStyle(resolvedStyle)}\n >\n {resolvedChildren}\n </RNPressable>\n );\n});\n\n/** 4pt rhythm; sections breathe more than the items inside them. */\nexport const SPACE = { xs: 4, sm: 8, md: 12, lg: 16, xl: 24, xxl: 32 } as const;\n\nexport const RADIUS = { sm: 8, md: 12, lg: 16, xl: 20, pill: 999 } as const;\n\n/** Product ramp, ~1.2 between steps. */\nexport const TYPE = {\n caption: { fontSize: 12, lineHeight: 16, fontWeight: '500' },\n label: { fontSize: 13, lineHeight: 18, fontWeight: '600' },\n body: { fontSize: 15, lineHeight: 21, fontWeight: '400' },\n title: { fontSize: 17, lineHeight: 22, fontWeight: '600' },\n heading: { fontSize: 22, lineHeight: 28, fontWeight: '700' },\n display: { fontSize: 28, lineHeight: 34, fontWeight: '700' },\n} as const satisfies Record<string, TextStyle>;\n\n/** Minimum comfortable touch target. */\nexport const HIT = 44;\n\n/** A section's title with an optional trailing action (\"See all\", a count). */\nexport function SectionHeader({\n title,\n detail,\n action,\n onAction,\n style,\n}: {\n title: string;\n detail?: string;\n action?: string;\n onAction?: () => void;\n style?: StyleProp<ViewStyle>;\n}) {\n const styles = makeStyles(useCanvasTheme());\n return (\n <View style={[styles.sectionHeader, style]}>\n <View style={styles.sectionTitleRow}>\n <Text style={styles.sectionTitle} accessibilityRole=\"header\">\n {title}\n </Text>\n {detail ? <Text style={styles.sectionDetail}>{detail}</Text> : null}\n </View>\n {action && onAction ? (\n <Pressable onPress={onAction} hitSlop={10} accessibilityRole=\"button\">\n <Text style={styles.sectionAction}>{action}</Text>\n </Pressable>\n ) : null}\n </View>\n );\n}\n\n/** A single-choice filter: one rounded track, the chosen option raised. */\nexport function Segmented<T extends string>({\n options,\n value,\n onChange,\n style,\n}: {\n options: ReadonlyArray<{ id: T; label: string }>;\n value: T;\n // NoInfer: T comes from the options and value, so a useState setter for a\n // literal union ('16:9' | '9:16') is accepted instead of widening T to string.\n onChange: (id: NoInfer<T>) => void;\n style?: StyleProp<ViewStyle>;\n}) {\n const styles = makeStyles(useCanvasTheme());\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n // flexGrow 0: a horizontal ScrollView otherwise swells into any spare height.\n style={[styles.segmentScroll, style]}\n contentContainerStyle={styles.segmentTrack}\n >\n {options.map((option) => {\n const on = option.id === value;\n return (\n <Pressable\n key={option.id}\n onPress={() => onChange(option.id)}\n style={[styles.segment, on && styles.segmentOn]}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: on }}\n >\n <Text style={[styles.segmentLabel, on && styles.segmentLabelOn]}>{option.label}</Text>\n </Pressable>\n );\n })}\n </ScrollView>\n );\n}\n\n/** Round icon-only control (theme toggle, close, more). */\nexport function IconButton({\n icon,\n onPress,\n label,\n tone = 'plain',\n size = 40,\n}: {\n icon: IconName;\n onPress: () => void;\n label: string;\n tone?: 'plain' | 'filled';\n size?: number;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n return (\n <Pressable\n onPress={onPress}\n hitSlop={Math.max(0, (HIT - size) / 2)}\n style={({ pressed }) => [\n styles.iconButton,\n { width: size, height: size, borderRadius: size / 2 },\n tone === 'filled' && styles.iconButtonFilled,\n pressed && styles.pressed,\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n >\n <MaterialCommunityIcons name={icon} size={Math.round(size * 0.5)} color={theme.foreground} />\n </Pressable>\n );\n}\n\n/** The one main action on a surface: lime, dark ink. `secondary` is the quiet neutral twin. */\nexport function ActionButton({\n label,\n icon,\n onPress,\n variant = 'primary',\n disabled,\n style,\n}: {\n label: string;\n icon?: IconName;\n onPress: () => void;\n variant?: 'primary' | 'secondary';\n disabled?: boolean;\n style?: StyleProp<ViewStyle>;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n const primary = variant === 'primary';\n const ink = primary ? theme.primaryForeground : theme.foreground;\n return (\n <Pressable\n onPress={onPress}\n disabled={disabled}\n style={({ pressed }) => [\n styles.action,\n primary ? styles.actionPrimary : styles.actionSecondary,\n disabled && styles.disabled,\n pressed && !disabled && styles.pressed,\n style,\n ]}\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: Boolean(disabled) }}\n >\n {icon ? <MaterialCommunityIcons name={icon} size={18} color={ink} /> : null}\n <Text style={[styles.actionLabel, { color: ink }]}>{label}</Text>\n </Pressable>\n );\n}\n\n/**\n * A loading block that breathes (opacity 0.45 to 1, 900ms each way) in place\n * of the content it stands for. Absolute-fills its parent unless given a size.\n */\nexport function Skeleton({ style, radius = 0 }: { style?: StyleProp<ViewStyle>; radius?: number }) {\n const theme = useCanvasTheme();\n const pulse = useRef(new Animated.Value(0.45)).current;\n useEffect(() => {\n const loop = Animated.loop(\n Animated.sequence([\n Animated.timing(pulse, {\n toValue: 1,\n duration: 900,\n easing: Easing.out(Easing.quad),\n useNativeDriver: true,\n }),\n Animated.timing(pulse, {\n toValue: 0.45,\n duration: 900,\n easing: Easing.in(Easing.quad),\n useNativeDriver: true,\n }),\n ]),\n );\n loop.start();\n return () => loop.stop();\n }, [pulse]);\n return (\n <Animated.View\n pointerEvents=\"none\"\n style={[\n style ?? StyleSheet.absoluteFillObject,\n { borderRadius: radius, backgroundColor: theme.isDark ? '#262626' : '#e7e7ea', opacity: pulse },\n ]}\n />\n );\n}\n\n/**\n * Soft cover washes for media that has no picture to show (a video whose frame\n * is not in, a link that will not load). Picked by a stable hash of `seed`, so\n * the same board always wears the same colour.\n */\nconst COVER_WASHES: Array<{ light: [string, string]; dark: [string, string] }> = [\n { light: ['#fde7d9', '#c2410c'], dark: ['#3a2418', '#fdba74'] },\n { light: ['#e0ecff', '#1d4ed8'], dark: ['#1a2540', '#93c5fd'] },\n { light: ['#e6f6ec', '#047857'], dark: ['#15291f', '#6ee7b7'] },\n { light: ['#efe7ff', '#6d28d9'], dark: ['#261d3d', '#c4b5fd'] },\n { light: ['#fde4ec', '#be185d'], dark: ['#3a1a27', '#f9a8d4'] },\n { light: ['#fdf3d4', '#a16207'], dark: ['#33290f', '#fcd34d'] },\n];\n\nexport function coverWash(seed: string, isDark: boolean): { wash: string; ink: string } {\n let h = 0;\n for (let i = 0; i < seed.length; i += 1) h = (h * 31 + seed.charCodeAt(i)) | 0;\n const pick = COVER_WASHES[Math.abs(h) % COVER_WASHES.length];\n const [wash, ink] = isDark ? pick.dark : pick.light;\n return { wash, ink };\n}\n\n/** A tinted cover with a frosted icon badge: the \"no picture\" state that still looks intended. */\nexport function CoverPlaceholder({ seed, icon, label }: { seed: string; icon: IconName; label?: string }) {\n const theme = useCanvasTheme();\n const { wash, ink } = coverWash(seed, theme.isDark);\n return (\n <View style={[StyleSheet.absoluteFillObject, placeholderStyles.wrap, { backgroundColor: wash }]}>\n <View\n style={[\n placeholderStyles.badge,\n { backgroundColor: theme.isDark ? 'rgba(255,255,255,0.08)' : 'rgba(255,255,255,0.7)' },\n ]}\n >\n <MaterialCommunityIcons name={icon} size={26} color={ink} />\n </View>\n {label ? <Text style={[placeholderStyles.label, { color: ink }]}>{label}</Text> : null}\n </View>\n );\n}\n\nconst placeholderStyles = StyleSheet.create({\n wrap: { alignItems: 'center', justifyContent: 'center', gap: SPACE.sm },\n badge: { width: 56, height: 56, borderRadius: 28, alignItems: 'center', justifyContent: 'center' },\n label: { ...TYPE.caption, fontWeight: '600' },\n});\n\n/** Press feedback every canvas pressable shares. */\nexport const pressedStyle = (pressed: boolean): ViewStyle | null =>\n pressed ? { opacity: 0.72, transform: [{ scale: 0.98 }] } : null;\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n sectionHeader: {\n flexDirection: 'row',\n alignItems: 'baseline',\n justifyContent: 'space-between',\n gap: SPACE.md,\n marginBottom: SPACE.md,\n },\n sectionTitleRow: { flexDirection: 'row', alignItems: 'baseline', gap: SPACE.sm, flexShrink: 1 },\n sectionTitle: { ...TYPE.title, color: theme.foreground },\n sectionDetail: { ...TYPE.caption, color: theme.mutedForeground },\n sectionAction: { ...TYPE.label, color: theme.mutedForeground },\n segmentScroll: { flexGrow: 0, alignSelf: 'flex-start' },\n segmentTrack: {\n flexDirection: 'row',\n padding: 3,\n gap: 2,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.card,\n },\n segment: {\n minHeight: 34,\n paddingHorizontal: SPACE.lg,\n borderRadius: RADIUS.pill,\n alignItems: 'center',\n justifyContent: 'center',\n },\n segmentOn: {\n backgroundColor: theme.isDark ? theme.secondary : theme.surface,\n shadowColor: '#000',\n shadowOpacity: theme.isDark ? 0 : 0.08,\n shadowRadius: 4,\n shadowOffset: { width: 0, height: 1 },\n elevation: theme.isDark ? 0 : 1,\n },\n segmentLabel: { ...TYPE.label, color: theme.mutedForeground },\n segmentLabelOn: { color: theme.foreground },\n iconButton: { alignItems: 'center', justifyContent: 'center' },\n iconButtonFilled: { backgroundColor: theme.card },\n action: {\n minHeight: HIT,\n paddingHorizontal: SPACE.lg + 2,\n borderRadius: RADIUS.pill,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: SPACE.sm,\n },\n actionPrimary: { backgroundColor: theme.primary },\n actionSecondary: { backgroundColor: theme.card },\n actionLabel: { ...TYPE.label, fontSize: 15 },\n disabled: { opacity: 0.4 },\n pressed: { opacity: 0.72, transform: [{ scale: 0.98 }] },\n }),\n);\n"],"names":["Pressable","RNPressable"],"mappings":"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"}
@@ -29,6 +29,10 @@ const studio = (s) => ({
29
29
  type: "studio",
30
30
  studio: s
31
31
  });
32
+ const web = (create) => ({
33
+ type: "web",
34
+ create
35
+ });
32
36
  const CREATE_GROUPS = [{
33
37
  id: "generate",
34
38
  title: "Generate with AI",
@@ -144,13 +148,13 @@ const CREATE_GROUPS = [{
144
148
  },
145
149
  tiles: [
146
150
  // Native's design studio has four kinds (design, t-shirt, postcard, carousel);
147
- // each web category maps to the nearest one or stays hidden.
151
+ // each web category maps to the nearest one or opens on the web canvas.
148
152
  {
149
153
  id: "presentation",
150
154
  label: "Presentation",
151
155
  hint: "Blank slides, 16:9",
152
156
  icon: "presentation",
153
- action: null
157
+ action: web("presentation")
154
158
  },
155
159
  {
156
160
  id: "social",
@@ -178,7 +182,7 @@ const CREATE_GROUPS = [{
178
182
  label: "Business card",
179
183
  hint: "Two sides, print-ready",
180
184
  icon: "card-account-details-outline",
181
- action: null
185
+ action: web("business-card")
182
186
  },
183
187
  {
184
188
  id: "logo",
@@ -192,35 +196,36 @@ const CREATE_GROUPS = [{
192
196
  label: "Banner",
193
197
  hint: "Printed, web, social",
194
198
  icon: "flag-outline",
195
- action: null
199
+ action: web("banner")
196
200
  },
197
201
  {
198
202
  id: "brochure",
199
203
  label: "Brochure",
200
204
  hint: "Folded, inside and out",
201
205
  icon: "book-open-outline",
202
- action: null
206
+ action: web("brochure")
203
207
  },
204
208
  {
205
209
  id: "branding",
206
210
  label: "Branding",
207
211
  hint: "Letterheads, envelopes",
208
212
  icon: "email-outline",
209
- action: null
213
+ action: web("branding")
210
214
  },
211
215
  {
212
216
  id: "doc",
213
217
  label: "Document",
214
218
  hint: "Write, format, export",
215
219
  icon: "file-document-outline",
216
- action: null
220
+ // Opens the native docs editor (`isDocsCreate`), not the design studio.
221
+ action: web("doc")
217
222
  },
218
223
  {
219
224
  id: "custom",
220
225
  label: "Custom size",
221
226
  hint: "Any width and height",
222
227
  icon: "resize",
223
- action: null
228
+ action: web("custom")
224
229
  },
225
230
  // Native-only kind (no web tile): the apparel print the studio already ships.
226
231
  {
@@ -232,6 +237,9 @@ const CREATE_GROUPS = [{
232
237
  }
233
238
  ]
234
239
  }];
240
+ function isDocsCreate(action) {
241
+ return (action == null ? void 0 : action.type) === "web" && action.create.trim().toLowerCase() === "doc";
242
+ }
235
243
  function createActionFor(id) {
236
244
  const key = id.trim().toLowerCase();
237
245
  for (const group of CREATE_GROUPS) {
@@ -244,4 +252,4 @@ function visibleCreateGroups(canRun = () => true) {
244
252
  return CREATE_GROUPS.map((group) => __spreadProps(__spreadValues({}, group), {
245
253
  tiles: group.tiles.filter((tile) => tile.action !== null && canRun(tile.action))
246
254
  })).filter((group) => group.tiles.length > 0);
247
- }export{CREATE_GROUPS,createActionFor,visibleCreateGroups};//# sourceMappingURL=createTiles.js.map
255
+ }export{CREATE_GROUPS,createActionFor,isDocsCreate,visibleCreateGroups};//# sourceMappingURL=createTiles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createTiles.js","sources":["../../../src/features/canvas/createTiles.ts"],"sourcesContent":["/**\n * Screen one's grouped Create rows - native twin of canvas-surface\n * `components/home/CreateStrip.tsx` (GROUPS + createActionFor).\n *\n * The tile ids are the web's (and the Templates surface's `TEMPLATE_TOOLS`),\n * so a `createTile` deep link names the same tool on both. A tile whose studio\n * native lacks (banner, brochure, docs...) keeps its id with a null action:\n * `createActionFor` answers null for it and the home grid hides it.\n *\n * Pure data: no RN imports, so it runs under jest as-is.\n */\nimport type { DesignKind } from '../design/designCore';\n\nexport type CreateGroupId = 'generate' | 'edit' | 'design';\n\n/** Generator lanes a tile opens (web GeneratorMode; slides/clips route to their native screens). */\nexport type CreateGenerateMode = 'image' | 'video' | 'audio' | 'promo' | 'clips' | 'slides';\n\nexport type CreateStudio =\n | 'video'\n | 'ai-cut'\n | 'image'\n | 'audio'\n | 'frames'\n | 'influencer'\n | 'set'\n | 'moodboard'\n | 'record';\n\nexport type CreateAction =\n | { type: 'design'; kind: DesignKind }\n | { type: 'generate'; mode: CreateGenerateMode }\n | { type: 'studio'; studio: CreateStudio };\n\nexport interface CreateTile {\n id: string;\n label: string;\n hint: string;\n /** MaterialCommunityIcons glyph. */\n icon: string;\n /** Null: the web tile has no native studio yet - hidden on home, ignored by links. */\n action: CreateAction | null;\n}\n\nexport interface CreateGroup {\n id: CreateGroupId;\n title: string;\n /** Icon well + heading accent (web's red / violet / emerald themes). */\n accent: { fg: string; bg: string };\n tiles: CreateTile[];\n}\n\nconst design = (kind: DesignKind): CreateAction => ({ type: 'design', kind });\nconst generate = (mode: CreateGenerateMode): CreateAction => ({ type: 'generate', mode });\nconst studio = (s: CreateStudio): CreateAction => ({ type: 'studio', studio: s });\n\nexport const CREATE_GROUPS: readonly CreateGroup[] = [\n {\n id: 'generate',\n title: 'Generate with AI',\n accent: { fg: '#b91c1c', bg: 'rgba(239,68,68,0.10)' },\n tiles: [\n {\n id: 'image',\n label: 'Image',\n hint: 'From a prompt or reference',\n icon: 'image-outline',\n action: generate('image'),\n },\n {\n id: 'video',\n label: 'Video',\n hint: 'From text or an image',\n icon: 'video-outline',\n action: generate('video'),\n },\n {\n id: 'audio',\n label: 'Music & voice',\n hint: 'Music, speech, sound',\n icon: 'microphone-outline',\n action: generate('audio'),\n },\n {\n id: 'slides',\n label: 'Slides',\n hint: 'A presentation from a topic',\n icon: 'view-grid-outline',\n action: generate('slides'),\n },\n {\n id: 'clips',\n label: 'Short clips',\n hint: 'Turn long videos into shorts',\n icon: 'movie-open-outline',\n action: generate('clips'),\n },\n {\n id: 'promo',\n label: 'Product video',\n hint: 'Promote a product with AI',\n icon: 'bullhorn-outline',\n action: generate('promo'),\n },\n ],\n },\n {\n id: 'edit',\n title: 'Edit & produce',\n accent: { fg: '#6d28d9', bg: 'rgba(139,92,246,0.10)' },\n tiles: [\n {\n id: 'video-editor',\n label: 'Video editor',\n hint: 'Timeline, captions, music',\n icon: 'filmstrip',\n action: studio('video'),\n },\n {\n id: 'ai-cut',\n label: 'AI cut',\n hint: 'Edit footage with a script',\n icon: 'movie-open-edit-outline',\n action: studio('ai-cut'),\n },\n {\n id: 'photo-editor',\n label: 'Photo editor',\n hint: 'Crop, filters, background',\n icon: 'tune-variant',\n action: studio('image'),\n },\n {\n id: 'audio-editor',\n label: 'Audio editor',\n hint: 'Trim, fade, mix',\n icon: 'waveform',\n action: studio('audio'),\n },\n {\n id: 'frames',\n label: 'Extract frames',\n hint: 'Save stills from a video',\n icon: 'content-cut',\n action: studio('frames'),\n },\n {\n id: 'influencer',\n label: 'AI presenter',\n hint: 'Create an on-camera host',\n icon: 'account-outline',\n action: studio('influencer'),\n },\n {\n id: '3d-set',\n label: '3D scene',\n hint: 'Arrange a scene, then render',\n icon: 'cube-outline',\n action: studio('set'),\n },\n {\n id: 'moodboard',\n label: 'Mood board',\n hint: 'Build a palette from references',\n icon: 'palette-outline',\n action: studio('moodboard'),\n },\n {\n id: 'record',\n label: 'Screen recording',\n hint: 'Record and polish your screen',\n icon: 'record-circle-outline',\n action: studio('record'),\n },\n ],\n },\n {\n id: 'design',\n title: 'Design & write',\n accent: { fg: '#047857', bg: 'rgba(16,185,129,0.10)' },\n tiles: [\n // Native's design studio has four kinds (design, t-shirt, postcard, carousel);\n // each web category maps to the nearest one or stays hidden.\n {\n id: 'presentation',\n label: 'Presentation',\n hint: 'Blank slides, 16:9',\n icon: 'presentation',\n action: null,\n },\n {\n id: 'social',\n label: 'Social post',\n hint: 'Instagram, LinkedIn, X',\n icon: 'view-grid-outline',\n action: design('design'),\n },\n {\n id: 'carousel',\n label: 'Carousel',\n hint: 'Swipeable posts',\n icon: 'view-carousel-outline',\n action: design('carousel'),\n },\n {\n id: 'flyer',\n label: 'Flyer',\n hint: 'Postcards and print',\n icon: 'bullhorn-outline',\n action: design('postcard'),\n },\n {\n id: 'business-card',\n label: 'Business card',\n hint: 'Two sides, print-ready',\n icon: 'card-account-details-outline',\n action: null,\n },\n { id: 'logo', label: 'Logo', hint: 'A square brand mark', icon: 'shape-outline', action: design('design') },\n { id: 'banner', label: 'Banner', hint: 'Printed, web, social', icon: 'flag-outline', action: null },\n {\n id: 'brochure',\n label: 'Brochure',\n hint: 'Folded, inside and out',\n icon: 'book-open-outline',\n action: null,\n },\n { id: 'branding', label: 'Branding', hint: 'Letterheads, envelopes', icon: 'email-outline', action: null },\n {\n id: 'doc',\n label: 'Document',\n hint: 'Write, format, export',\n icon: 'file-document-outline',\n action: null,\n },\n { id: 'custom', label: 'Custom size', hint: 'Any width and height', icon: 'resize', action: null },\n // Native-only kind (no web tile): the apparel print the studio already ships.\n {\n id: 'tshirt',\n label: 'T-shirt',\n hint: 'Front and back print',\n icon: 'tshirt-crew-outline',\n action: design('tshirt'),\n },\n ],\n },\n];\n\n/**\n * The action a Create tile runs, by the tile's id (`video-editor`, `clips`,\n * `logo`), or null for an id no tile has - or a tile native cannot run yet.\n */\nexport function createActionFor(id: string): CreateAction | null {\n const key = id.trim().toLowerCase();\n for (const group of CREATE_GROUPS) {\n const tile = group.tiles.find((t) => t.id === key);\n if (tile) return tile.action;\n }\n return null;\n}\n\n/**\n * The groups home shows: tiles with an action this host can run. `canRun`\n * lets the experience drop tiles whose seam is missing (no media picker ->\n * no photo editor). Empty groups drop.\n */\nexport function visibleCreateGroups(\n canRun: (action: CreateAction) => boolean = () => true,\n): Array<CreateGroup & { tiles: Array<CreateTile & { action: CreateAction }> }> {\n return CREATE_GROUPS.map((group) => ({\n ...group,\n tiles: group.tiles.filter(\n (tile): tile is CreateTile & { action: CreateAction } => tile.action !== null && canRun(tile.action),\n ),\n })).filter((group) => group.tiles.length > 0);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createTiles.js","sources":["../../../src/features/canvas/createTiles.ts"],"sourcesContent":["/**\n * Screen one's grouped Create rows - native twin of canvas-surface\n * `components/home/CreateStrip.tsx` (GROUPS + createActionFor).\n *\n * The tile ids are the web's (and the Templates surface's `TEMPLATE_TOOLS`),\n * so a `createTile` deep link names the same tool on both. A `web` tile\n * (presentation, banner, brochure, docs...) keeps the web's `?create=` id and\n * opens the native design studio on it (`deepLinks.designEntryForCreate`).\n *\n * Pure data: no RN imports, so it runs under jest as-is.\n */\nimport type { DesignKind } from '../design/designCore';\n\nexport type CreateGroupId = 'generate' | 'edit' | 'design';\n\n/** Generator lanes a tile opens (web GeneratorMode; slides/clips route to their native screens). */\nexport type CreateGenerateMode = 'image' | 'video' | 'audio' | 'promo' | 'clips' | 'slides';\n\nexport type CreateStudio =\n | 'video'\n | 'ai-cut'\n | 'image'\n | 'audio'\n | 'frames'\n | 'influencer'\n | 'set'\n | 'moodboard'\n | 'record';\n\nexport type CreateAction =\n | { type: 'design'; kind: DesignKind }\n | { type: 'generate'; mode: CreateGenerateMode }\n | { type: 'studio'; studio: CreateStudio }\n /** A web `?create=<create>` id: the native design studio opens on it. */\n | { type: 'web'; create: string };\n\nexport interface CreateTile {\n id: string;\n label: string;\n hint: string;\n /** MaterialCommunityIcons glyph. */\n icon: string;\n /** Null: no tile action at all - hidden on home, ignored by links. */\n action: CreateAction | null;\n}\n\nexport interface CreateGroup {\n id: CreateGroupId;\n title: string;\n /** Icon well + heading accent (web's red / violet / emerald themes). */\n accent: { fg: string; bg: string };\n tiles: CreateTile[];\n}\n\nconst design = (kind: DesignKind): CreateAction => ({ type: 'design', kind });\nconst generate = (mode: CreateGenerateMode): CreateAction => ({ type: 'generate', mode });\nconst studio = (s: CreateStudio): CreateAction => ({ type: 'studio', studio: s });\nconst web = (create: string): CreateAction => ({ type: 'web', create });\n\nexport const CREATE_GROUPS: readonly CreateGroup[] = [\n {\n id: 'generate',\n title: 'Generate with AI',\n accent: { fg: '#b91c1c', bg: 'rgba(239,68,68,0.10)' },\n tiles: [\n {\n id: 'image',\n label: 'Image',\n hint: 'From a prompt or reference',\n icon: 'image-outline',\n action: generate('image'),\n },\n {\n id: 'video',\n label: 'Video',\n hint: 'From text or an image',\n icon: 'video-outline',\n action: generate('video'),\n },\n {\n id: 'audio',\n label: 'Music & voice',\n hint: 'Music, speech, sound',\n icon: 'microphone-outline',\n action: generate('audio'),\n },\n {\n id: 'slides',\n label: 'Slides',\n hint: 'A presentation from a topic',\n icon: 'view-grid-outline',\n action: generate('slides'),\n },\n {\n id: 'clips',\n label: 'Short clips',\n hint: 'Turn long videos into shorts',\n icon: 'movie-open-outline',\n action: generate('clips'),\n },\n {\n id: 'promo',\n label: 'Product video',\n hint: 'Promote a product with AI',\n icon: 'bullhorn-outline',\n action: generate('promo'),\n },\n ],\n },\n {\n id: 'edit',\n title: 'Edit & produce',\n accent: { fg: '#6d28d9', bg: 'rgba(139,92,246,0.10)' },\n tiles: [\n {\n id: 'video-editor',\n label: 'Video editor',\n hint: 'Timeline, captions, music',\n icon: 'filmstrip',\n action: studio('video'),\n },\n {\n id: 'ai-cut',\n label: 'AI cut',\n hint: 'Edit footage with a script',\n icon: 'movie-open-edit-outline',\n action: studio('ai-cut'),\n },\n {\n id: 'photo-editor',\n label: 'Photo editor',\n hint: 'Crop, filters, background',\n icon: 'tune-variant',\n action: studio('image'),\n },\n {\n id: 'audio-editor',\n label: 'Audio editor',\n hint: 'Trim, fade, mix',\n icon: 'waveform',\n action: studio('audio'),\n },\n {\n id: 'frames',\n label: 'Extract frames',\n hint: 'Save stills from a video',\n icon: 'content-cut',\n action: studio('frames'),\n },\n {\n id: 'influencer',\n label: 'AI presenter',\n hint: 'Create an on-camera host',\n icon: 'account-outline',\n action: studio('influencer'),\n },\n {\n id: '3d-set',\n label: '3D scene',\n hint: 'Arrange a scene, then render',\n icon: 'cube-outline',\n action: studio('set'),\n },\n {\n id: 'moodboard',\n label: 'Mood board',\n hint: 'Build a palette from references',\n icon: 'palette-outline',\n action: studio('moodboard'),\n },\n {\n id: 'record',\n label: 'Screen recording',\n hint: 'Record and polish your screen',\n icon: 'record-circle-outline',\n action: studio('record'),\n },\n ],\n },\n {\n id: 'design',\n title: 'Design & write',\n accent: { fg: '#047857', bg: 'rgba(16,185,129,0.10)' },\n tiles: [\n // Native's design studio has four kinds (design, t-shirt, postcard, carousel);\n // each web category maps to the nearest one or opens on the web canvas.\n {\n id: 'presentation',\n label: 'Presentation',\n hint: 'Blank slides, 16:9',\n icon: 'presentation',\n action: web('presentation'),\n },\n {\n id: 'social',\n label: 'Social post',\n hint: 'Instagram, LinkedIn, X',\n icon: 'view-grid-outline',\n action: design('design'),\n },\n {\n id: 'carousel',\n label: 'Carousel',\n hint: 'Swipeable posts',\n icon: 'view-carousel-outline',\n action: design('carousel'),\n },\n {\n id: 'flyer',\n label: 'Flyer',\n hint: 'Postcards and print',\n icon: 'bullhorn-outline',\n action: design('postcard'),\n },\n {\n id: 'business-card',\n label: 'Business card',\n hint: 'Two sides, print-ready',\n icon: 'card-account-details-outline',\n action: web('business-card'),\n },\n { id: 'logo', label: 'Logo', hint: 'A square brand mark', icon: 'shape-outline', action: design('design') },\n {\n id: 'banner',\n label: 'Banner',\n hint: 'Printed, web, social',\n icon: 'flag-outline',\n action: web('banner'),\n },\n {\n id: 'brochure',\n label: 'Brochure',\n hint: 'Folded, inside and out',\n icon: 'book-open-outline',\n action: web('brochure'),\n },\n {\n id: 'branding',\n label: 'Branding',\n hint: 'Letterheads, envelopes',\n icon: 'email-outline',\n action: web('branding'),\n },\n {\n id: 'doc',\n label: 'Document',\n hint: 'Write, format, export',\n icon: 'file-document-outline',\n // Opens the native docs editor (`isDocsCreate`), not the design studio.\n action: web('doc'),\n },\n { id: 'custom', label: 'Custom size', hint: 'Any width and height', icon: 'resize', action: web('custom') },\n // Native-only kind (no web tile): the apparel print the studio already ships.\n {\n id: 'tshirt',\n label: 'T-shirt',\n hint: 'Front and back print',\n icon: 'tshirt-crew-outline',\n action: design('tshirt'),\n },\n ],\n },\n];\n\n/**\n * The action a Create tile runs, by the tile's id (`video-editor`, `clips`,\n * `logo`), or null for an id no tile has. A tile native cannot build answers\n * its web action (`{ type: 'web', create: 'brochure' }`).\n */\n/**\n * Does this Create action open the native docs editor? The `doc` tile keeps\n * web's `?create=doc` id (so links name the same tool) but writes a\n * rich-text doc, not an A4 design page.\n */\nexport function isDocsCreate(action: CreateAction | null | undefined): boolean {\n return action?.type === 'web' && action.create.trim().toLowerCase() === 'doc';\n}\n\nexport function createActionFor(id: string): CreateAction | null {\n const key = id.trim().toLowerCase();\n for (const group of CREATE_GROUPS) {\n const tile = group.tiles.find((t) => t.id === key);\n if (tile) return tile.action;\n }\n return null;\n}\n\n/**\n * The groups home shows: tiles with an action this host can run. `canRun`\n * lets the experience drop tiles whose seam is missing (no media picker ->\n * no photo editor). Empty groups drop.\n */\nexport function visibleCreateGroups(\n canRun: (action: CreateAction) => boolean = () => true,\n): Array<CreateGroup & { tiles: Array<CreateTile & { action: CreateAction }> }> {\n return CREATE_GROUPS.map((group) => ({\n ...group,\n tiles: group.tiles.filter(\n (tile): tile is CreateTile & { action: CreateAction } => tile.action !== null && canRun(tile.action),\n ),\n })).filter((group) => group.tiles.length > 0);\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import {createActionFor}from'./createTiles.js';var __defProp = Object.defineProperty;
1
+ import {designCategoryFor}from'./designCategories.js';import {createActionFor}from'./createTiles.js';var __defProp = Object.defineProperty;
2
2
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
3
  var __hasOwnProp = Object.prototype.hasOwnProperty;
4
4
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
@@ -70,14 +70,44 @@ function parseMediaLink(raw) {
70
70
  } : {});
71
71
  }
72
72
  const DESIGN_ID_RE = /^[0-9A-Za-z][0-9A-Za-z:_-]{3,127}$/;
73
+ const TEMPLATE_ID_RE = /^[0-9A-Za-z][0-9A-Za-z_-]{2,159}$/;
74
+ function designTemplateIdOf(raw) {
75
+ if (typeof raw !== "string") return null;
76
+ const id = raw.trim();
77
+ return TEMPLATE_ID_RE.test(id) ? id : null;
78
+ }
79
+ const CREATE_SIZE = {
80
+ doc: "a4"
81
+ };
82
+ function designEntryForCreate(create) {
83
+ const id = create.trim().toLowerCase();
84
+ if (CREATE_SIZE[id]) return {
85
+ sizeId: CREATE_SIZE[id]
86
+ };
87
+ if (designCategoryFor(id)) return {
88
+ categoryId: id
89
+ };
90
+ return {
91
+ kind: "design"
92
+ };
93
+ }
73
94
  function parseDesignLink(raw) {
74
95
  for (const value of [raw.designId, raw.artifactId]) {
75
- if (typeof value === "string" && DESIGN_ID_RE.test(value.trim())) return {
76
- channelId: value.trim()
77
- };
96
+ if (typeof value === "string" && DESIGN_ID_RE.test(value.trim()) && !DOC_ID_RE.test(value.trim())) {
97
+ return {
98
+ channelId: value.trim()
99
+ };
100
+ }
78
101
  }
79
102
  if (typeof raw.designTemplateId === "string" && raw.designTemplateId.trim()) return {
80
103
  kind: "design"
81
104
  };
82
105
  return null;
83
- }export{mediaKindFromPath,parseCreateTileLink,parseDesignLink,parseMediaLink};//# sourceMappingURL=deepLinks.js.map
106
+ }
107
+ const DOC_ID_RE = /^doc:[0-9A-Za-z-]{8,}$/;
108
+ function parseDocLink(raw) {
109
+ for (const value of [raw.artifactId, raw.designId]) {
110
+ if (typeof value === "string" && DOC_ID_RE.test(value.trim())) return value.trim();
111
+ }
112
+ return null;
113
+ }export{designEntryForCreate,designTemplateIdOf,mediaKindFromPath,parseCreateTileLink,parseDesignLink,parseDocLink,parseMediaLink};//# sourceMappingURL=deepLinks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deepLinks.js","sources":["../../../src/features/canvas/deepLinks.ts"],"sourcesContent":["/**\n * Deep links into the canvas - native twins of canvas-surface\n * `utils/createDeepLink.ts`, `utils/mediaDeepLink.ts` and the `?design=` /\n * `?artifact=` openings in CanvasPage. On web they arrive as query params; on\n * native they arrive as CanvasExperience props (route params from the host).\n * Each runs once on mount; every value is someone else's input, so nothing is\n * fetched or opened until it passes.\n *\n * Pure: no `URL` (RN's polyfill throws on most getters), no RN imports.\n */\nimport type { DesignKind } from '../design/designCore';\nimport { createActionFor, type CreateAction } from './createTiles';\n\n/** The Create action a `createTile` link names, or null (unknown id, hidden tile, junk). */\nexport function parseCreateTileLink(raw: unknown): CreateAction | null {\n if (typeof raw !== 'string') return null;\n const id = raw.trim().toLowerCase();\n return /^[a-z0-9][a-z0-9-]{0,39}$/.test(id) ? createActionFor(id) : null;\n}\n\nexport type MediaLinkKind = 'image' | 'video';\n\nexport interface MediaLink {\n src: string;\n kind: MediaLinkKind;\n /** Display name for the board item; absent when the link carried none. */\n name?: string;\n /** The file's own name off the URL's path. */\n fileName?: string;\n}\n\n/** Longer than any signed storage URL; past it the \"URL\" is not one a surface wrote. */\nconst MAX_URL_LENGTH = 8192;\nconst MAX_NAME_LENGTH = 120;\nconst IMAGE_EXTENSION = /\\.(png|jpe?g|gif|webp|avif|bmp)$/i;\nconst VIDEO_EXTENSION = /\\.(mp4|m4v|mov|webm)$/i;\n/** scheme://authority/path?query#hash with no whitespace anywhere. */\nconst HTTP_URL = /^(https?):\\/\\/([^/?#\\s]+)([^?#\\s]*)(\\?[^#\\s]*)?(#\\S*)?$/i;\n\n/** Control characters and runs of whitespace fold to one space; capped; blank is none. */\nfunction tidyLabel(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const label = value\n // eslint-disable-next-line no-control-regex\n .replace(/[\\u0000-\\u001f\\u007f-\\u009f\\s]+/g, ' ')\n .trim()\n .slice(0, MAX_NAME_LENGTH)\n .trim();\n return label || undefined;\n}\n\n/** The kind a path's extension names, or null. */\nexport function mediaKindFromPath(path: string): MediaLinkKind | null {\n if (IMAGE_EXTENSION.test(path)) return 'image';\n if (VIDEO_EXTENSION.test(path)) return 'video';\n return null;\n}\n\n/**\n * A `media` link that passes web's rules, or null: an absolute http(s) URL\n * without credentials, and a kind the editors take. A given kind decides; only\n * a missing one is read off the extension.\n */\nexport function parseMediaLink(raw: unknown): MediaLink | null {\n if (!raw || typeof raw !== 'object') return null;\n const { src, kind, name } = raw as { src?: unknown; kind?: unknown; name?: unknown };\n if (typeof src !== 'string') return null;\n const href = src.trim();\n if (!href || href.length > MAX_URL_LENGTH) return null;\n const match = HTTP_URL.exec(href);\n if (!match) return null;\n const authority = match[2];\n // A surface never hands over a URL with credentials in it.\n if (authority.includes('@')) return null;\n const path = match[3] || '/';\n const asked = typeof kind === 'string' ? kind.trim().toLowerCase() : '';\n const resolved: MediaLinkKind | null = asked\n ? asked === 'image' || asked === 'video'\n ? asked\n : null\n : mediaKindFromPath(path);\n if (!resolved) return null;\n const label = tidyLabel(name);\n let fileName: string | undefined;\n const segment = path.slice(path.lastIndexOf('/') + 1);\n try {\n fileName = tidyLabel(decodeURIComponent(segment));\n } catch {\n fileName = tidyLabel(segment);\n }\n return { src: href, kind: resolved, ...(label ? { name: label } : {}), ...(fileName ? { fileName } : {}) };\n}\n\n/** Ids the design index or web Studio mint: no spaces, no path tricks. */\nconst DESIGN_ID_RE = /^[0-9A-Za-z][0-9A-Za-z:_-]{3,127}$/;\n\nexport type DesignLinkEntry = { channelId: string } | { kind: DesignKind };\n\n/**\n * Where a design link opens the native studio: a saved design by id\n * (`designId`, or a chat card's `artifactId`), else a template link opens the\n * studio on a blank design (native has no design template catalog yet), else\n * null. DesignExperience falls back to its own list when the id is not one of\n * the person's designs, so a stale or foreign id lands in the studio, not on\n * someone else's work.\n */\nexport function parseDesignLink(raw: {\n designId?: unknown;\n designTemplateId?: unknown;\n artifactId?: unknown;\n}): DesignLinkEntry | null {\n for (const value of [raw.designId, raw.artifactId]) {\n if (typeof value === 'string' && DESIGN_ID_RE.test(value.trim())) return { channelId: value.trim() };\n }\n if (typeof raw.designTemplateId === 'string' && raw.designTemplateId.trim()) return { kind: 'design' };\n return null;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deepLinks.js","sources":["../../../src/features/canvas/deepLinks.ts"],"sourcesContent":["/**\n * Deep links into the canvas - native twins of canvas-surface\n * `utils/createDeepLink.ts`, `utils/mediaDeepLink.ts` and the `?design=` /\n * `?artifact=` openings in CanvasPage. On web they arrive as query params; on\n * native they arrive as CanvasExperience props (route params from the host).\n * Each runs once on mount; every value is someone else's input, so nothing is\n * fetched or opened until it passes.\n *\n * Pure: no `URL` (RN's polyfill throws on most getters), no RN imports.\n */\nimport type { DesignKind } from '../design/designCore';\nimport { designCategoryFor } from './designCategories';\nimport { createActionFor, type CreateAction } from './createTiles';\n\n/** The Create action a `createTile` link names, or null (unknown id, hidden tile, junk). */\nexport function parseCreateTileLink(raw: unknown): CreateAction | null {\n if (typeof raw !== 'string') return null;\n const id = raw.trim().toLowerCase();\n return /^[a-z0-9][a-z0-9-]{0,39}$/.test(id) ? createActionFor(id) : null;\n}\n\nexport type MediaLinkKind = 'image' | 'video';\n\nexport interface MediaLink {\n src: string;\n kind: MediaLinkKind;\n /** Display name for the board item; absent when the link carried none. */\n name?: string;\n /** The file's own name off the URL's path. */\n fileName?: string;\n}\n\n/** Longer than any signed storage URL; past it the \"URL\" is not one a surface wrote. */\nconst MAX_URL_LENGTH = 8192;\nconst MAX_NAME_LENGTH = 120;\nconst IMAGE_EXTENSION = /\\.(png|jpe?g|gif|webp|avif|bmp)$/i;\nconst VIDEO_EXTENSION = /\\.(mp4|m4v|mov|webm)$/i;\n/** scheme://authority/path?query#hash with no whitespace anywhere. */\nconst HTTP_URL = /^(https?):\\/\\/([^/?#\\s]+)([^?#\\s]*)(\\?[^#\\s]*)?(#\\S*)?$/i;\n\n/** Control characters and runs of whitespace fold to one space; capped; blank is none. */\nfunction tidyLabel(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const label = value\n // eslint-disable-next-line no-control-regex\n .replace(/[\\u0000-\\u001f\\u007f-\\u009f\\s]+/g, ' ')\n .trim()\n .slice(0, MAX_NAME_LENGTH)\n .trim();\n return label || undefined;\n}\n\n/** The kind a path's extension names, or null. */\nexport function mediaKindFromPath(path: string): MediaLinkKind | null {\n if (IMAGE_EXTENSION.test(path)) return 'image';\n if (VIDEO_EXTENSION.test(path)) return 'video';\n return null;\n}\n\n/**\n * A `media` link that passes web's rules, or null: an absolute http(s) URL\n * without credentials, and a kind the editors take. A given kind decides; only\n * a missing one is read off the extension.\n */\nexport function parseMediaLink(raw: unknown): MediaLink | null {\n if (!raw || typeof raw !== 'object') return null;\n const { src, kind, name } = raw as { src?: unknown; kind?: unknown; name?: unknown };\n if (typeof src !== 'string') return null;\n const href = src.trim();\n if (!href || href.length > MAX_URL_LENGTH) return null;\n const match = HTTP_URL.exec(href);\n if (!match) return null;\n const authority = match[2];\n // A surface never hands over a URL with credentials in it.\n if (authority.includes('@')) return null;\n const path = match[3] || '/';\n const asked = typeof kind === 'string' ? kind.trim().toLowerCase() : '';\n const resolved: MediaLinkKind | null = asked\n ? asked === 'image' || asked === 'video'\n ? asked\n : null\n : mediaKindFromPath(path);\n if (!resolved) return null;\n const label = tidyLabel(name);\n let fileName: string | undefined;\n const segment = path.slice(path.lastIndexOf('/') + 1);\n try {\n fileName = tidyLabel(decodeURIComponent(segment));\n } catch {\n fileName = tidyLabel(segment);\n }\n return { src: href, kind: resolved, ...(label ? { name: label } : {}), ...(fileName ? { fileName } : {}) };\n}\n\n/** Ids the design index or web Studio mint: no spaces, no path tricks. */\nconst DESIGN_ID_RE = /^[0-9A-Za-z][0-9A-Za-z:_-]{3,127}$/;\n\nexport type DesignLinkEntry = { channelId: string } | { kind: DesignKind };\n\n/** Template ids are catalog row names (`canvas-flyer-summer-sale-123`): no spaces, no path tricks. */\nconst TEMPLATE_ID_RE = /^[0-9A-Za-z][0-9A-Za-z_-]{2,159}$/;\n\n/**\n * The web canvas query a design template link opens (`design=<id>`), or null.\n * The native design studio cannot draw a catalog template's pages faithfully,\n * so a host with the web canvas seam opens the template there.\n */\nexport function designTemplateQuery(raw: unknown): string | null {\n if (typeof raw !== 'string') return null;\n const id = raw.trim();\n return TEMPLATE_ID_RE.test(id) ? `design=${encodeURIComponent(id)}` : null;\n}\n\n/** A template link's catalog id (`canvas-flyer-summer-sale-123`), or null. */\nexport function designTemplateIdOf(raw: unknown): string | null {\n if (typeof raw !== 'string') return null;\n const id = raw.trim();\n return TEMPLATE_ID_RE.test(id) ? id : null;\n}\n\n/** Tile ids whose blank is one size rather than a category (web `?create=`). */\nconst CREATE_SIZE: Readonly<Record<string, string>> = { doc: 'a4' };\n\n/**\n * Where a `web` Create tile (web `?create=<id>`) opens the native design studio:\n * its category's sizes and templates, a document as an A4 page, anything else\n * (custom size) the studio home.\n */\nexport function designEntryForCreate(create: string): { categoryId: string } | { sizeId: string } | { kind: 'design' } {\n const id = create.trim().toLowerCase();\n if (CREATE_SIZE[id]) return { sizeId: CREATE_SIZE[id] };\n if (designCategoryFor(id)) return { categoryId: id };\n return { kind: 'design' };\n}\n\n/**\n * Where a design link opens the native studio: a saved design by id\n * (`designId`, or a chat card's `artifactId`), else a template link opens the\n * studio on a blank design (the fallback when the host cannot open the web\n * canvas: see `designTemplateQuery`), else null. DesignExperience falls back to its own list when the id is not one of\n * the person's designs, so a stale or foreign id lands in the studio, not on\n * someone else's work.\n */\nexport function parseDesignLink(raw: {\n designId?: unknown;\n designTemplateId?: unknown;\n artifactId?: unknown;\n}): DesignLinkEntry | null {\n for (const value of [raw.designId, raw.artifactId]) {\n // A `doc:` id is a rich-text doc: `parseDocLink` opens it in the docs editor.\n if (typeof value === 'string' && DESIGN_ID_RE.test(value.trim()) && !DOC_ID_RE.test(value.trim())) {\n return { channelId: value.trim() };\n }\n }\n if (typeof raw.designTemplateId === 'string' && raw.designTemplateId.trim()) return { kind: 'design' };\n return null;\n}\n\n/** A web docs editor row id (`doc:<uuid>`). */\nconst DOC_ID_RE = /^doc:[0-9A-Za-z-]{8,}$/;\n\n/**\n * The saved doc a link opens (web `?artifact=doc:<uuid>`, a chat card's\n * `artifactId`, or `designId` carrying one), or null. The docs editor opens\n * it only when it is one of the person's own docs.\n */\nexport function parseDocLink(raw: { designId?: unknown; artifactId?: unknown }): string | null {\n for (const value of [raw.artifactId, raw.designId]) {\n if (typeof value === 'string' && DOC_ID_RE.test(value.trim())) return value.trim();\n }\n return null;\n}\n"],"names":[],"mappings":"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"}