@agent-native/core 0.85.6 → 0.86.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1069) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +130 -1
  3. package/corpus/core/README.md +0 -11
  4. package/corpus/core/docs/content/cloneable-saas.mdx +0 -1
  5. package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +0 -1
  6. package/corpus/core/docs/content/locales/ar-SA/plan-plugin.mdx +10 -9
  7. package/corpus/core/docs/content/locales/ar-SA/sharing.mdx +1 -2
  8. package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +2 -3
  9. package/corpus/core/docs/content/locales/ar-SA/template-plan.mdx +23 -7
  10. package/corpus/core/docs/content/locales/ar-SA/tracking.mdx +1 -1
  11. package/corpus/core/docs/content/locales/ar-SA/workspace-connections.mdx +11 -11
  12. package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +0 -1
  13. package/corpus/core/docs/content/locales/de-DE/plan-plugin.mdx +10 -9
  14. package/corpus/core/docs/content/locales/de-DE/sharing.mdx +1 -2
  15. package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +2 -3
  16. package/corpus/core/docs/content/locales/de-DE/template-plan.mdx +23 -7
  17. package/corpus/core/docs/content/locales/de-DE/tracking.mdx +1 -1
  18. package/corpus/core/docs/content/locales/de-DE/workspace-connections.mdx +1 -1
  19. package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +0 -1
  20. package/corpus/core/docs/content/locales/es-ES/plan-plugin.mdx +10 -9
  21. package/corpus/core/docs/content/locales/es-ES/sharing.mdx +1 -2
  22. package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +2 -3
  23. package/corpus/core/docs/content/locales/es-ES/template-plan.mdx +23 -7
  24. package/corpus/core/docs/content/locales/es-ES/tracking.mdx +1 -1
  25. package/corpus/core/docs/content/locales/es-ES/workspace-connections.mdx +1 -1
  26. package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +0 -1
  27. package/corpus/core/docs/content/locales/fr-FR/plan-plugin.mdx +10 -9
  28. package/corpus/core/docs/content/locales/fr-FR/sharing.mdx +1 -2
  29. package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +2 -3
  30. package/corpus/core/docs/content/locales/fr-FR/template-plan.mdx +23 -7
  31. package/corpus/core/docs/content/locales/fr-FR/tracking.mdx +1 -1
  32. package/corpus/core/docs/content/locales/fr-FR/workspace-connections.mdx +1 -1
  33. package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +0 -1
  34. package/corpus/core/docs/content/locales/hi-IN/plan-plugin.mdx +10 -9
  35. package/corpus/core/docs/content/locales/hi-IN/sharing.mdx +1 -2
  36. package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +2 -3
  37. package/corpus/core/docs/content/locales/hi-IN/template-plan.mdx +23 -7
  38. package/corpus/core/docs/content/locales/hi-IN/tracking.mdx +1 -1
  39. package/corpus/core/docs/content/locales/hi-IN/workspace-connections.mdx +1 -1
  40. package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +0 -1
  41. package/corpus/core/docs/content/locales/ja-JP/plan-plugin.mdx +10 -9
  42. package/corpus/core/docs/content/locales/ja-JP/sharing.mdx +1 -2
  43. package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +2 -3
  44. package/corpus/core/docs/content/locales/ja-JP/template-plan.mdx +23 -7
  45. package/corpus/core/docs/content/locales/ja-JP/tracking.mdx +1 -1
  46. package/corpus/core/docs/content/locales/ja-JP/workspace-connections.mdx +1 -1
  47. package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +0 -1
  48. package/corpus/core/docs/content/locales/ko-KR/plan-plugin.mdx +10 -9
  49. package/corpus/core/docs/content/locales/ko-KR/sharing.mdx +1 -2
  50. package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +2 -3
  51. package/corpus/core/docs/content/locales/ko-KR/template-plan.mdx +23 -7
  52. package/corpus/core/docs/content/locales/ko-KR/tracking.mdx +1 -1
  53. package/corpus/core/docs/content/locales/ko-KR/workspace-connections.mdx +1 -1
  54. package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +0 -1
  55. package/corpus/core/docs/content/locales/pt-BR/plan-plugin.mdx +10 -9
  56. package/corpus/core/docs/content/locales/pt-BR/sharing.mdx +1 -2
  57. package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +2 -3
  58. package/corpus/core/docs/content/locales/pt-BR/template-plan.mdx +23 -7
  59. package/corpus/core/docs/content/locales/pt-BR/tracking.mdx +1 -1
  60. package/corpus/core/docs/content/locales/pt-BR/workspace-connections.mdx +1 -1
  61. package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +0 -1
  62. package/corpus/core/docs/content/locales/zh-CN/plan-plugin.mdx +10 -9
  63. package/corpus/core/docs/content/locales/zh-CN/sharing.mdx +1 -2
  64. package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +2 -3
  65. package/corpus/core/docs/content/locales/zh-CN/template-plan.mdx +23 -7
  66. package/corpus/core/docs/content/locales/zh-CN/tracking.mdx +1 -1
  67. package/corpus/core/docs/content/locales/zh-CN/workspace-connections.mdx +1 -1
  68. package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +0 -1
  69. package/corpus/core/docs/content/locales/zh-TW/plan-plugin.mdx +10 -9
  70. package/corpus/core/docs/content/locales/zh-TW/sharing.mdx +1 -2
  71. package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +2 -3
  72. package/corpus/core/docs/content/locales/zh-TW/template-plan.mdx +23 -7
  73. package/corpus/core/docs/content/locales/zh-TW/tracking.mdx +1 -1
  74. package/corpus/core/docs/content/locales/zh-TW/workspace-connections.mdx +1 -1
  75. package/corpus/core/docs/content/plan-plugin.mdx +12 -11
  76. package/corpus/core/docs/content/sharing.mdx +1 -2
  77. package/corpus/core/docs/content/skills-guide.mdx +4 -3
  78. package/corpus/core/docs/content/template-plan.mdx +37 -6
  79. package/corpus/core/docs/content/tracking.mdx +1 -1
  80. package/corpus/core/docs/content/workspace-connections.mdx +1 -1
  81. package/corpus/core/package.json +6 -6
  82. package/corpus/core/src/agent/run-store.ts +1 -1
  83. package/corpus/core/src/chat-threads/store.ts +73 -11
  84. package/corpus/core/src/checkpoints/store.ts +13 -2
  85. package/corpus/core/src/cli/create.ts +3 -4
  86. package/corpus/core/src/cli/design-connect.ts +469 -9
  87. package/corpus/core/src/cli/index.ts +13 -0
  88. package/corpus/core/src/cli/plan-local.ts +281 -24
  89. package/corpus/core/src/cli/skills.ts +177 -21
  90. package/corpus/core/src/cli/templates-meta.ts +0 -13
  91. package/corpus/core/src/cli/visualize-repo.ts +715 -0
  92. package/corpus/core/src/client/AssistantChat.tsx +126 -17
  93. package/corpus/core/src/client/agent-chat-adapter.ts +6 -5
  94. package/corpus/core/src/client/app-providers.tsx +2 -2
  95. package/corpus/core/src/client/collab/index.ts +31 -0
  96. package/corpus/core/src/client/components/LiveCursorOverlay.tsx +16 -1
  97. package/corpus/core/src/client/components/PresenceBar.tsx +14 -1
  98. package/corpus/core/src/client/components/RecentEditHighlights.tsx +219 -0
  99. package/corpus/core/src/client/components/RemoteSelectionRings.tsx +40 -6
  100. package/corpus/core/src/client/index.ts +48 -0
  101. package/corpus/core/src/client/org/OrgSwitcher.tsx +0 -4
  102. package/corpus/core/src/client/rich-markdown-editor/SharedRichEditor.tsx +49 -32
  103. package/corpus/core/src/client/rich-markdown-editor/index.ts +6 -0
  104. package/corpus/core/src/client/rich-markdown-editor/surgical-apply.ts +192 -0
  105. package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +59 -8
  106. package/corpus/core/src/client/session-replay.ts +181 -15
  107. package/corpus/core/src/client/sse-event-processor.ts +90 -1
  108. package/corpus/core/src/client/use-action.ts +123 -25
  109. package/corpus/core/src/client/use-agent-engine-configured.ts +7 -1
  110. package/corpus/core/src/client/use-chat-threads.ts +18 -7
  111. package/corpus/core/src/client/use-db-sync.ts +104 -19
  112. package/corpus/core/src/client/use-pinch-zoom.ts +76 -11
  113. package/corpus/core/src/client/visual-style-controls.tsx +475 -0
  114. package/corpus/core/src/collab/agent-presence.ts +191 -62
  115. package/corpus/core/src/collab/awareness.ts +83 -6
  116. package/corpus/core/src/collab/client.ts +89 -146
  117. package/corpus/core/src/collab/index.ts +34 -0
  118. package/corpus/core/src/collab/presence.ts +63 -3
  119. package/corpus/core/src/collab/recent-edits.ts +171 -0
  120. package/corpus/core/src/collab/undo.ts +432 -0
  121. package/corpus/core/src/collab/ydoc-manager.ts +68 -0
  122. package/corpus/core/src/connections/catalog.ts +2 -3
  123. package/corpus/core/src/db/create-get-db.ts +86 -1
  124. package/corpus/core/src/db/ensure-additive-columns.ts +430 -0
  125. package/corpus/core/src/db/index.ts +6 -0
  126. package/corpus/core/src/db/migrations.ts +236 -35
  127. package/corpus/core/src/jobs/scheduler.ts +17 -14
  128. package/corpus/core/src/observability/traces.ts +182 -1
  129. package/corpus/core/src/org/context.ts +79 -2
  130. package/corpus/core/src/server/agent-chat-plugin.ts +10 -6
  131. package/corpus/core/src/server/auth-marketing.ts +0 -11
  132. package/corpus/core/src/server/auth.ts +11 -4
  133. package/corpus/core/src/server/collab-plugin.ts +56 -13
  134. package/corpus/core/src/server/design-token-utils.ts +1 -1
  135. package/corpus/core/src/server/fusion-app.ts +447 -0
  136. package/corpus/core/src/server/index.ts +13 -0
  137. package/corpus/core/src/server/onboarding-html.ts +3 -4
  138. package/corpus/core/src/server/poll-events.ts +14 -2
  139. package/corpus/core/src/server/poll.ts +219 -12
  140. package/corpus/core/src/server/schema-prompt.ts +28 -9
  141. package/corpus/core/src/settings/store.ts +33 -2
  142. package/corpus/core/src/sharing/actions/set-resource-visibility.ts +2 -0
  143. package/corpus/core/src/sharing/actions/share-resource.ts +3 -0
  144. package/corpus/core/src/sharing/actions/unshare-resource.ts +2 -0
  145. package/corpus/core/src/styles/agent-native.css +0 -5
  146. package/corpus/core/src/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
  147. package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
  148. package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
  149. package/corpus/core/src/templates/default/package.json +3 -3
  150. package/corpus/core/src/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
  151. package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
  152. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
  153. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
  154. package/corpus/core/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
  155. package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
  156. package/corpus/core/src/tracking/providers.ts +22 -1
  157. package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +15 -0
  158. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +20 -5
  159. package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +8 -0
  160. package/corpus/templates/analytics/AGENTS.md +33 -6
  161. package/corpus/templates/analytics/actions/navigate.ts +14 -4
  162. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
  163. package/corpus/templates/analytics/actions/view-screen.ts +57 -0
  164. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +23 -1
  165. package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -0
  166. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +21 -0
  167. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +7 -0
  168. package/corpus/templates/analytics/app/i18n/zh-TW.ts +15 -1
  169. package/corpus/templates/analytics/app/i18n-data.ts +151 -10
  170. package/corpus/templates/analytics/app/pages/Agents.tsx +118 -0
  171. package/corpus/templates/analytics/app/pages/DataSources.tsx +11 -1
  172. package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +76 -40
  173. package/corpus/templates/analytics/app/pages/sessions/session-replay-devtools.ts +5 -0
  174. package/corpus/templates/analytics/app/routes/agents.tsx +10 -0
  175. package/corpus/templates/analytics/changelog/2026-07-03-agent-admin-tools-page.md +6 -0
  176. package/corpus/templates/analytics/changelog/2026-07-03-agent-llm-observability-dashboard.md +6 -0
  177. package/corpus/templates/analytics/changelog/2026-07-03-session-recordings-now-include-response-bodies-for-5xx-error.md +6 -0
  178. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +34 -0
  179. package/corpus/templates/analytics/docs/schemas/tracked-events.md +6 -0
  180. package/corpus/templates/analytics/package.json +3 -3
  181. package/corpus/templates/analytics/seeds/dashboards/agent-observability-llm.json +173 -0
  182. package/corpus/templates/analytics/server/jobs/analytics-alerts.ts +23 -5
  183. package/corpus/templates/analytics/server/lib/analytics-alerts.ts +58 -13
  184. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +23 -0
  185. package/corpus/templates/analytics/server/lib/dashboard-seeds.ts +5 -0
  186. package/corpus/templates/analytics/server/lib/session-replay-agent-context.ts +120 -8
  187. package/corpus/templates/analytics/server/lib/session-replay.ts +3 -2
  188. package/corpus/templates/analytics/server/plugins/db.ts +93 -2
  189. package/corpus/templates/analytics/server/routes/api/session-replay/agent-diagnostics.json.get.ts +45 -1
  190. package/corpus/templates/analytics/shared/session-replay-diagnostics.ts +10 -0
  191. package/corpus/templates/assets/.agents/skills/real-time-collab/SKILL.md +82 -19
  192. package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +15 -0
  193. package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +8 -0
  194. package/corpus/templates/assets/package.json +3 -3
  195. package/corpus/templates/assets/server/plugins/db.ts +63 -2
  196. package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +15 -0
  197. package/corpus/templates/brain/package.json +3 -3
  198. package/corpus/templates/brain/server/plugins/db.ts +75 -2
  199. package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +15 -0
  200. package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +8 -0
  201. package/corpus/templates/calendar/package.json +3 -3
  202. package/corpus/templates/calendar/server/plugins/db.ts +64 -2
  203. package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +15 -0
  204. package/corpus/templates/chat/package.json +3 -3
  205. package/corpus/templates/clips/actions/finalize-recording.ts +50 -40
  206. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +8 -6
  207. package/corpus/templates/clips/app/routes/share.$shareId.tsx +3 -3
  208. package/corpus/templates/clips/changelog/2026-07-03-mobile-recording-pages-keep-videos-in-a-16-9-player-with-act.md +6 -0
  209. package/corpus/templates/clips/desktop/src/lib/recorder.ts +245 -77
  210. package/corpus/templates/clips/package.json +3 -3
  211. package/corpus/templates/clips/server/lib/recording-upload-state.ts +56 -0
  212. package/corpus/templates/clips/server/plugins/db.ts +68 -1
  213. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +27 -3
  214. package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +15 -0
  215. package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +8 -0
  216. package/corpus/templates/content/actions/edit-document.ts +48 -1
  217. package/corpus/templates/content/actions/list-documents.ts +101 -94
  218. package/corpus/templates/content/actions/search-documents.ts +19 -3
  219. package/corpus/templates/content/actions/update-document.ts +54 -1
  220. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +127 -7
  221. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +97 -2
  222. package/corpus/templates/content/changelog/2026-07-03-agent-document-edits-now-appear-as-a-live-collaborator-prese.md +6 -0
  223. package/corpus/templates/content/changelog/2026-07-03-document-search-and-list-views-load-faster-on-large-workspac.md +6 -0
  224. package/corpus/templates/content/package.json +3 -3
  225. package/corpus/templates/content/server/plugins/db.ts +57 -1
  226. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +190 -13
  227. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +16 -4
  228. package/corpus/templates/design/.agents/skills/export-handoff/SKILL.md +46 -3
  229. package/corpus/templates/design/.agents/skills/full-app-build/SKILL.md +140 -0
  230. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +20 -0
  231. package/corpus/templates/design/AGENTS.md +83 -13
  232. package/corpus/templates/design/actions/add-fusion-screens.ts +91 -0
  233. package/corpus/templates/design/actions/apply-a11y-fix.ts +5 -1
  234. package/corpus/templates/design/actions/apply-component-prop-edit.ts +24 -69
  235. package/corpus/templates/design/actions/apply-fusion-edits.ts +161 -0
  236. package/corpus/templates/design/actions/apply-motion-edit.ts +29 -2
  237. package/corpus/templates/design/actions/apply-visual-edit.ts +38 -3
  238. package/corpus/templates/design/actions/connect-localhost.ts +25 -18
  239. package/corpus/templates/design/actions/create-component.ts +5 -1
  240. package/corpus/templates/design/actions/create-fusion-app.ts +202 -0
  241. package/corpus/templates/design/actions/deploy-fusion-app.ts +123 -0
  242. package/corpus/templates/design/actions/edit-design.ts +13 -16
  243. package/corpus/templates/design/actions/export-pdf.ts +8 -1
  244. package/corpus/templates/design/actions/export-zip.ts +10 -1
  245. package/corpus/templates/design/actions/get-fusion-deploy-status.ts +86 -0
  246. package/corpus/templates/design/actions/get-motion-timeline.ts +26 -20
  247. package/corpus/templates/design/actions/grant-localhost-write-consent.ts +10 -0
  248. package/corpus/templates/design/actions/insert-asset.ts +190 -7
  249. package/corpus/templates/design/actions/list-fusion-edits.ts +96 -0
  250. package/corpus/templates/design/actions/list-local-files.ts +133 -0
  251. package/corpus/templates/design/actions/open-visual-edit.ts +27 -5
  252. package/corpus/templates/design/actions/present-design-variants.ts +2 -2
  253. package/corpus/templates/design/actions/push-fusion-app.ts +62 -0
  254. package/corpus/templates/design/actions/queue-fusion-edit.ts +112 -0
  255. package/corpus/templates/design/actions/read-local-file.ts +139 -0
  256. package/corpus/templates/design/actions/revoke-localhost-write-consent.ts +18 -14
  257. package/corpus/templates/design/actions/run-design-audit.ts +7 -4
  258. package/corpus/templates/design/actions/send-fusion-message.ts +69 -0
  259. package/corpus/templates/design/actions/sync-fusion-app.ts +196 -0
  260. package/corpus/templates/design/actions/write-local-file.ts +162 -36
  261. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +12 -0
  262. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +600 -66
  263. package/corpus/templates/design/app/components/design/EditPanel.tsx +793 -304
  264. package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +328 -0
  265. package/corpus/templates/design/app/components/design/LayersPanel.tsx +671 -154
  266. package/corpus/templates/design/app/components/design/LocalhostWriteConsentDialog.tsx +1 -1
  267. package/corpus/templates/design/app/components/design/MotionDock.tsx +234 -46
  268. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +2070 -420
  269. package/corpus/templates/design/app/components/design/StatesPanel.tsx +25 -2
  270. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +7 -98
  271. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +640 -72
  272. package/corpus/templates/design/app/components/design/bridge/motion-preview.bridge.ts +605 -0
  273. package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +50 -26
  274. package/corpus/templates/design/app/components/design/code-workbench/ActivityBar.tsx +85 -0
  275. package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +466 -0
  276. package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +53 -0
  277. package/corpus/templates/design/app/components/design/code-workbench/commands.ts +339 -0
  278. package/corpus/templates/design/app/components/design/code-workbench/editor/Breadcrumbs.tsx +42 -0
  279. package/corpus/templates/design/app/components/design/code-workbench/editor/BufferSync.tsx +128 -0
  280. package/corpus/templates/design/app/components/design/code-workbench/editor/EditorTabs.tsx +363 -0
  281. package/corpus/templates/design/app/components/design/code-workbench/editor/MonacoHost.tsx +268 -0
  282. package/corpus/templates/design/app/components/design/code-workbench/editor/StatusBar.tsx +208 -0
  283. package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-setup.ts +61 -0
  284. package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-theme-palette.ts +191 -0
  285. package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-theme.ts +29 -0
  286. package/corpus/templates/design/app/components/design/code-workbench/editor/status-bar-lang.ts +21 -0
  287. package/corpus/templates/design/app/components/design/code-workbench/editor/tab-drag.ts +27 -0
  288. package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +155 -0
  289. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +551 -0
  290. package/corpus/templates/design/app/components/design/code-workbench/explorer/file-icons.tsx +115 -0
  291. package/corpus/templates/design/app/components/design/code-workbench/format/format-on-open.ts +65 -0
  292. package/corpus/templates/design/app/components/design/code-workbench/format/prettier-format.ts +182 -0
  293. package/corpus/templates/design/app/components/design/code-workbench/model-registry.ts +133 -0
  294. package/corpus/templates/design/app/components/design/code-workbench/quickinput/QuickInput.tsx +563 -0
  295. package/corpus/templates/design/app/components/design/code-workbench/quickinput/fuzzy.ts +170 -0
  296. package/corpus/templates/design/app/components/design/code-workbench/search/SearchView.tsx +508 -0
  297. package/corpus/templates/design/app/components/design/code-workbench/search/search-engine.ts +280 -0
  298. package/corpus/templates/design/app/components/design/code-workbench/store.tsx +734 -0
  299. package/corpus/templates/design/app/components/design/code-workbench/workspace/create-providers.ts +39 -0
  300. package/corpus/templates/design/app/components/design/code-workbench/workspace/inline-provider.ts +196 -0
  301. package/corpus/templates/design/app/components/design/code-workbench/workspace/localhost-provider.ts +177 -0
  302. package/corpus/templates/design/app/components/design/code-workbench/workspace/tree.ts +110 -0
  303. package/corpus/templates/design/app/components/design/code-workbench/workspace/types.ts +103 -0
  304. package/corpus/templates/design/app/components/design/code-workbench-theme.ts +68 -0
  305. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +16 -4
  306. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +217 -113
  307. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +111 -5
  308. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +13 -2
  309. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +79 -16
  310. package/corpus/templates/design/app/components/design/inspector/index.ts +9 -0
  311. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +67 -2
  312. package/corpus/templates/design/app/components/design/types.ts +16 -0
  313. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +80 -1
  314. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +24 -6
  315. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +15 -1
  316. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +6 -16
  317. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +77 -0
  318. package/corpus/templates/design/app/i18n/zh-TW.ts +2 -0
  319. package/corpus/templates/design/app/i18n-data.ts +31 -0
  320. package/corpus/templates/design/app/lib/design-import.ts +95 -0
  321. package/corpus/templates/design/app/pages/DesignEditor.tsx +5586 -1112
  322. package/corpus/templates/design/app/pages/Index.tsx +90 -17
  323. package/corpus/templates/design/changelog/2026-07-03-canvas-interactions-now-match-figma-rotation-aware-resizing-.md +6 -0
  324. package/corpus/templates/design/changelog/2026-07-03-inspector-fixes-mixed-selections-show-mixed-instead-of-wrong.md +6 -0
  325. package/corpus/templates/design/changelog/2026-07-03-keyframe-timeline-works-reliably-drag-keyframes-smoothly-pic.md +6 -0
  326. package/corpus/templates/design/changelog/2026-07-03-layers-panel-matches-figma-top-layer-on-top-drag-with-auto-s.md +6 -0
  327. package/corpus/templates/design/changelog/2026-07-03-much-faster-editor-smooth-dragging-zooming-and-panel-updates.md +6 -0
  328. package/corpus/templates/design/changelog/2026-07-03-pen-tool-refinements-click-the-first-point-to-close-with-a-d.md +6 -0
  329. package/corpus/templates/design/changelog/2026-07-03-text-editing-enter-adds-a-line-break-international-ime-typin.md +6 -0
  330. package/corpus/templates/design/changelog/2026-07-03-the-ai-now-edits-like-a-collaborator-on-canvas-its-cursor-gl.md +6 -0
  331. package/corpus/templates/design/changelog/2026-07-03-the-code-panel-is-now-a-full-vs-code-style-editor-with-a-fil.md +6 -0
  332. package/corpus/templates/design/changelog/2026-07-03-undo-and-redo-are-dependable-across-agent-edits-screen-switc.md +6 -0
  333. package/corpus/templates/design/package.json +4 -3
  334. package/corpus/templates/design/server/db/schema.ts +31 -0
  335. package/corpus/templates/design/server/lib/design-export.ts +43 -1
  336. package/corpus/templates/design/server/lib/fusion-screens.ts +246 -0
  337. package/corpus/templates/design/server/plugins/db.ts +89 -2
  338. package/corpus/templates/design/shared/board-file.ts +25 -5
  339. package/corpus/templates/design/shared/canvas-math.ts +754 -9
  340. package/corpus/templates/design/shared/code-layer.ts +304 -26
  341. package/corpus/templates/design/shared/collab-selection.ts +52 -0
  342. package/corpus/templates/design/shared/color-utils.ts +84 -0
  343. package/corpus/templates/design/shared/design-source-capabilities.ts +16 -7
  344. package/corpus/templates/design/shared/full-app.ts +126 -0
  345. package/corpus/templates/design/shared/motion-compiler.ts +75 -31
  346. package/corpus/templates/design/shared/motion-timeline.ts +335 -0
  347. package/corpus/templates/design/shared/pen-path.ts +496 -23
  348. package/corpus/templates/dispatch/package.json +3 -3
  349. package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +15 -0
  350. package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +8 -0
  351. package/corpus/templates/forms/package.json +3 -3
  352. package/corpus/templates/forms/server/plugins/db.ts +62 -2
  353. package/corpus/templates/macros/package.json +3 -3
  354. package/corpus/templates/macros/server/plugins/db.ts +63 -2
  355. package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +15 -0
  356. package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +8 -0
  357. package/corpus/templates/mail/package.json +3 -3
  358. package/corpus/templates/mail/server/lib/contact-frequency.ts +42 -15
  359. package/corpus/templates/mail/server/plugins/db.ts +63 -2
  360. package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +15 -0
  361. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +9 -3
  362. package/corpus/templates/plan/.agents/skills/visualize-repo/SKILL.md +92 -0
  363. package/corpus/templates/plan/actions/export-visual-plan.ts +5 -0
  364. package/corpus/templates/plan/actions/get-local-plan-folder.ts +4 -22
  365. package/corpus/templates/plan/actions/get-plan-version.ts +6 -16
  366. package/corpus/templates/plan/actions/list-plan-versions.ts +48 -20
  367. package/corpus/templates/plan/actions/patch-visual-plan-source.ts +41 -1
  368. package/corpus/templates/plan/actions/promote-local-plan-folder.ts +4 -22
  369. package/corpus/templates/plan/actions/update-local-plan-comments.ts +4 -2
  370. package/corpus/templates/plan/actions/update-local-plan-folder.ts +4 -22
  371. package/corpus/templates/plan/actions/update-visual-plan.ts +60 -1
  372. package/corpus/templates/plan/agent-native.app-skill.json +10 -0
  373. package/corpus/templates/plan/app/components/editor/PlanDocumentEditor.tsx +138 -39
  374. package/corpus/templates/plan/app/components/editor/usePlanUndoStack.ts +165 -23
  375. package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +80 -4
  376. package/corpus/templates/plan/app/global.css +11 -9
  377. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +10 -1
  378. package/corpus/templates/plan/app/hooks/use-plan-presence.ts +66 -0
  379. package/corpus/templates/plan/app/pages/PlansPage.tsx +215 -63
  380. package/corpus/templates/plan/changelog/2026-07-03-local-visual-plans-and-recaps-can-save-comments-without-sign.md +6 -0
  381. package/corpus/templates/plan/changelog/2026-07-03-plan-tabs-render-nested-text-instead-of-raw-json.md +6 -0
  382. package/corpus/templates/plan/changelog/2026-07-03-plans-are-now-fully-real-time-collaborative-multiple-people-.md +6 -0
  383. package/corpus/templates/plan/changelog/2026-07-03-plans-open-and-refresh-faster-especially-long-lived-plans-wi.md +6 -0
  384. package/corpus/templates/plan/changelog/2026-07-03-undo-now-survives-agent-edits-cmd-z-keeps-working-on-your-ow.md +6 -0
  385. package/corpus/templates/plan/package.json +5 -3
  386. package/corpus/templates/plan/server/db/schema.ts +12 -0
  387. package/corpus/templates/plan/server/lib/local-plan-kind.ts +25 -0
  388. package/corpus/templates/plan/server/lib/plan-versions.ts +83 -1
  389. package/corpus/templates/plan/server/lib/public-action-paths.ts +0 -2
  390. package/corpus/templates/plan/server/plans.ts +26 -3
  391. package/corpus/templates/plan/server/plugins/db.ts +105 -2
  392. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +8 -4
  393. package/corpus/templates/slides/AGENTS.md +4 -0
  394. package/corpus/templates/slides/actions/_agent-presence.ts +48 -0
  395. package/corpus/templates/slides/actions/add-slide.ts +16 -18
  396. package/corpus/templates/slides/actions/patch-deck.ts +4 -2
  397. package/corpus/templates/slides/actions/update-slide.ts +114 -77
  398. package/corpus/templates/slides/actions/view-screen.ts +39 -0
  399. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +47 -3
  400. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +32 -35
  401. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +625 -199
  402. package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +342 -0
  403. package/corpus/templates/slides/app/components/editor/TweaksPanel.tsx +46 -96
  404. package/corpus/templates/slides/app/components/visual-editor/SaveStatusIndicator.tsx +8 -1
  405. package/corpus/templates/slides/app/context/DeckContext.tsx +589 -176
  406. package/corpus/templates/slides/app/hooks/use-deck-presence.ts +84 -42
  407. package/corpus/templates/slides/app/i18n/ar-SA.ts +46 -0
  408. package/corpus/templates/slides/app/i18n/de-DE.ts +46 -0
  409. package/corpus/templates/slides/app/i18n/en-US.ts +46 -0
  410. package/corpus/templates/slides/app/i18n/es-ES.ts +46 -0
  411. package/corpus/templates/slides/app/i18n/fr-FR.ts +46 -0
  412. package/corpus/templates/slides/app/i18n/hi-IN.ts +46 -0
  413. package/corpus/templates/slides/app/i18n/ja-JP.ts +46 -0
  414. package/corpus/templates/slides/app/i18n/ko-KR.ts +46 -0
  415. package/corpus/templates/slides/app/i18n/pt-BR.ts +46 -0
  416. package/corpus/templates/slides/app/i18n/zh-CN.ts +46 -0
  417. package/corpus/templates/slides/app/i18n/zh-TW.ts +46 -0
  418. package/corpus/templates/slides/app/pages/DeckEditor.tsx +25 -13
  419. package/corpus/templates/slides/changelog/2026-07-03-figma-style-slide-editing.md +6 -0
  420. package/corpus/templates/slides/changelog/2026-07-03-see-the-ai-working-with-you-when-the-agent-edits-a-slide-it-.md +6 -0
  421. package/corpus/templates/slides/changelog/2026-07-03-undo-redo-is-now-precise-and-safe-with-collaborators-it-only.md +6 -0
  422. package/corpus/templates/slides/package.json +3 -3
  423. package/corpus/templates/slides/server/handlers/decks.ts +31 -3
  424. package/corpus/templates/slides/server/plugins/db.ts +65 -2
  425. package/corpus/templates/videos/netlify.toml +1 -12
  426. package/dist/agent/run-store.js +1 -1
  427. package/dist/agent/run-store.js.map +1 -1
  428. package/dist/chat-threads/store.d.ts +9 -1
  429. package/dist/chat-threads/store.d.ts.map +1 -1
  430. package/dist/chat-threads/store.js +63 -11
  431. package/dist/chat-threads/store.js.map +1 -1
  432. package/dist/checkpoints/store.d.ts.map +1 -1
  433. package/dist/checkpoints/store.js +10 -2
  434. package/dist/checkpoints/store.js.map +1 -1
  435. package/dist/cli/create.d.ts.map +1 -1
  436. package/dist/cli/create.js +3 -5
  437. package/dist/cli/create.js.map +1 -1
  438. package/dist/cli/design-connect.d.ts +49 -1
  439. package/dist/cli/design-connect.d.ts.map +1 -1
  440. package/dist/cli/design-connect.js +414 -9
  441. package/dist/cli/design-connect.js.map +1 -1
  442. package/dist/cli/index.js +12 -0
  443. package/dist/cli/index.js.map +1 -1
  444. package/dist/cli/plan-local.d.ts +24 -0
  445. package/dist/cli/plan-local.d.ts.map +1 -1
  446. package/dist/cli/plan-local.js +188 -20
  447. package/dist/cli/plan-local.js.map +1 -1
  448. package/dist/cli/skills.d.ts +3 -1
  449. package/dist/cli/skills.d.ts.map +1 -1
  450. package/dist/cli/skills.js +173 -21
  451. package/dist/cli/skills.js.map +1 -1
  452. package/dist/cli/templates-meta.d.ts.map +1 -1
  453. package/dist/cli/templates-meta.js +0 -14
  454. package/dist/cli/templates-meta.js.map +1 -1
  455. package/dist/cli/visualize-repo.d.ts +49 -0
  456. package/dist/cli/visualize-repo.d.ts.map +1 -0
  457. package/dist/cli/visualize-repo.js +561 -0
  458. package/dist/cli/visualize-repo.js.map +1 -0
  459. package/dist/client/AssistantChat.d.ts.map +1 -1
  460. package/dist/client/AssistantChat.js +120 -15
  461. package/dist/client/AssistantChat.js.map +1 -1
  462. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  463. package/dist/client/agent-chat-adapter.js +6 -5
  464. package/dist/client/agent-chat-adapter.js.map +1 -1
  465. package/dist/client/app-providers.d.ts +2 -2
  466. package/dist/client/app-providers.js.map +1 -1
  467. package/dist/client/collab/index.d.ts +4 -1
  468. package/dist/client/collab/index.d.ts.map +1 -1
  469. package/dist/client/collab/index.js +3 -0
  470. package/dist/client/collab/index.js.map +1 -1
  471. package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
  472. package/dist/client/components/LiveCursorOverlay.js +11 -3
  473. package/dist/client/components/LiveCursorOverlay.js.map +1 -1
  474. package/dist/client/components/PresenceBar.d.ts.map +1 -1
  475. package/dist/client/components/PresenceBar.js +6 -1
  476. package/dist/client/components/PresenceBar.js.map +1 -1
  477. package/dist/client/components/RecentEditHighlights.d.ts +43 -0
  478. package/dist/client/components/RecentEditHighlights.d.ts.map +1 -0
  479. package/dist/client/components/RecentEditHighlights.js +146 -0
  480. package/dist/client/components/RecentEditHighlights.js.map +1 -0
  481. package/dist/client/components/RemoteSelectionRings.d.ts +9 -0
  482. package/dist/client/components/RemoteSelectionRings.d.ts.map +1 -1
  483. package/dist/client/components/RemoteSelectionRings.js +22 -8
  484. package/dist/client/components/RemoteSelectionRings.js.map +1 -1
  485. package/dist/client/index.d.ts +6 -1
  486. package/dist/client/index.d.ts.map +1 -1
  487. package/dist/client/index.js +7 -0
  488. package/dist/client/index.js.map +1 -1
  489. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  490. package/dist/client/org/OrgSwitcher.js +1 -3
  491. package/dist/client/org/OrgSwitcher.js.map +1 -1
  492. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +8 -1
  493. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
  494. package/dist/client/rich-markdown-editor/SharedRichEditor.js +8 -2
  495. package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
  496. package/dist/client/rich-markdown-editor/index.d.ts +1 -0
  497. package/dist/client/rich-markdown-editor/index.d.ts.map +1 -1
  498. package/dist/client/rich-markdown-editor/index.js +1 -0
  499. package/dist/client/rich-markdown-editor/index.js.map +1 -1
  500. package/dist/client/rich-markdown-editor/surgical-apply.d.ts +66 -0
  501. package/dist/client/rich-markdown-editor/surgical-apply.d.ts.map +1 -0
  502. package/dist/client/rich-markdown-editor/surgical-apply.js +147 -0
  503. package/dist/client/rich-markdown-editor/surgical-apply.js.map +1 -0
  504. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts +18 -2
  505. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
  506. package/dist/client/rich-markdown-editor/useCollabReconcile.js +39 -8
  507. package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
  508. package/dist/client/session-replay.d.ts +10 -1
  509. package/dist/client/session-replay.d.ts.map +1 -1
  510. package/dist/client/session-replay.js +134 -7
  511. package/dist/client/session-replay.js.map +1 -1
  512. package/dist/client/sse-event-processor.d.ts.map +1 -1
  513. package/dist/client/sse-event-processor.js +81 -1
  514. package/dist/client/sse-event-processor.js.map +1 -1
  515. package/dist/client/use-action.d.ts +24 -0
  516. package/dist/client/use-action.d.ts.map +1 -1
  517. package/dist/client/use-action.js +109 -27
  518. package/dist/client/use-action.js.map +1 -1
  519. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  520. package/dist/client/use-agent-engine-configured.js +7 -1
  521. package/dist/client/use-agent-engine-configured.js.map +1 -1
  522. package/dist/client/use-chat-threads.d.ts.map +1 -1
  523. package/dist/client/use-chat-threads.js +11 -3
  524. package/dist/client/use-chat-threads.js.map +1 -1
  525. package/dist/client/use-db-sync.d.ts +36 -0
  526. package/dist/client/use-db-sync.d.ts.map +1 -1
  527. package/dist/client/use-db-sync.js +68 -12
  528. package/dist/client/use-db-sync.js.map +1 -1
  529. package/dist/client/use-pinch-zoom.d.ts.map +1 -1
  530. package/dist/client/use-pinch-zoom.js +76 -11
  531. package/dist/client/use-pinch-zoom.js.map +1 -1
  532. package/dist/client/visual-style-controls.d.ts +79 -0
  533. package/dist/client/visual-style-controls.d.ts.map +1 -0
  534. package/dist/client/visual-style-controls.js +150 -0
  535. package/dist/client/visual-style-controls.js.map +1 -0
  536. package/dist/collab/agent-presence.d.ts +51 -5
  537. package/dist/collab/agent-presence.d.ts.map +1 -1
  538. package/dist/collab/agent-presence.js +144 -58
  539. package/dist/collab/agent-presence.js.map +1 -1
  540. package/dist/collab/awareness-store.d.ts +32 -0
  541. package/dist/collab/awareness-store.d.ts.map +1 -0
  542. package/dist/collab/awareness-store.js +0 -0
  543. package/dist/collab/awareness-store.js.map +1 -0
  544. package/dist/collab/awareness.d.ts +14 -3
  545. package/dist/collab/awareness.d.ts.map +1 -1
  546. package/dist/collab/awareness.js +53 -5
  547. package/dist/collab/awareness.js.map +1 -1
  548. package/dist/collab/client.d.ts +2 -0
  549. package/dist/collab/client.d.ts.map +1 -1
  550. package/dist/collab/client.js +79 -119
  551. package/dist/collab/client.js.map +1 -1
  552. package/dist/collab/index.d.ts +3 -1
  553. package/dist/collab/index.d.ts.map +1 -1
  554. package/dist/collab/index.js +5 -1
  555. package/dist/collab/index.js.map +1 -1
  556. package/dist/collab/presence.d.ts.map +1 -1
  557. package/dist/collab/presence.js +54 -3
  558. package/dist/collab/presence.js.map +1 -1
  559. package/dist/collab/recent-edits.d.ts +87 -0
  560. package/dist/collab/recent-edits.d.ts.map +1 -0
  561. package/dist/collab/recent-edits.js +116 -0
  562. package/dist/collab/recent-edits.js.map +1 -0
  563. package/dist/collab/undo.d.ts +121 -0
  564. package/dist/collab/undo.d.ts.map +1 -0
  565. package/dist/collab/undo.js +244 -0
  566. package/dist/collab/undo.js.map +1 -0
  567. package/dist/collab/ydoc-manager.d.ts +10 -0
  568. package/dist/collab/ydoc-manager.d.ts.map +1 -1
  569. package/dist/collab/ydoc-manager.js +57 -0
  570. package/dist/collab/ydoc-manager.js.map +1 -1
  571. package/dist/connections/catalog.d.ts +2 -2
  572. package/dist/connections/catalog.d.ts.map +1 -1
  573. package/dist/connections/catalog.js +1 -1
  574. package/dist/connections/catalog.js.map +1 -1
  575. package/dist/db/create-get-db.d.ts +22 -0
  576. package/dist/db/create-get-db.d.ts.map +1 -1
  577. package/dist/db/create-get-db.js +73 -1
  578. package/dist/db/create-get-db.js.map +1 -1
  579. package/dist/db/ensure-additive-columns.d.ts +93 -0
  580. package/dist/db/ensure-additive-columns.d.ts.map +1 -0
  581. package/dist/db/ensure-additive-columns.js +355 -0
  582. package/dist/db/ensure-additive-columns.js.map +1 -0
  583. package/dist/db/index.d.ts +1 -0
  584. package/dist/db/index.d.ts.map +1 -1
  585. package/dist/db/index.js +1 -0
  586. package/dist/db/index.js.map +1 -1
  587. package/dist/db/migrations.d.ts +70 -0
  588. package/dist/db/migrations.d.ts.map +1 -1
  589. package/dist/db/migrations.js +196 -33
  590. package/dist/db/migrations.js.map +1 -1
  591. package/dist/jobs/scheduler.js +17 -10
  592. package/dist/jobs/scheduler.js.map +1 -1
  593. package/dist/notifications/routes.d.ts +3 -3
  594. package/dist/observability/routes.d.ts +5 -5
  595. package/dist/observability/traces.d.ts.map +1 -1
  596. package/dist/observability/traces.js +155 -1
  597. package/dist/observability/traces.js.map +1 -1
  598. package/dist/org/context.d.ts +7 -0
  599. package/dist/org/context.d.ts.map +1 -1
  600. package/dist/org/context.js +54 -2
  601. package/dist/org/context.js.map +1 -1
  602. package/dist/progress/routes.d.ts +1 -1
  603. package/dist/resources/handlers.d.ts +3 -3
  604. package/dist/secrets/routes.d.ts +6 -6
  605. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  606. package/dist/server/agent-chat-plugin.js +10 -6
  607. package/dist/server/agent-chat-plugin.js.map +1 -1
  608. package/dist/server/auth-marketing.d.ts.map +1 -1
  609. package/dist/server/auth-marketing.js +0 -10
  610. package/dist/server/auth-marketing.js.map +1 -1
  611. package/dist/server/auth.d.ts.map +1 -1
  612. package/dist/server/auth.js +6 -4
  613. package/dist/server/auth.js.map +1 -1
  614. package/dist/server/collab-plugin.d.ts.map +1 -1
  615. package/dist/server/collab-plugin.js +45 -13
  616. package/dist/server/collab-plugin.js.map +1 -1
  617. package/dist/server/design-token-utils.d.ts +1 -1
  618. package/dist/server/design-token-utils.js +1 -1
  619. package/dist/server/design-token-utils.js.map +1 -1
  620. package/dist/server/fusion-app.d.ts +107 -0
  621. package/dist/server/fusion-app.d.ts.map +1 -0
  622. package/dist/server/fusion-app.js +371 -0
  623. package/dist/server/fusion-app.js.map +1 -0
  624. package/dist/server/index.d.ts +1 -0
  625. package/dist/server/index.d.ts.map +1 -1
  626. package/dist/server/index.js +1 -0
  627. package/dist/server/index.js.map +1 -1
  628. package/dist/server/onboarding-html.d.ts.map +1 -1
  629. package/dist/server/onboarding-html.js +3 -4
  630. package/dist/server/onboarding-html.js.map +1 -1
  631. package/dist/server/poll-events.d.ts +2 -0
  632. package/dist/server/poll-events.d.ts.map +1 -1
  633. package/dist/server/poll-events.js +7 -2
  634. package/dist/server/poll-events.js.map +1 -1
  635. package/dist/server/poll.d.ts +47 -3
  636. package/dist/server/poll.d.ts.map +1 -1
  637. package/dist/server/poll.js +176 -10
  638. package/dist/server/poll.js.map +1 -1
  639. package/dist/server/schema-prompt.d.ts.map +1 -1
  640. package/dist/server/schema-prompt.js +24 -7
  641. package/dist/server/schema-prompt.js.map +1 -1
  642. package/dist/settings/store.d.ts.map +1 -1
  643. package/dist/settings/store.js +32 -3
  644. package/dist/settings/store.js.map +1 -1
  645. package/dist/sharing/actions/set-resource-visibility.js +2 -0
  646. package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
  647. package/dist/sharing/actions/share-resource.d.ts.map +1 -1
  648. package/dist/sharing/actions/share-resource.js +3 -0
  649. package/dist/sharing/actions/share-resource.js.map +1 -1
  650. package/dist/sharing/actions/unshare-resource.js +2 -0
  651. package/dist/sharing/actions/unshare-resource.js.map +1 -1
  652. package/dist/styles/agent-native.css +0 -5
  653. package/dist/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
  654. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
  655. package/dist/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
  656. package/dist/templates/default/package.json +3 -3
  657. package/dist/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
  658. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
  659. package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
  660. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
  661. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
  662. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
  663. package/dist/tracking/providers.d.ts.map +1 -1
  664. package/dist/tracking/providers.js +17 -1
  665. package/dist/tracking/providers.js.map +1 -1
  666. package/docs/content/cloneable-saas.mdx +0 -1
  667. package/docs/content/locales/ar-SA/cloneable-saas.mdx +0 -1
  668. package/docs/content/locales/ar-SA/plan-plugin.mdx +10 -9
  669. package/docs/content/locales/ar-SA/sharing.mdx +1 -2
  670. package/docs/content/locales/ar-SA/skills-guide.mdx +2 -3
  671. package/docs/content/locales/ar-SA/template-plan.mdx +23 -7
  672. package/docs/content/locales/ar-SA/tracking.mdx +1 -1
  673. package/docs/content/locales/ar-SA/workspace-connections.mdx +11 -11
  674. package/docs/content/locales/de-DE/cloneable-saas.mdx +0 -1
  675. package/docs/content/locales/de-DE/plan-plugin.mdx +10 -9
  676. package/docs/content/locales/de-DE/sharing.mdx +1 -2
  677. package/docs/content/locales/de-DE/skills-guide.mdx +2 -3
  678. package/docs/content/locales/de-DE/template-plan.mdx +23 -7
  679. package/docs/content/locales/de-DE/tracking.mdx +1 -1
  680. package/docs/content/locales/de-DE/workspace-connections.mdx +1 -1
  681. package/docs/content/locales/es-ES/cloneable-saas.mdx +0 -1
  682. package/docs/content/locales/es-ES/plan-plugin.mdx +10 -9
  683. package/docs/content/locales/es-ES/sharing.mdx +1 -2
  684. package/docs/content/locales/es-ES/skills-guide.mdx +2 -3
  685. package/docs/content/locales/es-ES/template-plan.mdx +23 -7
  686. package/docs/content/locales/es-ES/tracking.mdx +1 -1
  687. package/docs/content/locales/es-ES/workspace-connections.mdx +1 -1
  688. package/docs/content/locales/fr-FR/cloneable-saas.mdx +0 -1
  689. package/docs/content/locales/fr-FR/plan-plugin.mdx +10 -9
  690. package/docs/content/locales/fr-FR/sharing.mdx +1 -2
  691. package/docs/content/locales/fr-FR/skills-guide.mdx +2 -3
  692. package/docs/content/locales/fr-FR/template-plan.mdx +23 -7
  693. package/docs/content/locales/fr-FR/tracking.mdx +1 -1
  694. package/docs/content/locales/fr-FR/workspace-connections.mdx +1 -1
  695. package/docs/content/locales/hi-IN/cloneable-saas.mdx +0 -1
  696. package/docs/content/locales/hi-IN/plan-plugin.mdx +10 -9
  697. package/docs/content/locales/hi-IN/sharing.mdx +1 -2
  698. package/docs/content/locales/hi-IN/skills-guide.mdx +2 -3
  699. package/docs/content/locales/hi-IN/template-plan.mdx +23 -7
  700. package/docs/content/locales/hi-IN/tracking.mdx +1 -1
  701. package/docs/content/locales/hi-IN/workspace-connections.mdx +1 -1
  702. package/docs/content/locales/ja-JP/cloneable-saas.mdx +0 -1
  703. package/docs/content/locales/ja-JP/plan-plugin.mdx +10 -9
  704. package/docs/content/locales/ja-JP/sharing.mdx +1 -2
  705. package/docs/content/locales/ja-JP/skills-guide.mdx +2 -3
  706. package/docs/content/locales/ja-JP/template-plan.mdx +23 -7
  707. package/docs/content/locales/ja-JP/tracking.mdx +1 -1
  708. package/docs/content/locales/ja-JP/workspace-connections.mdx +1 -1
  709. package/docs/content/locales/ko-KR/cloneable-saas.mdx +0 -1
  710. package/docs/content/locales/ko-KR/plan-plugin.mdx +10 -9
  711. package/docs/content/locales/ko-KR/sharing.mdx +1 -2
  712. package/docs/content/locales/ko-KR/skills-guide.mdx +2 -3
  713. package/docs/content/locales/ko-KR/template-plan.mdx +23 -7
  714. package/docs/content/locales/ko-KR/tracking.mdx +1 -1
  715. package/docs/content/locales/ko-KR/workspace-connections.mdx +1 -1
  716. package/docs/content/locales/pt-BR/cloneable-saas.mdx +0 -1
  717. package/docs/content/locales/pt-BR/plan-plugin.mdx +10 -9
  718. package/docs/content/locales/pt-BR/sharing.mdx +1 -2
  719. package/docs/content/locales/pt-BR/skills-guide.mdx +2 -3
  720. package/docs/content/locales/pt-BR/template-plan.mdx +23 -7
  721. package/docs/content/locales/pt-BR/tracking.mdx +1 -1
  722. package/docs/content/locales/pt-BR/workspace-connections.mdx +1 -1
  723. package/docs/content/locales/zh-CN/cloneable-saas.mdx +0 -1
  724. package/docs/content/locales/zh-CN/plan-plugin.mdx +10 -9
  725. package/docs/content/locales/zh-CN/sharing.mdx +1 -2
  726. package/docs/content/locales/zh-CN/skills-guide.mdx +2 -3
  727. package/docs/content/locales/zh-CN/template-plan.mdx +23 -7
  728. package/docs/content/locales/zh-CN/tracking.mdx +1 -1
  729. package/docs/content/locales/zh-CN/workspace-connections.mdx +1 -1
  730. package/docs/content/locales/zh-TW/cloneable-saas.mdx +0 -1
  731. package/docs/content/locales/zh-TW/plan-plugin.mdx +10 -9
  732. package/docs/content/locales/zh-TW/sharing.mdx +1 -2
  733. package/docs/content/locales/zh-TW/skills-guide.mdx +2 -3
  734. package/docs/content/locales/zh-TW/template-plan.mdx +23 -7
  735. package/docs/content/locales/zh-TW/tracking.mdx +1 -1
  736. package/docs/content/locales/zh-TW/workspace-connections.mdx +1 -1
  737. package/docs/content/plan-plugin.mdx +12 -11
  738. package/docs/content/sharing.mdx +1 -2
  739. package/docs/content/skills-guide.mdx +4 -3
  740. package/docs/content/template-plan.mdx +37 -6
  741. package/docs/content/tracking.mdx +1 -1
  742. package/docs/content/workspace-connections.mdx +1 -1
  743. package/package.json +6 -6
  744. package/src/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
  745. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
  746. package/src/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
  747. package/src/templates/default/package.json +3 -3
  748. package/src/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
  749. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
  750. package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
  751. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
  752. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
  753. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
  754. package/corpus/core/docs/content/locales/ar-SA/template-videos.mdx +0 -336
  755. package/corpus/core/docs/content/locales/de-DE/template-videos.mdx +0 -336
  756. package/corpus/core/docs/content/locales/es-ES/template-videos.mdx +0 -336
  757. package/corpus/core/docs/content/locales/fr-FR/template-videos.mdx +0 -336
  758. package/corpus/core/docs/content/locales/hi-IN/template-videos.mdx +0 -336
  759. package/corpus/core/docs/content/locales/ja-JP/template-videos.mdx +0 -336
  760. package/corpus/core/docs/content/locales/ko-KR/template-videos.mdx +0 -336
  761. package/corpus/core/docs/content/locales/pt-BR/template-videos.mdx +0 -336
  762. package/corpus/core/docs/content/locales/zh-CN/template-videos.mdx +0 -334
  763. package/corpus/core/docs/content/locales/zh-TW/template-videos.mdx +0 -334
  764. package/corpus/core/docs/content/template-videos.mdx +0 -332
  765. package/corpus/templates/design/app/components/design/CodeWorkbenchHost.tsx +0 -697
  766. package/corpus/templates/slides/app/components/editor/CodeEditor.tsx +0 -49
  767. package/corpus/templates/videos/.agents/skills/actions/SKILL.md +0 -432
  768. package/corpus/templates/videos/.agents/skills/animation-tracks/SKILL.md +0 -99
  769. package/corpus/templates/videos/.agents/skills/capture-learnings/SKILL.md +0 -76
  770. package/corpus/templates/videos/.agents/skills/composition-management/SKILL.md +0 -106
  771. package/corpus/templates/videos/.agents/skills/create-skill/SKILL.md +0 -221
  772. package/corpus/templates/videos/.agents/skills/delegate-to-agent/SKILL.md +0 -263
  773. package/corpus/templates/videos/.agents/skills/frontend-design/SKILL.md +0 -112
  774. package/corpus/templates/videos/.agents/skills/security/SKILL.md +0 -263
  775. package/corpus/templates/videos/.agents/skills/self-modifying-code/SKILL.md +0 -88
  776. package/corpus/templates/videos/.agents/skills/shadcn-ui/SKILL.md +0 -95
  777. package/corpus/templates/videos/.builder/ANIMATED_PROPERTIES.md +0 -335
  778. package/corpus/templates/videos/.builder/KEYFRAME_SYNC.md +0 -166
  779. package/corpus/templates/videos/.builder/SEAMLESS_SYNC.md +0 -211
  780. package/corpus/templates/videos/.builder/rules/deploy-app.mdc +0 -22
  781. package/corpus/templates/videos/.builder/rules/organize-ui.mdc +0 -9
  782. package/corpus/templates/videos/.builder/skills/remotion/SKILL.md +0 -29
  783. package/corpus/templates/videos/.builder/skills/remotion/rules/animations.md +0 -27
  784. package/corpus/templates/videos/.builder/skills/remotion/rules/assets.md +0 -43
  785. package/corpus/templates/videos/.builder/skills/remotion/rules/audio.md +0 -58
  786. package/corpus/templates/videos/.builder/skills/remotion/rules/compositions.md +0 -129
  787. package/corpus/templates/videos/.builder/skills/remotion/rules/fonts.md +0 -47
  788. package/corpus/templates/videos/.builder/skills/remotion/rules/images.md +0 -41
  789. package/corpus/templates/videos/.builder/skills/remotion/rules/parameters.md +0 -59
  790. package/corpus/templates/videos/.builder/skills/remotion/rules/sequencing.md +0 -54
  791. package/corpus/templates/videos/.builder/skills/remotion/rules/tailwind.md +0 -11
  792. package/corpus/templates/videos/.builder/skills/remotion/rules/text-animations.md +0 -18
  793. package/corpus/templates/videos/.builder/skills/remotion/rules/timing.md +0 -103
  794. package/corpus/templates/videos/.builder/skills/remotion/rules/transparent-videos.md +0 -35
  795. package/corpus/templates/videos/.builder/skills/remotion/rules/trimming.md +0 -38
  796. package/corpus/templates/videos/.builder/skills/remotion/rules/videos.md +0 -54
  797. package/corpus/templates/videos/.dockerignore +0 -62
  798. package/corpus/templates/videos/.env.example +0 -4
  799. package/corpus/templates/videos/.oxfmtrc.json +0 -8
  800. package/corpus/templates/videos/AGENTS.md +0 -46
  801. package/corpus/templates/videos/CHANGELOG.md +0 -10
  802. package/corpus/templates/videos/DEVELOPING.md +0 -143
  803. package/corpus/templates/videos/README.md +0 -33
  804. package/corpus/templates/videos/actions/analyze-brand-assets.ts +0 -151
  805. package/corpus/templates/videos/actions/apply-design-system.ts +0 -35
  806. package/corpus/templates/videos/actions/create-design-system.ts +0 -84
  807. package/corpus/templates/videos/actions/create-folder.ts +0 -48
  808. package/corpus/templates/videos/actions/db-connect.ts +0 -45
  809. package/corpus/templates/videos/actions/db-health.ts +0 -24
  810. package/corpus/templates/videos/actions/db-status.ts +0 -28
  811. package/corpus/templates/videos/actions/delete-composition.ts +0 -272
  812. package/corpus/templates/videos/actions/delete-folder.ts +0 -27
  813. package/corpus/templates/videos/actions/generate-animated-component.ts +0 -470
  814. package/corpus/templates/videos/actions/get-composition.ts +0 -36
  815. package/corpus/templates/videos/actions/get-design-system.ts +0 -35
  816. package/corpus/templates/videos/actions/import-code.ts +0 -67
  817. package/corpus/templates/videos/actions/import-design-project.ts +0 -42
  818. package/corpus/templates/videos/actions/import-document.ts +0 -125
  819. package/corpus/templates/videos/actions/import-from-url.ts +0 -18
  820. package/corpus/templates/videos/actions/import-github.ts +0 -182
  821. package/corpus/templates/videos/actions/list-compositions.ts +0 -32
  822. package/corpus/templates/videos/actions/list-design-systems.ts +0 -66
  823. package/corpus/templates/videos/actions/list-folders.ts +0 -61
  824. package/corpus/templates/videos/actions/move-composition-to-folder.ts +0 -59
  825. package/corpus/templates/videos/actions/navigate.ts +0 -40
  826. package/corpus/templates/videos/actions/rename-folder.ts +0 -41
  827. package/corpus/templates/videos/actions/run.ts +0 -2
  828. package/corpus/templates/videos/actions/save-composition.ts +0 -114
  829. package/corpus/templates/videos/actions/set-default-design-system.ts +0 -40
  830. package/corpus/templates/videos/actions/update-composition.ts +0 -81
  831. package/corpus/templates/videos/actions/update-design-system.ts +0 -68
  832. package/corpus/templates/videos/actions/validate-compositions.ts +0 -502
  833. package/corpus/templates/videos/actions/view-screen.ts +0 -48
  834. package/corpus/templates/videos/app/components/CameraControls.tsx +0 -442
  835. package/corpus/templates/videos/app/components/CameraToolbar.tsx +0 -437
  836. package/corpus/templates/videos/app/components/CloudUpgrade.tsx +0 -287
  837. package/corpus/templates/videos/app/components/CollabPresenceBar.tsx +0 -81
  838. package/corpus/templates/videos/app/components/CompSettingsEditor.tsx +0 -107
  839. package/corpus/templates/videos/app/components/ComponentLibrarySidebar.tsx +0 -457
  840. package/corpus/templates/videos/app/components/ComponentPropsPanel.tsx +0 -227
  841. package/corpus/templates/videos/app/components/ComponentsSidebar.tsx +0 -70
  842. package/corpus/templates/videos/app/components/CompositionCard.tsx +0 -147
  843. package/corpus/templates/videos/app/components/CurrentElementPanel.tsx +0 -835
  844. package/corpus/templates/videos/app/components/CursorControls.tsx +0 -664
  845. package/corpus/templates/videos/app/components/CursorPositioningOverlay.tsx +0 -238
  846. package/corpus/templates/videos/app/components/LibraryFolderRow.tsx +0 -235
  847. package/corpus/templates/videos/app/components/MotionCurveSelect.tsx +0 -61
  848. package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +0 -192
  849. package/corpus/templates/videos/app/components/PropsEditor.tsx +0 -210
  850. package/corpus/templates/videos/app/components/QuestionFlow.tsx +0 -40
  851. package/corpus/templates/videos/app/components/Sidebar.tsx +0 -609
  852. package/corpus/templates/videos/app/components/StudioHeader.tsx +0 -109
  853. package/corpus/templates/videos/app/components/Timeline.tsx +0 -2067
  854. package/corpus/templates/videos/app/components/TrackPropertiesPanel.tsx +0 -922
  855. package/corpus/templates/videos/app/components/TweaksPanel.tsx +0 -277
  856. package/corpus/templates/videos/app/components/VideoPlayer.tsx +0 -487
  857. package/corpus/templates/videos/app/components/design-system/DesignSystemCard.tsx +0 -134
  858. package/corpus/templates/videos/app/components/design-system/DesignSystemPreview.tsx +0 -176
  859. package/corpus/templates/videos/app/components/design-system/DesignSystemSetup.tsx +0 -707
  860. package/corpus/templates/videos/app/components/keyframes/KeyframeActionButtons.tsx +0 -78
  861. package/corpus/templates/videos/app/components/keyframes/KeyframeNavigation.tsx +0 -59
  862. package/corpus/templates/videos/app/components/keyframes/PropertyNumberInput.tsx +0 -56
  863. package/corpus/templates/videos/app/components/layout/Header.tsx +0 -64
  864. package/corpus/templates/videos/app/components/layout/HeaderActions.tsx +0 -84
  865. package/corpus/templates/videos/app/components/layout/Layout.tsx +0 -132
  866. package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +0 -180
  867. package/corpus/templates/videos/app/components/ui/accordion.tsx +0 -56
  868. package/corpus/templates/videos/app/components/ui/alert-dialog.tsx +0 -139
  869. package/corpus/templates/videos/app/components/ui/alert.tsx +0 -59
  870. package/corpus/templates/videos/app/components/ui/aspect-ratio.tsx +0 -5
  871. package/corpus/templates/videos/app/components/ui/avatar.tsx +0 -48
  872. package/corpus/templates/videos/app/components/ui/badge.tsx +0 -37
  873. package/corpus/templates/videos/app/components/ui/breadcrumb.tsx +0 -115
  874. package/corpus/templates/videos/app/components/ui/button.tsx +0 -57
  875. package/corpus/templates/videos/app/components/ui/calendar.tsx +0 -68
  876. package/corpus/templates/videos/app/components/ui/card.tsx +0 -86
  877. package/corpus/templates/videos/app/components/ui/carousel.tsx +0 -260
  878. package/corpus/templates/videos/app/components/ui/chart.tsx +0 -375
  879. package/corpus/templates/videos/app/components/ui/checkbox.tsx +0 -28
  880. package/corpus/templates/videos/app/components/ui/collapsible.tsx +0 -9
  881. package/corpus/templates/videos/app/components/ui/command.tsx +0 -154
  882. package/corpus/templates/videos/app/components/ui/context-menu.tsx +0 -202
  883. package/corpus/templates/videos/app/components/ui/dialog.tsx +0 -130
  884. package/corpus/templates/videos/app/components/ui/drawer.tsx +0 -116
  885. package/corpus/templates/videos/app/components/ui/dropdown-menu.tsx +0 -212
  886. package/corpus/templates/videos/app/components/ui/form.tsx +0 -177
  887. package/corpus/templates/videos/app/components/ui/hover-card.tsx +0 -27
  888. package/corpus/templates/videos/app/components/ui/input-otp.tsx +0 -69
  889. package/corpus/templates/videos/app/components/ui/input.tsx +0 -22
  890. package/corpus/templates/videos/app/components/ui/label.tsx +0 -24
  891. package/corpus/templates/videos/app/components/ui/menubar.tsx +0 -234
  892. package/corpus/templates/videos/app/components/ui/navigation-menu.tsx +0 -128
  893. package/corpus/templates/videos/app/components/ui/pagination.tsx +0 -121
  894. package/corpus/templates/videos/app/components/ui/popover.tsx +0 -44
  895. package/corpus/templates/videos/app/components/ui/progress.tsx +0 -26
  896. package/corpus/templates/videos/app/components/ui/radio-group.tsx +0 -42
  897. package/corpus/templates/videos/app/components/ui/resizable.tsx +0 -43
  898. package/corpus/templates/videos/app/components/ui/scroll-area.tsx +0 -46
  899. package/corpus/templates/videos/app/components/ui/select.tsx +0 -158
  900. package/corpus/templates/videos/app/components/ui/separator.tsx +0 -29
  901. package/corpus/templates/videos/app/components/ui/sheet.tsx +0 -160
  902. package/corpus/templates/videos/app/components/ui/sidebar.tsx +0 -782
  903. package/corpus/templates/videos/app/components/ui/skeleton.tsx +0 -15
  904. package/corpus/templates/videos/app/components/ui/slider.tsx +0 -26
  905. package/corpus/templates/videos/app/components/ui/sonner.tsx +0 -58
  906. package/corpus/templates/videos/app/components/ui/spinner.tsx +0 -17
  907. package/corpus/templates/videos/app/components/ui/switch.tsx +0 -27
  908. package/corpus/templates/videos/app/components/ui/table.tsx +0 -117
  909. package/corpus/templates/videos/app/components/ui/tabs.tsx +0 -53
  910. package/corpus/templates/videos/app/components/ui/textarea.tsx +0 -23
  911. package/corpus/templates/videos/app/components/ui/toast.tsx +0 -127
  912. package/corpus/templates/videos/app/components/ui/toaster.tsx +0 -33
  913. package/corpus/templates/videos/app/components/ui/toggle-group.tsx +0 -59
  914. package/corpus/templates/videos/app/components/ui/toggle.tsx +0 -43
  915. package/corpus/templates/videos/app/components/ui/tooltip.tsx +0 -30
  916. package/corpus/templates/videos/app/components/ui/use-toast.ts +0 -3
  917. package/corpus/templates/videos/app/config/constants.ts +0 -204
  918. package/corpus/templates/videos/app/contexts/CompositionContext.tsx +0 -437
  919. package/corpus/templates/videos/app/contexts/CurrentElementContext.tsx +0 -247
  920. package/corpus/templates/videos/app/contexts/PlaybackContext.tsx +0 -65
  921. package/corpus/templates/videos/app/contexts/TimelineContext.tsx +0 -433
  922. package/corpus/templates/videos/app/entry.client.tsx +0 -19
  923. package/corpus/templates/videos/app/entry.server.tsx +0 -10
  924. package/corpus/templates/videos/app/global.css +0 -171
  925. package/corpus/templates/videos/app/hooks/use-composition-collab.ts +0 -269
  926. package/corpus/templates/videos/app/hooks/use-composition-design-system.ts +0 -47
  927. package/corpus/templates/videos/app/hooks/use-database-compositions.ts +0 -144
  928. package/corpus/templates/videos/app/hooks/use-db-status.ts +0 -30
  929. package/corpus/templates/videos/app/hooks/use-design-systems.ts +0 -21
  930. package/corpus/templates/videos/app/hooks/use-folders.ts +0 -199
  931. package/corpus/templates/videos/app/hooks/use-mobile.tsx +0 -21
  932. package/corpus/templates/videos/app/hooks/use-navigation-state.ts +0 -52
  933. package/corpus/templates/videos/app/hooks/use-question-flow.ts +0 -14
  934. package/corpus/templates/videos/app/hooks/use-toast.ts +0 -188
  935. package/corpus/templates/videos/app/hooks/useUnsavedChanges.ts +0 -48
  936. package/corpus/templates/videos/app/i18n/ar-SA.ts +0 -446
  937. package/corpus/templates/videos/app/i18n/de-DE.ts +0 -470
  938. package/corpus/templates/videos/app/i18n/en-US.ts +0 -452
  939. package/corpus/templates/videos/app/i18n/es-ES.ts +0 -468
  940. package/corpus/templates/videos/app/i18n/fr-FR.ts +0 -469
  941. package/corpus/templates/videos/app/i18n/hi-IN.ts +0 -446
  942. package/corpus/templates/videos/app/i18n/index.ts +0 -34
  943. package/corpus/templates/videos/app/i18n/ja-JP.ts +0 -460
  944. package/corpus/templates/videos/app/i18n/ko-KR.ts +0 -453
  945. package/corpus/templates/videos/app/i18n/pt-BR.ts +0 -461
  946. package/corpus/templates/videos/app/i18n/zh-CN.ts +0 -437
  947. package/corpus/templates/videos/app/i18n/zh-TW.ts +0 -437
  948. package/corpus/templates/videos/app/lib/database-compositions.ts +0 -67
  949. package/corpus/templates/videos/app/lib/design-systems.ts +0 -234
  950. package/corpus/templates/videos/app/lib/tab-id.ts +0 -1
  951. package/corpus/templates/videos/app/lib/utils.ts +0 -1
  952. package/corpus/templates/videos/app/pages/ComponentLibrary.tsx +0 -134
  953. package/corpus/templates/videos/app/pages/ComponentLibraryView.tsx +0 -362
  954. package/corpus/templates/videos/app/pages/CompositionView.tsx +0 -715
  955. package/corpus/templates/videos/app/pages/DesignSystems.tsx +0 -180
  956. package/corpus/templates/videos/app/pages/Index.tsx +0 -258
  957. package/corpus/templates/videos/app/pages/NewComposition.tsx +0 -95
  958. package/corpus/templates/videos/app/pages/NotFound.tsx +0 -36
  959. package/corpus/templates/videos/app/remotion/CameraHost.tsx +0 -223
  960. package/corpus/templates/videos/app/remotion/animations/useElementAnimations.ts +0 -231
  961. package/corpus/templates/videos/app/remotion/componentRegistry.ts +0 -473
  962. package/corpus/templates/videos/app/remotion/components/AnimatedElement.tsx +0 -436
  963. package/corpus/templates/videos/app/remotion/components/InteractiveElement.tsx +0 -159
  964. package/corpus/templates/videos/app/remotion/components/InteractiveZoneEditor.tsx +0 -273
  965. package/corpus/templates/videos/app/remotion/compositions/BlankComposition.tsx +0 -204
  966. package/corpus/templates/videos/app/remotion/compositions/index.ts +0 -2
  967. package/corpus/templates/videos/app/remotion/createComponentCursorTrack.ts +0 -132
  968. package/corpus/templates/videos/app/remotion/docs/CURSOR_TRACKS.md +0 -285
  969. package/corpus/templates/videos/app/remotion/easingFunctions.ts +0 -255
  970. package/corpus/templates/videos/app/remotion/hooks/createInteractiveComposition.tsx +0 -283
  971. package/corpus/templates/videos/app/remotion/hooks/useCursorHistory.ts +0 -72
  972. package/corpus/templates/videos/app/remotion/hooks/useCursorTypeFromHover.ts +0 -35
  973. package/corpus/templates/videos/app/remotion/hooks/useEditableZones.tsx +0 -267
  974. package/corpus/templates/videos/app/remotion/hooks/useHoverAnimation.ts +0 -90
  975. package/corpus/templates/videos/app/remotion/hooks/useHoverAnimationSmooth.ts +0 -146
  976. package/corpus/templates/videos/app/remotion/hooks/useInteractiveComponent.ts +0 -711
  977. package/corpus/templates/videos/app/remotion/hooks/useRegisterInteractiveElement.ts +0 -56
  978. package/corpus/templates/videos/app/remotion/library-components/Button.tsx +0 -252
  979. package/corpus/templates/videos/app/remotion/library-components/Card.tsx +0 -241
  980. package/corpus/templates/videos/app/remotion/library-components/CodePanel.tsx +0 -1005
  981. package/corpus/templates/videos/app/remotion/library-components/FileItem.tsx +0 -196
  982. package/corpus/templates/videos/app/remotion/library-components/FolderItem.tsx +0 -199
  983. package/corpus/templates/videos/app/remotion/library-components/PrimaryButton.tsx +0 -177
  984. package/corpus/templates/videos/app/remotion/library-components/SecondaryButton.tsx +0 -167
  985. package/corpus/templates/videos/app/remotion/library-components/SectionHeader.tsx +0 -108
  986. package/corpus/templates/videos/app/remotion/library-components/TEMPLATE.tsx +0 -211
  987. package/corpus/templates/videos/app/remotion/library-components/index.ts +0 -10
  988. package/corpus/templates/videos/app/remotion/registry.ts +0 -91
  989. package/corpus/templates/videos/app/remotion/testing/animationTestUtils.ts +0 -366
  990. package/corpus/templates/videos/app/remotion/trackAnimation.ts +0 -179
  991. package/corpus/templates/videos/app/remotion/trackHelpers.ts +0 -110
  992. package/corpus/templates/videos/app/remotion/ui-components/Cursor.tsx +0 -182
  993. package/corpus/templates/videos/app/remotion/ui-components/InteractiveButton.tsx +0 -116
  994. package/corpus/templates/videos/app/remotion/ui-components/InteractiveCard.tsx +0 -126
  995. package/corpus/templates/videos/app/remotion/ui-components/index.ts +0 -16
  996. package/corpus/templates/videos/app/remotion/utils/animationHelpers.ts +0 -444
  997. package/corpus/templates/videos/app/remotion/utils/interactiveElements.ts +0 -235
  998. package/corpus/templates/videos/app/remotion/utils/springAnimation.ts +0 -76
  999. package/corpus/templates/videos/app/root.tsx +0 -165
  1000. package/corpus/templates/videos/app/routes/$.tsx +0 -10
  1001. package/corpus/templates/videos/app/routes/_index.tsx +0 -25
  1002. package/corpus/templates/videos/app/routes/c.$compositionId.tsx +0 -10
  1003. package/corpus/templates/videos/app/routes/components.tsx +0 -10
  1004. package/corpus/templates/videos/app/routes/design-systems.tsx +0 -10
  1005. package/corpus/templates/videos/app/routes/extensions.$id.$slug.tsx +0 -2
  1006. package/corpus/templates/videos/app/routes/extensions.$id.tsx +0 -5
  1007. package/corpus/templates/videos/app/routes/extensions._index.tsx +0 -5
  1008. package/corpus/templates/videos/app/routes/extensions.tsx +0 -5
  1009. package/corpus/templates/videos/app/routes/settings.tsx +0 -88
  1010. package/corpus/templates/videos/app/routes/team.tsx +0 -11
  1011. package/corpus/templates/videos/app/routes.ts +0 -4
  1012. package/corpus/templates/videos/app/state.ts +0 -77
  1013. package/corpus/templates/videos/app/types/elementAnimations.ts +0 -121
  1014. package/corpus/templates/videos/app/types.ts +0 -200
  1015. package/corpus/templates/videos/app/utils/compositionHelpers.ts +0 -445
  1016. package/corpus/templates/videos/app/utils/debug.ts +0 -63
  1017. package/corpus/templates/videos/app/utils/keyframeUtils.ts +0 -331
  1018. package/corpus/templates/videos/app/utils/timelineCoordinates.ts +0 -79
  1019. package/corpus/templates/videos/app/vite-env.d.ts +0 -6
  1020. package/corpus/templates/videos/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +0 -6
  1021. package/corpus/templates/videos/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +0 -6
  1022. package/corpus/templates/videos/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +0 -6
  1023. package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +0 -6
  1024. package/corpus/templates/videos/changelog/2026-06-29-video-layouts-adapt-when-the-agent-sidebar-is-open.md +0 -6
  1025. package/corpus/templates/videos/components.json +0 -20
  1026. package/corpus/templates/videos/data/sync-config.json +0 -3
  1027. package/corpus/templates/videos/docs/examples/create-composition.example.ts +0 -128
  1028. package/corpus/templates/videos/drizzle.config.ts +0 -3
  1029. package/corpus/templates/videos/learnings.defaults.md +0 -5
  1030. package/corpus/templates/videos/package.json +0 -114
  1031. package/corpus/templates/videos/public/agent-native-icon-dark.svg +0 -10
  1032. package/corpus/templates/videos/public/agent-native-icon-light.svg +0 -10
  1033. package/corpus/templates/videos/public/agent-native-logo-dark.svg +0 -21
  1034. package/corpus/templates/videos/public/agent-native-logo-light.svg +0 -21
  1035. package/corpus/templates/videos/public/favicon.svg +0 -1
  1036. package/corpus/templates/videos/public/icon-180.svg +0 -1
  1037. package/corpus/templates/videos/public/icon-192.svg +0 -1
  1038. package/corpus/templates/videos/public/icon-512.svg +0 -1
  1039. package/corpus/templates/videos/public/manifest.json +0 -21
  1040. package/corpus/templates/videos/public/placeholder.svg +0 -1
  1041. package/corpus/templates/videos/public/robots.txt +0 -14
  1042. package/corpus/templates/videos/react-router.config.ts +0 -7
  1043. package/corpus/templates/videos/server/db/index.ts +0 -37
  1044. package/corpus/templates/videos/server/db/schema.ts +0 -55
  1045. package/corpus/templates/videos/server/middleware/auth.ts +0 -15
  1046. package/corpus/templates/videos/server/plugins/agent-chat.ts +0 -29
  1047. package/corpus/templates/videos/server/plugins/auth.ts +0 -14
  1048. package/corpus/templates/videos/server/plugins/collab.ts +0 -11
  1049. package/corpus/templates/videos/server/plugins/core-routes.ts +0 -22
  1050. package/corpus/templates/videos/server/plugins/db.ts +0 -160
  1051. package/corpus/templates/videos/server/routes/[...page].get.ts +0 -5
  1052. package/corpus/templates/videos/server/routes/[...page].head.ts +0 -1
  1053. package/corpus/templates/videos/server/routes/api/save-composition-defaults.post.ts +0 -274
  1054. package/corpus/templates/videos/shared/api.ts +0 -75
  1055. package/corpus/templates/videos/ssr-entry.ts +0 -15
  1056. package/corpus/templates/videos/tsconfig.json +0 -21
  1057. package/corpus/templates/videos/vite.config.ts +0 -19
  1058. package/corpus/templates/videos/vitest.config.ts +0 -16
  1059. package/docs/content/locales/ar-SA/template-videos.mdx +0 -336
  1060. package/docs/content/locales/de-DE/template-videos.mdx +0 -336
  1061. package/docs/content/locales/es-ES/template-videos.mdx +0 -336
  1062. package/docs/content/locales/fr-FR/template-videos.mdx +0 -336
  1063. package/docs/content/locales/hi-IN/template-videos.mdx +0 -336
  1064. package/docs/content/locales/ja-JP/template-videos.mdx +0 -336
  1065. package/docs/content/locales/ko-KR/template-videos.mdx +0 -336
  1066. package/docs/content/locales/pt-BR/template-videos.mdx +0 -336
  1067. package/docs/content/locales/zh-CN/template-videos.mdx +0 -334
  1068. package/docs/content/locales/zh-TW/template-videos.mdx +0 -334
  1069. package/docs/content/template-videos.mdx +0 -332
@@ -1,4 +1,5 @@
1
1
  import { usePinchZoom, useT } from "@agent-native/core/client";
2
+ import { getDraftGeometryFromPoints } from "@shared/canvas-math";
2
3
  import { ensureCodeLayerNodeIdsInHtml } from "@shared/code-layer";
3
4
  import { useRef, useEffect, useCallback, useMemo, useState } from "react";
4
5
 
@@ -12,6 +13,7 @@ import {
12
13
  type CanvasPin,
13
14
  } from "@/components/visual-editor";
14
15
  import { sendToDesignAgentChat } from "@/lib/agent-chat";
16
+ import { cn } from "@/lib/utils";
15
17
 
16
18
  import { editorChromeBridgeScript } from "../../../.generated/bridge/editor-chrome.generated";
17
19
  import { embeddedWheelBridgeScript } from "../../../.generated/bridge/embedded-wheel.generated";
@@ -447,6 +449,14 @@ interface DesignCanvasProps {
447
449
  * needs the tracks so the bridge can interpolate values at each tick.
448
450
  */
449
451
  motionTracks?: MotionTrackWire[];
452
+ /**
453
+ * Timeline-level default easing applied to any keyframe that omits its own
454
+ * `ease`. Threaded to the motion-preview bridge alongside the tracks so the
455
+ * scrub/playback preview matches the persisted CSS (the compiler uses the
456
+ * same `defaultEase` fallback when emitting `animation-timing-function`).
457
+ * When omitted the bridge falls back to "ease".
458
+ */
459
+ motionDefaultEase?: string;
450
460
  /**
451
461
  * Explicit iframe width in pixels. When provided it overrides the width
452
462
  * derived from `deviceFrame`, enabling per-breakpoint preview (e.g. Mobile
@@ -485,6 +495,88 @@ interface DesignCanvasProps {
485
495
  nodeId: string;
486
496
  componentName: string;
487
497
  }) => void;
498
+ /**
499
+ * Figma-style click-to-place primitive creation while focused on a single
500
+ * screen. When set to a non-null tool, DesignCanvas mounts a transparent
501
+ * capture overlay above the iframe so pointer gestures draw a new
502
+ * primitive instead of reaching the iframe's own content/editor-chrome
503
+ * bridge. `null`/`undefined` fully restores prior (pre-creation-tool)
504
+ * behavior — the overlay never mounts.
505
+ */
506
+ activeCreationTool?: CreationTool | null;
507
+ /**
508
+ * Fired once per completed click or drag gesture while `activeCreationTool`
509
+ * is set. Geometry is in SCREEN-CONTENT coordinates — the screen's own
510
+ * pixel coordinate system, matching what `getDraftGeometryFromPoints` and
511
+ * `draftPrimitiveToInsert` already use in MultiScreenCanvas — NOT viewport
512
+ * pixels. The parent (DesignEditor) is responsible for turning this into a
513
+ * persisted primitive (see `appendCanvasPrimitiveToHtml` /
514
+ * `draftPrimitiveToInsert` on the overview side).
515
+ */
516
+ onCreatePrimitive?: (spec: CreatePrimitiveSpec) => void;
517
+ }
518
+
519
+ /** Creation tools supported by the single-screen click-to-place overlay. */
520
+ export type CreationTool =
521
+ | "rectangle"
522
+ | "ellipse"
523
+ | "line"
524
+ | "arrow"
525
+ | "text"
526
+ | "pen";
527
+
528
+ /**
529
+ * Geometry payload emitted by the single-screen creation overlay. Coordinates
530
+ * are always in screen-content space (see `activeCreationTool` doc above).
531
+ *
532
+ * - `rect` is present for rectangle/ellipse/text (a click uses a sensible
533
+ * default size; a drag uses the dragged bounds via
534
+ * `getDraftGeometryFromPoints`, matching MultiScreenCanvas).
535
+ * - `points` is present for line/arrow (always exactly 2 points) and for a
536
+ * pen click (a single start point — see the deferred multi-click pen note
537
+ * on the overlay component itself).
538
+ * - `fromClick` distinguishes a negligible-movement click (true) from a
539
+ * drag past the movement threshold (false), mirroring MultiScreenCanvas's
540
+ * own click-vs-drag draft creation semantics.
541
+ */
542
+ export interface CreatePrimitiveSpec {
543
+ tool: CreationTool;
544
+ rect?: { x: number; y: number; width: number; height: number };
545
+ points?: Array<{ x: number; y: number }>;
546
+ fromClick: boolean;
547
+ }
548
+
549
+ /**
550
+ * Converts a pointer position in viewport (client) coordinates into
551
+ * screen-content coordinates — the screen's own pixel coordinate system, as
552
+ * used by `getDraftGeometryFromPoints` / `draftPrimitiveToInsert` in
553
+ * MultiScreenCanvas.
554
+ *
555
+ * The iframe's rendered rect (`getBoundingClientRect()`) already reflects any
556
+ * outer zoom `transform: scale(...)` wrapper, while `iframe.clientWidth` /
557
+ * `iframe.clientHeight` are the raw (unscaled) layout size that equals the
558
+ * screen's own content pixel dimensions. Dividing out that ratio undoes the
559
+ * zoom scale, matching the scaleX/scaleY convention already used by the
560
+ * `element-contextmenu` bridge handler below.
561
+ */
562
+ export function getScreenContentPointFromClient(
563
+ clientX: number,
564
+ clientY: number,
565
+ iframeRect: { left: number; top: number; width: number; height: number },
566
+ iframeContentSize: { width: number; height: number },
567
+ ): { x: number; y: number } {
568
+ const scaleX =
569
+ iframeContentSize.width > 0
570
+ ? iframeRect.width / iframeContentSize.width
571
+ : 1;
572
+ const scaleY =
573
+ iframeContentSize.height > 0
574
+ ? iframeRect.height / iframeContentSize.height
575
+ : 1;
576
+ return {
577
+ x: (clientX - iframeRect.left) / (scaleX || 1),
578
+ y: (clientY - iframeRect.top) / (scaleY || 1),
579
+ };
488
580
  }
489
581
 
490
582
  function getExternalPreviewUrl(content: string): string | null {
@@ -683,9 +775,12 @@ export function DesignCanvas({
683
775
  commentContextLabel,
684
776
  onPrototypeNavigate,
685
777
  motionTracks,
778
+ motionDefaultEase,
686
779
  previewWidthPx,
687
780
  onComponentSourceJump,
688
781
  shaderFillPreview,
782
+ activeCreationTool = null,
783
+ onCreatePrimitive,
689
784
  }: DesignCanvasProps) {
690
785
  const t = useT();
691
786
  const iframeRef = useRef<HTMLIFrameElement>(null);
@@ -695,6 +790,40 @@ export function DesignCanvas({
695
790
  const runtimeReplacementContentRef = useRef(runtimeReplacementContent);
696
791
  const runtimeReplacementKeyRef = useRef(runtimeReplacementKey);
697
792
  const lastRuntimeReplacementKeyRef = useRef(runtimeReplacementKey);
793
+ // Bridge-ready handshake (see EDITOR_CHROME_BRIDGE_SCRIPT's
794
+ // agent-native:editor-chrome-ready post on install). One-shot commands —
795
+ // begin-text-edit, set-editor-chrome-scale, style-change, delete-element,
796
+ // replace-document-content — are fire-and-forget postMessages with no retry:
797
+ // if the iframe document is still loading (fresh srcdoc, screen switch, or a
798
+ // mid-flight reload) the bridge script hasn't attached its message listener
799
+ // yet and the command is silently dropped. replayIframeEditorState only
800
+ // re-sends steady-state selection/hover/tweak/motion values, never these
801
+ // one-shot commands, so a dropped one-shot never recovers on its own.
802
+ // Queue them here until ready fires (or the iframe finishes loading, as a
803
+ // fallback for older/interact-mode documents that never inject the chrome
804
+ // bridge and thus never post ready) and flush in order.
805
+ const bridgeReadyRef = useRef(false);
806
+ const pendingOneShotMessagesRef = useRef<unknown[]>([]);
807
+ const flushPendingOneShotMessages = useCallback(() => {
808
+ const iframe = iframeRef.current;
809
+ const win = iframe?.contentWindow;
810
+ if (!win) return;
811
+ const queued = pendingOneShotMessagesRef.current;
812
+ if (queued.length === 0) return;
813
+ pendingOneShotMessagesRef.current = [];
814
+ queued.forEach((message) => win.postMessage(message, "*"));
815
+ }, []);
816
+ const postOneShotBridgeMessage = useCallback((message: unknown) => {
817
+ const iframe = iframeRef.current;
818
+ const win = iframe?.contentWindow;
819
+ if (!win) return false;
820
+ if (!bridgeReadyRef.current) {
821
+ pendingOneShotMessagesRef.current.push(message);
822
+ return true;
823
+ }
824
+ win.postMessage(message, "*");
825
+ return true;
826
+ }, []);
698
827
  const [renderedContent, setRenderedContent] = useState(content);
699
828
  const [annotationPins, setAnnotationPins] = useState<CanvasPin[]>([]);
700
829
  const [pinSubmitSignal, setPinSubmitSignal] = useState(0);
@@ -865,6 +994,15 @@ export function DesignCanvas({
865
994
  if (previousContentKeyRef.current !== contentKey) {
866
995
  previousContentKeyRef.current = contentKey;
867
996
  lastRuntimeReplacementKeyRef.current = runtimeReplacementKey;
997
+ // A content-key change rebuilds srcdoc, which reloads the iframe with a
998
+ // brand-new document. The previous document's ready handshake (and any
999
+ // one-shot commands still queued against it) no longer apply — reset
1000
+ // synchronously here rather than on the iframe's `load` event, since
1001
+ // `load` fires AFTER the freshly (re)injected editor-chrome bridge script
1002
+ // has already run and posted its own new ready message; resetting on
1003
+ // `load` would incorrectly clobber that just-arrived ready signal.
1004
+ bridgeReadyRef.current = false;
1005
+ pendingOneShotMessagesRef.current = [];
868
1006
  setRenderedContent(content);
869
1007
  }
870
1008
  // Same-screen visual edits are already applied optimistically inside the
@@ -888,11 +1026,14 @@ export function DesignCanvas({
888
1026
  // outside Edit mode. The editor chrome bridge is omitted for Interact mode
889
1027
  // so preview/app users can interact with the app normally.
890
1028
  //
891
- // readOnly is intentionally NOT a dep here: the bridge is injected whenever
892
- // !interactMode and the initial __READ_ONLY__ placeholder is baked from the
893
- // *first* render only. After that, live readOnly changes flow through the
894
- // set-read-only postMessage (see the useEffect below) so switching the active
895
- // surface (board screen) never rebuilds srcdoc / reloads the iframe.
1029
+ // readOnly and editMode are intentionally NOT deps here: the bridge is
1030
+ // injected whenever !interactMode and the initial __READ_ONLY__ /
1031
+ // __TEXT_EDITING_ENABLED__ placeholders are baked from the *first* render
1032
+ // only (so first paint never flashes the wrong mode). After that, live
1033
+ // readOnly / editMode changes flow through the set-read-only and
1034
+ // set-text-editing-enabled postMessages (see the useEffects below) so
1035
+ // switching the active surface (board ↔ screen) or toggling Edit ⇄ Preview
1036
+ // never rebuilds srcdoc / reloads every screen iframe.
896
1037
  const srcdoc = useMemo(() => {
897
1038
  if (externalPreviewUrl) return undefined;
898
1039
  const editorChromeBridge = interactMode
@@ -917,12 +1058,20 @@ export function DesignCanvas({
917
1058
  "__EMBEDDED_WHEEL_FORWARDING_ENABLED__",
918
1059
  isEmbeddedFrame ? "true" : "false",
919
1060
  );
1061
+ // ALWAYS injected (like the other always-on bridges above) so
1062
+ // MultiScreenCanvas's cross-screen drag hit-testing
1063
+ // (agent-native:hit-test / agent-native:hit-test-result) resolves an
1064
+ // anchor+placement against this screen's live DOM too, not only the
1065
+ // static-fallback board thumbnails that call appendHitTestResponder.
1066
+ // Without this, a drop onto a live/active screen has no responder and
1067
+ // always falls through to the 50ms request timeout.
920
1068
  const bridgeToInject =
921
1069
  MOTION_PREVIEW_BRIDGE_SCRIPT +
922
1070
  SHADER_FILL_PREVIEW_BRIDGE_SCRIPT +
923
1071
  TWEAK_BRIDGE_SCRIPT +
924
1072
  ZOOM_BRIDGE_SCRIPT +
925
1073
  NAV_BRIDGE_SCRIPT +
1074
+ LIGHTWEIGHT_HIT_TEST_BRIDGE_SCRIPT +
926
1075
  embeddedWheelBridge +
927
1076
  editorChromeBridge;
928
1077
  const frameContent = getEmbeddedFrameDocumentContent({
@@ -954,10 +1103,10 @@ export function DesignCanvas({
954
1103
  // baked chrome scale. Live zoom updates flow through the set-editor-chrome-scale
955
1104
  // postMessage above. Including them here rebuilds srcdoc on every zoom commit,
956
1105
  // which reloads the iframe and flashes the screen content white.
957
- // readOnly is intentionally NOT a dep: live changes flow through set-read-only.
1106
+ // readOnly and editMode are intentionally NOT deps: live changes flow
1107
+ // through set-read-only / set-text-editing-enabled.
958
1108
  // eslint-disable-next-line react-hooks/exhaustive-deps
959
1109
  }, [
960
- editMode,
961
1110
  boardSurface,
962
1111
  externalPreviewUrl,
963
1112
  interactMode,
@@ -996,6 +1145,11 @@ export function DesignCanvas({
996
1145
  return;
997
1146
  }
998
1147
  if (!e.data || !e.data.type) return;
1148
+ if (e.data.type === "agent-native:editor-chrome-ready") {
1149
+ bridgeReadyRef.current = true;
1150
+ flushPendingOneShotMessages();
1151
+ return;
1152
+ }
999
1153
  if (e.data.type === "clear-selection") {
1000
1154
  onClearSelection?.();
1001
1155
  return;
@@ -1256,17 +1410,30 @@ export function DesignCanvas({
1256
1410
  const iframe = iframeRef.current;
1257
1411
  const scroll = scrollContainerRef.current;
1258
1412
  if (!iframe || !scroll) return;
1413
+ // Guard against non-finite values (NaN/undefined/string) before they
1414
+ // reach Math.max/Math.min/Math.exp — an unguarded NaN here would
1415
+ // propagate through nextZoom and silently break zoom (mirrors the
1416
+ // Number.isFinite-style validation the embedded-canvas-wheel sibling
1417
+ // handler above applies to its own wheel deltas/coordinates).
1418
+ const rawDeltaY = Number(e.data.deltaY);
1419
+ if (!Number.isFinite(rawDeltaY)) return;
1259
1420
  // Mirror usePinchZoom's algorithm here. We can't reliably re-dispatch
1260
1421
  // a synthetic WheelEvent to trigger the hook's listener — untrusted
1261
1422
  // events are inconsistent across browsers — so just compute the
1262
1423
  // next zoom directly using the same exponential factor + cursor-anchor
1263
1424
  // math. Clamp range matches the usePinchZoom call above (10–500).
1264
1425
  const currentZoom = zoomRef.current;
1265
- const clampedDelta = Math.max(-50, Math.min(50, e.data.deltaY));
1426
+ const clampedDelta = Math.max(-50, Math.min(50, rawDeltaY));
1266
1427
  const factor = Math.exp(-clampedDelta * 0.01);
1267
1428
  const nextZoom = Math.max(10, Math.min(500, currentZoom * factor));
1268
- if (nextZoom === currentZoom) return;
1429
+ if (!Number.isFinite(nextZoom) || nextZoom === currentZoom) return;
1269
1430
  if (deviceFrame === "none") {
1431
+ const rawClientX = Number(e.data.clientX);
1432
+ const rawClientY = Number(e.data.clientY);
1433
+ if (!Number.isFinite(rawClientX) || !Number.isFinite(rawClientY)) {
1434
+ onZoomChange(nextZoom);
1435
+ return;
1436
+ }
1270
1437
  // The iframe lives inside a `transform: scale(zoom/100)` wrapper, so
1271
1438
  // its visual scale relative to viewport is currentZoom / 100. Convert
1272
1439
  // the iframe-document point under the cursor → viewport point →
@@ -1274,8 +1441,8 @@ export function DesignCanvas({
1274
1441
  const iframeRect = iframe.getBoundingClientRect();
1275
1442
  const scrollRect = scroll.getBoundingClientRect();
1276
1443
  const scale = currentZoom / 100;
1277
- const viewportX = iframeRect.left + e.data.clientX * scale;
1278
- const viewportY = iframeRect.top + e.data.clientY * scale;
1444
+ const viewportX = iframeRect.left + rawClientX * scale;
1445
+ const viewportY = iframeRect.top + rawClientY * scale;
1279
1446
  const cx = viewportX - scrollRect.left + scroll.scrollLeft;
1280
1447
  const cy = viewportY - scrollRect.top + scroll.scrollTop;
1281
1448
  const ratio = nextZoom / currentZoom;
@@ -1315,6 +1482,7 @@ export function DesignCanvas({
1315
1482
  isEmbeddedFrame,
1316
1483
  sourceType,
1317
1484
  fusionUrl,
1485
+ flushPendingOneShotMessages,
1318
1486
  ]);
1319
1487
 
1320
1488
  const replayIframeEditorState = useCallback(() => {
@@ -1362,7 +1530,11 @@ export function DesignCanvas({
1362
1530
  // Re-send motion tracks so the preview bridge is ready after a reload.
1363
1531
  if (motionTracks && motionTracks.length > 0) {
1364
1532
  iframe.contentWindow?.postMessage(
1365
- { type: "motion-load-tracks", tracks: motionTracks },
1533
+ {
1534
+ type: "motion-load-tracks",
1535
+ tracks: motionTracks,
1536
+ defaultEase: motionDefaultEase,
1537
+ },
1366
1538
  "*",
1367
1539
  );
1368
1540
  } else {
@@ -1392,6 +1564,7 @@ export function DesignCanvas({
1392
1564
  hiddenSelectors,
1393
1565
  lockedSelectors,
1394
1566
  motionTracks,
1567
+ motionDefaultEase,
1395
1568
  scaleMode,
1396
1569
  selectedSelector,
1397
1570
  selectedSelectorCandidates,
@@ -1411,6 +1584,27 @@ export function DesignCanvas({
1411
1584
  return () => iframe.removeEventListener("load", replayIframeEditorState);
1412
1585
  }, [replayIframeEditorState]);
1413
1586
 
1587
+ // Fallback for documents that never inject the editor-chrome bridge (e.g.
1588
+ // interactMode, or an external-preview iframe where srcdoc is undefined):
1589
+ // those never post agent-native:editor-chrome-ready, so nothing would ever
1590
+ // flush a queued one-shot command. Treat the iframe's `load` event as an
1591
+ // implicit ready in that case — the queued commands (begin-text-edit,
1592
+ // style-change, delete-element, replace-document-content) target the
1593
+ // editor-chrome bridge's own message handlers, so with no chrome bridge
1594
+ // present there is nothing that would have handled them regardless; this
1595
+ // just prevents the queue from growing unbounded across repeated reloads.
1596
+ useEffect(() => {
1597
+ const iframe = iframeRef.current;
1598
+ if (!iframe) return;
1599
+ function handleLoadReadyFallback() {
1600
+ if (bridgeReadyRef.current) return;
1601
+ bridgeReadyRef.current = true;
1602
+ flushPendingOneShotMessages();
1603
+ }
1604
+ iframe.addEventListener("load", handleLoadReadyFallback);
1605
+ return () => iframe.removeEventListener("load", handleLoadReadyFallback);
1606
+ }, [flushPendingOneShotMessages]);
1607
+
1414
1608
  useEffect(() => {
1415
1609
  if (clearSelectionRequest === undefined) return;
1416
1610
  iframeRef.current?.contentWindow?.postMessage(
@@ -1429,11 +1623,15 @@ export function DesignCanvas({
1429
1623
  win.postMessage({ type: "motion-preview-clear" }, "*");
1430
1624
  } else {
1431
1625
  win.postMessage(
1432
- { type: "motion-load-tracks", tracks: motionTracks },
1626
+ {
1627
+ type: "motion-load-tracks",
1628
+ tracks: motionTracks,
1629
+ defaultEase: motionDefaultEase,
1630
+ },
1433
1631
  "*",
1434
1632
  );
1435
1633
  }
1436
- }, [motionTracks]);
1634
+ }, [motionTracks, motionDefaultEase]);
1437
1635
 
1438
1636
  // Sync shader-fill preview to the iframe whenever the prop changes.
1439
1637
  // When cleared (null / undefined) send a clear message so the bridge
@@ -1461,16 +1659,16 @@ export function DesignCanvas({
1461
1659
  // overview zoom settles. This is intentionally separate from the srcdoc build so
1462
1660
  // a scale change never rebuilds srcdoc / reloads the iframe (which flashes the
1463
1661
  // content white). The baked __EDITOR_CHROME_SCALE__ values cover first paint.
1662
+ // Routed through the one-shot queue too: a zoom settle that lands while the
1663
+ // iframe is mid-reload would otherwise be silently dropped, leaving the
1664
+ // chrome at a stale scale until the next zoom change.
1464
1665
  useEffect(() => {
1465
- iframeRef.current?.contentWindow?.postMessage(
1466
- {
1467
- type: "set-editor-chrome-scale",
1468
- scaleX: editorChromeScaleX,
1469
- scaleY: editorChromeScaleY,
1470
- },
1471
- "*",
1472
- );
1473
- }, [editorChromeScaleX, editorChromeScaleY]);
1666
+ postOneShotBridgeMessage({
1667
+ type: "set-editor-chrome-scale",
1668
+ scaleX: editorChromeScaleX,
1669
+ scaleY: editorChromeScaleY,
1670
+ });
1671
+ }, [editorChromeScaleX, editorChromeScaleY, postOneShotBridgeMessage]);
1474
1672
 
1475
1673
  // Sync readOnly to the bridge IN-PLACE via postMessage so switching the active
1476
1674
  // surface (board ↔ screen) does not rebuild srcdoc / reload the iframe.
@@ -1495,6 +1693,34 @@ export function DesignCanvas({
1495
1693
  // eslint-disable-next-line react-hooks/exhaustive-deps
1496
1694
  }, [readOnly]);
1497
1695
 
1696
+ // Sync editMode to the bridge IN-PLACE via postMessage so toggling Edit ⇄
1697
+ // Preview does not rebuild srcdoc / reload every screen iframe (which was
1698
+ // PF21: __TEXT_EDITING_ENABLED__ used to be baked into srcdoc, so flipping
1699
+ // edit/preview mode reloaded every iframe — white flash + lost in-iframe
1700
+ // Alpine state). The initial baked __TEXT_EDITING_ENABLED__ placeholder
1701
+ // covers first paint; subsequent changes arrive here. Also re-send on
1702
+ // iframe load so the bridge is in sync after any content-key-driven reload.
1703
+ const editModeRef = useRef(editMode);
1704
+ editModeRef.current = editMode;
1705
+ useEffect(() => {
1706
+ const iframe = iframeRef.current;
1707
+ if (!iframe) return;
1708
+ function sendTextEditingEnabled() {
1709
+ iframe!.contentWindow?.postMessage(
1710
+ {
1711
+ type: "set-text-editing-enabled",
1712
+ enabled: editModeRef.current,
1713
+ },
1714
+ "*",
1715
+ );
1716
+ }
1717
+ sendTextEditingEnabled();
1718
+ iframe.addEventListener("load", sendTextEditingEnabled);
1719
+ return () => iframe.removeEventListener("load", sendTextEditingEnabled);
1720
+ // Only re-run when editMode changes; iframe identity is stable.
1721
+ // eslint-disable-next-line react-hooks/exhaustive-deps
1722
+ }, [editMode]);
1723
+
1498
1724
  /**
1499
1725
  * Trigger immediate text-editing mode for a specific node inside the iframe,
1500
1726
  * identified by its data-agent-native-node-id value. Call this after
@@ -1504,14 +1730,18 @@ export function DesignCanvas({
1504
1730
  * Posts { type: 'begin-text-edit', nodeId } to the iframe bridge.
1505
1731
  * The bridge enters the same contenteditable text-editing path used on dblclick.
1506
1732
  */
1507
- const beginTextEdit = useCallback((nodeId: string) => {
1508
- const iframe = iframeRef.current;
1509
- if (!iframe?.contentWindow || !nodeId) return;
1510
- iframe.contentWindow.postMessage(
1511
- { type: "begin-text-edit", nodeId, force: true },
1512
- "*",
1513
- );
1514
- }, []);
1733
+ const beginTextEdit = useCallback(
1734
+ (nodeId: string) => {
1735
+ const iframe = iframeRef.current;
1736
+ if (!iframe?.contentWindow || !nodeId) return;
1737
+ postOneShotBridgeMessage({
1738
+ type: "begin-text-edit",
1739
+ nodeId,
1740
+ force: true,
1741
+ });
1742
+ },
1743
+ [postOneShotBridgeMessage],
1744
+ );
1515
1745
 
1516
1746
  const sendStyleChange = useCallback(
1517
1747
  (
@@ -1522,19 +1752,16 @@ export function DesignCanvas({
1522
1752
  ) => {
1523
1753
  const iframe = iframeRef.current;
1524
1754
  if (!iframe?.contentWindow) return;
1525
- iframe.contentWindow.postMessage(
1526
- {
1527
- type: "style-change",
1528
- selector,
1529
- property,
1530
- value,
1531
- selectorCandidates: options?.selectorCandidates ?? [],
1532
- nodeId: options?.nodeId ?? "",
1533
- },
1534
- "*",
1535
- );
1755
+ postOneShotBridgeMessage({
1756
+ type: "style-change",
1757
+ selector,
1758
+ property,
1759
+ value,
1760
+ selectorCandidates: options?.selectorCandidates ?? [],
1761
+ nodeId: options?.nodeId ?? "",
1762
+ });
1536
1763
  },
1537
- [],
1764
+ [postOneShotBridgeMessage],
1538
1765
  );
1539
1766
 
1540
1767
  /**
@@ -1601,19 +1828,15 @@ export function DesignCanvas({
1601
1828
  ) => {
1602
1829
  const iframe = iframeRef.current;
1603
1830
  if (!iframe?.contentWindow) return false;
1604
- iframe.contentWindow.postMessage(
1605
- {
1606
- type: "replace-document-content",
1607
- content: nextContent,
1608
- selectedSelector: selector ?? "",
1609
- selectorCandidates: candidates ?? [],
1610
- forceFullDocument: options?.forceFullDocument === true,
1611
- },
1612
- "*",
1613
- );
1614
- return true;
1831
+ return postOneShotBridgeMessage({
1832
+ type: "replace-document-content",
1833
+ content: nextContent,
1834
+ selectedSelector: selector ?? "",
1835
+ selectorCandidates: candidates ?? [],
1836
+ forceFullDocument: options?.forceFullDocument === true,
1837
+ });
1615
1838
  },
1616
- [],
1839
+ [postOneShotBridgeMessage],
1617
1840
  );
1618
1841
 
1619
1842
  const replaceRuntimeContentInPlace = useCallback(
@@ -1680,17 +1903,13 @@ export function DesignCanvas({
1680
1903
  (selector?: string | null, candidates?: string[]) => {
1681
1904
  const iframe = iframeRef.current;
1682
1905
  if (!iframe?.contentWindow) return false;
1683
- iframe.contentWindow.postMessage(
1684
- {
1685
- type: "delete-element",
1686
- selector: selector ?? "",
1687
- selectorCandidates: candidates ?? [],
1688
- },
1689
- "*",
1690
- );
1691
- return true;
1906
+ return postOneShotBridgeMessage({
1907
+ type: "delete-element",
1908
+ selector: selector ?? "",
1909
+ selectorCandidates: candidates ?? [],
1910
+ });
1692
1911
  },
1693
- [],
1912
+ [postOneShotBridgeMessage],
1694
1913
  );
1695
1914
 
1696
1915
  // Expose iframe runtime mutations for the editor orchestrator.
@@ -1826,7 +2045,29 @@ export function DesignCanvas({
1826
2045
  sandbox={
1827
2046
  externalPreviewUrl
1828
2047
  ? "allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox allow-same-origin"
1829
- : "allow-scripts allow-popups allow-popups-to-escape-sandbox allow-same-origin"
2048
+ : // NOTE(security): allow-same-origin is still present on this
2049
+ // branch (the inline srcdoc iframe, where agent/user-generated
2050
+ // design HTML executes) even though allow-scripts +
2051
+ // allow-same-origin together defeat the sandbox in principle.
2052
+ // This is a deliberate, currently-blocked tradeoff, not an
2053
+ // oversight — see the long comment above DesignCanvasProps /
2054
+ // sourceType for the security model, and the PNG/SVG export
2055
+ // handlers in DesignEditor.tsx (handleDownloadPng /
2056
+ // handleDownloadSvg). Those handlers read this same iframe's
2057
+ // `contentDocument` directly and hand the LIVE document element
2058
+ // to html2canvas, and read live CSSOM (getComputedStyle,
2059
+ // doc.styleSheets) for SVG serialization. That cannot be
2060
+ // expressed over the postMessage bridge without moving
2061
+ // html2canvas execution and CSSOM-dependent serialization logic
2062
+ // INTO the sandboxed iframe itself — a separate, larger rewrite,
2063
+ // not a bridge-handler addition. All other former
2064
+ // `contentDocument`/`contentWindow.document` reads on this
2065
+ // iframe (e.g. text-edit-status) now go through bridge
2066
+ // request/response postMessage handlers in
2067
+ // editor-chrome.bridge.ts and no longer need allow-same-origin.
2068
+ // Do not remove this flag until PNG/SVG export is rebuilt to run
2069
+ // inside the iframe.
2070
+ "allow-scripts allow-popups allow-popups-to-escape-sandbox allow-same-origin"
1830
2071
  }
1831
2072
  data-design-preview-iframe
1832
2073
  data-screen-iframe-id={
@@ -1845,6 +2086,18 @@ export function DesignCanvas({
1845
2086
  }}
1846
2087
  title={t("designEditor.designPreview")}
1847
2088
  />
2089
+ {/* Single-screen click-to-place creation overlay — sits over the
2090
+ iframe, NOT inside it, mirroring the SharedDrawOverlay pattern
2091
+ below. Only mounts while a creation tool is active so it never
2092
+ changes existing behavior otherwise (T14: single-screen mode
2093
+ previously had no creation capability at all). */}
2094
+ {activeCreationTool ? (
2095
+ <SingleScreenCreationOverlay
2096
+ tool={activeCreationTool}
2097
+ iframeRef={iframeRef}
2098
+ onCreatePrimitive={onCreatePrimitive}
2099
+ />
2100
+ ) : null}
1848
2101
  {waitingForEditableExternalSnapshot ? (
1849
2102
  <div className="pointer-events-none absolute inset-0 z-10 flex items-center justify-center bg-background/85 px-4 text-center text-sm text-muted-foreground">
1850
2103
  <div className="max-w-[28rem] rounded-md border bg-card px-4 py-3 shadow-sm">
@@ -2020,3 +2273,284 @@ export function DesignCanvas({
2020
2273
  </div>
2021
2274
  );
2022
2275
  }
2276
+
2277
+ /** Minimum pointer movement (in viewport/client px) before a pointerdown→up
2278
+ * gesture counts as a drag instead of a click. Matches the small-threshold
2279
+ * click-vs-drag convention used elsewhere in the editor (e.g. marquee-vs-
2280
+ * click hit-testing) rather than MultiScreenCanvas's own canvas-space
2281
+ * threshold, since this overlay only ever sees viewport-space pointer
2282
+ * events. */
2283
+ const CREATION_CLICK_MOVE_THRESHOLD_PX = 4;
2284
+
2285
+ /** Default click-to-place sizes, in screen-content px, for tools that need a
2286
+ * sensible size when the user clicks instead of drags. Mirrors
2287
+ * MultiScreenCanvas's own DRAFT_*_WIDTH/HEIGHT defaults closely enough for
2288
+ * single-screen placement (kept local — those constants aren't exported). */
2289
+ const CREATION_DEFAULT_SIZE: Record<
2290
+ Exclude<CreationTool, "line" | "arrow" | "pen">,
2291
+ { width: number; height: number }
2292
+ > = {
2293
+ rectangle: { width: 160, height: 100 },
2294
+ ellipse: { width: 120, height: 120 },
2295
+ text: { width: 160, height: 32 },
2296
+ };
2297
+
2298
+ /** Default line/arrow length (screen-content px) for a click (no drag). */
2299
+ const CREATION_DEFAULT_LINE_LENGTH = 120;
2300
+
2301
+ interface CreationDragState {
2302
+ tool: CreationTool;
2303
+ /** Screen-content coordinates of the initial pointerdown. */
2304
+ startContent: { x: number; y: number };
2305
+ /** Screen-content coordinates of the latest pointer position. */
2306
+ currentContent: { x: number; y: number };
2307
+ /** Viewport (client) coordinates of the initial pointerdown — kept
2308
+ * alongside startContent so the click-vs-drag movement threshold can be
2309
+ * measured in client space (a constant visual distance regardless of
2310
+ * zoom) without re-deriving it from content-space coordinates. */
2311
+ startClient: { x: number; y: number };
2312
+ pointerId: number;
2313
+ moved: boolean;
2314
+ }
2315
+
2316
+ interface SingleScreenCreationOverlayProps {
2317
+ tool: CreationTool;
2318
+ iframeRef: React.RefObject<HTMLIFrameElement | null>;
2319
+ onCreatePrimitive?: (spec: CreatePrimitiveSpec) => void;
2320
+ }
2321
+
2322
+ /**
2323
+ * Figma-style click-to-place creation overlay for single-screen mode.
2324
+ *
2325
+ * Mounts a transparent, `pointer-events: auto` surface above the iframe
2326
+ * (matching the `SharedDrawOverlay` mount pattern) that intercepts pointer
2327
+ * gestures instead of letting them reach the iframe's own content/editor-
2328
+ * chrome bridge. A pointerdown→move→up past `CREATION_CLICK_MOVE_THRESHOLD_PX`
2329
+ * is treated as a drag (draws a rect/line via `getDraftGeometryFromPoints`,
2330
+ * the same helper MultiScreenCanvas uses for overview drafts); a
2331
+ * pointerdown→up with negligible movement is treated as a click (places a
2332
+ * default-sized primitive, or for pen, starts a path at that point).
2333
+ *
2334
+ * Deferred: multi-click pen path authoring. In single-screen mode a single
2335
+ * click emits `points: [point], fromClick: true` so the parent can start a
2336
+ * pen path (matching MultiScreenCanvas's click-to-start behavior), but there
2337
+ * is no in-overlay support yet for adding further anchor points before
2338
+ * committing — that's a follow-up once the parent's pen-path commit flow is
2339
+ * wired for single-screen. This intentionally never force-switches to
2340
+ * overview to get full pen authoring.
2341
+ */
2342
+ function SingleScreenCreationOverlay({
2343
+ tool,
2344
+ iframeRef,
2345
+ onCreatePrimitive,
2346
+ }: SingleScreenCreationOverlayProps) {
2347
+ const [drag, setDrag] = useState<CreationDragState | null>(null);
2348
+ const dragRef = useRef<CreationDragState | null>(null);
2349
+
2350
+ const toContentPoint = useCallback(
2351
+ (clientX: number, clientY: number) => {
2352
+ const iframe = iframeRef.current;
2353
+ const rect = iframe?.getBoundingClientRect();
2354
+ if (!iframe || !rect) return { x: clientX, y: clientY };
2355
+ return getScreenContentPointFromClient(clientX, clientY, rect, {
2356
+ width: iframe.clientWidth,
2357
+ height: iframe.clientHeight,
2358
+ });
2359
+ },
2360
+ [iframeRef],
2361
+ );
2362
+
2363
+ const emit = useCallback(
2364
+ (state: CreationDragState) => {
2365
+ if (!onCreatePrimitive) return;
2366
+ const { tool: activeTool, startContent, currentContent, moved } = state;
2367
+
2368
+ if (activeTool === "line" || activeTool === "arrow") {
2369
+ const end = moved
2370
+ ? currentContent
2371
+ : {
2372
+ x: startContent.x + CREATION_DEFAULT_LINE_LENGTH,
2373
+ y: startContent.y,
2374
+ };
2375
+ onCreatePrimitive({
2376
+ tool: activeTool,
2377
+ points: [startContent, end],
2378
+ fromClick: !moved,
2379
+ });
2380
+ return;
2381
+ }
2382
+
2383
+ if (activeTool === "pen") {
2384
+ // Deferred: multi-click pen authoring (see component doc comment).
2385
+ // A click starts a path; a drag is treated the same as a click for
2386
+ // now — only the start point is emitted.
2387
+ onCreatePrimitive({
2388
+ tool: "pen",
2389
+ points: [startContent],
2390
+ fromClick: true,
2391
+ });
2392
+ return;
2393
+ }
2394
+
2395
+ if (!moved) {
2396
+ const size = CREATION_DEFAULT_SIZE[activeTool];
2397
+ onCreatePrimitive({
2398
+ tool: activeTool,
2399
+ rect: {
2400
+ x: startContent.x,
2401
+ y: startContent.y,
2402
+ width: size.width,
2403
+ height: size.height,
2404
+ },
2405
+ fromClick: true,
2406
+ });
2407
+ return;
2408
+ }
2409
+
2410
+ const geometry = getDraftGeometryFromPoints(
2411
+ startContent,
2412
+ currentContent,
2413
+ {
2414
+ minWidth: activeTool === "text" ? 24 : 8,
2415
+ minHeight: activeTool === "text" ? 18 : 8,
2416
+ defaultWidth: CREATION_DEFAULT_SIZE[activeTool].width,
2417
+ defaultHeight: CREATION_DEFAULT_SIZE[activeTool].height,
2418
+ },
2419
+ );
2420
+ onCreatePrimitive({
2421
+ tool: activeTool,
2422
+ rect: geometry,
2423
+ fromClick: false,
2424
+ });
2425
+ },
2426
+ [onCreatePrimitive],
2427
+ );
2428
+
2429
+ const handlePointerDown = useCallback(
2430
+ (e: React.PointerEvent<HTMLDivElement>) => {
2431
+ if (e.button !== 0) return;
2432
+ const point = toContentPoint(e.clientX, e.clientY);
2433
+ const next: CreationDragState = {
2434
+ tool,
2435
+ startContent: point,
2436
+ currentContent: point,
2437
+ startClient: { x: e.clientX, y: e.clientY },
2438
+ pointerId: e.pointerId,
2439
+ moved: false,
2440
+ };
2441
+ dragRef.current = next;
2442
+ setDrag(next);
2443
+ (e.target as HTMLElement).setPointerCapture(e.pointerId);
2444
+ },
2445
+ [tool, toContentPoint],
2446
+ );
2447
+
2448
+ const handlePointerMove = useCallback(
2449
+ (e: React.PointerEvent<HTMLDivElement>) => {
2450
+ const current = dragRef.current;
2451
+ if (!current || current.pointerId !== e.pointerId) return;
2452
+ // Movement threshold measured in client (viewport) space — a constant
2453
+ // visual distance regardless of zoom — rather than screen-content
2454
+ // space, which would need dividing by scale to mean the same thing at
2455
+ // every zoom level.
2456
+ const movedPastThreshold =
2457
+ Math.hypot(
2458
+ e.clientX - current.startClient.x,
2459
+ e.clientY - current.startClient.y,
2460
+ ) > CREATION_CLICK_MOVE_THRESHOLD_PX;
2461
+ const point = toContentPoint(e.clientX, e.clientY);
2462
+ const next: CreationDragState = {
2463
+ ...current,
2464
+ currentContent: point,
2465
+ moved: current.moved || movedPastThreshold,
2466
+ };
2467
+ dragRef.current = next;
2468
+ setDrag(next);
2469
+ },
2470
+ [toContentPoint],
2471
+ );
2472
+
2473
+ const handlePointerUp = useCallback(
2474
+ (e: React.PointerEvent<HTMLDivElement>) => {
2475
+ const current = dragRef.current;
2476
+ if (!current || current.pointerId !== e.pointerId) return;
2477
+ dragRef.current = null;
2478
+ setDrag(null);
2479
+ emit(current);
2480
+ },
2481
+ [emit],
2482
+ );
2483
+
2484
+ const handlePointerCancel = useCallback(
2485
+ (e: React.PointerEvent<HTMLDivElement>) => {
2486
+ const current = dragRef.current;
2487
+ if (!current || current.pointerId !== e.pointerId) return;
2488
+ dragRef.current = null;
2489
+ setDrag(null);
2490
+ },
2491
+ [],
2492
+ );
2493
+
2494
+ const cursorClass = tool === "text" ? "cursor-text" : "cursor-crosshair";
2495
+ const isLineTool = tool === "line" || tool === "arrow";
2496
+
2497
+ // Live drag preview, converted back from screen-content space to the
2498
+ // overlay's own (unscaled, layout-space) coordinates. The overlay div is
2499
+ // sized to the iframe's layout box (via inset-0 on a wrapper that already
2500
+ // matches iframe.clientWidth/Height 1:1 before the outer zoom transform),
2501
+ // so screen-content coordinates ARE this overlay's local coordinates —
2502
+ // no extra scale conversion is needed for the preview's own CSS position.
2503
+ const previewRect =
2504
+ drag && drag.moved && !isLineTool && tool !== "pen"
2505
+ ? getDraftGeometryFromPoints(drag.startContent, drag.currentContent, {
2506
+ minWidth: tool === "text" ? 24 : 8,
2507
+ minHeight: tool === "text" ? 18 : 8,
2508
+ })
2509
+ : null;
2510
+ const previewLine =
2511
+ drag && drag.moved && isLineTool
2512
+ ? { start: drag.startContent, end: drag.currentContent }
2513
+ : null;
2514
+
2515
+ return (
2516
+ <div
2517
+ data-design-canvas-creation-overlay
2518
+ data-creation-tool={tool}
2519
+ className={cn("absolute inset-0 z-20 pointer-events-auto", cursorClass)}
2520
+ onPointerDown={handlePointerDown}
2521
+ onPointerMove={handlePointerMove}
2522
+ onPointerUp={handlePointerUp}
2523
+ onPointerCancel={handlePointerCancel}
2524
+ >
2525
+ {previewRect ? (
2526
+ <div
2527
+ data-creation-preview-rect
2528
+ className="pointer-events-none absolute rounded-[2px] border-[1.5px] border-[var(--design-editor-accent-color)] bg-[var(--design-editor-accent-color)]/10"
2529
+ style={{
2530
+ left: previewRect.x,
2531
+ top: previewRect.y,
2532
+ width: Math.max(1, previewRect.width),
2533
+ height: Math.max(1, previewRect.height),
2534
+ borderRadius: tool === "ellipse" ? "9999px" : undefined,
2535
+ }}
2536
+ />
2537
+ ) : null}
2538
+ {previewLine ? (
2539
+ <svg
2540
+ data-creation-preview-line
2541
+ className="pointer-events-none absolute inset-0 h-full w-full overflow-visible"
2542
+ >
2543
+ <line
2544
+ x1={previewLine.start.x}
2545
+ y1={previewLine.start.y}
2546
+ x2={previewLine.end.x}
2547
+ y2={previewLine.end.y}
2548
+ stroke="var(--design-editor-accent-color)"
2549
+ strokeWidth={2}
2550
+ strokeDasharray="4 3"
2551
+ />
2552
+ </svg>
2553
+ ) : null}
2554
+ </div>
2555
+ );
2556
+ }