@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
@@ -30,8 +30,25 @@ declare var __DESIGN_CANVAS_SCREEN_ID__: string;
30
30
  declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
31
31
 
32
32
  (function () {
33
+ // Idempotency guard: replace-document-content / srcdoc rebuilds can end up
34
+ // re-injecting this script into a document where a previous instance's
35
+ // listeners, overlays, and observers are still alive (e.g. a head-only
36
+ // content swap in replaceRuntimeDocument that preserves persistent overlay
37
+ // nodes but re-runs inline <script> tags). Without this, a second instance
38
+ // would double-post every message and double-attach every document-level
39
+ // listener. Bail out entirely if an instance is already installed.
40
+ if ((window as any).__anEditorChromeBridge) return;
41
+ (window as any).__anEditorChromeBridge = true;
42
+
33
43
  var readOnly = __READ_ONLY__;
34
- var textEditingEnabled = !readOnly && __TEXT_EDITING_ENABLED__;
44
+ // Raw host-controlled flag, kept separate from the derived
45
+ // `textEditingEnabled` below. The host (DesignCanvas.tsx) live-updates this
46
+ // via the `set-text-editing-enabled` postMessage instead of rebuilding
47
+ // srcdoc, exactly like `set-read-only`. See that handler for why: baking
48
+ // edit/preview-mode toggles into srcdoc would reload every screen iframe on
49
+ // every mode switch (white flash + lost in-iframe/Alpine state).
50
+ var textEditingEnabledFlag = __TEXT_EDITING_ENABLED__;
51
+ var textEditingEnabled = !readOnly && textEditingEnabledFlag;
35
52
  var designCanvasScreenId = __DESIGN_CANVAS_SCREEN_ID__ || "";
36
53
  var designCanvasBoardSurface = !!__DESIGN_CANVAS_BOARD_SURFACE__;
37
54
  var scaleToolEnabled = false;
@@ -548,6 +565,38 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
548
565
  };
549
566
  }
550
567
 
568
+ // Raw authored (not computed) inline style values for the properties the
569
+ // EditPanel constraints/position/auto-size readers need to distinguish
570
+ // "unset" from "resolved to a computed pixel value" (e.g. an absolutely
571
+ // positioned element with only `left` authored still computes both `left`
572
+ // and `right` — only the inline style tells you which side was actually
573
+ // set). Empty-string values are omitted so callers can treat key-absence as
574
+ // "not authored".
575
+ var INLINE_STYLE_PROPERTIES = [
576
+ "position",
577
+ "left",
578
+ "right",
579
+ "top",
580
+ "bottom",
581
+ "width",
582
+ "height",
583
+ "transform",
584
+ "whiteSpace",
585
+ ];
586
+
587
+ function collectInlineStyles(el: Element): Record<string, string> {
588
+ var styles: Record<string, string> = {};
589
+ var inline = (el as HTMLElement).style;
590
+ if (!inline) return styles;
591
+ INLINE_STYLE_PROPERTIES.forEach(function (property) {
592
+ var value = inline[property as never] as unknown as string;
593
+ if (typeof value === "string" && value !== "") {
594
+ styles[property] = value;
595
+ }
596
+ });
597
+ return styles;
598
+ }
599
+
551
600
  function chromeColorForElement(el: Element | null): string {
552
601
  return elementLooksLikeComponent(el)
553
602
  ? "var(--design-editor-component-color)"
@@ -748,7 +797,20 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
748
797
  filter: cs.filter,
749
798
  mixBlendMode: cs.mixBlendMode,
750
799
  zIndex: cs.zIndex,
800
+ transform: cs.transform,
801
+ scale: cs.scale,
802
+ visibility: cs.visibility,
803
+ backdropFilter: cs.backdropFilter,
804
+ webkitBackdropFilter: (
805
+ cs as unknown as { webkitBackdropFilter?: string }
806
+ ).webkitBackdropFilter,
807
+ flexWrap: cs.flexWrap,
808
+ alignContent: cs.alignContent,
809
+ isolation: cs.isolation,
810
+ whiteSpace: cs.whiteSpace,
751
811
  },
812
+ inlineStyles: collectInlineStyles(el),
813
+ primitiveKind: el.getAttribute("data-an-primitive") || undefined,
752
814
  portableStyleSnapshot: collectPortableStyleSnapshot(el),
753
815
  boundingRect: {
754
816
  x: rect.x + (window.scrollX || window.pageXOffset || 0),
@@ -776,6 +838,49 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
776
838
  };
777
839
  }
778
840
 
841
+ // Light hover descriptor: every pointer hover posts one of these instead of
842
+ // the full getElementInfo() payload. getElementInfo() runs getComputedStyle
843
+ // over ~130 properties on the element PLUS (via collectPortableStyleSnapshot)
844
+ // up to 80 descendants — fine at select/drag-start time, too expensive to run
845
+ // on every mousemove. Hover-only consumers (outline positioning, code-layer
846
+ // resolution by selector/id/tagName/classes/text) never read computedStyles
847
+ // or portableStyleSnapshot, so this intentionally omits both. Full detail is
848
+ // still posted on element-select / drag-start / edit-time messages via
849
+ // getElementInfo().
850
+ function getLightElementInfo(el: Element): unknown {
851
+ var rect = el.getBoundingClientRect();
852
+ var componentName = componentNameForElement(el);
853
+ var sourceBacked =
854
+ hasStableOwnSource(el) || !!closestStableSourceElement(el);
855
+ var sourceId = sourceBacked ? getSourceId(el) || getSelector(el) : "";
856
+ var parentStyles = el.parentElement
857
+ ? window.getComputedStyle(el.parentElement)
858
+ : null;
859
+ var parentDisplay = parentStyles ? parentStyles.display : undefined;
860
+ var cs = window.getComputedStyle(el);
861
+ return {
862
+ tagName: el.tagName.toLowerCase(),
863
+ componentName: componentName || undefined,
864
+ id: el.id || undefined,
865
+ sourceId: sourceId,
866
+ selector: getSelector(el),
867
+ classes: Array.from(el.classList),
868
+ computedStyles: {},
869
+ boundingRect: {
870
+ x: rect.x + (window.scrollX || window.pageXOffset || 0),
871
+ y: rect.y + (window.scrollY || window.pageYOffset || 0),
872
+ width: rect.width,
873
+ height: rect.height,
874
+ },
875
+ textContent: el.textContent ? el.textContent.slice(0, 200) : undefined,
876
+ childElementCount: el.children ? el.children.length : 0,
877
+ isFlexContainer: cs.display === "flex" || cs.display === "inline-flex",
878
+ isGridContainer: cs.display === "grid" || cs.display === "inline-grid",
879
+ isFlexChild: parentDisplay === "flex" || parentDisplay === "inline-flex",
880
+ parentDisplay: parentDisplay,
881
+ };
882
+ }
883
+
779
884
  function selectionIntentFromEvent(e): {
780
885
  additive: boolean;
781
886
  range: boolean;
@@ -1145,6 +1250,33 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
1145
1250
  onUp: (ev: MouseEvent) => void;
1146
1251
  } | null = null;
1147
1252
  var activeTextEditEl: HTMLElement | null = null;
1253
+ // Session-captured original min-width/min-height for the active text edit
1254
+ // (T19): refreshOverlays() re-applies these on every reflow via
1255
+ // updateTextEditingChrome, so it needs the real originals rather than "" —
1256
+ // otherwise every overlay refresh during an edit clobbers the saved size
1257
+ // back to the "1px"/"1em" empty-text defaults.
1258
+ var activeTextEditOriginalMinWidth = "";
1259
+ var activeTextEditOriginalMinHeight = "";
1260
+ // Module-level ref to the in-flight text edit session's finish() closure
1261
+ // (T4). replaceRuntimeDocument (forceFullDocument path, e.g. HMR/localhost
1262
+ // reload) must commit or discard the active edit through the same path a
1263
+ // user Escape/blur would use — removing its listeners and clearing overlay
1264
+ // chrome — instead of only resetting the activeTextEditEl variable, which
1265
+ // left the session's keydown/blur/paste/input/selectionchange listeners
1266
+ // (including a document-level "selectionchange" listener) attached forever.
1267
+ var finishActiveTextEdit: ((commit: boolean) => void) | null = null;
1268
+ // Buffered runtime-content-update payload dropped while a text edit session
1269
+ // is active (T13). replaceRuntimeDocument silently no-ops non-force updates
1270
+ // during an edit (so the user's in-progress typing isn't yanked out from
1271
+ // under them), but the host's one-shot queue still marks the update as
1272
+ // applied. Without buffering, the canvas is left stale once the edit
1273
+ // session ends. We keep only the latest dropped payload — a newer update
1274
+ // supersedes an older one.
1275
+ var pendingRuntimeDocumentUpdate: {
1276
+ html: string;
1277
+ preferredSelector: string;
1278
+ selectorCandidates: string[];
1279
+ } | null = null;
1148
1280
  var textEditPointerState: {
1149
1281
  shield: string;
1150
1282
  selection: string;
@@ -1414,15 +1546,34 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
1414
1546
  ): void {
1415
1547
  if (typeof html !== "string") return;
1416
1548
  if (activeTextEditEl && !forceFullDocument) {
1549
+ // Don't yank a runtime content update out from under an in-progress
1550
+ // text edit — but don't silently lose it either (T13). Buffer only the
1551
+ // latest payload; it is applied once the edit session ends via
1552
+ // finishActiveTextEdit's replay below.
1553
+ pendingRuntimeDocumentUpdate = {
1554
+ html: html,
1555
+ preferredSelector: preferredSelector,
1556
+ selectorCandidates: Array.isArray(selectorCandidates)
1557
+ ? selectorCandidates
1558
+ : [],
1559
+ };
1417
1560
  applyHiddenSelectors();
1418
1561
  refreshOverlays();
1419
1562
  return;
1420
1563
  }
1421
1564
  if (activeTextEditEl) {
1422
- postTextEditingState(activeTextEditEl, false);
1423
- activeTextEditEl = null;
1424
- setTextEditingPointerPassthrough(false);
1425
- setSelectionOverlayResizeChromeVisible(true);
1565
+ // Commit (or discard, if empty) the active edit through the same path
1566
+ // Escape/blur would use — this removes the session's listeners
1567
+ // (including the document-level "selectionchange" listener) instead of
1568
+ // just resetting activeTextEditEl, which leaked them (T4).
1569
+ if (finishActiveTextEdit) {
1570
+ finishActiveTextEdit(true);
1571
+ } else {
1572
+ postTextEditingState(activeTextEditEl, false);
1573
+ activeTextEditEl = null;
1574
+ setTextEditingPointerPassthrough(false);
1575
+ setSelectionOverlayResizeChromeVisible(true);
1576
+ }
1426
1577
  }
1427
1578
  var parser = new DOMParser();
1428
1579
  var nextDoc = parser.parseFromString(html, "text/html");
@@ -2193,7 +2344,7 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
2193
2344
  hideMeasurements();
2194
2345
  if (changed) {
2195
2346
  (window.parent as Window).postMessage(
2196
- { type: "element-hover", payload: getElementInfo(selectedEl) },
2347
+ { type: "element-hover", payload: getLightElementInfo(selectedEl) },
2197
2348
  "*",
2198
2349
  );
2199
2350
  }
@@ -2345,54 +2496,60 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
2345
2496
  });
2346
2497
  }
2347
2498
 
2499
+ // Rotation-aware local-box placement shared by selectionOverlay, the hover
2500
+ // highlightOverlay, and the passive multi-selection overlays: prefer the CSS
2501
+ // box + rotation transform so the outline hugs the rotated element rather
2502
+ // than its inflated axis-aligned bounding box. Returns true when it placed
2503
+ // the overlay (caller should skip the AABB fallback), false when the element
2504
+ // has no usable local box (falls back to getBoundingClientRect).
2505
+ function positionOverlayForRotatedLocalBox(
2506
+ overlay: HTMLElement,
2507
+ el: Element,
2508
+ ): boolean {
2509
+ var elCs = window.getComputedStyle(el);
2510
+ var elLeft = readFinitePx(el.style.left || elCs.left);
2511
+ var elTop = readFinitePx(el.style.top || elCs.top);
2512
+ var elW = readFinitePx(el.style.width || elCs.width);
2513
+ var elH = readFinitePx(el.style.height || elCs.height);
2514
+ var elRot = currentRotation(el);
2515
+ var canUseLocalBox =
2516
+ Math.abs(elRot) > 0.01 &&
2517
+ elLeft !== null &&
2518
+ elTop !== null &&
2519
+ elW !== null &&
2520
+ elH !== null;
2521
+ if (!canUseLocalBox) return false;
2522
+ // Convert element-local left/top to viewport coords by walking to the
2523
+ // nearest positioned ancestor (same reference frame as getBoundingClientRect).
2524
+ var parentRect = (
2525
+ (el as HTMLElement).offsetParent || document.documentElement
2526
+ ).getBoundingClientRect();
2527
+ overlay.style.display = "block";
2528
+ overlay.style.left = parentRect.left + elLeft + "px";
2529
+ overlay.style.top = parentRect.top + elTop + "px";
2530
+ overlay.style.width = elW + "px";
2531
+ overlay.style.height = elH + "px";
2532
+ overlay.style.transform = "rotate(" + elRot + "deg)";
2533
+ overlay.style.transformOrigin = "0 0";
2534
+ return true;
2535
+ }
2536
+
2348
2537
  function positionOverlay(overlay: HTMLElement, el: Element): void {
2349
2538
  if (!el || !document.documentElement.contains(el)) {
2350
2539
  overlay.style.display = "none";
2351
2540
  if (overlay === selectionOverlay) hideSelectionOverlay();
2352
2541
  return;
2353
2542
  }
2354
- // For the selection overlay, prefer the CSS box + rotation transform so
2355
- // the handles hug the rotated element rather than its inflated AABB.
2356
- if (overlay === selectionOverlay) {
2357
- var elCs = window.getComputedStyle(el);
2358
- var elLeft = readFinitePx(el.style.left || elCs.left);
2359
- var elTop = readFinitePx(el.style.top || elCs.top);
2360
- var elW = readFinitePx(el.style.width || elCs.width);
2361
- var elH = readFinitePx(el.style.height || elCs.height);
2362
- var elRot = currentRotation(el);
2363
- var canUseLocalBox =
2364
- Math.abs(elRot) > 0.01 &&
2365
- elLeft !== null &&
2366
- elTop !== null &&
2367
- elW !== null &&
2368
- elH !== null;
2369
- // Convert element-local left/top to viewport coords by walking to the
2370
- // nearest positioned ancestor (same reference frame as getBoundingClientRect).
2371
- if (canUseLocalBox) {
2372
- var parentRect = (
2373
- (el as HTMLElement).offsetParent || document.documentElement
2374
- ).getBoundingClientRect();
2375
- overlay.style.display = "block";
2376
- overlay.style.left = parentRect.left + elLeft + "px";
2377
- overlay.style.top = parentRect.top + elTop + "px";
2378
- overlay.style.width = elW + "px";
2379
- overlay.style.height = elH + "px";
2380
- overlay.style.transform = "rotate(" + elRot + "deg)";
2381
- overlay.style.transformOrigin = "0 0";
2382
- applySelectionChrome(el);
2383
- updateSpacingOverlay(el);
2384
- updateComponentTag(el);
2385
- updateParentAutoLayoutOverlay(el);
2386
- return;
2387
- }
2543
+ var placedRotatedLocalBox = positionOverlayForRotatedLocalBox(overlay, el);
2544
+ if (!placedRotatedLocalBox) {
2545
+ var rect = el.getBoundingClientRect();
2546
+ overlay.style.display = "block";
2547
+ overlay.style.top = rect.top + "px";
2548
+ overlay.style.left = rect.left + "px";
2549
+ overlay.style.width = rect.width + "px";
2550
+ overlay.style.height = rect.height + "px";
2551
+ overlay.style.transform = "";
2388
2552
  }
2389
- var rect = el.getBoundingClientRect();
2390
- overlay.style.display = "block";
2391
- overlay.style.top = rect.top + "px";
2392
- overlay.style.left = rect.left + "px";
2393
- overlay.style.width = rect.width + "px";
2394
- overlay.style.height = rect.height + "px";
2395
- overlay.style.transform = "";
2396
2553
  if (overlay === selectionOverlay) {
2397
2554
  applySelectionChrome(el);
2398
2555
  updateSpacingOverlay(el);
@@ -2416,7 +2573,11 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
2416
2573
  }
2417
2574
  if (textEditingEl) {
2418
2575
  if (activeTextEditEl === textEditingEl) {
2419
- updateTextEditingChrome(textEditingEl, "", "");
2576
+ updateTextEditingChrome(
2577
+ textEditingEl,
2578
+ activeTextEditOriginalMinWidth,
2579
+ activeTextEditOriginalMinHeight,
2580
+ );
2420
2581
  }
2421
2582
  if (!hasTextCharacters(textEditingEl)) {
2422
2583
  hideSelectionOverlay();
@@ -2430,6 +2591,103 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
2430
2591
  var overlay = passiveSelectionOverlays[index];
2431
2592
  if (overlay) positionOverlay(overlay, el);
2432
2593
  });
2594
+ syncOverlayObservers();
2595
+ }
2596
+
2597
+ // Coalesced overlay refresh: ResizeObserver/MutationObserver callbacks can
2598
+ // fire in bursts (e.g. a font/image load reflowing many ancestors, or an
2599
+ // Alpine x-show toggling several siblings in one microtask). Collapse any
2600
+ // number of triggers within a frame into a single refreshOverlays() call.
2601
+ var refreshOverlaysScheduled = false;
2602
+ function scheduleRefreshOverlays(): void {
2603
+ if (refreshOverlaysScheduled) return;
2604
+ refreshOverlaysScheduled = true;
2605
+ window.requestAnimationFrame(function () {
2606
+ refreshOverlaysScheduled = false;
2607
+ refreshOverlays();
2608
+ });
2609
+ }
2610
+
2611
+ // ResizeObserver on the selected + hovered elements catches size changes
2612
+ // that scroll/resize listeners miss entirely: webfont swap reflow, image
2613
+ // decode, CSS transitions/animations, and Alpine/Vue reactivity toggling
2614
+ // classes on the element itself. MutationObserver (attributes + childList,
2615
+ // scoped to the selected element and its parent) catches structural/attr
2616
+ // changes that resize an element without necessarily firing a ResizeObserver
2617
+ // entry on that exact node (e.g. a sibling insertion shifting layout).
2618
+ var overlayResizeObserver: ResizeObserver | null = null;
2619
+ var overlayMutationObserver: MutationObserver | null = null;
2620
+ var observedResizeEls: Element[] = [];
2621
+ var observedMutationRoot: Element | null = null;
2622
+
2623
+ function ensureOverlayObservers(): void {
2624
+ if (!overlayResizeObserver && typeof ResizeObserver !== "undefined") {
2625
+ overlayResizeObserver = new ResizeObserver(function () {
2626
+ scheduleRefreshOverlays();
2627
+ });
2628
+ }
2629
+ if (!overlayMutationObserver && typeof MutationObserver !== "undefined") {
2630
+ overlayMutationObserver = new MutationObserver(function () {
2631
+ scheduleRefreshOverlays();
2632
+ });
2633
+ }
2634
+ }
2635
+
2636
+ function syncOverlayObservers(): void {
2637
+ ensureOverlayObservers();
2638
+ if (overlayResizeObserver) {
2639
+ var nextTargets: Element[] = [];
2640
+ if (selectedEl && document.documentElement.contains(selectedEl)) {
2641
+ nextTargets.push(selectedEl);
2642
+ }
2643
+ if (
2644
+ hoveredEl &&
2645
+ hoveredEl !== selectedEl &&
2646
+ document.documentElement.contains(hoveredEl)
2647
+ ) {
2648
+ nextTargets.push(hoveredEl);
2649
+ }
2650
+ var targetsChanged =
2651
+ nextTargets.length !== observedResizeEls.length ||
2652
+ nextTargets.some(function (el, i) {
2653
+ return observedResizeEls[i] !== el;
2654
+ });
2655
+ if (targetsChanged) {
2656
+ observedResizeEls.forEach(function (el) {
2657
+ overlayResizeObserver!.unobserve(el);
2658
+ });
2659
+ nextTargets.forEach(function (el) {
2660
+ overlayResizeObserver!.observe(el);
2661
+ });
2662
+ observedResizeEls = nextTargets;
2663
+ }
2664
+ }
2665
+ if (overlayMutationObserver) {
2666
+ var nextRoot: Element | null =
2667
+ selectedEl && document.documentElement.contains(selectedEl)
2668
+ ? selectedEl.parentElement || selectedEl
2669
+ : null;
2670
+ if (nextRoot !== observedMutationRoot) {
2671
+ overlayMutationObserver.disconnect();
2672
+ if (nextRoot) {
2673
+ overlayMutationObserver.observe(nextRoot, {
2674
+ attributes: true,
2675
+ childList: true,
2676
+ subtree: false,
2677
+ });
2678
+ // Also watch the selected element itself for attribute changes
2679
+ // (e.g. class/style toggles) when it isn't the observed root.
2680
+ if (nextRoot !== selectedEl && selectedEl) {
2681
+ overlayMutationObserver.observe(selectedEl, {
2682
+ attributes: true,
2683
+ childList: true,
2684
+ subtree: false,
2685
+ });
2686
+ }
2687
+ }
2688
+ observedMutationRoot = nextRoot;
2689
+ }
2690
+ }
2433
2691
  }
2434
2692
 
2435
2693
  function hideMeasurements(): void {
@@ -2728,6 +2986,11 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
2728
2986
  }
2729
2987
 
2730
2988
  function shouldForwardDesignHotkey(e) {
2989
+ // Read-only surfaces (e.g. background/inactive board screens) must never
2990
+ // forward edit hotkeys or preventDefault() native browser shortcuts —
2991
+ // Escape/Enter/Tab/Delete/arrow-key/undo-redo forwarding is an editing
2992
+ // affordance and has no business intercepting keys on a passive view.
2993
+ if (readOnly) return false;
2731
2994
  if (activeTextEditEl || isEditorTypingTarget(e.target) || e.isComposing)
2732
2995
  return false;
2733
2996
  var key = e.key;
@@ -3564,6 +3827,64 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
3564
3827
  selection.addRange(range);
3565
3828
  }
3566
3829
 
3830
+ // T2: Figma-style text editing treats Enter as a line break while editing
3831
+ // (Escape or blur commits and exits). Uses the same insertText execCommand
3832
+ // path as insertPlainTextAtSelection so undo grouping/IME behavior matches,
3833
+ // falling back to a manual <br> insertion when insertText isn't supported.
3834
+ function insertLineBreak(): void {
3835
+ if (
3836
+ document.queryCommandSupported &&
3837
+ document.queryCommandSupported("insertText")
3838
+ ) {
3839
+ document.execCommand("insertText", false, "\n");
3840
+ return;
3841
+ }
3842
+ var selection: Selection | null = window.getSelection
3843
+ ? window.getSelection()
3844
+ : null;
3845
+ if (!selection || selection.rangeCount === 0) return;
3846
+ var range = selection.getRangeAt(0);
3847
+ range.deleteContents();
3848
+ var br = document.createElement("br");
3849
+ range.insertNode(br);
3850
+ range.setStartAfter(br);
3851
+ range.setEndAfter(br);
3852
+ selection.removeAllRanges();
3853
+ selection.addRange(range);
3854
+ }
3855
+
3856
+ // T12: applyTextRangeStyle wraps a fresh <span> per invocation, so repeated
3857
+ // scrub/commit cycles on the same range nest span chains
3858
+ // (<span><span><span>text</span></span></span>) that persist in saved HTML.
3859
+ // Collapse any run of nested spans that carry the exact same style
3860
+ // attribute and no other attributes down to a single span. Only merges
3861
+ // spans that are the sole child of their parent span (an exact 1:1 nesting,
3862
+ // not spans that merely overlap a wider range).
3863
+ function normalizeNestedIdenticalSpans(root: Element | null): void {
3864
+ if (!root) return;
3865
+ var spans = Array.prototype.slice.call(root.querySelectorAll("span"));
3866
+ for (var i = 0; i < spans.length; i += 1) {
3867
+ var span = spans[i];
3868
+ if (!span || !span.parentNode) continue;
3869
+ var parent = span.parentNode;
3870
+ while (
3871
+ parent &&
3872
+ parent.nodeType === 1 &&
3873
+ (parent as Element).tagName === "SPAN" &&
3874
+ (parent as Element).childNodes.length === 1 &&
3875
+ (parent as Element).getAttribute("style") ===
3876
+ span.getAttribute("style") &&
3877
+ (parent as Element).attributes.length === span.attributes.length
3878
+ ) {
3879
+ var grandparent = parent.parentNode;
3880
+ if (!grandparent) break;
3881
+ grandparent.insertBefore(span, parent);
3882
+ grandparent.removeChild(parent);
3883
+ parent = grandparent;
3884
+ }
3885
+ }
3886
+ }
3887
+
3567
3888
  function selectionBelongsToElement(
3568
3889
  selection: Selection | null,
3569
3890
  el: Element | null,
@@ -3597,6 +3918,50 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
3597
3918
  return true;
3598
3919
  }
3599
3920
 
3921
+ // T12: if the current selection exactly covers an existing <span>'s content
3922
+ // (i.e. the user is re-scrubbing/re-applying a style to the same range
3923
+ // rather than a new sub-range), reuse that span instead of wrapping another
3924
+ // one around it. Without this, a scrub gesture that fires applyTextRangeStyle
3925
+ // many times per gesture nests a new <span> on every tick
3926
+ // (<span><span><span>text</span></span></span>), and those chains persist
3927
+ // in the saved HTML.
3928
+ function exactCoverSpanForRange(range: Range): HTMLSpanElement | null {
3929
+ var start = range.startContainer;
3930
+ var end = range.endContainer;
3931
+ if (start !== end) return null;
3932
+
3933
+ // Shape A: start/end container IS the span itself, with node-offsets
3934
+ // spanning all of its children (this is what
3935
+ // Range.selectNodeContents(span) produces — offsets into an Element
3936
+ // container count child nodes, not characters).
3937
+ if (start.nodeType === 1) {
3938
+ var containerEl = start as HTMLElement;
3939
+ if (containerEl.tagName !== "SPAN") return null;
3940
+ if (containerEl.childNodes.length !== 1) return null;
3941
+ if (range.startOffset !== 0 || range.endOffset !== 1) return null;
3942
+ return containerEl as HTMLSpanElement;
3943
+ }
3944
+
3945
+ // Shape B: start/end container is a text node, with character offsets
3946
+ // spanning its full length (this is what surroundContents +
3947
+ // selectNodeContents(span) round-trips to on a subsequent read, or what a
3948
+ // caller-constructed range over the text node directly looks like).
3949
+ if (start.nodeType !== 3) return null; // text node
3950
+ var parent = start.parentNode;
3951
+ if (!parent || parent.nodeType !== 1) return null;
3952
+ var el = parent as HTMLElement;
3953
+ if (el.tagName !== "SPAN") return null;
3954
+ // The span must contain exactly this one text node, and the range must
3955
+ // span the text node's full content (not a sub-range within it).
3956
+ if (el.childNodes.length !== 1 || el.childNodes[0] !== start) return null;
3957
+ if (
3958
+ range.startOffset !== 0 ||
3959
+ range.endOffset !== start.textContent!.length
3960
+ )
3961
+ return null;
3962
+ return el as HTMLSpanElement;
3963
+ }
3964
+
3600
3965
  function applyTextRangeStyle(property: unknown, value: unknown): boolean {
3601
3966
  if (!activeTextEditEl || !property) return false;
3602
3967
  var selection: Selection | null = window.getSelection
@@ -3606,6 +3971,15 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
3606
3971
  return false;
3607
3972
  if (!selectionBelongsToElement(selection, activeTextEditEl)) return false;
3608
3973
  var range = selection.getRangeAt(0);
3974
+ var reused = exactCoverSpanForRange(range);
3975
+ if (reused) {
3976
+ if (!applyInlineStyleProperty(reused, property, value)) return false;
3977
+ selection.removeAllRanges();
3978
+ var reusedRange = document.createRange();
3979
+ reusedRange.selectNodeContents(reused);
3980
+ selection.addRange(reusedRange);
3981
+ return true;
3982
+ }
3609
3983
  var span = document.createElement("span");
3610
3984
  applyInlineStyleProperty(span, property, value);
3611
3985
  if (!span.getAttribute("style")) return false;
@@ -5096,6 +5470,18 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
5096
5470
  }
5097
5471
  }
5098
5472
 
5473
+ // T5: elements that must never become contenteditable via the raw-target
5474
+ // fallback below, even when a caller opts into programmatic text editing.
5475
+ // Chrome overlays are never real content; img/svg/canvas cannot host a text
5476
+ // selection/caret the way findTextEditTarget expects and would leave the
5477
+ // editor in a broken state (see the warning comment in findTextEditTarget).
5478
+ function isRejectedRawTextEditTarget(el: Element | null): boolean {
5479
+ if (!el) return true;
5480
+ if (isOverlayElement(el)) return true;
5481
+ var tag = el.tagName ? el.tagName.toLowerCase() : "";
5482
+ return tag === "img" || tag === "svg" || tag === "canvas";
5483
+ }
5484
+
5099
5485
  function beginTextEditingFromEvent(e, forceTextEditing) {
5100
5486
  if (activeTextEditEl && e.target && activeTextEditEl.contains(e.target))
5101
5487
  return;
@@ -5106,10 +5492,25 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
5106
5492
  stopNativeInteraction(e);
5107
5493
  var eventTarget =
5108
5494
  e && e.target && e.target.nodeType === 1 ? e.target : null;
5495
+ // The raw `eventTarget` fallback (no findTextEditTarget resolution at
5496
+ // all) bypasses findTextEditTarget's editable-ancestor check entirely, so
5497
+ // it is only safe when the caller has explicitly opted into programmatic
5498
+ // text editing (e.g. an agent action creating a new text primitive and
5499
+ // immediately entering edit mode on it) — and even then, never for a
5500
+ // chrome overlay or an img/svg/canvas element, which cannot be made
5501
+ // sensibly contenteditable.
5502
+ var programmaticFlag =
5503
+ !!e &&
5504
+ (e as unknown as { agentNativeProgrammaticTextEdit?: boolean })
5505
+ .agentNativeProgrammaticTextEdit === true;
5506
+ var rawTargetFallback =
5507
+ programmaticFlag && !isRejectedRawTextEditTarget(eventTarget)
5508
+ ? eventTarget
5509
+ : null;
5109
5510
  var target =
5110
5511
  findTextEditTarget(elementFromEditorPoint(e.clientX, e.clientY)) ||
5111
5512
  findTextEditTarget(eventTarget) ||
5112
- eventTarget;
5513
+ rawTargetFallback;
5113
5514
  if (!target || target.nodeType !== 1) return;
5114
5515
  // Anchor the selection identity to the nearest source-backed element. Text
5115
5516
  // editing still operates on the actual target text node, but a later
@@ -5117,10 +5518,7 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
5117
5518
  // code-layer node rather than a runtime-only descendant (which would emit a
5118
5519
  // brittle body > div:nth-of-type(...) selector that never resolves).
5119
5520
  selectedEl = selectionTargetForHit(target) || target;
5120
- var programmaticTextEdit =
5121
- !!e &&
5122
- (e as unknown as { agentNativeProgrammaticTextEdit?: boolean })
5123
- .agentNativeProgrammaticTextEdit === true;
5521
+ var programmaticTextEdit = programmaticFlag;
5124
5522
  var originalText = target.textContent || "";
5125
5523
  var originalHtml = target.innerHTML || "";
5126
5524
  var originalMinWidth = target.style.minWidth;
@@ -5130,6 +5528,27 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
5130
5528
  var originalOutlineOffset = target.style.outlineOffset;
5131
5529
  var committed = false;
5132
5530
  activeTextEditEl = target;
5531
+ // T19: publish this session's captured originals so refreshOverlays()
5532
+ // (which runs on ResizeObserver/MutationObserver ticks during the edit,
5533
+ // not just from inside this closure) can pass the real values instead of
5534
+ // "" to updateTextEditingChrome.
5535
+ activeTextEditOriginalMinWidth = originalMinWidth;
5536
+ activeTextEditOriginalMinHeight = originalMinHeight;
5537
+ // T20: per-keystroke chrome updates (onInput/onSelectionChange) and the
5538
+ // 3-4 postMessages they cause (text-editing-state + a caret-move
5539
+ // selectionchange on every arrow key / click) are coalesced into a single
5540
+ // rAF tick instead of firing synchronously on every event.
5541
+ var chromeUpdateScheduled = false;
5542
+ function scheduleTextEditingChromeUpdate() {
5543
+ if (chromeUpdateScheduled) return;
5544
+ chromeUpdateScheduled = true;
5545
+ window.requestAnimationFrame(function () {
5546
+ chromeUpdateScheduled = false;
5547
+ if (committed) return;
5548
+ updateTextEditingChrome(target, originalMinWidth, originalMinHeight);
5549
+ postTextEditingState(target, true);
5550
+ });
5551
+ }
5133
5552
  target.setAttribute("contenteditable", "true");
5134
5553
  target.setAttribute("data-agent-native-text-editing", "true");
5135
5554
  target.style.cursor = "text";
@@ -5174,19 +5593,43 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
5174
5593
  setTextEditingPointerPassthrough(false);
5175
5594
  setSelectionOverlayResizeChromeVisible(true);
5176
5595
  if (activeTextEditEl === target) activeTextEditEl = null;
5596
+ // T4: this session no longer owns the active-edit slot.
5597
+ if (finishActiveTextEdit === finish) finishActiveTextEdit = null;
5177
5598
  postTextEditingState(target, false);
5178
5599
  if (!commit) {
5179
5600
  target.innerHTML = originalHtml;
5180
5601
  refreshOverlays();
5181
5602
  return;
5182
5603
  }
5604
+ // T12: collapse any nested-identical-style <span> chains left behind by
5605
+ // repeated applyTextRangeStyle scrub/commit cycles before reading out
5606
+ // the committed HTML.
5607
+ normalizeNestedIdenticalSpans(target);
5183
5608
  var next = target.textContent || "";
5184
5609
  var nextHtml = target.innerHTML || "";
5185
5610
  refreshOverlays();
5186
5611
  if (next !== originalText || nextHtml !== originalHtml) {
5187
5612
  postTextContentChange(target, next, nextHtml);
5188
5613
  }
5614
+ // T13: replay the latest runtime-content update that arrived (and was
5615
+ // buffered) while this edit session was active, so the canvas isn't
5616
+ // left stale now that editing has ended.
5617
+ if (pendingRuntimeDocumentUpdate) {
5618
+ var pending = pendingRuntimeDocumentUpdate;
5619
+ pendingRuntimeDocumentUpdate = null;
5620
+ replaceRuntimeDocument(
5621
+ pending.html,
5622
+ pending.preferredSelector,
5623
+ pending.selectorCandidates,
5624
+ true,
5625
+ );
5626
+ }
5189
5627
  }
5628
+ // T4: publish this session's finish() so replaceRuntimeDocument (and any
5629
+ // other caller that must end an in-progress edit deterministically) can
5630
+ // commit/discard through the same listener-teardown path a user
5631
+ // Escape/blur would take, instead of only resetting activeTextEditEl.
5632
+ finishActiveTextEdit = finish;
5190
5633
 
5191
5634
  function onBlur() {
5192
5635
  if (programmaticTextEdit && !(target.textContent || "").trim()) {
@@ -5202,16 +5645,42 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
5202
5645
  }
5203
5646
 
5204
5647
  function onKeyDown(ev) {
5648
+ // T3: bail out on IME composition input (e.g. CJK/Korean input method
5649
+ // candidate selection) so a composing Enter/Escape keystroke isn't
5650
+ // intercepted as a commit/newline before the IME has finished composing
5651
+ // the character. keyCode 229 is the legacy signal browsers send for
5652
+ // composition keydowns that don't set isComposing.
5653
+ if (ev.isComposing || ev.keyCode === 229) return;
5205
5654
  if (ev.key === "Escape") {
5206
5655
  ev.preventDefault();
5207
5656
  finish(true);
5208
5657
  target.blur();
5209
5658
  return;
5210
5659
  }
5660
+ // T2: Enter inserts a line break while editing (Figma convention);
5661
+ // Escape or blur (click-out) is what commits and exits the session.
5211
5662
  if (ev.key === "Enter" && !ev.shiftKey) {
5212
5663
  ev.preventDefault();
5213
- finish(true);
5214
- target.blur();
5664
+ insertLineBreak();
5665
+ scheduleTextEditingChromeUpdate();
5666
+ return;
5667
+ }
5668
+ // T21: forward Cmd/Ctrl+B and Cmd/Ctrl+I within the edit session to
5669
+ // execCommand bold/italic on the current selection. normalizeNestedIdenticalSpans
5670
+ // (T12) cleans up any span nesting execCommand leaves behind when the
5671
+ // session commits.
5672
+ var metaOrCtrl = ev.metaKey || ev.ctrlKey;
5673
+ if (metaOrCtrl && !ev.altKey && ev.key.toLowerCase() === "b") {
5674
+ ev.preventDefault();
5675
+ document.execCommand("bold");
5676
+ scheduleTextEditingChromeUpdate();
5677
+ return;
5678
+ }
5679
+ if (metaOrCtrl && !ev.altKey && ev.key.toLowerCase() === "i") {
5680
+ ev.preventDefault();
5681
+ document.execCommand("italic");
5682
+ scheduleTextEditingChromeUpdate();
5683
+ return;
5215
5684
  }
5216
5685
  }
5217
5686
 
@@ -5220,18 +5689,15 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
5220
5689
  insertPlainTextAtSelection(
5221
5690
  (ev.clipboardData && ev.clipboardData.getData("text/plain")) || "",
5222
5691
  );
5223
- updateTextEditingChrome(target, originalMinWidth, originalMinHeight);
5224
- postTextEditingState(target, true);
5692
+ scheduleTextEditingChromeUpdate();
5225
5693
  }
5226
5694
 
5227
5695
  function onInput() {
5228
- updateTextEditingChrome(target, originalMinWidth, originalMinHeight);
5229
- postTextEditingState(target, true);
5696
+ scheduleTextEditingChromeUpdate();
5230
5697
  }
5231
5698
 
5232
5699
  function onSelectionChange() {
5233
- updateTextEditingChrome(target, originalMinWidth, originalMinHeight);
5234
- postTextEditingState(target, true);
5700
+ scheduleTextEditingChromeUpdate();
5235
5701
  }
5236
5702
 
5237
5703
  target.addEventListener("blur", onBlur, true);
@@ -5300,7 +5766,7 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
5300
5766
  } else {
5301
5767
  hideMeasurements();
5302
5768
  }
5303
- var info = getElementInfo(hoveredEl);
5769
+ var info = getLightElementInfo(hoveredEl);
5304
5770
  (window.parent as Window).postMessage(
5305
5771
  { type: "element-hover", payload: info },
5306
5772
  "*",
@@ -5363,11 +5829,17 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
5363
5829
  window.addEventListener("message", function (e) {
5364
5830
  if (e.source !== window.parent) return;
5365
5831
  if (!e.data) return;
5366
- if (e.data.payload && typeof e.data.payload === "object") {
5367
- Object.keys(e.data.payload).forEach(function (key) {
5368
- if (e.data[key] === undefined) e.data[key] = e.data.payload[key];
5369
- });
5370
- }
5832
+ // NOTE: no message type in this handler is sourced from a `payload`
5833
+ // sub-object — every host sender (DesignCanvas.tsx) puts its fields
5834
+ // directly on the top-level message. A previous blanket
5835
+ // `Object.keys(e.data.payload).forEach(...)` hoist here copied every key
5836
+ // of an arbitrary `payload` object onto `e.data` for ANY message type,
5837
+ // which could let an attacker-controlled `payload` (e.g. relayed through
5838
+ // a less-trusted surface) inject fields like `readOnly`, `force`, or
5839
+ // `content` into a message type that never intended to accept them. If a
5840
+ // future message type needs payload-sourced fields, extract them
5841
+ // explicitly inside that type's own branch below instead of reintroducing
5842
+ // a blanket hoist.
5371
5843
  // set-read-only: toggle the bridge's readOnly state in-place without a reload.
5372
5844
  // When readOnly becomes true the shield/selection/drag/edit entry points are
5373
5845
  // gated so the surface is safe for background/inactive display use.
@@ -5375,7 +5847,7 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
5375
5847
  var nextReadOnly = !!e.data.readOnly;
5376
5848
  if (readOnly === nextReadOnly) return;
5377
5849
  readOnly = nextReadOnly;
5378
- textEditingEnabled = !readOnly && __TEXT_EDITING_ENABLED__;
5850
+ textEditingEnabled = !readOnly && textEditingEnabledFlag;
5379
5851
  if (readOnly) {
5380
5852
  // Leave the text editor gracefully before going read-only.
5381
5853
  if (activeTextEditEl) {
@@ -5388,6 +5860,27 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
5388
5860
  }
5389
5861
  return;
5390
5862
  }
5863
+ // set-text-editing-enabled: toggle the bridge's edit/preview-mode flag
5864
+ // in-place without a reload, mirroring set-read-only above. The host
5865
+ // flips this whenever DesignCanvas's `editMode` prop changes (Edit ⇄
5866
+ // Preview). Without this postMessage path, `editMode` would need to stay
5867
+ // a srcdoc dependency, which rebuilds and reloads every screen iframe on
5868
+ // every edit/preview toggle.
5869
+ if (e.data.type === "set-text-editing-enabled") {
5870
+ var nextTextEditingEnabledFlag = !!e.data.enabled;
5871
+ if (textEditingEnabledFlag === nextTextEditingEnabledFlag) return;
5872
+ textEditingEnabledFlag = nextTextEditingEnabledFlag;
5873
+ var nextTextEditingEnabled = !readOnly && textEditingEnabledFlag;
5874
+ if (textEditingEnabled === nextTextEditingEnabled) return;
5875
+ textEditingEnabled = nextTextEditingEnabled;
5876
+ // Leaving text-editing-enabled mode: gracefully exit any in-progress
5877
+ // text edit rather than leaving a live contenteditable behind, mirroring
5878
+ // the readOnly transition above.
5879
+ if (!textEditingEnabled && activeTextEditEl) {
5880
+ activeTextEditEl.blur();
5881
+ }
5882
+ return;
5883
+ }
5391
5884
  // begin-text-edit: enter text-editing mode for the element identified by
5392
5885
  // nodeId immediately (no double-click needed). Used after programmatic
5393
5886
  // text-element creation so the user can type right away and the autosize
@@ -5473,6 +5966,53 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
5473
5966
  );
5474
5967
  return;
5475
5968
  }
5969
+ // agent-native:text-edit-status: host-side query used instead of a direct
5970
+ // (now sandbox-blocked) iframe.contentDocument read. Mirrors the exact
5971
+ // resolution `postBeginTextEditToPreviewIframes` (DesignEditor.tsx) used to
5972
+ // do itself: find the node by data-agent-native-node-id, and report whether
5973
+ // a text-edit session is currently "active" on it (focused element carries
5974
+ // data-agent-native-text-editing), "done" (non-empty committed text and not
5975
+ // actively focused), or neither.
5976
+ if (e.data.type === "agent-native:text-edit-status") {
5977
+ var textEditStatusCorrelationId: string =
5978
+ typeof e.data.correlationId === "string" ? e.data.correlationId : "";
5979
+ var textEditStatusNodeId: string =
5980
+ typeof e.data.nodeId === "string" ? e.data.nodeId : "";
5981
+ var textEditStatus: "active" | "done" | false = false;
5982
+ if (textEditStatusNodeId) {
5983
+ var escapedTextEditStatusNodeId = textEditStatusNodeId
5984
+ .replace(/\\/g, "\\\\")
5985
+ .replace(/"/g, '\\"');
5986
+ var textEditStatusNode: Element | null = document.querySelector(
5987
+ '[data-agent-native-node-id="' + escapedTextEditStatusNodeId + '"]',
5988
+ );
5989
+ var textEditStatusEditingEl: Element | null = document.querySelector(
5990
+ '[data-agent-native-node-id="' +
5991
+ escapedTextEditStatusNodeId +
5992
+ '"][data-agent-native-text-editing]',
5993
+ );
5994
+ if (
5995
+ textEditStatusEditingEl &&
5996
+ document.activeElement === textEditStatusEditingEl
5997
+ ) {
5998
+ textEditStatus = "active";
5999
+ } else if (
6000
+ textEditStatusNode &&
6001
+ (textEditStatusNode.textContent ?? "").trim().length > 0
6002
+ ) {
6003
+ textEditStatus = "done";
6004
+ }
6005
+ }
6006
+ (window.parent as Window).postMessage(
6007
+ {
6008
+ type: "agent-native:text-edit-status-result",
6009
+ correlationId: textEditStatusCorrelationId,
6010
+ status: textEditStatus,
6011
+ },
6012
+ "*",
6013
+ );
6014
+ return;
6015
+ }
5476
6016
  if (e.data.type === "select-elements") {
5477
6017
  var passiveTargets: Element[] = [];
5478
6018
  var selectorGroups: unknown[] = Array.isArray(e.data.selectorGroups)
@@ -5675,16 +6215,32 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
5675
6215
  );
5676
6216
  }
5677
6217
  var el = findRuntimeTarget(String(sel || ""), candidatesForStyle);
6218
+ // T11: a live text-edit session's selection lives inside activeTextEditEl,
6219
+ // but the incoming style-change's selector/candidates were captured from
6220
+ // selectedEl at edit-start time, which selectionTargetForHit may have
6221
+ // anchored to a source-backed ancestor rather than activeTextEditEl
6222
+ // itself (when the actual edit target is a runtime-only descendant).
6223
+ // Requiring `el === activeTextEditEl` then never matches, and the whole
6224
+ // ancestor gets restyled instead of just the visible range. Route on
6225
+ // activeTextEditEl's own relationship to the resolved target instead: a
6226
+ // style-change should still be treated as "editing the active session"
6227
+ // when the resolved element IS activeTextEditEl, or IS an ancestor that
6228
+ // activeTextEditEl lives inside (the panel is targeting "the thing the
6229
+ // user double-clicked into", which is this edit session, even though the
6230
+ // selector re-anchored to its stable container).
6231
+ var styleChangeTargetsActiveTextEdit =
6232
+ !!activeTextEditEl &&
6233
+ !!el &&
6234
+ (el === activeTextEditEl || el.contains(activeTextEditEl));
5678
6235
  if (
5679
6236
  prop &&
5680
- activeTextEditEl &&
5681
- el === activeTextEditEl &&
6237
+ styleChangeTargetsActiveTextEdit &&
5682
6238
  applyTextRangeStyle(prop, val)
5683
6239
  ) {
5684
6240
  postTextContentChange(
5685
6241
  activeTextEditEl,
5686
- activeTextEditEl.textContent || "",
5687
- activeTextEditEl.innerHTML || "",
6242
+ activeTextEditEl!.textContent || "",
6243
+ activeTextEditEl!.innerHTML || "",
5688
6244
  );
5689
6245
  refreshOverlays();
5690
6246
  return;
@@ -5755,4 +6311,16 @@ declare var __DESIGN_CANVAS_BOARD_SURFACE__: boolean;
5755
6311
  window.addEventListener("scroll", refreshOverlays, true);
5756
6312
  window.addEventListener("resize", refreshOverlays);
5757
6313
  applyEditorChromeScale();
6314
+
6315
+ // One-time ready signal: tells the host that every message listener above is
6316
+ // now attached, so one-shot commands (begin-text-edit, set-editor-chrome-scale,
6317
+ // style-change, delete-element, replace-document-content) sent immediately
6318
+ // after (re)creating this iframe are safe to deliver. Without this, a command
6319
+ // posted before the bridge script has executed — or while the iframe is
6320
+ // reloading — is simply lost; replayIframeEditorState only replays
6321
+ // steady-state selection/hover/tweak/motion state, not one-shot commands.
6322
+ (window.parent as Window).postMessage(
6323
+ { type: "agent-native:editor-chrome-ready" },
6324
+ "*",
6325
+ );
5758
6326
  })();