@agent-native/core 0.82.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 (474) hide show
  1. package/README.md +2 -2
  2. package/corpus/README.md +1 -1
  3. package/corpus/core/CHANGELOG.md +34 -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/CommandMenu.tsx +34 -12
  57. package/corpus/core/src/client/DefaultSpinner.tsx +8 -1
  58. package/corpus/core/src/client/chat/message-components.tsx +49 -1
  59. package/corpus/core/src/client/chat/repo-helpers.ts +71 -0
  60. package/corpus/core/src/client/chat/run-recovery.tsx +15 -5
  61. package/corpus/core/src/client/components/ApiKeySettings.tsx +8 -8
  62. package/corpus/core/src/client/components/CodeRequiredDialog.tsx +26 -15
  63. package/corpus/core/src/client/components/MissingKeyCard.tsx +13 -6
  64. package/corpus/core/src/client/composer/TiptapComposer.tsx +4 -3
  65. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +0 -1
  66. package/corpus/core/src/client/guided-questions.tsx +21 -27
  67. package/corpus/core/src/client/integrations/IntegrationCard.tsx +1 -1
  68. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +1 -1
  69. package/corpus/core/src/client/onboarding/OnboardingBanner.tsx +2 -2
  70. package/corpus/core/src/client/onboarding/OnboardingPanel.tsx +23 -19
  71. package/corpus/core/src/client/resources/ResourceEditor.tsx +18 -10
  72. package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
  73. package/corpus/core/src/client/settings/SettingsPanel.tsx +8 -3
  74. package/corpus/core/src/client/settings/useBuilderStatus.ts +8 -41
  75. package/corpus/core/src/client/useProductionAgent.ts +6 -2
  76. package/corpus/core/src/deploy/build.ts +1 -1
  77. package/corpus/core/src/observability/traces.ts +3 -3
  78. package/corpus/core/src/onboarding/default-steps.ts +1 -1
  79. package/corpus/core/src/scripts/agent-engines/manage-agent-engine.ts +1 -1
  80. package/corpus/core/src/scripts/agent-engines/set-agent-engine.ts +1 -1
  81. package/corpus/core/src/server/agent-chat-plugin.ts +177 -81
  82. package/corpus/core/src/server/core-routes-plugin.ts +7 -1
  83. package/corpus/core/src/server/open-route.ts +59 -40
  84. package/corpus/core/src/shared/reasoning-effort.ts +2 -0
  85. package/corpus/core/src/sharing/access.ts +22 -2
  86. package/corpus/core/src/sharing/registry.ts +18 -0
  87. package/corpus/core/src/styles/agent-native.css +104 -20
  88. package/corpus/core/src/styles/rich-markdown-editor.css +11 -10
  89. package/corpus/templates/analytics/actions/hubspot-deals.ts +64 -4
  90. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +10 -10
  91. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +10 -10
  92. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +6 -5
  93. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +9 -9
  94. package/corpus/templates/analytics/app/global.css +4 -0
  95. package/corpus/templates/analytics/app/lib/chart-theme.ts +13 -0
  96. package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +22 -24
  97. package/corpus/templates/analytics/changelog/2026-06-30-dashboard-charts-now-use-theme-aware-tooltip-and-grid-colors.md +6 -0
  98. package/corpus/templates/analytics/changelog/2026-06-30-fixed-ask-composer-spacing-so-the-chat-field-has-a-comfortab.md +6 -0
  99. package/corpus/templates/calendar/AGENTS.md +4 -0
  100. package/corpus/templates/calendar/actions/connect-google-calendar.ts +80 -0
  101. package/corpus/templates/calendar/changelog/2026-06-30-calendar-now-gives-the-agent-a-safe-google-connection-link-i.md +6 -0
  102. package/corpus/templates/calendar/server/plugins/agent-chat.ts +4 -0
  103. package/corpus/templates/content/.env.local.example +6 -0
  104. package/corpus/templates/content/AGENTS.md +10 -1
  105. package/corpus/templates/content/actions/_builder-cms-read-client.ts +14 -1
  106. package/corpus/templates/content/actions/_builder-cms-source-adapter.ts +43 -0
  107. package/corpus/templates/content/actions/_builder-cms-write-adapter.ts +79 -7
  108. package/corpus/templates/content/actions/_database-source-utils.ts +987 -22
  109. package/corpus/templates/content/actions/_database-utils.ts +41 -0
  110. package/corpus/templates/content/actions/_local-file-documents.ts +74 -1
  111. package/corpus/templates/content/actions/attach-content-database-source.ts +33 -8
  112. package/corpus/templates/content/actions/change-content-database-source-role.ts +14 -0
  113. package/corpus/templates/content/actions/disconnect-content-database-source.ts +3 -0
  114. package/corpus/templates/content/actions/execute-builder-source-execution.ts +71 -3
  115. package/corpus/templates/content/actions/list-content-databases.ts +41 -33
  116. package/corpus/templates/content/actions/process-builder-body-hydration.ts +47 -0
  117. package/corpus/templates/content/actions/update-document.ts +93 -0
  118. package/corpus/templates/content/app/blocks/SourceComponentBlock.tsx +277 -0
  119. package/corpus/templates/content/app/blocks/contentBlockRegistry.tsx +2 -0
  120. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +5 -5
  121. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +45 -4
  122. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +5 -1
  123. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +92 -0
  124. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +5 -3
  125. package/corpus/templates/content/app/components/editor/extensions/registryBlocks.ts +41 -0
  126. package/corpus/templates/content/app/components/editor/registrySlashItems.ts +4 -0
  127. package/corpus/templates/content/app/global.css +16 -8
  128. package/corpus/templates/content/app/hooks/use-content-database.ts +24 -0
  129. package/corpus/templates/content/app/i18n/zh-TW.ts +24 -0
  130. package/corpus/templates/content/app/i18n-data.ts +212 -0
  131. package/corpus/templates/content/app/lib/content-command-search.ts +64 -0
  132. package/corpus/templates/content/app/root.tsx +236 -8
  133. package/corpus/templates/content/changelog/2026-06-29-builder-cms-sources-now-sync-article-bodies-through-content.md +6 -0
  134. package/corpus/templates/content/changelog/2026-06-30-builder-article-media-now-render-as-images-and-embeds-when-r.md +6 -0
  135. package/corpus/templates/content/changelog/2026-06-30-builder-source-components-now-render-as-preserved-preview-bl.md +6 -0
  136. package/corpus/templates/content/changelog/2026-06-30-cmd-k-search-now-opens-from-the-editor-and-finds-real-content.md +6 -0
  137. package/corpus/templates/content/changelog/2026-06-30-editor-floating-toolbars-now-use-theme-aware-colors-in-light.md +6 -0
  138. package/corpus/templates/content/package.json +3 -1
  139. package/corpus/templates/content/scripts/check-native-deps.mjs +57 -0
  140. package/corpus/templates/content/scripts/dev-database.mjs +83 -0
  141. package/corpus/templates/content/scripts/seed-demo-user.mjs +107 -0
  142. package/corpus/templates/content/server/db/schema.ts +27 -0
  143. package/corpus/templates/content/server/plugins/db.ts +33 -0
  144. package/corpus/templates/content/shared/api.ts +45 -0
  145. package/corpus/templates/content/shared/builder-mdx.ts +905 -5
  146. package/corpus/templates/content/shared/nfm-registry.ts +2 -0
  147. package/corpus/templates/content/shared/source-component-block.ts +141 -0
  148. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +6 -1
  149. package/corpus/templates/design/actions/add-localhost-screens.ts +63 -8
  150. package/corpus/templates/design/actions/apply-motion-edit.ts +12 -46
  151. package/corpus/templates/design/actions/list-design-native-assets.ts +2 -1
  152. package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +49 -1
  153. package/corpus/templates/design/actions/navigate.ts +3 -12
  154. package/corpus/templates/design/actions/open-visual-edit.ts +341 -0
  155. package/corpus/templates/design/actions/view-screen.ts +1 -1
  156. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +1 -1
  157. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +350 -15
  158. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +71 -91
  159. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +25 -27
  160. package/corpus/templates/design/app/components/design/DeviceFrame.tsx +1 -1
  161. package/corpus/templates/design/app/components/design/DrawOverlay.tsx +2 -2
  162. package/corpus/templates/design/app/components/design/EditPanel.tsx +1111 -570
  163. package/corpus/templates/design/app/components/design/LayersPanel.tsx +162 -32
  164. package/corpus/templates/design/app/components/design/MotionDock.tsx +268 -240
  165. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1193 -207
  166. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +1 -1
  167. package/corpus/templates/design/app/components/design/ReviewPanel.tsx +81 -102
  168. package/corpus/templates/design/app/components/design/StatesPanel.tsx +6 -6
  169. package/corpus/templates/design/app/components/design/TokensPanel.tsx +11 -11
  170. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +9 -7
  171. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +1225 -154
  172. package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +130 -37
  173. package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +24 -11
  174. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +184 -162
  175. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +137 -79
  176. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +13 -13
  177. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +8 -8
  178. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +2 -2
  179. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +4 -4
  180. package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +3 -3
  181. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +13 -7
  182. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +14 -11
  183. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +4 -4
  184. package/corpus/templates/design/app/components/design/inspector/index.ts +2 -0
  185. package/corpus/templates/design/app/components/design/types.ts +19 -0
  186. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +61 -78
  187. package/corpus/templates/design/app/components/layout/Header.tsx +0 -1
  188. package/corpus/templates/design/app/components/layout/Layout.tsx +3 -2
  189. package/corpus/templates/design/app/components/layout/Sidebar.tsx +0 -2
  190. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +5 -4
  191. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +1 -1
  192. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +2 -2
  193. package/corpus/templates/design/app/global.css +56 -0
  194. package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -5
  195. package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -7
  196. package/corpus/templates/design/app/hooks/use-question-flow.ts +3 -2
  197. package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +6 -4
  198. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +6 -3
  199. package/corpus/templates/design/app/i18n/zh-TW.ts +5 -14
  200. package/corpus/templates/design/app/i18n-data.ts +63 -188
  201. package/corpus/templates/design/app/lib/agent-chat.ts +13 -0
  202. package/corpus/templates/design/app/pages/DesignEditor.tsx +1755 -401
  203. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +9 -5
  204. package/corpus/templates/design/app/pages/DesignSystems.tsx +2 -2
  205. package/corpus/templates/design/app/pages/Index.tsx +49 -26
  206. package/corpus/templates/design/app/pages/NotFound.tsx +25 -8
  207. package/corpus/templates/design/app/pages/VisualEdit.tsx +17 -5
  208. package/corpus/templates/design/app/routes/examples.tsx +1 -7
  209. package/corpus/templates/design/app/routes/templates.tsx +7 -4
  210. package/corpus/templates/design/changelog/2026-06-30-board-shapes-and-auto-layout-controls-are-clearer.md +6 -0
  211. package/corpus/templates/design/changelog/2026-06-30-canvas-editing-now-keeps-undo-redo-and-cross-screen-layer-mo.md +6 -0
  212. package/corpus/templates/design/changelog/2026-06-30-component-selections-now-use-purple-component-chrome-and-sho.md +6 -0
  213. package/corpus/templates/design/changelog/2026-06-30-constraints-now-stay-tucked-into-a-compact-inspector-preview.md +6 -0
  214. package/corpus/templates/design/changelog/2026-06-30-creating-a-component-now-opens-in-a-compact-inspector-popove.md +6 -0
  215. package/corpus/templates/design/changelog/2026-06-30-design-cards-no-longer-show-legacy-project-type-badges.md +6 -0
  216. package/corpus/templates/design/changelog/2026-06-30-design-chat-now-keeps-new-turns-in-the-visible-design-agent-.md +6 -0
  217. package/corpus/templates/design/changelog/2026-06-30-design-editor-panels-now-keep-their-compact-text-sizing-cons.md +6 -0
  218. package/corpus/templates/design/changelog/2026-06-30-design-no-longer-shows-the-connected-local-code-warning-bann.md +6 -0
  219. package/corpus/templates/design/changelog/2026-06-30-design-now-opens-to-the-files-panel-unless-a-generation-is-a.md +6 -0
  220. package/corpus/templates/design/changelog/2026-06-30-design-opens-with-a-cleaner-empty-canvas-and-loading-preview.md +6 -0
  221. package/corpus/templates/design/changelog/2026-06-30-design-tools-use-simpler-less-decorative-icons.md +6 -0
  222. package/corpus/templates/design/changelog/2026-06-30-dragging-absolute-elements-no-longer-shows-coordinate-labels.md +6 -0
  223. package/corpus/templates/design/changelog/2026-06-30-fixed-all-screens-opening-too-zoomed-in-by-default.md +6 -0
  224. package/corpus/templates/design/changelog/2026-06-30-fixed-the-public-design-assets-sidebar-so-native-components-.md +6 -0
  225. package/corpus/templates/design/changelog/2026-06-30-fixed-the-screen-overview-board-so-empty-board-space-no-long.md +6 -0
  226. package/corpus/templates/design/changelog/2026-06-30-full-view-screens-can-now-scroll-while-remaining-editable.md +6 -0
  227. package/corpus/templates/design/changelog/2026-06-30-inspector-element-headers-show-the-selected-html-tag-and-the.md +6 -0
  228. package/corpus/templates/design/changelog/2026-06-30-inspector-inputs-stay-compact-across-desktop-breakpoints.md +6 -0
  229. package/corpus/templates/design/changelog/2026-06-30-layers-can-be-multi-selected-from-the-canvas-and-edited-toge.md +6 -0
  230. package/corpus/templates/design/changelog/2026-06-30-local-visual-edit-links-can-edit-localhost-frames-without-si.md +6 -0
  231. package/corpus/templates/design/changelog/2026-06-30-localhost-visual-edit-frames-can-now-be-selected-and-edited.md +6 -0
  232. package/corpus/templates/design/changelog/2026-06-30-marquee-selection-now-works-inside-screens-multi-selected-la.md +6 -0
  233. package/corpus/templates/design/changelog/2026-06-30-motion-is-now-available-from-the-persistent-left-rail-and-th.md +6 -0
  234. package/corpus/templates/design/changelog/2026-06-30-motion-timeline-collapse-and-reopen-animations-feel-smoother.md +6 -0
  235. package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +6 -0
  236. package/corpus/templates/design/changelog/2026-06-30-new-board-shapes-now-start-with-neutral-gray-styling.md +6 -0
  237. package/corpus/templates/design/changelog/2026-06-30-new-designs-open-into-a-steadier-loading-state-before-the-ed.md +6 -0
  238. package/corpus/templates/design/changelog/2026-06-30-new-designs-show-a-loading-state-during-handoff-and-keep-edi.md +6 -0
  239. package/corpus/templates/design/changelog/2026-06-30-public-visual-edit-design-links-now-open-directly-instead-of.md +6 -0
  240. package/corpus/templates/design/changelog/2026-06-30-removed-the-confusing-states-section-from-the-design-editor-.md +6 -0
  241. package/corpus/templates/design/changelog/2026-06-30-removed-the-templates-gallery-from-design-navigation.md +6 -0
  242. package/corpus/templates/design/changelog/2026-06-30-share-stays-visible-as-soon-as-editable-designs-load.md +6 -0
  243. package/corpus/templates/design/changelog/2026-06-30-signed-out-save-and-share-controls-use-simpler-labels-and-op.md +6 -0
  244. package/corpus/templates/design/changelog/2026-06-30-text-added-on-the-canvas-now-focuses-cleanly-with-the-right-.md +6 -0
  245. package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-is-simpler-and-its-bottom.md +6 -0
  246. package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-now-follows-the-current-t.md +6 -0
  247. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-child-layout-controls-o.md +6 -0
  248. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-the-ask-ai-section-abov.md +6 -0
  249. package/corpus/templates/design/changelog/2026-06-30-the-design-review-panel-no-longer-shows-a-separate-inline-au.md +6 -0
  250. package/corpus/templates/design/changelog/2026-06-30-the-empty-designs-page-now-focuses-on-a-single-primary-new-d.md +6 -0
  251. package/corpus/templates/design/changelog/2026-06-30-the-layers-panel-header-stays-as-layers-while-multiple-items.md +6 -0
  252. package/corpus/templates/design/changelog/2026-06-30-the-missing-design-screen-now-uses-a-neutral-back-button.md +6 -0
  253. package/corpus/templates/design/changelog/2026-06-30-the-motion-timeline-now-closes-without-squeezing-the-canvas-.md +6 -0
  254. package/corpus/templates/design/changelog/2026-06-30-the-new-design-connect-ai-setup-now-lines-up-with-the-compos.md +6 -0
  255. package/corpus/templates/design/changelog/2026-06-30-the-screen-overview-board-now-blends-into-the-canvas-and-new.md +6 -0
  256. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-drops-now-show-screen-guides.md +6 -0
  257. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-keep-a-transparent-backdrop-and-.md +6 -0
  258. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-select-reliably-from-all-screens.md +6 -0
  259. package/corpus/templates/design/changelog/2026-06-30-visual-edit-can-open-and-refresh-localhost-screens-in-one-au.md +6 -0
  260. package/corpus/templates/design/e2e/helpers.ts +15 -4
  261. package/corpus/templates/design/server/db/index.ts +52 -0
  262. package/corpus/templates/design/server/plugins/agent-chat.ts +5 -0
  263. package/corpus/templates/design/server/plugins/auth.ts +1 -0
  264. package/corpus/templates/design/server/plugins/core-routes.ts +4 -0
  265. package/corpus/templates/design/shared/board-file.ts +380 -5
  266. package/corpus/templates/design/shared/board-objects.ts +2 -2
  267. package/corpus/templates/design/shared/code-layer.ts +50 -6
  268. package/corpus/templates/design/shared/motion-compiler.ts +27 -0
  269. package/corpus/templates/macros/app/components/DailyProgress.tsx +41 -37
  270. package/corpus/templates/macros/app/components/ExerciseCard.tsx +2 -2
  271. package/corpus/templates/macros/app/components/MealCard.tsx +2 -2
  272. package/corpus/templates/macros/app/components/VoiceDictation.tsx +1 -1
  273. package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +1 -1
  274. package/corpus/templates/macros/app/components/WeightCard.tsx +2 -2
  275. package/corpus/templates/macros/app/components/WeightTracker.tsx +1 -1
  276. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +1 -1
  277. package/corpus/templates/macros/app/routes/_index.tsx +5 -5
  278. package/corpus/templates/macros/app/routes/analytics.tsx +1 -1
  279. package/corpus/templates/macros/changelog/2026-06-30-dashboard-loading-and-chart-surfaces-now-use-theme-aware-col.md +6 -0
  280. package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +14 -11
  281. package/corpus/templates/mail/app/global.css +3 -2
  282. package/corpus/templates/mail/changelog/2026-06-30-compose-floating-toolbars-now-use-theme-aware-colors-in-ligh.md +6 -0
  283. package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -2
  284. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +3 -3
  285. package/corpus/templates/slides/app/global.css +10 -0
  286. package/corpus/templates/slides/app/pages/Index.tsx +55 -51
  287. package/corpus/templates/slides/changelog/2026-06-30-deck-thumbnails-collapse-cleanly-to-one-column-when-the-chat.md +6 -0
  288. package/dist/agent/engine/anthropic-engine.d.ts +2 -2
  289. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  290. package/dist/agent/engine/builder-engine.d.ts +2 -2
  291. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  292. package/dist/agent/engine/builtin.js +1 -1
  293. package/dist/agent/engine/builtin.js.map +1 -1
  294. package/dist/agent/engine/output-tokens.js +1 -1
  295. package/dist/agent/engine/output-tokens.js.map +1 -1
  296. package/dist/agent/harness/acp-adapter.d.ts +4 -1
  297. package/dist/agent/harness/acp-adapter.d.ts.map +1 -1
  298. package/dist/agent/harness/acp-adapter.js +19 -2
  299. package/dist/agent/harness/acp-adapter.js.map +1 -1
  300. package/dist/agent/harness/ai-sdk-adapter.d.ts.map +1 -1
  301. package/dist/agent/harness/ai-sdk-adapter.js +3 -0
  302. package/dist/agent/harness/ai-sdk-adapter.js.map +1 -1
  303. package/dist/agent/harness/translate.d.ts.map +1 -1
  304. package/dist/agent/harness/translate.js +3 -0
  305. package/dist/agent/harness/translate.js.map +1 -1
  306. package/dist/agent/harness/types.d.ts +1 -0
  307. package/dist/agent/harness/types.d.ts.map +1 -1
  308. package/dist/agent/harness/types.js.map +1 -1
  309. package/dist/agent/model-config.d.ts +21 -20
  310. package/dist/agent/model-config.d.ts.map +1 -1
  311. package/dist/agent/model-config.js +31 -13
  312. package/dist/agent/model-config.js.map +1 -1
  313. package/dist/agent/production-agent.d.ts.map +1 -1
  314. package/dist/agent/production-agent.js +85 -10
  315. package/dist/agent/production-agent.js.map +1 -1
  316. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  317. package/dist/agent/thread-data-builder.js +27 -6
  318. package/dist/agent/thread-data-builder.js.map +1 -1
  319. package/dist/agent/tool-call-journal.d.ts +11 -9
  320. package/dist/agent/tool-call-journal.d.ts.map +1 -1
  321. package/dist/agent/tool-call-journal.js +92 -40
  322. package/dist/agent/tool-call-journal.js.map +1 -1
  323. package/dist/agent/types.d.ts +5 -1
  324. package/dist/agent/types.d.ts.map +1 -1
  325. package/dist/agent/types.js.map +1 -1
  326. package/dist/cli/design-connect.d.ts.map +1 -1
  327. package/dist/cli/design-connect.js +84 -0
  328. package/dist/cli/design-connect.js.map +1 -1
  329. package/dist/cli/gateway-helpers.d.ts +4 -0
  330. package/dist/cli/gateway-helpers.d.ts.map +1 -1
  331. package/dist/cli/gateway-helpers.js +9 -0
  332. package/dist/cli/gateway-helpers.js.map +1 -1
  333. package/dist/cli/recap.d.ts.map +1 -1
  334. package/dist/cli/recap.js +0 -2
  335. package/dist/cli/recap.js.map +1 -1
  336. package/dist/cli/skills.d.ts.map +1 -1
  337. package/dist/cli/skills.js +54 -16
  338. package/dist/cli/skills.js.map +1 -1
  339. package/dist/cli/workspace-dev.d.ts.map +1 -1
  340. package/dist/cli/workspace-dev.js +33 -6
  341. package/dist/cli/workspace-dev.js.map +1 -1
  342. package/dist/client/AssistantChat.d.ts.map +1 -1
  343. package/dist/client/AssistantChat.js +72 -26
  344. package/dist/client/AssistantChat.js.map +1 -1
  345. package/dist/client/CommandMenu.d.ts +6 -2
  346. package/dist/client/CommandMenu.d.ts.map +1 -1
  347. package/dist/client/CommandMenu.js +25 -14
  348. package/dist/client/CommandMenu.js.map +1 -1
  349. package/dist/client/DefaultSpinner.d.ts.map +1 -1
  350. package/dist/client/DefaultSpinner.js +8 -1
  351. package/dist/client/DefaultSpinner.js.map +1 -1
  352. package/dist/client/chat/message-components.d.ts +7 -1
  353. package/dist/client/chat/message-components.d.ts.map +1 -1
  354. package/dist/client/chat/message-components.js +37 -1
  355. package/dist/client/chat/message-components.js.map +1 -1
  356. package/dist/client/chat/repo-helpers.d.ts +1 -0
  357. package/dist/client/chat/repo-helpers.d.ts.map +1 -1
  358. package/dist/client/chat/repo-helpers.js +59 -0
  359. package/dist/client/chat/repo-helpers.js.map +1 -1
  360. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  361. package/dist/client/chat/run-recovery.js +4 -4
  362. package/dist/client/chat/run-recovery.js.map +1 -1
  363. package/dist/client/components/ApiKeySettings.js +8 -8
  364. package/dist/client/components/ApiKeySettings.js.map +1 -1
  365. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  366. package/dist/client/components/CodeRequiredDialog.js +24 -15
  367. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  368. package/dist/client/components/MissingKeyCard.d.ts.map +1 -1
  369. package/dist/client/components/MissingKeyCard.js +11 -6
  370. package/dist/client/components/MissingKeyCard.js.map +1 -1
  371. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  372. package/dist/client/composer/TiptapComposer.js +4 -3
  373. package/dist/client/composer/TiptapComposer.js.map +1 -1
  374. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  375. package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
  376. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  377. package/dist/client/guided-questions.d.ts.map +1 -1
  378. package/dist/client/guided-questions.js +6 -6
  379. package/dist/client/guided-questions.js.map +1 -1
  380. package/dist/client/integrations/IntegrationCard.js +1 -1
  381. package/dist/client/integrations/IntegrationCard.js.map +1 -1
  382. package/dist/client/integrations/IntegrationsPanel.js +1 -1
  383. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  384. package/dist/client/onboarding/OnboardingBanner.js +2 -2
  385. package/dist/client/onboarding/OnboardingBanner.js.map +1 -1
  386. package/dist/client/onboarding/OnboardingPanel.js +23 -19
  387. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  388. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  389. package/dist/client/resources/ResourceEditor.js +13 -10
  390. package/dist/client/resources/ResourceEditor.js.map +1 -1
  391. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  392. package/dist/client/resources/ResourcesPanel.js +2 -1
  393. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  394. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  395. package/dist/client/settings/SettingsPanel.js +8 -3
  396. package/dist/client/settings/SettingsPanel.js.map +1 -1
  397. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  398. package/dist/client/settings/useBuilderStatus.js +6 -38
  399. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  400. package/dist/client/useProductionAgent.d.ts +2 -1
  401. package/dist/client/useProductionAgent.d.ts.map +1 -1
  402. package/dist/client/useProductionAgent.js.map +1 -1
  403. package/dist/deploy/build.js +1 -1
  404. package/dist/deploy/build.js.map +1 -1
  405. package/dist/notifications/routes.d.ts +3 -3
  406. package/dist/observability/routes.d.ts +3 -3
  407. package/dist/observability/traces.d.ts.map +1 -1
  408. package/dist/observability/traces.js.map +1 -1
  409. package/dist/onboarding/default-steps.js +1 -1
  410. package/dist/onboarding/default-steps.js.map +1 -1
  411. package/dist/scripts/agent-engines/manage-agent-engine.js +1 -1
  412. package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
  413. package/dist/scripts/agent-engines/set-agent-engine.js +1 -1
  414. package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
  415. package/dist/server/agent-chat-plugin.d.ts +3 -0
  416. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  417. package/dist/server/agent-chat-plugin.js +134 -72
  418. package/dist/server/agent-chat-plugin.js.map +1 -1
  419. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  420. package/dist/server/core-routes-plugin.d.ts +3 -0
  421. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  422. package/dist/server/core-routes-plugin.js +4 -1
  423. package/dist/server/core-routes-plugin.js.map +1 -1
  424. package/dist/server/open-route.d.ts +9 -0
  425. package/dist/server/open-route.d.ts.map +1 -1
  426. package/dist/server/open-route.js +48 -38
  427. package/dist/server/open-route.js.map +1 -1
  428. package/dist/shared/reasoning-effort.js +3 -0
  429. package/dist/shared/reasoning-effort.js.map +1 -1
  430. package/dist/sharing/access.d.ts.map +1 -1
  431. package/dist/sharing/access.js +18 -2
  432. package/dist/sharing/access.js.map +1 -1
  433. package/dist/sharing/registry.d.ts +10 -0
  434. package/dist/sharing/registry.d.ts.map +1 -1
  435. package/dist/sharing/registry.js.map +1 -1
  436. package/dist/styles/agent-native.css +104 -20
  437. package/dist/styles/rich-markdown-editor.css +11 -10
  438. package/docs/content/cloneable-saas.mdx +2 -2
  439. package/docs/content/faq.mdx +1 -1
  440. package/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
  441. package/docs/content/locales/ar-SA/faq.mdx +1 -1
  442. package/docs/content/locales/ar-SA/template-chat.mdx +1 -1
  443. package/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
  444. package/docs/content/locales/de-DE/faq.mdx +1 -1
  445. package/docs/content/locales/de-DE/template-chat.mdx +1 -1
  446. package/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
  447. package/docs/content/locales/es-ES/faq.mdx +1 -1
  448. package/docs/content/locales/es-ES/template-chat.mdx +1 -1
  449. package/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
  450. package/docs/content/locales/fr-FR/faq.mdx +1 -1
  451. package/docs/content/locales/fr-FR/template-chat.mdx +1 -1
  452. package/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
  453. package/docs/content/locales/hi-IN/faq.mdx +1 -1
  454. package/docs/content/locales/hi-IN/template-chat.mdx +1 -1
  455. package/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
  456. package/docs/content/locales/ja-JP/faq.mdx +1 -1
  457. package/docs/content/locales/ja-JP/template-chat.mdx +1 -1
  458. package/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
  459. package/docs/content/locales/ko-KR/faq.mdx +1 -1
  460. package/docs/content/locales/ko-KR/template-chat.mdx +1 -1
  461. package/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
  462. package/docs/content/locales/pt-BR/faq.mdx +1 -1
  463. package/docs/content/locales/pt-BR/template-chat.mdx +1 -1
  464. package/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
  465. package/docs/content/locales/zh-CN/faq.mdx +1 -1
  466. package/docs/content/locales/zh-CN/template-chat.mdx +1 -1
  467. package/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
  468. package/docs/content/locales/zh-TW/faq.mdx +1 -1
  469. package/docs/content/locales/zh-TW/template-chat.mdx +1 -1
  470. package/docs/content/template-chat.mdx +1 -1
  471. package/package.json +1 -1
  472. package/corpus/templates/design/app/components/design/LocalSourceEditBanner.tsx +0 -157
  473. package/corpus/templates/design/app/lib/design-templates.ts +0 -1305
  474. package/corpus/templates/design/app/pages/Templates.tsx +0 -279
@@ -3,6 +3,7 @@ import { useState } from "react";
3
3
  import {
4
4
  Select,
5
5
  SelectContent,
6
+ SelectGroup,
6
7
  SelectItem,
7
8
  SelectTrigger,
8
9
  SelectValue,
@@ -49,6 +50,15 @@ export interface ConstraintsWidgetProps {
49
50
  className?: string;
50
51
  }
51
52
 
53
+ export interface ConstraintsPreviewProps {
54
+ value: ConstraintsValue;
55
+ labels?: Partial<ConstraintsWidgetLabels>;
56
+ disabled?: boolean;
57
+ size?: number;
58
+ surface?: boolean;
59
+ className?: string;
60
+ }
61
+
52
62
  const DEFAULT_LABELS: ConstraintsWidgetLabels = {
53
63
  title: "Constraints", // i18n-ignore fallback component label
54
64
  horizontal: "Horizontal", // i18n-ignore fallback component label
@@ -163,6 +173,10 @@ interface PinBoxProps {
163
173
  labels: Pick<ConstraintsWidgetLabels, "left" | "right" | "top" | "bottom">;
164
174
  onToggleH: (side: "left" | "right") => void;
165
175
  onToggleV: (side: "top" | "bottom") => void;
176
+ interactive?: boolean;
177
+ size?: number;
178
+ surface?: boolean;
179
+ className?: string;
166
180
  }
167
181
 
168
182
  function PinBox({
@@ -171,6 +185,10 @@ function PinBox({
171
185
  labels,
172
186
  onToggleH,
173
187
  onToggleV,
188
+ interactive = true,
189
+ size = BOX,
190
+ surface = true,
191
+ className,
174
192
  }: PinBoxProps) {
175
193
  const [hoveredPin, setHoveredPin] = useState<
176
194
  "left" | "right" | "top" | "bottom" | null
@@ -189,7 +207,7 @@ function PinBox({
189
207
  // active / scale → accent (primary)
190
208
  // hovered inactive → slightly brighter muted
191
209
  // inactive → muted (30% foreground opacity)
192
- const ACCENT = "hsl(var(--primary))";
210
+ const ACCENT = "var(--design-editor-accent-color, hsl(var(--primary)))";
193
211
  // Hover: lighten inactive pins on hover — use 55% opacity instead of 30%
194
212
  const MUTED = "hsl(var(--foreground) / 0.30)";
195
213
  const MUTED_HOVER = "hsl(var(--foreground) / 0.60)";
@@ -229,15 +247,20 @@ function PinBox({
229
247
 
230
248
  return (
231
249
  <svg
232
- width={BOX}
233
- height={BOX}
250
+ width={size}
251
+ height={size}
234
252
  viewBox={`0 0 ${BOX} ${BOX}`}
235
253
  aria-hidden="true"
236
254
  className={cn(
237
- "shrink-0 rounded-sm",
255
+ "shrink-0 rounded-[5px]",
238
256
  disabled && "pointer-events-none opacity-40",
257
+ className,
239
258
  )}
240
- style={{ background: "hsl(var(--muted) / 0.4)" }}
259
+ style={{
260
+ background: surface
261
+ ? "var(--design-editor-control-bg, hsl(var(--muted) / 0.4))"
262
+ : "transparent",
263
+ }}
241
264
  >
242
265
  {/* outer border */}
243
266
  <rect
@@ -336,7 +359,7 @@ function PinBox({
336
359
  />
337
360
 
338
361
  {/* invisible click + hover targets — rendered on top of strokes */}
339
- {!disabled && (
362
+ {interactive && !disabled && (
340
363
  <>
341
364
  {/* left pin hit area */}
342
365
  <rect
@@ -402,6 +425,92 @@ function PinBox({
402
425
 
403
426
  // ── Main widget ──────────────────────────────────────────────────────────────
404
427
 
428
+ export function ConstraintsPreview({
429
+ value,
430
+ labels,
431
+ disabled = false,
432
+ size = 22,
433
+ surface = false,
434
+ className,
435
+ }: ConstraintsPreviewProps) {
436
+ const copy = { ...DEFAULT_LABELS, ...labels };
437
+
438
+ return (
439
+ <PinBox
440
+ value={value}
441
+ disabled={disabled}
442
+ labels={copy}
443
+ onToggleH={() => undefined}
444
+ onToggleV={() => undefined}
445
+ interactive={false}
446
+ size={size}
447
+ surface={surface}
448
+ className={className}
449
+ />
450
+ );
451
+ }
452
+
453
+ function ConstraintSelect({
454
+ axis,
455
+ value,
456
+ onChange,
457
+ disabled,
458
+ labels,
459
+ }: {
460
+ axis: "horizontal" | "vertical";
461
+ value: HorizontalConstraint | VerticalConstraint;
462
+ onChange: (value: HorizontalConstraint | VerticalConstraint) => void;
463
+ disabled: boolean;
464
+ labels: ConstraintsWidgetLabels;
465
+ }) {
466
+ const options =
467
+ axis === "horizontal"
468
+ ? [
469
+ { value: "left", label: labels.left },
470
+ { value: "right", label: labels.right },
471
+ { value: "left-right", label: labels.leftRight },
472
+ { value: "center", label: labels.center },
473
+ { value: "scale", label: labels.scale },
474
+ ]
475
+ : [
476
+ { value: "top", label: labels.top },
477
+ { value: "bottom", label: labels.bottom },
478
+ { value: "top-bottom", label: labels.topBottom },
479
+ { value: "center", label: labels.center },
480
+ { value: "scale", label: labels.scale },
481
+ ];
482
+
483
+ return (
484
+ <Select
485
+ value={value}
486
+ onValueChange={(next) =>
487
+ onChange(next as HorizontalConstraint | VerticalConstraint)
488
+ }
489
+ disabled={disabled}
490
+ >
491
+ <SelectTrigger
492
+ className="h-8 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 text-[12px] shadow-none focus:ring-1 focus:ring-[var(--design-editor-accent-color)] focus:ring-offset-0 [&>svg]:size-3"
493
+ aria-label={axis === "horizontal" ? labels.horizontal : labels.vertical}
494
+ >
495
+ <SelectValue />
496
+ </SelectTrigger>
497
+ <SelectContent className="z-[270]">
498
+ <SelectGroup>
499
+ {options.map((option) => (
500
+ <SelectItem
501
+ key={option.value}
502
+ value={option.value}
503
+ className="text-[12px]"
504
+ >
505
+ {option.label}
506
+ </SelectItem>
507
+ ))}
508
+ </SelectGroup>
509
+ </SelectContent>
510
+ </Select>
511
+ );
512
+ }
513
+
405
514
  export function ConstraintsWidget({
406
515
  value,
407
516
  onChange,
@@ -420,91 +529,40 @@ export function ConstraintsWidget({
420
529
  }
421
530
 
422
531
  return (
423
- <div className={cn("space-y-1.5", className)}>
424
- {/* section label */}
425
- <span className="text-[11px] font-medium text-muted-foreground">
532
+ <div className={cn("space-y-2", className)}>
533
+ <span className="!text-[11px] font-medium text-muted-foreground">
426
534
  {copy.title}
427
535
  </span>
428
536
 
429
- {/* main row: pin-box LEFT + dropdowns RIGHT */}
430
- <div className="flex items-center gap-1.5">
431
- {/* pin box */}
432
- <PinBox
433
- value={value}
434
- disabled={disabled}
435
- labels={copy}
436
- onToggleH={handleToggleH}
437
- onToggleV={handleToggleV}
438
- />
439
-
440
- {/* dropdowns column */}
441
- <div className="flex min-w-0 flex-1 flex-col gap-1">
442
- {/* horizontal constraint */}
443
- <Select
537
+ <div className="grid grid-cols-[minmax(0,1fr)_4rem] items-stretch gap-2">
538
+ <div className="flex min-w-0 flex-col gap-1.5">
539
+ <ConstraintSelect
540
+ axis="horizontal"
444
541
  value={value.horizontal}
445
- onValueChange={(next) =>
542
+ onChange={(next) =>
446
543
  onChange({ ...value, horizontal: next as HorizontalConstraint })
447
544
  }
448
545
  disabled={disabled}
449
- >
450
- <SelectTrigger
451
- className="h-6 w-full px-1.5 text-[11px]"
452
- aria-label={copy.horizontal}
453
- >
454
- <SelectValue />
455
- </SelectTrigger>
456
- <SelectContent>
457
- <SelectItem value="left" className="text-[11px]">
458
- {copy.left}
459
- </SelectItem>
460
- <SelectItem value="right" className="text-[11px]">
461
- {copy.right}
462
- </SelectItem>
463
- <SelectItem value="left-right" className="text-[11px]">
464
- {copy.leftRight}
465
- </SelectItem>
466
- <SelectItem value="center" className="text-[11px]">
467
- {copy.center}
468
- </SelectItem>
469
- <SelectItem value="scale" className="text-[11px]">
470
- {copy.scale}
471
- </SelectItem>
472
- </SelectContent>
473
- </Select>
474
-
475
- {/* vertical constraint */}
476
- <Select
546
+ labels={copy}
547
+ />
548
+ <ConstraintSelect
549
+ axis="vertical"
477
550
  value={value.vertical}
478
- onValueChange={(next) =>
551
+ onChange={(next) =>
479
552
  onChange({ ...value, vertical: next as VerticalConstraint })
480
553
  }
481
554
  disabled={disabled}
482
- >
483
- <SelectTrigger
484
- className="h-6 w-full px-1.5 text-[11px]"
485
- aria-label={copy.vertical}
486
- >
487
- <SelectValue />
488
- </SelectTrigger>
489
- <SelectContent>
490
- <SelectItem value="top" className="text-[11px]">
491
- {copy.top}
492
- </SelectItem>
493
- <SelectItem value="bottom" className="text-[11px]">
494
- {copy.bottom}
495
- </SelectItem>
496
- <SelectItem value="top-bottom" className="text-[11px]">
497
- {copy.topBottom}
498
- </SelectItem>
499
- <SelectItem value="center" className="text-[11px]">
500
- {copy.center}
501
- </SelectItem>
502
- <SelectItem value="scale" className="text-[11px]">
503
- {copy.scale}
504
- </SelectItem>
505
- </SelectContent>
506
- </Select>
555
+ labels={copy}
556
+ />
507
557
  </div>
558
+ <PinBox
559
+ value={value}
560
+ disabled={disabled}
561
+ labels={copy}
562
+ onToggleH={handleToggleH}
563
+ onToggleV={handleToggleV}
564
+ size={64}
565
+ />
508
566
  </div>
509
567
  </div>
510
568
  );
@@ -1085,7 +1085,7 @@ export function DesignColorPicker({
1085
1085
  disabled={disabled}
1086
1086
  aria-label={copy.hex}
1087
1087
  spellCheck={false}
1088
- className="h-6 min-w-0 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 text-[11px] tabular-nums uppercase"
1088
+ className="h-6 min-w-0 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 !text-[11px] tabular-nums uppercase md:!text-[11px]"
1089
1089
  onChange={(e) => {
1090
1090
  hexDraftRef.current = e.target.value;
1091
1091
  setHexDraft(e.target.value);
@@ -1206,7 +1206,7 @@ export function DesignColorPicker({
1206
1206
  disabled={disabled}
1207
1207
  aria-label={copy.trigger}
1208
1208
  className={cn(
1209
- "flex h-6 w-full items-center gap-1.5 rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 text-[11px] shadow-none",
1209
+ "flex h-6 w-full items-center gap-1.5 rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 !text-[11px] shadow-none",
1210
1210
  "hover:bg-[var(--design-editor-panel-raised-bg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1",
1211
1211
  disabled && "pointer-events-none opacity-50",
1212
1212
  )}
@@ -1216,10 +1216,10 @@ export function DesignColorPicker({
1216
1216
  className="size-4 shrink-0 rounded-[3px] border border-border/60"
1217
1217
  style={triggerSwatchStyle(value, color)}
1218
1218
  />
1219
- <span className="min-w-0 flex-1 truncate text-left tabular-nums uppercase text-[11px]">
1219
+ <span className="min-w-0 flex-1 truncate text-left tabular-nums uppercase !text-[11px]">
1220
1220
  {triggerLabel(effectivePaintType, color)}
1221
1221
  </span>
1222
- <span className="tabular-nums text-muted-foreground text-[11px]">
1222
+ <span className="tabular-nums text-muted-foreground !text-[11px]">
1223
1223
  {effectiveOpacity}%
1224
1224
  </span>
1225
1225
  </button>
@@ -1362,7 +1362,7 @@ export function DesignColorPicker({
1362
1362
  placeholder={"Video URL (mp4, webm)" /* i18n-ignore */}
1363
1363
  aria-label={"Video URL" /* i18n-ignore */}
1364
1364
  spellCheck={false}
1365
- className="h-6 w-full rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 text-[11px]"
1365
+ className="h-6 w-full rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 !text-[11px] md:!text-[11px]"
1366
1366
  onKeyDown={(e) => {
1367
1367
  if (e.key === "Enter") {
1368
1368
  e.preventDefault();
@@ -1565,7 +1565,7 @@ export function DesignColorPicker({
1565
1565
  setOpacity(next);
1566
1566
  }
1567
1567
  }}
1568
- className="h-full min-w-0 flex-1 rounded-none border-0 bg-transparent px-1 text-[11px] tabular-nums shadow-none focus-visible:ring-0"
1568
+ className="h-full min-w-0 flex-1 rounded-none border-0 bg-transparent px-1 !text-[11px] tabular-nums shadow-none focus-visible:ring-0"
1569
1569
  compact
1570
1570
  />
1571
1571
  <span className="flex w-4 shrink-0 items-center justify-center border-l border-border/60 text-[10px] text-muted-foreground">
@@ -1579,7 +1579,7 @@ export function DesignColorPicker({
1579
1579
  {showBlendMode && onBlendModeChange && (
1580
1580
  <div className="border-t border-border/70 px-3 py-2.5">
1581
1581
  <div className="flex items-center gap-1.5">
1582
- <span className="min-w-0 flex-1 text-[11px] text-muted-foreground">
1582
+ <span className="min-w-0 flex-1 !text-[11px] text-muted-foreground">
1583
1583
  {copy.blendMode}
1584
1584
  </span>
1585
1585
  <Select
@@ -1589,7 +1589,7 @@ export function DesignColorPicker({
1589
1589
  >
1590
1590
  <SelectTrigger
1591
1591
  aria-label={copy.blendMode}
1592
- className="h-6 min-w-0 flex-1 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-1.5 text-[11px] shadow-none focus:ring-1 focus:ring-[var(--design-editor-accent-color)]"
1592
+ className="h-6 min-w-0 flex-1 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-1.5 !text-[11px] shadow-none focus:ring-1 focus:ring-[var(--design-editor-accent-color)]"
1593
1593
  >
1594
1594
  <SelectValue />
1595
1595
  </SelectTrigger>
@@ -1598,7 +1598,7 @@ export function DesignColorPicker({
1598
1598
  <SelectItem
1599
1599
  key={option.value}
1600
1600
  value={option.value}
1601
- className="text-[11px]"
1601
+ className="!text-[11px]"
1602
1602
  >
1603
1603
  {option.label}
1604
1604
  </SelectItem>
@@ -1616,7 +1616,7 @@ export function DesignColorPicker({
1616
1616
  section is never empty. */}
1617
1617
  <div className="border-t border-border/70 px-3 py-2.5">
1618
1618
  {/* Source label — matches the design editor layout */}
1619
- <div className="mb-2 flex h-6 w-full items-center justify-between px-0.5 text-[11px] text-muted-foreground">
1619
+ <div className="mb-2 flex h-6 w-full items-center justify-between px-0.5 !text-[11px] text-muted-foreground">
1620
1620
  {"Document colors" /* i18n-ignore design picker source */}
1621
1621
  </div>
1622
1622
 
@@ -1718,7 +1718,7 @@ function ColorModelPill({
1718
1718
  onClick={() => setMenuOpen((o) => !o)}
1719
1719
  className={cn(
1720
1720
  "flex h-6 w-[4.5rem] items-center gap-0.5 rounded px-1.5",
1721
- "text-[11px] font-semibold text-foreground",
1721
+ "!text-[11px] font-semibold text-foreground",
1722
1722
  "bg-transparent border-0 shadow-none",
1723
1723
  "hover:bg-[var(--design-editor-control-bg)]",
1724
1724
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
@@ -1751,7 +1751,7 @@ function ColorModelPill({
1751
1751
  setMenuOpen(false);
1752
1752
  }}
1753
1753
  className={cn(
1754
- "flex w-full items-center px-2 py-1 text-[11px]",
1754
+ "flex w-full items-center px-2 py-1 !text-[11px]",
1755
1755
  "hover:bg-accent hover:text-accent-foreground",
1756
1756
  "focus-visible:outline-none focus-visible:bg-accent",
1757
1757
  m.value === value
@@ -2018,7 +2018,7 @@ function ScrubbyNumberInput({
2018
2018
  max={max}
2019
2019
  disabled={disabled}
2020
2020
  className={cn(
2021
- "h-6 w-full rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] text-center text-[11px] tabular-nums",
2021
+ "h-6 w-full rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] text-center !text-[11px] tabular-nums",
2022
2022
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
2023
2023
  compact && "border-0 shadow-none focus-visible:ring-0",
2024
2024
  className,
@@ -140,7 +140,7 @@ function ScaleSelect({
140
140
  >
141
141
  <SelectTrigger
142
142
  className={cn(
143
- "h-6 w-14 shrink-0 px-1.5 text-[11px]",
143
+ "h-6 w-14 shrink-0 px-1.5 !text-[11px]",
144
144
  controlChromeClass,
145
145
  )}
146
146
  >
@@ -149,7 +149,7 @@ function ScaleSelect({
149
149
  <SelectContent>
150
150
  <SelectGroup>
151
151
  {SCALE_PRESETS.map((p) => (
152
- <SelectItem key={p.value} value={p.value} className="text-[11px]">
152
+ <SelectItem key={p.value} value={p.value} className="!text-[11px]">
153
153
  {p.label}
154
154
  </SelectItem>
155
155
  ))}
@@ -241,7 +241,7 @@ export function ExportSettingsPanel({
241
241
  <div className={cn("space-y-1.5", className)}>
242
242
  {/* Section header: title left, "+" right — matches the design editor export header */}
243
243
  <div className="flex h-6 items-center justify-between">
244
- <span className="text-[11px] font-medium text-muted-foreground">
244
+ <span className="!text-[11px] font-medium text-muted-foreground">
245
245
  {copy.title}
246
246
  </span>
247
247
  <button
@@ -275,7 +275,7 @@ export function ExportSettingsPanel({
275
275
  variant="outline"
276
276
  disabled={isDisabled}
277
277
  onClick={handleExport}
278
- className={cn("h-6 w-full px-2 text-[11px]", controlChromeClass)}
278
+ className={cn("h-6 w-full px-2 !text-[11px]", controlChromeClass)}
279
279
  >
280
280
  <IconDownload className="size-3.5" />
281
281
  {copy.export}
@@ -333,7 +333,7 @@ function ExportRow({
333
333
  }
334
334
  }}
335
335
  className={cn(
336
- "h-6 w-14 shrink-0 px-1.5 text-[11px] tabular-nums",
336
+ "h-6 w-14 shrink-0 px-1.5 !text-[11px] tabular-nums md:!text-[11px]",
337
337
  controlChromeClass,
338
338
  )}
339
339
  aria-label="Scale"
@@ -365,7 +365,7 @@ function ExportRow({
365
365
  >
366
366
  <SelectTrigger
367
367
  className={cn(
368
- "h-6 min-w-0 flex-1 px-1.5 text-[11px]",
368
+ "h-6 min-w-0 flex-1 px-1.5 !text-[11px]",
369
369
  controlChromeClass,
370
370
  )}
371
371
  >
@@ -377,7 +377,7 @@ function ExportRow({
377
377
  <SelectItem
378
378
  key={format}
379
379
  value={format}
380
- className="text-[11px] uppercase"
380
+ className="!text-[11px] uppercase"
381
381
  >
382
382
  {format.toUpperCase()}
383
383
  </SelectItem>
@@ -393,7 +393,7 @@ function ExportRow({
393
393
  onChange={(e) => onPatchRow(row.id, { suffix: e.target.value })}
394
394
  placeholder={labels.suffix}
395
395
  className={cn(
396
- "h-6 min-w-0 flex-1 px-1.5 text-[11px]",
396
+ "h-6 min-w-0 flex-1 px-1.5 !text-[11px] md:!text-[11px]",
397
397
  controlChromeClass,
398
398
  )}
399
399
  aria-label={labels.suffix}
@@ -564,7 +564,7 @@ export function GradientEditor({
564
564
  if (Number.isFinite(next))
565
565
  updateStopPosition(selectedStopId, clamp(next, 0, 100));
566
566
  }}
567
- className="h-full min-w-0 flex-1 bg-transparent px-1.5 text-[11px] tabular-nums focus-visible:outline-none"
567
+ className="h-full min-w-0 flex-1 bg-transparent px-1.5 !text-[11px] tabular-nums focus-visible:outline-none"
568
568
  />
569
569
  </div>
570
570
 
@@ -595,7 +595,7 @@ export function GradientEditor({
595
595
  }
596
596
  }}
597
597
  onBlur={() => setAngleInput(null)}
598
- className="h-full min-w-0 flex-1 bg-transparent px-1.5 text-[11px] tabular-nums focus-visible:outline-none"
598
+ className="h-full min-w-0 flex-1 bg-transparent px-1.5 !text-[11px] tabular-nums focus-visible:outline-none"
599
599
  />
600
600
  <span className="flex w-4 shrink-0 items-center justify-center text-[10px] text-muted-foreground">
601
601
  °
@@ -347,7 +347,7 @@ export function ImageFillControls({
347
347
  placeholder={"Image URL" /* i18n-ignore */}
348
348
  aria-label={"Image URL" /* i18n-ignore */}
349
349
  spellCheck={false}
350
- className="h-6 min-w-0 flex-1 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 text-[11px]"
350
+ className="h-6 min-w-0 flex-1 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 !text-[11px] md:!text-[11px]"
351
351
  onChange={(event) => {
352
352
  urlDraftRef.current = event.target.value;
353
353
  setUrlDraft(event.target.value);
@@ -400,13 +400,13 @@ export function ImageFillControls({
400
400
  >
401
401
  <SelectTrigger
402
402
  aria-label={"Fill" /* i18n-ignore image fit selector */}
403
- className="h-6 w-full rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 text-[11px] shadow-none focus:ring-0 focus:ring-offset-0 focus-visible:ring-2 focus-visible:ring-ring [&>svg]:size-3 [&>svg]:shrink-0"
403
+ className="h-6 w-full rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2 !text-[11px] shadow-none focus:ring-0 focus:ring-offset-0 focus-visible:ring-2 focus-visible:ring-ring [&>svg]:size-3 [&>svg]:shrink-0"
404
404
  >
405
405
  <SelectValue />
406
406
  </SelectTrigger>
407
- <SelectContent className="text-[11px]">
407
+ <SelectContent className="!text-[11px]">
408
408
  {FIT_MODES.map(({ mode, label }) => (
409
- <SelectItem key={mode} value={mode} className="text-[11px]">
409
+ <SelectItem key={mode} value={mode} className="!text-[11px]">
410
410
  {label}
411
411
  </SelectItem>
412
412
  ))}
@@ -2,7 +2,7 @@ import { useT } from "@agent-native/core/client";
2
2
  import {
3
3
  IconClipboard,
4
4
  IconChevronDown,
5
- IconSparkles,
5
+ IconMessageCircle,
6
6
  } from "@tabler/icons-react";
7
7
  import { useState } from "react";
8
8
 
@@ -71,7 +71,7 @@ export function InspectorAiActions({
71
71
  )}
72
72
  >
73
73
  <span className="flex items-center gap-1.5">
74
- <IconSparkles className="size-3.5 shrink-0" />
74
+ <IconMessageCircle className="size-3.5 shrink-0" />
75
75
  {t("designEditor.localSourceEdit.askAi")}
76
76
  </span>
77
77
  <IconChevronDown
@@ -115,7 +115,7 @@ export function InspectorAiActions({
115
115
  setOpen(false);
116
116
  }}
117
117
  >
118
- <IconSparkles className="size-3.5 shrink-0" />
118
+ <IconMessageCircle className="size-3.5 shrink-0" />
119
119
  {t("designEditor.localSourceEdit.applyWithAi")}
120
120
  </Button>
121
121
  <Button
@@ -42,6 +42,7 @@ export interface ScrubInputProps extends ScrubExpressionOptions {
42
42
  icon?: ScrubInputIcon | null;
43
43
  disabled?: boolean;
44
44
  placeholder?: string;
45
+ mixed?: boolean;
45
46
  className?: string;
46
47
  inputClassName?: string;
47
48
  labelClassName?: string;
@@ -62,6 +63,7 @@ export function ScrubInput({
62
63
  icon: Icon = IconArrowsHorizontal,
63
64
  disabled = false,
64
65
  placeholder,
66
+ mixed = false,
65
67
  className,
66
68
  inputClassName,
67
69
  labelClassName,
@@ -71,7 +73,7 @@ export function ScrubInput({
71
73
  const generatedId = useId();
72
74
  const inputId = id ?? generatedId;
73
75
  const [draft, setDraft] = useState(() =>
74
- formatScrubValue(value, { unit, precision }),
76
+ mixed ? "Mixed" : formatScrubValue(value, { unit, precision }),
75
77
  );
76
78
  // Track the latest draft in a ref so commitDraft always reads the most
77
79
  // up-to-date value even if the blur event fires before the React state
@@ -90,11 +92,13 @@ export function ScrubInput({
90
92
 
91
93
  useEffect(() => {
92
94
  if (!focused) {
93
- const formatted = formatScrubValue(value, { unit, precision });
95
+ const formatted = mixed
96
+ ? "Mixed"
97
+ : formatScrubValue(value, { unit, precision });
94
98
  draftRef.current = formatted;
95
99
  setDraft(formatted);
96
100
  }
97
- }, [focused, precision, unit, value]);
101
+ }, [focused, mixed, precision, unit, value]);
98
102
 
99
103
  const options = { unit, min, max, precision };
100
104
  const resolvedTooltipLabel = tooltipLabel ?? ariaLabel ?? label;
@@ -112,9 +116,10 @@ export function ScrubInput({
112
116
  // React render with the updated draft state hasn't committed yet (e.g.
113
117
  // when blur fires in the same synchronous batch as the last onChange).
114
118
  const currentDraft = draftRef.current;
119
+ if (mixed && currentDraft === "Mixed") return;
115
120
  const parsed = parseScrubExpression(currentDraft, value, options);
116
121
  if (!parsed) {
117
- const reverted = formatScrubValue(value, options);
122
+ const reverted = mixed ? "Mixed" : formatScrubValue(value, options);
118
123
  draftRef.current = reverted;
119
124
  setDraft(reverted);
120
125
  return;
@@ -151,7 +156,7 @@ export function ScrubInput({
151
156
 
152
157
  if (event.key === "Escape") {
153
158
  event.preventDefault();
154
- const reverted = formatScrubValue(value, options);
159
+ const reverted = mixed ? "Mixed" : formatScrubValue(value, options);
155
160
  draftRef.current = reverted;
156
161
  setDraft(reverted);
157
162
  skipNextBlurCommitRef.current = true;
@@ -216,7 +221,7 @@ export function ScrubInput({
216
221
  onPointerUp={endDrag}
217
222
  onPointerCancel={endDrag}
218
223
  className={cn(
219
- "flex h-6 w-20 shrink-0 cursor-ew-resize select-none items-center gap-1 rounded-sm text-[11px] text-muted-foreground transition-colors",
224
+ "flex h-6 w-20 shrink-0 cursor-ew-resize select-none items-center gap-1 rounded-sm !text-[11px] text-muted-foreground transition-colors",
220
225
  "hover:bg-[var(--design-editor-control-bg)] hover:text-foreground",
221
226
  dragging &&
222
227
  "bg-[var(--design-editor-control-bg)] text-foreground",
@@ -257,9 +262,10 @@ export function ScrubInput({
257
262
  onKeyDown={handleKeyDown}
258
263
  className={cn(
259
264
  // Compact design-editor: h-6, 11px tabular text, ring-1 with no offset.
260
- "h-6 text-[11px] tabular-nums",
265
+ "h-6 !text-[11px] tabular-nums",
261
266
  "focus-visible:ring-1 focus-visible:ring-offset-0",
262
267
  inputClassName,
268
+ mixed && "text-muted-foreground",
263
269
  )}
264
270
  />
265
271
  </div>