@agent-native/core 0.83.0 → 0.84.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 (424) hide show
  1. package/README.md +2 -2
  2. package/corpus/README.md +1 -1
  3. package/corpus/core/CHANGELOG.md +28 -0
  4. package/corpus/core/README.md +2 -2
  5. package/corpus/core/docs/content/cloneable-saas.mdx +2 -2
  6. package/corpus/core/docs/content/faq.mdx +1 -1
  7. package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
  8. package/corpus/core/docs/content/locales/ar-SA/faq.mdx +1 -1
  9. package/corpus/core/docs/content/locales/ar-SA/template-chat.mdx +1 -1
  10. package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
  11. package/corpus/core/docs/content/locales/de-DE/faq.mdx +1 -1
  12. package/corpus/core/docs/content/locales/de-DE/template-chat.mdx +1 -1
  13. package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
  14. package/corpus/core/docs/content/locales/es-ES/faq.mdx +1 -1
  15. package/corpus/core/docs/content/locales/es-ES/template-chat.mdx +1 -1
  16. package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
  17. package/corpus/core/docs/content/locales/fr-FR/faq.mdx +1 -1
  18. package/corpus/core/docs/content/locales/fr-FR/template-chat.mdx +1 -1
  19. package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
  20. package/corpus/core/docs/content/locales/hi-IN/faq.mdx +1 -1
  21. package/corpus/core/docs/content/locales/hi-IN/template-chat.mdx +1 -1
  22. package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
  23. package/corpus/core/docs/content/locales/ja-JP/faq.mdx +1 -1
  24. package/corpus/core/docs/content/locales/ja-JP/template-chat.mdx +1 -1
  25. package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
  26. package/corpus/core/docs/content/locales/ko-KR/faq.mdx +1 -1
  27. package/corpus/core/docs/content/locales/ko-KR/template-chat.mdx +1 -1
  28. package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
  29. package/corpus/core/docs/content/locales/pt-BR/faq.mdx +1 -1
  30. package/corpus/core/docs/content/locales/pt-BR/template-chat.mdx +1 -1
  31. package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
  32. package/corpus/core/docs/content/locales/zh-CN/faq.mdx +1 -1
  33. package/corpus/core/docs/content/locales/zh-CN/template-chat.mdx +1 -1
  34. package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
  35. package/corpus/core/docs/content/locales/zh-TW/faq.mdx +1 -1
  36. package/corpus/core/docs/content/locales/zh-TW/template-chat.mdx +1 -1
  37. package/corpus/core/docs/content/template-chat.mdx +1 -1
  38. package/corpus/core/package.json +1 -1
  39. package/corpus/core/src/agent/engine/builtin.ts +1 -1
  40. package/corpus/core/src/agent/engine/output-tokens.ts +1 -1
  41. package/corpus/core/src/agent/harness/acp-adapter.ts +28 -4
  42. package/corpus/core/src/agent/harness/ai-sdk-adapter.ts +3 -0
  43. package/corpus/core/src/agent/harness/translate.ts +3 -0
  44. package/corpus/core/src/agent/harness/types.ts +1 -0
  45. package/corpus/core/src/agent/model-config.ts +34 -13
  46. package/corpus/core/src/agent/production-agent.ts +87 -10
  47. package/corpus/core/src/agent/thread-data-builder.ts +29 -4
  48. package/corpus/core/src/agent/tool-call-journal.ts +109 -48
  49. package/corpus/core/src/agent/types.ts +6 -1
  50. package/corpus/core/src/cli/design-connect.ts +106 -0
  51. package/corpus/core/src/cli/gateway-helpers.ts +17 -0
  52. package/corpus/core/src/cli/recap.ts +0 -2
  53. package/corpus/core/src/cli/skills.ts +54 -16
  54. package/corpus/core/src/cli/workspace-dev.ts +29 -5
  55. package/corpus/core/src/client/AssistantChat.tsx +89 -42
  56. package/corpus/core/src/client/DefaultSpinner.tsx +8 -1
  57. package/corpus/core/src/client/chat/message-components.tsx +49 -1
  58. package/corpus/core/src/client/chat/repo-helpers.ts +71 -0
  59. package/corpus/core/src/client/chat/run-recovery.tsx +15 -5
  60. package/corpus/core/src/client/components/ApiKeySettings.tsx +8 -8
  61. package/corpus/core/src/client/components/CodeRequiredDialog.tsx +26 -15
  62. package/corpus/core/src/client/components/MissingKeyCard.tsx +13 -6
  63. package/corpus/core/src/client/composer/TiptapComposer.tsx +4 -3
  64. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +0 -1
  65. package/corpus/core/src/client/guided-questions.tsx +21 -27
  66. package/corpus/core/src/client/integrations/IntegrationCard.tsx +1 -1
  67. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +1 -1
  68. package/corpus/core/src/client/onboarding/OnboardingBanner.tsx +2 -2
  69. package/corpus/core/src/client/onboarding/OnboardingPanel.tsx +23 -19
  70. package/corpus/core/src/client/resources/ResourceEditor.tsx +18 -10
  71. package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
  72. package/corpus/core/src/client/settings/SettingsPanel.tsx +8 -3
  73. package/corpus/core/src/client/settings/useBuilderStatus.ts +8 -41
  74. package/corpus/core/src/client/useProductionAgent.ts +6 -2
  75. package/corpus/core/src/deploy/build.ts +1 -1
  76. package/corpus/core/src/observability/traces.ts +3 -3
  77. package/corpus/core/src/onboarding/default-steps.ts +1 -1
  78. package/corpus/core/src/scripts/agent-engines/manage-agent-engine.ts +1 -1
  79. package/corpus/core/src/scripts/agent-engines/set-agent-engine.ts +1 -1
  80. package/corpus/core/src/server/agent-chat-plugin.ts +177 -81
  81. package/corpus/core/src/server/core-routes-plugin.ts +7 -1
  82. package/corpus/core/src/server/open-route.ts +59 -40
  83. package/corpus/core/src/shared/reasoning-effort.ts +2 -0
  84. package/corpus/core/src/sharing/access.ts +22 -2
  85. package/corpus/core/src/sharing/registry.ts +18 -0
  86. package/corpus/core/src/styles/agent-native.css +104 -20
  87. package/corpus/core/src/styles/rich-markdown-editor.css +11 -10
  88. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +10 -10
  89. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +10 -10
  90. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +6 -5
  91. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +9 -9
  92. package/corpus/templates/analytics/app/global.css +4 -0
  93. package/corpus/templates/analytics/app/lib/chart-theme.ts +13 -0
  94. package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +22 -24
  95. package/corpus/templates/analytics/changelog/2026-06-30-dashboard-charts-now-use-theme-aware-tooltip-and-grid-colors.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-06-30-fixed-ask-composer-spacing-so-the-chat-field-has-a-comfortab.md +6 -0
  97. package/corpus/templates/calendar/AGENTS.md +4 -0
  98. package/corpus/templates/calendar/actions/connect-google-calendar.ts +80 -0
  99. package/corpus/templates/calendar/changelog/2026-06-30-calendar-now-gives-the-agent-a-safe-google-connection-link-i.md +6 -0
  100. package/corpus/templates/calendar/server/plugins/agent-chat.ts +4 -0
  101. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +5 -5
  102. package/corpus/templates/content/app/global.css +6 -5
  103. package/corpus/templates/content/changelog/2026-06-30-editor-floating-toolbars-now-use-theme-aware-colors-in-light.md +6 -0
  104. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +6 -1
  105. package/corpus/templates/design/actions/add-localhost-screens.ts +63 -8
  106. package/corpus/templates/design/actions/apply-motion-edit.ts +12 -46
  107. package/corpus/templates/design/actions/list-design-native-assets.ts +2 -1
  108. package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +49 -1
  109. package/corpus/templates/design/actions/navigate.ts +3 -12
  110. package/corpus/templates/design/actions/open-visual-edit.ts +341 -0
  111. package/corpus/templates/design/actions/view-screen.ts +1 -1
  112. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +1 -1
  113. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +345 -14
  114. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +71 -91
  115. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +25 -27
  116. package/corpus/templates/design/app/components/design/DeviceFrame.tsx +1 -1
  117. package/corpus/templates/design/app/components/design/DrawOverlay.tsx +2 -2
  118. package/corpus/templates/design/app/components/design/EditPanel.tsx +1111 -570
  119. package/corpus/templates/design/app/components/design/LayersPanel.tsx +162 -32
  120. package/corpus/templates/design/app/components/design/MotionDock.tsx +268 -240
  121. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1038 -150
  122. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +1 -1
  123. package/corpus/templates/design/app/components/design/ReviewPanel.tsx +81 -102
  124. package/corpus/templates/design/app/components/design/StatesPanel.tsx +6 -6
  125. package/corpus/templates/design/app/components/design/TokensPanel.tsx +11 -11
  126. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +9 -7
  127. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +1129 -155
  128. package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +130 -37
  129. package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +24 -11
  130. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +184 -162
  131. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +137 -79
  132. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +13 -13
  133. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +8 -8
  134. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +2 -2
  135. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +4 -4
  136. package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +3 -3
  137. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +13 -7
  138. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +14 -11
  139. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +4 -4
  140. package/corpus/templates/design/app/components/design/inspector/index.ts +2 -0
  141. package/corpus/templates/design/app/components/design/types.ts +19 -0
  142. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +61 -78
  143. package/corpus/templates/design/app/components/layout/Header.tsx +0 -1
  144. package/corpus/templates/design/app/components/layout/Layout.tsx +3 -2
  145. package/corpus/templates/design/app/components/layout/Sidebar.tsx +0 -2
  146. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +5 -4
  147. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +1 -1
  148. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +2 -2
  149. package/corpus/templates/design/app/global.css +56 -0
  150. package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -5
  151. package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -7
  152. package/corpus/templates/design/app/hooks/use-question-flow.ts +3 -2
  153. package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +6 -4
  154. package/corpus/templates/design/app/i18n/zh-TW.ts +5 -14
  155. package/corpus/templates/design/app/i18n-data.ts +63 -188
  156. package/corpus/templates/design/app/lib/agent-chat.ts +13 -0
  157. package/corpus/templates/design/app/pages/DesignEditor.tsx +1428 -384
  158. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +9 -5
  159. package/corpus/templates/design/app/pages/DesignSystems.tsx +2 -2
  160. package/corpus/templates/design/app/pages/Index.tsx +49 -26
  161. package/corpus/templates/design/app/pages/NotFound.tsx +25 -8
  162. package/corpus/templates/design/app/pages/VisualEdit.tsx +17 -5
  163. package/corpus/templates/design/app/routes/examples.tsx +1 -7
  164. package/corpus/templates/design/app/routes/templates.tsx +7 -4
  165. package/corpus/templates/design/changelog/2026-06-30-board-shapes-and-auto-layout-controls-are-clearer.md +6 -0
  166. package/corpus/templates/design/changelog/2026-06-30-component-selections-now-use-purple-component-chrome-and-sho.md +6 -0
  167. package/corpus/templates/design/changelog/2026-06-30-constraints-now-stay-tucked-into-a-compact-inspector-preview.md +6 -0
  168. package/corpus/templates/design/changelog/2026-06-30-creating-a-component-now-opens-in-a-compact-inspector-popove.md +6 -0
  169. package/corpus/templates/design/changelog/2026-06-30-design-cards-no-longer-show-legacy-project-type-badges.md +6 -0
  170. package/corpus/templates/design/changelog/2026-06-30-design-chat-now-keeps-new-turns-in-the-visible-design-agent-.md +6 -0
  171. package/corpus/templates/design/changelog/2026-06-30-design-editor-panels-now-keep-their-compact-text-sizing-cons.md +6 -0
  172. package/corpus/templates/design/changelog/2026-06-30-design-no-longer-shows-the-connected-local-code-warning-bann.md +6 -0
  173. package/corpus/templates/design/changelog/2026-06-30-design-now-opens-to-the-files-panel-unless-a-generation-is-a.md +6 -0
  174. package/corpus/templates/design/changelog/2026-06-30-design-opens-with-a-cleaner-empty-canvas-and-loading-preview.md +6 -0
  175. package/corpus/templates/design/changelog/2026-06-30-design-tools-use-simpler-less-decorative-icons.md +6 -0
  176. package/corpus/templates/design/changelog/2026-06-30-dragging-absolute-elements-no-longer-shows-coordinate-labels.md +6 -0
  177. package/corpus/templates/design/changelog/2026-06-30-fixed-all-screens-opening-too-zoomed-in-by-default.md +6 -0
  178. package/corpus/templates/design/changelog/2026-06-30-fixed-the-public-design-assets-sidebar-so-native-components-.md +6 -0
  179. package/corpus/templates/design/changelog/2026-06-30-fixed-the-screen-overview-board-so-empty-board-space-no-long.md +6 -0
  180. package/corpus/templates/design/changelog/2026-06-30-full-view-screens-can-now-scroll-while-remaining-editable.md +6 -0
  181. package/corpus/templates/design/changelog/2026-06-30-inspector-element-headers-show-the-selected-html-tag-and-the.md +6 -0
  182. package/corpus/templates/design/changelog/2026-06-30-inspector-inputs-stay-compact-across-desktop-breakpoints.md +6 -0
  183. package/corpus/templates/design/changelog/2026-06-30-layers-can-be-multi-selected-from-the-canvas-and-edited-toge.md +6 -0
  184. package/corpus/templates/design/changelog/2026-06-30-local-visual-edit-links-can-edit-localhost-frames-without-si.md +6 -0
  185. package/corpus/templates/design/changelog/2026-06-30-localhost-visual-edit-frames-can-now-be-selected-and-edited.md +6 -0
  186. package/corpus/templates/design/changelog/2026-06-30-marquee-selection-now-works-inside-screens-multi-selected-la.md +6 -0
  187. package/corpus/templates/design/changelog/2026-06-30-motion-is-now-available-from-the-persistent-left-rail-and-th.md +6 -0
  188. package/corpus/templates/design/changelog/2026-06-30-motion-timeline-collapse-and-reopen-animations-feel-smoother.md +6 -0
  189. package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +6 -0
  190. package/corpus/templates/design/changelog/2026-06-30-new-board-shapes-now-start-with-neutral-gray-styling.md +6 -0
  191. package/corpus/templates/design/changelog/2026-06-30-new-designs-open-into-a-steadier-loading-state-before-the-ed.md +6 -0
  192. package/corpus/templates/design/changelog/2026-06-30-new-designs-show-a-loading-state-during-handoff-and-keep-edi.md +6 -0
  193. package/corpus/templates/design/changelog/2026-06-30-public-visual-edit-design-links-now-open-directly-instead-of.md +6 -0
  194. package/corpus/templates/design/changelog/2026-06-30-removed-the-confusing-states-section-from-the-design-editor-.md +6 -0
  195. package/corpus/templates/design/changelog/2026-06-30-removed-the-templates-gallery-from-design-navigation.md +6 -0
  196. package/corpus/templates/design/changelog/2026-06-30-share-stays-visible-as-soon-as-editable-designs-load.md +6 -0
  197. package/corpus/templates/design/changelog/2026-06-30-signed-out-save-and-share-controls-use-simpler-labels-and-op.md +6 -0
  198. package/corpus/templates/design/changelog/2026-06-30-text-added-on-the-canvas-now-focuses-cleanly-with-the-right-.md +6 -0
  199. package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-is-simpler-and-its-bottom.md +6 -0
  200. package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-now-follows-the-current-t.md +6 -0
  201. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-child-layout-controls-o.md +6 -0
  202. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-the-ask-ai-section-abov.md +6 -0
  203. package/corpus/templates/design/changelog/2026-06-30-the-design-review-panel-no-longer-shows-a-separate-inline-au.md +6 -0
  204. package/corpus/templates/design/changelog/2026-06-30-the-empty-designs-page-now-focuses-on-a-single-primary-new-d.md +6 -0
  205. package/corpus/templates/design/changelog/2026-06-30-the-layers-panel-header-stays-as-layers-while-multiple-items.md +6 -0
  206. package/corpus/templates/design/changelog/2026-06-30-the-missing-design-screen-now-uses-a-neutral-back-button.md +6 -0
  207. package/corpus/templates/design/changelog/2026-06-30-the-motion-timeline-now-closes-without-squeezing-the-canvas-.md +6 -0
  208. package/corpus/templates/design/changelog/2026-06-30-the-new-design-connect-ai-setup-now-lines-up-with-the-compos.md +6 -0
  209. package/corpus/templates/design/changelog/2026-06-30-the-screen-overview-board-now-blends-into-the-canvas-and-new.md +6 -0
  210. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-drops-now-show-screen-guides.md +6 -0
  211. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-keep-a-transparent-backdrop-and-.md +6 -0
  212. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-select-reliably-from-all-screens.md +6 -0
  213. package/corpus/templates/design/changelog/2026-06-30-visual-edit-can-open-and-refresh-localhost-screens-in-one-au.md +6 -0
  214. package/corpus/templates/design/e2e/helpers.ts +15 -4
  215. package/corpus/templates/design/server/db/index.ts +52 -0
  216. package/corpus/templates/design/server/plugins/agent-chat.ts +5 -0
  217. package/corpus/templates/design/server/plugins/auth.ts +1 -0
  218. package/corpus/templates/design/server/plugins/core-routes.ts +4 -0
  219. package/corpus/templates/design/shared/board-file.ts +380 -5
  220. package/corpus/templates/design/shared/board-objects.ts +2 -2
  221. package/corpus/templates/design/shared/code-layer.ts +50 -6
  222. package/corpus/templates/design/shared/motion-compiler.ts +27 -0
  223. package/corpus/templates/macros/app/components/DailyProgress.tsx +41 -37
  224. package/corpus/templates/macros/app/components/ExerciseCard.tsx +2 -2
  225. package/corpus/templates/macros/app/components/MealCard.tsx +2 -2
  226. package/corpus/templates/macros/app/components/VoiceDictation.tsx +1 -1
  227. package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +1 -1
  228. package/corpus/templates/macros/app/components/WeightCard.tsx +2 -2
  229. package/corpus/templates/macros/app/components/WeightTracker.tsx +1 -1
  230. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +1 -1
  231. package/corpus/templates/macros/app/routes/_index.tsx +5 -5
  232. package/corpus/templates/macros/app/routes/analytics.tsx +1 -1
  233. package/corpus/templates/macros/changelog/2026-06-30-dashboard-loading-and-chart-surfaces-now-use-theme-aware-col.md +6 -0
  234. package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +14 -11
  235. package/corpus/templates/mail/app/global.css +3 -2
  236. package/corpus/templates/mail/changelog/2026-06-30-compose-floating-toolbars-now-use-theme-aware-colors-in-ligh.md +6 -0
  237. package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -2
  238. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +3 -3
  239. package/corpus/templates/slides/app/global.css +10 -0
  240. package/corpus/templates/slides/app/pages/Index.tsx +55 -51
  241. package/corpus/templates/slides/changelog/2026-06-30-deck-thumbnails-collapse-cleanly-to-one-column-when-the-chat.md +6 -0
  242. package/dist/agent/engine/anthropic-engine.d.ts +2 -2
  243. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  244. package/dist/agent/engine/builder-engine.d.ts +2 -2
  245. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  246. package/dist/agent/engine/builtin.js +1 -1
  247. package/dist/agent/engine/builtin.js.map +1 -1
  248. package/dist/agent/engine/output-tokens.js +1 -1
  249. package/dist/agent/engine/output-tokens.js.map +1 -1
  250. package/dist/agent/harness/acp-adapter.d.ts +4 -1
  251. package/dist/agent/harness/acp-adapter.d.ts.map +1 -1
  252. package/dist/agent/harness/acp-adapter.js +19 -2
  253. package/dist/agent/harness/acp-adapter.js.map +1 -1
  254. package/dist/agent/harness/ai-sdk-adapter.d.ts.map +1 -1
  255. package/dist/agent/harness/ai-sdk-adapter.js +3 -0
  256. package/dist/agent/harness/ai-sdk-adapter.js.map +1 -1
  257. package/dist/agent/harness/translate.d.ts.map +1 -1
  258. package/dist/agent/harness/translate.js +3 -0
  259. package/dist/agent/harness/translate.js.map +1 -1
  260. package/dist/agent/harness/types.d.ts +1 -0
  261. package/dist/agent/harness/types.d.ts.map +1 -1
  262. package/dist/agent/harness/types.js.map +1 -1
  263. package/dist/agent/model-config.d.ts +21 -20
  264. package/dist/agent/model-config.d.ts.map +1 -1
  265. package/dist/agent/model-config.js +31 -13
  266. package/dist/agent/model-config.js.map +1 -1
  267. package/dist/agent/production-agent.d.ts.map +1 -1
  268. package/dist/agent/production-agent.js +85 -10
  269. package/dist/agent/production-agent.js.map +1 -1
  270. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  271. package/dist/agent/thread-data-builder.js +27 -6
  272. package/dist/agent/thread-data-builder.js.map +1 -1
  273. package/dist/agent/tool-call-journal.d.ts +11 -9
  274. package/dist/agent/tool-call-journal.d.ts.map +1 -1
  275. package/dist/agent/tool-call-journal.js +92 -40
  276. package/dist/agent/tool-call-journal.js.map +1 -1
  277. package/dist/agent/types.d.ts +5 -1
  278. package/dist/agent/types.d.ts.map +1 -1
  279. package/dist/agent/types.js.map +1 -1
  280. package/dist/cli/design-connect.d.ts.map +1 -1
  281. package/dist/cli/design-connect.js +84 -0
  282. package/dist/cli/design-connect.js.map +1 -1
  283. package/dist/cli/gateway-helpers.d.ts +4 -0
  284. package/dist/cli/gateway-helpers.d.ts.map +1 -1
  285. package/dist/cli/gateway-helpers.js +9 -0
  286. package/dist/cli/gateway-helpers.js.map +1 -1
  287. package/dist/cli/recap.d.ts.map +1 -1
  288. package/dist/cli/recap.js +0 -2
  289. package/dist/cli/recap.js.map +1 -1
  290. package/dist/cli/skills.d.ts.map +1 -1
  291. package/dist/cli/skills.js +54 -16
  292. package/dist/cli/skills.js.map +1 -1
  293. package/dist/cli/workspace-dev.d.ts.map +1 -1
  294. package/dist/cli/workspace-dev.js +33 -6
  295. package/dist/cli/workspace-dev.js.map +1 -1
  296. package/dist/client/AssistantChat.d.ts.map +1 -1
  297. package/dist/client/AssistantChat.js +72 -26
  298. package/dist/client/AssistantChat.js.map +1 -1
  299. package/dist/client/DefaultSpinner.d.ts.map +1 -1
  300. package/dist/client/DefaultSpinner.js +8 -1
  301. package/dist/client/DefaultSpinner.js.map +1 -1
  302. package/dist/client/chat/message-components.d.ts +7 -1
  303. package/dist/client/chat/message-components.d.ts.map +1 -1
  304. package/dist/client/chat/message-components.js +37 -1
  305. package/dist/client/chat/message-components.js.map +1 -1
  306. package/dist/client/chat/repo-helpers.d.ts +1 -0
  307. package/dist/client/chat/repo-helpers.d.ts.map +1 -1
  308. package/dist/client/chat/repo-helpers.js +59 -0
  309. package/dist/client/chat/repo-helpers.js.map +1 -1
  310. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  311. package/dist/client/chat/run-recovery.js +4 -4
  312. package/dist/client/chat/run-recovery.js.map +1 -1
  313. package/dist/client/components/ApiKeySettings.js +8 -8
  314. package/dist/client/components/ApiKeySettings.js.map +1 -1
  315. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  316. package/dist/client/components/CodeRequiredDialog.js +24 -15
  317. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  318. package/dist/client/components/MissingKeyCard.d.ts.map +1 -1
  319. package/dist/client/components/MissingKeyCard.js +11 -6
  320. package/dist/client/components/MissingKeyCard.js.map +1 -1
  321. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  322. package/dist/client/composer/TiptapComposer.js +4 -3
  323. package/dist/client/composer/TiptapComposer.js.map +1 -1
  324. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  325. package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
  326. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  327. package/dist/client/guided-questions.d.ts.map +1 -1
  328. package/dist/client/guided-questions.js +6 -6
  329. package/dist/client/guided-questions.js.map +1 -1
  330. package/dist/client/integrations/IntegrationCard.js +1 -1
  331. package/dist/client/integrations/IntegrationCard.js.map +1 -1
  332. package/dist/client/integrations/IntegrationsPanel.js +1 -1
  333. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  334. package/dist/client/onboarding/OnboardingBanner.js +2 -2
  335. package/dist/client/onboarding/OnboardingBanner.js.map +1 -1
  336. package/dist/client/onboarding/OnboardingPanel.js +23 -19
  337. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  338. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  339. package/dist/client/resources/ResourceEditor.js +13 -10
  340. package/dist/client/resources/ResourceEditor.js.map +1 -1
  341. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  342. package/dist/client/resources/ResourcesPanel.js +2 -1
  343. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  344. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  345. package/dist/client/settings/SettingsPanel.js +8 -3
  346. package/dist/client/settings/SettingsPanel.js.map +1 -1
  347. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  348. package/dist/client/settings/useBuilderStatus.js +6 -38
  349. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  350. package/dist/client/useProductionAgent.d.ts +2 -1
  351. package/dist/client/useProductionAgent.d.ts.map +1 -1
  352. package/dist/client/useProductionAgent.js.map +1 -1
  353. package/dist/deploy/build.js +1 -1
  354. package/dist/deploy/build.js.map +1 -1
  355. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  356. package/dist/notifications/routes.d.ts +1 -1
  357. package/dist/observability/routes.d.ts +5 -5
  358. package/dist/observability/traces.d.ts.map +1 -1
  359. package/dist/observability/traces.js.map +1 -1
  360. package/dist/onboarding/default-steps.js +1 -1
  361. package/dist/onboarding/default-steps.js.map +1 -1
  362. package/dist/scripts/agent-engines/manage-agent-engine.js +1 -1
  363. package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
  364. package/dist/scripts/agent-engines/set-agent-engine.js +1 -1
  365. package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
  366. package/dist/server/agent-chat-plugin.d.ts +3 -0
  367. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  368. package/dist/server/agent-chat-plugin.js +134 -72
  369. package/dist/server/agent-chat-plugin.js.map +1 -1
  370. package/dist/server/core-routes-plugin.d.ts +3 -0
  371. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  372. package/dist/server/core-routes-plugin.js +4 -1
  373. package/dist/server/core-routes-plugin.js.map +1 -1
  374. package/dist/server/open-route.d.ts +9 -0
  375. package/dist/server/open-route.d.ts.map +1 -1
  376. package/dist/server/open-route.js +48 -38
  377. package/dist/server/open-route.js.map +1 -1
  378. package/dist/shared/reasoning-effort.js +3 -0
  379. package/dist/shared/reasoning-effort.js.map +1 -1
  380. package/dist/sharing/access.d.ts.map +1 -1
  381. package/dist/sharing/access.js +18 -2
  382. package/dist/sharing/access.js.map +1 -1
  383. package/dist/sharing/registry.d.ts +10 -0
  384. package/dist/sharing/registry.d.ts.map +1 -1
  385. package/dist/sharing/registry.js.map +1 -1
  386. package/dist/styles/agent-native.css +104 -20
  387. package/dist/styles/rich-markdown-editor.css +11 -10
  388. package/docs/content/cloneable-saas.mdx +2 -2
  389. package/docs/content/faq.mdx +1 -1
  390. package/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
  391. package/docs/content/locales/ar-SA/faq.mdx +1 -1
  392. package/docs/content/locales/ar-SA/template-chat.mdx +1 -1
  393. package/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
  394. package/docs/content/locales/de-DE/faq.mdx +1 -1
  395. package/docs/content/locales/de-DE/template-chat.mdx +1 -1
  396. package/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
  397. package/docs/content/locales/es-ES/faq.mdx +1 -1
  398. package/docs/content/locales/es-ES/template-chat.mdx +1 -1
  399. package/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
  400. package/docs/content/locales/fr-FR/faq.mdx +1 -1
  401. package/docs/content/locales/fr-FR/template-chat.mdx +1 -1
  402. package/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
  403. package/docs/content/locales/hi-IN/faq.mdx +1 -1
  404. package/docs/content/locales/hi-IN/template-chat.mdx +1 -1
  405. package/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
  406. package/docs/content/locales/ja-JP/faq.mdx +1 -1
  407. package/docs/content/locales/ja-JP/template-chat.mdx +1 -1
  408. package/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
  409. package/docs/content/locales/ko-KR/faq.mdx +1 -1
  410. package/docs/content/locales/ko-KR/template-chat.mdx +1 -1
  411. package/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
  412. package/docs/content/locales/pt-BR/faq.mdx +1 -1
  413. package/docs/content/locales/pt-BR/template-chat.mdx +1 -1
  414. package/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
  415. package/docs/content/locales/zh-CN/faq.mdx +1 -1
  416. package/docs/content/locales/zh-CN/template-chat.mdx +1 -1
  417. package/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
  418. package/docs/content/locales/zh-TW/faq.mdx +1 -1
  419. package/docs/content/locales/zh-TW/template-chat.mdx +1 -1
  420. package/docs/content/template-chat.mdx +1 -1
  421. package/package.json +1 -1
  422. package/corpus/templates/design/app/components/design/LocalSourceEditBanner.tsx +0 -157
  423. package/corpus/templates/design/app/lib/design-templates.ts +0 -1305
  424. package/corpus/templates/design/app/pages/Templates.tsx +0 -279
@@ -47,6 +47,7 @@ import {
47
47
  useRef,
48
48
  useState,
49
49
  type PointerEvent as ReactPointerEvent,
50
+ type TransitionEvent as ReactTransitionEvent,
50
51
  } from "react";
51
52
 
52
53
  import { Button } from "@/components/ui/button";
@@ -103,6 +104,8 @@ export interface MotionDockProps {
103
104
  open?: boolean;
104
105
  /** Called when the user toggles the dock open/closed. */
105
106
  onOpenChange?: (open: boolean) => void;
107
+ /** Called after the close transform finishes. */
108
+ onExitComplete?: () => void;
106
109
  /** Called when a track is modified (add/move/delete keyframe or change value). */
107
110
  onTracksChange?: (tracks: MotionDockTrack[]) => void;
108
111
  /** Called when durationMs is edited. */
@@ -131,6 +134,7 @@ export function MotionDock({
131
134
  defaultEase = "ease",
132
135
  open: openProp,
133
136
  onOpenChange,
137
+ onExitComplete,
134
138
  onTracksChange,
135
139
  onDurationChange,
136
140
  canvasIframeRef,
@@ -159,9 +163,19 @@ export function MotionDock({
159
163
 
160
164
  // Dock height (resizable via the top drag handle).
161
165
  const [dockHeight, setDockHeight] = useState(DEFAULT_DOCK_HEIGHT);
166
+ const [isResizingDock, setIsResizingDock] = useState(false);
162
167
  const resizingRef = useRef(false);
163
168
  const resizeStartRef = useRef<{ y: number; h: number } | null>(null);
164
169
 
170
+ const handleDockTransitionEnd = useCallback(
171
+ (event: ReactTransitionEvent<HTMLDivElement>) => {
172
+ if (event.currentTarget !== event.target) return;
173
+ if (event.propertyName !== "height") return;
174
+ if (!isOpen) onExitComplete?.();
175
+ },
176
+ [isOpen, onExitComplete],
177
+ );
178
+
165
179
  // Expanded layers in the sidebar.
166
180
  const [expandedNodeIds, setExpandedNodeIds] = useState<Set<string>>(
167
181
  () => new Set(tracks.map((t) => t.targetNodeId)),
@@ -274,6 +288,7 @@ export function MotionDock({
274
288
  const handleResizePointerDown = useCallback(
275
289
  (e: ReactPointerEvent<HTMLDivElement>) => {
276
290
  resizingRef.current = true;
291
+ setIsResizingDock(true);
277
292
  resizeStartRef.current = { y: e.clientY, h: dockHeight };
278
293
  (e.target as HTMLElement).setPointerCapture(e.pointerId);
279
294
  },
@@ -293,6 +308,7 @@ export function MotionDock({
293
308
 
294
309
  const handleResizePointerUp = useCallback(() => {
295
310
  resizingRef.current = false;
311
+ setIsResizingDock(false);
296
312
  resizeStartRef.current = null;
297
313
  }, []);
298
314
 
@@ -404,272 +420,285 @@ export function MotionDock({
404
420
  // ── Render ────────────────────────────────────────────────────────────────
405
421
  return (
406
422
  <div
407
- aria-label="Motion dock"
408
423
  className={cn(
409
- "flex flex-col overflow-hidden border-t bg-background transition-[height,opacity,transform,border-color] duration-200 ease-out select-none will-change-transform",
410
- isOpen
411
- ? "translate-y-0 border-border opacity-100"
412
- : "translate-y-full border-transparent opacity-0 pointer-events-none",
424
+ "design-motion-dock-space relative shrink-0 overflow-visible",
425
+ isResizingDock && "design-motion-dock-resizing",
413
426
  )}
427
+ onTransitionEnd={handleDockTransitionEnd}
414
428
  style={{ height: isOpen ? dockHeight : 0 }}
415
429
  >
416
- {/* Resize handle */}
417
430
  <div
418
- className="absolute -top-1 left-0 right-0 h-2 cursor-ns-resize z-10"
419
- onPointerDown={handleResizePointerDown}
420
- onPointerMove={handleResizePointerMove}
421
- onPointerUp={handleResizePointerUp}
422
- />
423
-
424
- {/* Dock toolbar */}
425
- <div className="flex h-8 shrink-0 items-center gap-1 border-b border-border px-2">
426
- {/* Collapse toggle. The label and nearby space are part of the target. */}
427
- <button
428
- type="button"
429
- className="-ml-1 flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-md px-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground outline-none transition-colors hover:bg-accent hover:text-foreground focus-visible:ring-1 focus-visible:ring-[var(--design-editor-accent-color)]"
430
- onClick={() => setOpen(false)}
431
- aria-label="Collapse motion dock"
432
- >
433
- <IconChevronDown className="size-3.5" />
434
- <span>Motion</span>
435
- </button>
436
-
437
- <>
438
- {/* Play / Pause */}
439
- <Tooltip>
440
- <TooltipTrigger asChild>
441
- <Button
442
- type="button"
443
- variant="ghost"
444
- size="icon"
445
- className="size-6 shrink-0"
446
- onClick={playing ? stopPlayback : startPlayback}
447
- aria-label={playing ? "Pause" : "Play"}
448
- >
449
- {playing ? (
450
- <IconPlayerPause className="size-3.5" />
451
- ) : (
452
- <IconPlayerPlay className="size-3.5" />
453
- )}
454
- </Button>
455
- </TooltipTrigger>
456
- <TooltipContent side="top">
457
- {playing ? "Pause" : "Play"}
458
- </TooltipContent>
459
- </Tooltip>
460
-
461
- {/* Stop / reset */}
462
- <Tooltip>
463
- <TooltipTrigger asChild>
464
- <Button
465
- type="button"
466
- variant="ghost"
467
- size="icon"
468
- className="size-6 shrink-0"
469
- onClick={() => {
470
- stopPlayback();
471
- setPlayhead(0);
472
- sendPreview(0);
473
- }}
474
- aria-label="Reset playhead"
475
- >
476
- <IconPlayerStop className="size-3.5" />
477
- </Button>
478
- </TooltipTrigger>
479
- <TooltipContent side="top">Reset</TooltipContent>
480
- </Tooltip>
481
-
482
- {/* Duration */}
483
- <div className="flex items-center gap-1 ml-1">
484
- <span className="text-[10px] text-muted-foreground">Duration</span>
485
- <Input
486
- type="number"
487
- min={50}
488
- step={50}
489
- value={durationInput}
490
- onChange={(e) => setDurationInput(e.target.value)}
491
- onBlur={() => {
492
- const ms = parseInt(durationInput, 10);
493
- if (!isNaN(ms) && ms >= 50) {
494
- onDurationChange?.(ms);
495
- } else {
496
- setDurationInput(String(durationMs));
497
- }
498
- }}
499
- className="h-5 w-16 px-1 text-[11px]"
500
- aria-label="Duration in ms"
501
- />
502
- <span className="text-[10px] text-muted-foreground">ms</span>
503
- </div>
431
+ aria-label="Motion dock"
432
+ aria-hidden={!isOpen ? true : undefined}
433
+ className={cn(
434
+ "design-motion-dock absolute inset-x-0 bottom-0 z-40 flex min-h-0 transform-gpu flex-col overflow-hidden border-t bg-background select-none",
435
+ isOpen
436
+ ? "translate-y-0 border-border opacity-100"
437
+ : "translate-y-full border-transparent pointer-events-none",
438
+ )}
439
+ style={{ height: dockHeight }}
440
+ >
441
+ {/* Resize handle */}
442
+ <div
443
+ className="absolute -top-1 left-0 right-0 h-2 cursor-ns-resize z-10"
444
+ onPointerDown={handleResizePointerDown}
445
+ onPointerMove={handleResizePointerMove}
446
+ onPointerUp={handleResizePointerUp}
447
+ onPointerCancel={handleResizePointerUp}
448
+ />
504
449
 
505
- {/* Add track — the "create first track" entry point. */}
506
- <div className="ml-2">
507
- <AddTrackMenu
508
- selectedTarget={selectedTarget}
509
- onCreateTrack={createTrack}
510
- />
511
- </div>
450
+ {/* Dock toolbar */}
451
+ <div className="flex h-8 shrink-0 items-center gap-1 border-b border-border px-2">
452
+ {/* Collapse toggle. The label and nearby space are part of the target. */}
453
+ <button
454
+ type="button"
455
+ className="-ml-1 flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-md px-1.5 !text-[11px] font-medium uppercase tracking-wide text-muted-foreground outline-none transition-colors hover:bg-accent hover:text-foreground focus-visible:ring-1 focus-visible:ring-[var(--design-editor-accent-color)]"
456
+ onClick={() => setOpen(false)}
457
+ aria-label="Collapse motion dock"
458
+ >
459
+ <IconChevronDown className="size-3.5" />
460
+ <span>Motion</span>
461
+ </button>
512
462
 
513
- <div className="ml-auto flex items-center gap-1">
514
- {/* Auto-keyframe toggle */}
463
+ <>
464
+ {/* Play / Pause */}
515
465
  <Tooltip>
516
466
  <TooltipTrigger asChild>
517
467
  <Button
518
468
  type="button"
519
- variant={autoKeyframe ? "secondary" : "ghost"}
469
+ variant="ghost"
520
470
  size="icon"
521
- className={cn(
522
- "size-6 shrink-0",
523
- autoKeyframe && "text-primary",
471
+ className="size-6 shrink-0"
472
+ onClick={playing ? stopPlayback : startPlayback}
473
+ aria-label={playing ? "Pause" : "Play"}
474
+ >
475
+ {playing ? (
476
+ <IconPlayerPause className="size-3.5" />
477
+ ) : (
478
+ <IconPlayerPlay className="size-3.5" />
524
479
  )}
525
- onClick={() => setAutoKeyframe((v) => !v)}
526
- aria-label="Toggle auto-keyframe"
527
- aria-pressed={autoKeyframe}
480
+ </Button>
481
+ </TooltipTrigger>
482
+ <TooltipContent side="top">
483
+ {playing ? "Pause" : "Play"}
484
+ </TooltipContent>
485
+ </Tooltip>
486
+
487
+ {/* Stop / reset */}
488
+ <Tooltip>
489
+ <TooltipTrigger asChild>
490
+ <Button
491
+ type="button"
492
+ variant="ghost"
493
+ size="icon"
494
+ className="size-6 shrink-0"
495
+ onClick={() => {
496
+ stopPlayback();
497
+ setPlayhead(0);
498
+ sendPreview(0);
499
+ }}
500
+ aria-label="Reset playhead"
528
501
  >
529
- <IconBolt className="size-3.5" />
502
+ <IconPlayerStop className="size-3.5" />
530
503
  </Button>
531
504
  </TooltipTrigger>
532
- <TooltipContent side="top">Auto-keyframe</TooltipContent>
505
+ <TooltipContent side="top">Reset</TooltipContent>
533
506
  </Tooltip>
534
507
 
535
- {applying ? (
508
+ {/* Duration */}
509
+ <div className="flex items-center gap-1 ml-1">
510
+ <span className="text-[10px] text-muted-foreground">
511
+ Duration
512
+ </span>
513
+ <Input
514
+ type="number"
515
+ min={50}
516
+ step={50}
517
+ value={durationInput}
518
+ onChange={(e) => setDurationInput(e.target.value)}
519
+ onBlur={() => {
520
+ const ms = parseInt(durationInput, 10);
521
+ if (!isNaN(ms) && ms >= 50) {
522
+ onDurationChange?.(ms);
523
+ } else {
524
+ setDurationInput(String(durationMs));
525
+ }
526
+ }}
527
+ className="h-5 w-16 px-1 !text-[11px] md:!text-[11px]"
528
+ aria-label="Duration in ms"
529
+ />
530
+ <span className="text-[10px] text-muted-foreground">ms</span>
531
+ </div>
532
+
533
+ {/* Add track — the "create first track" entry point. */}
534
+ <div className="ml-2">
535
+ <AddTrackMenu
536
+ selectedTarget={selectedTarget}
537
+ onCreateTrack={createTrack}
538
+ />
539
+ </div>
540
+
541
+ <div className="ml-auto flex items-center gap-1">
542
+ {/* Auto-keyframe toggle */}
536
543
  <Tooltip>
537
544
  <TooltipTrigger asChild>
538
- <span
539
- role="status"
540
- aria-label="Saving motion"
541
- className="flex size-6 items-center justify-center rounded text-muted-foreground"
545
+ <Button
546
+ type="button"
547
+ variant={autoKeyframe ? "secondary" : "ghost"}
548
+ size="icon"
549
+ className={cn(
550
+ "size-6 shrink-0",
551
+ autoKeyframe && "text-primary",
552
+ )}
553
+ onClick={() => setAutoKeyframe((v) => !v)}
554
+ aria-label="Toggle auto-keyframe"
555
+ aria-pressed={autoKeyframe}
542
556
  >
543
- <IconRefresh className="size-3 animate-spin" />
544
- </span>
557
+ <IconBolt className="size-3.5" />
558
+ </Button>
545
559
  </TooltipTrigger>
546
- <TooltipContent side="top">Saving motion</TooltipContent>
560
+ <TooltipContent side="top">Auto-keyframe</TooltipContent>
547
561
  </Tooltip>
548
- ) : null}
549
- </div>
550
- </>
551
- </div>
552
-
553
- {/* Dock body */}
554
- <div className="flex flex-1 overflow-hidden">
555
- {/* Layer sidebar */}
556
- <div
557
- className="flex flex-col shrink-0 border-r border-border overflow-y-auto"
558
- style={{ width: LAYER_SIDEBAR_WIDTH }}
559
- >
560
- {/* Ruler spacer */}
561
- <div
562
- style={{ height: RULER_HEIGHT }}
563
- className="border-b border-border"
564
- />
565
562
 
566
- {layers.length === 0 ? (
567
- <div className="flex flex-col items-center justify-center flex-1 gap-3 text-center px-4 py-6">
568
- <IconLayersSubtract className="size-5 text-muted-foreground/40" />
569
- {selectedTarget ? (
570
- <>
571
- <p className="text-[11px] text-muted-foreground/70 leading-snug">
572
- Animate{" "}
573
- <span className="font-medium text-foreground/80">
574
- {selectedTarget.label}
563
+ {applying ? (
564
+ <Tooltip>
565
+ <TooltipTrigger asChild>
566
+ <span
567
+ role="status"
568
+ aria-label="Saving motion"
569
+ className="flex size-6 items-center justify-center rounded text-muted-foreground"
570
+ >
571
+ <IconRefresh className="size-3 animate-spin" />
575
572
  </span>
576
- . Pick a property to add the first track.
577
- </p>
578
- <AddTrackMenu
579
- selectedTarget={selectedTarget}
580
- onCreateTrack={createTrack}
581
- variant="cta"
582
- />
583
- </>
584
- ) : (
585
- <p className="text-[11px] text-muted-foreground/70 leading-snug">
586
- Select an element on the canvas, then add a track to animate
587
- it.
588
- </p>
589
- )}
573
+ </TooltipTrigger>
574
+ <TooltipContent side="top">Saving motion</TooltipContent>
575
+ </Tooltip>
576
+ ) : null}
590
577
  </div>
591
- ) : (
592
- layers.map((layer) => (
593
- <LayerGroup
594
- key={layer.nodeId}
595
- layer={layer}
596
- expanded={expandedNodeIds.has(layer.nodeId)}
597
- onToggleExpand={() =>
598
- setExpandedNodeIds((prev) => {
599
- const next = new Set(prev);
600
- if (next.has(layer.nodeId)) next.delete(layer.nodeId);
601
- else next.add(layer.nodeId);
602
- return next;
603
- })
604
- }
605
- onAddKeyframe={(track) => addKeyframe(track)}
606
- />
607
- ))
608
- )}
578
+ </>
609
579
  </div>
610
580
 
611
- {/* Timeline / track area */}
612
- <div className="flex flex-col flex-1 overflow-hidden">
613
- {/* Ruler + playhead drag */}
581
+ {/* Dock body */}
582
+ <div className="flex flex-1 overflow-hidden">
583
+ {/* Layer sidebar */}
614
584
  <div
615
- ref={trackAreaRef}
616
- className="relative shrink-0 border-b border-border cursor-col-resize"
617
- style={{ height: RULER_HEIGHT }}
618
- onPointerDown={handleRulerPointerDown}
619
- onPointerMove={handleRulerPointerMove}
620
- onPointerUp={handleRulerPointerUp}
585
+ className="flex flex-col shrink-0 border-r border-border overflow-y-auto"
586
+ style={{ width: LAYER_SIDEBAR_WIDTH }}
621
587
  >
622
- {/* Tick marks */}
623
- {rulerTicks().map(({ t, label }) => (
624
- <div
625
- key={t}
626
- className="absolute top-0 flex flex-col items-center pointer-events-none"
627
- style={{ left: `${t * 100}%`, transform: "translateX(-50%)" }}
628
- >
629
- <span className="text-[9px] text-muted-foreground/60 leading-none mt-1">
630
- {label}
631
- </span>
632
- <div className="w-px h-2 bg-border mt-0.5" />
633
- </div>
634
- ))}
588
+ {/* Ruler spacer */}
589
+ <div
590
+ style={{ height: RULER_HEIGHT }}
591
+ className="border-b border-border"
592
+ />
635
593
 
636
- {/* Playhead */}
637
- <PlayheadLine t={playhead} height={RULER_HEIGHT} inRuler />
594
+ {layers.length === 0 ? (
595
+ <div className="flex flex-col items-center justify-center flex-1 gap-3 text-center px-4 py-6">
596
+ <IconLayersSubtract className="size-5 text-muted-foreground/40" />
597
+ {selectedTarget ? (
598
+ <>
599
+ <p className="!text-[11px] text-muted-foreground/70 leading-snug">
600
+ Animate{" "}
601
+ <span className="font-medium text-foreground/80">
602
+ {selectedTarget.label}
603
+ </span>
604
+ . Pick a property to add the first track.
605
+ </p>
606
+ <AddTrackMenu
607
+ selectedTarget={selectedTarget}
608
+ onCreateTrack={createTrack}
609
+ variant="cta"
610
+ />
611
+ </>
612
+ ) : (
613
+ <p className="!text-[11px] text-muted-foreground/70 leading-snug">
614
+ Select an element on the canvas, then add a track to animate
615
+ it.
616
+ </p>
617
+ )}
618
+ </div>
619
+ ) : (
620
+ layers.map((layer) => (
621
+ <LayerGroup
622
+ key={layer.nodeId}
623
+ layer={layer}
624
+ expanded={expandedNodeIds.has(layer.nodeId)}
625
+ onToggleExpand={() =>
626
+ setExpandedNodeIds((prev) => {
627
+ const next = new Set(prev);
628
+ if (next.has(layer.nodeId)) next.delete(layer.nodeId);
629
+ else next.add(layer.nodeId);
630
+ return next;
631
+ })
632
+ }
633
+ onAddKeyframe={(track) => addKeyframe(track)}
634
+ />
635
+ ))
636
+ )}
638
637
  </div>
639
638
 
640
- {/* Track rows with keyframe diamonds */}
641
- <div className="relative flex-1 overflow-y-auto">
642
- {layers.map((layer) => (
643
- <LayerTrackRows
644
- key={layer.nodeId}
645
- layer={layer}
646
- expanded={expandedNodeIds.has(layer.nodeId)}
647
- playhead={playhead}
648
- onDeleteKeyframe={deleteKeyframe}
649
- onMoveKeyframe={(track, kf, newT) => {
650
- updateTrack(track.targetNodeId, track.property, (tr) => ({
651
- ...tr,
652
- keyframes: tr.keyframes.map((k) =>
653
- k === kf ? { ...k, t: newT } : k,
654
- ),
655
- }));
656
- }}
639
+ {/* Timeline / track area */}
640
+ <div className="flex flex-col flex-1 overflow-hidden">
641
+ {/* Ruler + playhead drag */}
642
+ <div
643
+ ref={trackAreaRef}
644
+ className="relative shrink-0 border-b border-border cursor-col-resize"
645
+ style={{ height: RULER_HEIGHT }}
646
+ onPointerDown={handleRulerPointerDown}
647
+ onPointerMove={handleRulerPointerMove}
648
+ onPointerUp={handleRulerPointerUp}
649
+ >
650
+ {/* Tick marks */}
651
+ {rulerTicks().map(({ t, label }) => (
652
+ <div
653
+ key={t}
654
+ className="absolute top-0 flex flex-col items-center pointer-events-none"
655
+ style={{ left: `${t * 100}%`, transform: "translateX(-50%)" }}
656
+ >
657
+ <span className="text-[9px] text-muted-foreground/60 leading-none mt-1">
658
+ {label}
659
+ </span>
660
+ <div className="w-px h-2 bg-border mt-0.5" />
661
+ </div>
662
+ ))}
663
+
664
+ {/* Playhead */}
665
+ <PlayheadLine t={playhead} height={RULER_HEIGHT} inRuler />
666
+ </div>
667
+
668
+ {/* Track rows with keyframe diamonds */}
669
+ <div className="relative flex-1 overflow-y-auto">
670
+ {layers.map((layer) => (
671
+ <LayerTrackRows
672
+ key={layer.nodeId}
673
+ layer={layer}
674
+ expanded={expandedNodeIds.has(layer.nodeId)}
675
+ playhead={playhead}
676
+ onDeleteKeyframe={deleteKeyframe}
677
+ onMoveKeyframe={(track, kf, newT) => {
678
+ updateTrack(track.targetNodeId, track.property, (tr) => ({
679
+ ...tr,
680
+ keyframes: tr.keyframes.map((k) =>
681
+ k === kf ? { ...k, t: newT } : k,
682
+ ),
683
+ }));
684
+ }}
685
+ />
686
+ ))}
687
+
688
+ {/* Playhead across track rows */}
689
+ <PlayheadLine
690
+ t={playhead}
691
+ height={layers.reduce(
692
+ (sum, layer) =>
693
+ sum +
694
+ ROW_HEIGHT +
695
+ (expandedNodeIds.has(layer.nodeId)
696
+ ? layer.tracks.length * ROW_HEIGHT
697
+ : 0),
698
+ 0,
699
+ )}
657
700
  />
658
- ))}
659
-
660
- {/* Playhead across track rows */}
661
- <PlayheadLine
662
- t={playhead}
663
- height={layers.reduce(
664
- (sum, layer) =>
665
- sum +
666
- ROW_HEIGHT +
667
- (expandedNodeIds.has(layer.nodeId)
668
- ? layer.tracks.length * ROW_HEIGHT
669
- : 0),
670
- 0,
671
- )}
672
- />
701
+ </div>
673
702
  </div>
674
703
  </div>
675
704
  </div>
@@ -703,7 +732,7 @@ function AddTrackMenu({
703
732
  type="button"
704
733
  size="sm"
705
734
  variant="secondary"
706
- className="h-7 gap-1 text-[11px]"
735
+ className="h-7 gap-1 !text-[11px]"
707
736
  disabled={disabled}
708
737
  >
709
738
  <IconPlus className="size-3.5" />
@@ -714,7 +743,7 @@ function AddTrackMenu({
714
743
  type="button"
715
744
  size="sm"
716
745
  variant="ghost"
717
- className="h-6 gap-1 px-2 text-[11px]"
746
+ className="h-6 gap-1 px-2 !text-[11px]"
718
747
  disabled={disabled}
719
748
  >
720
749
  <IconPlus className="size-3.5" />
@@ -740,18 +769,17 @@ function AddTrackMenu({
740
769
  return (
741
770
  <DropdownMenu>
742
771
  <DropdownMenuTrigger asChild>{trigger}</DropdownMenuTrigger>
743
- <DropdownMenuContent align="start" className="w-52">
744
- <DropdownMenuLabel className="truncate text-[10px] text-muted-foreground">
772
+ <DropdownMenuContent align="start" className="w-48 p-1">
773
+ <DropdownMenuLabel className="truncate px-2 py-1 text-[10px] font-medium leading-none text-muted-foreground">
745
774
  Animate “{selectedTarget.label}”
746
775
  </DropdownMenuLabel>
747
- <DropdownMenuSeparator />
776
+ <DropdownMenuSeparator className="my-1" />
748
777
  {MOTION_PROPERTY_PRESETS.map((preset) => (
749
778
  <DropdownMenuItem
750
779
  key={`${preset.property}-${preset.label}`}
751
- className="text-[12px]"
780
+ className="h-7 px-2 text-[12px] leading-none"
752
781
  onSelect={() => onCreateTrack(preset)}
753
782
  >
754
- <IconDiamond className="size-3 text-primary/70" />
755
783
  {preset.label}
756
784
  </DropdownMenuItem>
757
785
  ))}
@@ -822,7 +850,7 @@ function LayerGroup({
822
850
  )}
823
851
  </span>
824
852
  <span
825
- className="flex-1 truncate text-[11px] font-medium"
853
+ className="flex-1 truncate !text-[11px] font-medium"
826
854
  title={layer.label}
827
855
  >
828
856
  {layer.label}