@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
@@ -346,7 +346,7 @@ function OptionButton({
346
346
  <span className="sr-only">{option.description}</span>
347
347
  )}
348
348
  {option.preview && (
349
- <span className="mt-2 block max-h-36 overflow-auto whitespace-pre-wrap rounded-md border border-border/60 bg-background/70 px-2 py-1.5 font-mono text-[11px] leading-4 text-muted-foreground">
349
+ <span className="mt-2 block max-h-36 overflow-auto whitespace-pre-wrap rounded-md border border-border/60 bg-background/70 px-2 py-1.5 font-mono !text-[11px] leading-4 text-muted-foreground">
350
350
  {option.preview}
351
351
  </span>
352
352
  )}
@@ -23,15 +23,13 @@
23
23
  import { useActionMutation } from "@agent-native/core/client";
24
24
  import {
25
25
  IconAlertCircle,
26
- IconAlertTriangle,
27
26
  IconArrowsLeftRight,
28
27
  IconCheck,
29
28
  IconChevronDown,
30
29
  IconChevronRight,
31
- IconInfoCircle,
32
30
  IconRefresh,
33
31
  IconShieldCheck,
34
- IconWand,
32
+ IconTool,
35
33
  } from "@tabler/icons-react";
36
34
  import { useState } from "react";
37
35
 
@@ -131,24 +129,20 @@ export interface ReviewPanelProps {
131
129
 
132
130
  interface SeverityConfig {
133
131
  dot: string;
134
- icon: React.ElementType;
135
132
  label: string;
136
133
  }
137
134
 
138
135
  const SEVERITY_CONFIG: Record<A11ySeverity, SeverityConfig> = {
139
136
  error: {
140
137
  dot: "bg-destructive",
141
- icon: IconAlertCircle,
142
138
  label: "Error",
143
139
  },
144
140
  warning: {
145
141
  dot: "bg-amber-400",
146
- icon: IconAlertTriangle,
147
142
  label: "Warning",
148
143
  },
149
144
  info: {
150
145
  dot: "bg-blue-400",
151
- icon: IconInfoCircle,
152
146
  label: "Info",
153
147
  },
154
148
  };
@@ -194,7 +188,6 @@ function FindingRow({
194
188
  onFixApplied?: (finding: A11yFinding, result?: ReviewFixResult) => void;
195
189
  }) {
196
190
  const cfg = SEVERITY_CONFIG[finding.severity];
197
- const Icon = cfg.icon;
198
191
  const [expanded, setExpanded] = useState(false);
199
192
  const hasDetail = !!(finding.detail ?? finding.wcag);
200
193
 
@@ -246,8 +239,10 @@ function FindingRow({
246
239
  return (
247
240
  <div
248
241
  className={cn(
249
- "group rounded px-2 py-1.5 transition-colors",
250
- onClick ? "cursor-pointer hover:bg-accent/60" : "cursor-default",
242
+ "group rounded-[5px] px-2 py-1.5 transition-colors",
243
+ onClick
244
+ ? "cursor-pointer hover:bg-[var(--design-editor-layer-hover-color)]"
245
+ : "cursor-default",
251
246
  )}
252
247
  role={onClick ? "button" : undefined}
253
248
  tabIndex={onClick ? 0 : undefined}
@@ -257,28 +252,15 @@ function FindingRow({
257
252
  }}
258
253
  aria-label={finding.message}
259
254
  >
260
- <div className="flex items-start gap-2">
261
- {/* Severity dot */}
255
+ <div className="flex items-start gap-2.5">
262
256
  <span
263
257
  className={cn("mt-[5px] size-1.5 shrink-0 rounded-full", cfg.dot)}
264
258
  aria-hidden="true"
265
259
  />
266
260
 
267
- {/* Message + expand toggle */}
268
261
  <div className="min-w-0 flex-1">
269
- <div className="flex items-center gap-1">
270
- <Icon
271
- className={cn(
272
- "size-3.5 shrink-0",
273
- finding.severity === "error"
274
- ? "text-destructive"
275
- : finding.severity === "warning"
276
- ? "text-amber-500"
277
- : "text-blue-500",
278
- )}
279
- aria-hidden="true"
280
- />
281
- <span className="truncate text-[11px] text-foreground leading-snug">
262
+ <div className="flex min-h-5 items-center gap-1">
263
+ <span className="truncate !text-[11px] font-medium leading-snug text-foreground">
282
264
  {finding.message}
283
265
  </span>
284
266
  {hasDetail && (
@@ -301,16 +283,15 @@ function FindingRow({
301
283
  )}
302
284
  </div>
303
285
 
304
- {/* WCAG badge */}
305
- {finding.wcag && (
306
- <span className="text-[10px] text-muted-foreground/60">
307
- WCAG {finding.wcag}
286
+ {(finding.wcag || expanded) && (
287
+ <span className="text-[10px] capitalize text-muted-foreground/55">
288
+ {cfg.label}
289
+ {finding.wcag ? ` · WCAG ${finding.wcag}` : ""}
308
290
  </span>
309
291
  )}
310
292
 
311
- {/* Expanded detail */}
312
293
  {expanded && finding.detail && (
313
- <p className="mt-1 text-[11px] leading-snug text-muted-foreground">
294
+ <p className="mt-1 !text-[11px] leading-snug text-muted-foreground">
314
295
  {finding.detail}
315
296
  </p>
316
297
  )}
@@ -337,7 +318,7 @@ function FindingRow({
337
318
  "h-5 shrink-0 gap-1 px-1.5 text-[10px]",
338
319
  fixStatus === "error"
339
320
  ? "text-destructive hover:text-destructive"
340
- : "text-muted-foreground hover:text-foreground",
321
+ : "text-muted-foreground opacity-0 hover:text-foreground group-hover:opacity-100 focus-visible:opacity-100",
341
322
  )}
342
323
  title={
343
324
  fixStatus === "error"
@@ -349,7 +330,7 @@ function FindingRow({
349
330
  {fixStatus === "pending" ? (
350
331
  <IconRefresh className="size-3 animate-spin" />
351
332
  ) : (
352
- <IconWand className="size-3" />
333
+ <IconTool className="size-3" />
353
334
  )}
354
335
  {fixStatus === "error" ? "Retry" : "Fix"}
355
336
  </Button>
@@ -368,7 +349,6 @@ function A11ySection({
368
349
  loading,
369
350
  auditedAt,
370
351
  auditError,
371
- onRunAudit,
372
352
  onFindingClick,
373
353
  fixSource,
374
354
  onFixApplied,
@@ -377,7 +357,6 @@ function A11ySection({
377
357
  loading?: boolean;
378
358
  auditedAt?: string | null;
379
359
  auditError?: string | null;
380
- onRunAudit?: () => void;
381
360
  onFindingClick?: (finding: A11yFinding) => void;
382
361
  fixSource?: ReviewFixSource;
383
362
  onFixApplied?: (finding: A11yFinding, result?: ReviewFixResult) => void;
@@ -388,20 +367,38 @@ function A11ySection({
388
367
 
389
368
  const hasFindings = findings.length > 0;
390
369
  const notRun = !auditedAt && !loading && !auditError && !hasFindings;
370
+ const statusLabel = loading
371
+ ? "Scanning..."
372
+ : auditError
373
+ ? "Could not scan"
374
+ : notRun
375
+ ? "Not checked"
376
+ : hasFindings
377
+ ? `${findings.length} ${findings.length === 1 ? "issue" : "issues"}`
378
+ : "No issues";
391
379
 
392
380
  return (
393
381
  <section aria-labelledby="review-a11y-heading">
394
- {/* Section header */}
395
- <div className="flex h-7 items-center justify-between">
382
+ <div className="flex h-7 items-center justify-between gap-2">
396
383
  <div className="flex items-center gap-1.5">
397
384
  <IconShieldCheck className="size-3.5 text-muted-foreground" />
398
385
  <span
399
386
  id="review-a11y-heading"
400
- className="text-[11px] font-semibold text-foreground"
387
+ className="!text-[11px] font-semibold text-foreground"
401
388
  >
402
389
  Accessibility
403
390
  </span>
404
- {hasFindings && (
391
+ <span
392
+ className={cn(
393
+ "rounded px-1 py-0.5 text-[10px] font-medium text-muted-foreground/65",
394
+ !loading && !auditError && !notRun && !hasFindings
395
+ ? "text-emerald-500"
396
+ : "",
397
+ )}
398
+ >
399
+ {statusLabel}
400
+ </span>
401
+ {hasFindings ? (
405
402
  <div className="flex items-center gap-1">
406
403
  {errors.length > 0 && (
407
404
  <Badge
@@ -428,73 +425,46 @@ function A11ySection({
428
425
  </Badge>
429
426
  )}
430
427
  </div>
431
- )}
428
+ ) : null}
432
429
  </div>
433
-
434
- {/* Run audit button */}
435
- {onRunAudit && (
436
- <Button
437
- type="button"
438
- variant="ghost"
439
- size="sm"
440
- disabled={loading}
441
- onClick={onRunAudit}
442
- className="h-6 gap-1 rounded-md px-1.5 text-[10px] text-muted-foreground hover:text-foreground"
443
- >
444
- {loading ? (
445
- <IconRefresh className="size-3 animate-spin" />
446
- ) : (
447
- <IconRefresh className="size-3" />
448
- )}
449
- {loading ? "Running…" : "Run"}
450
- </Button>
451
- )}
452
430
  </div>
453
431
 
454
- <Separator />
455
-
456
432
  <div className="py-1">
457
- {/* Error state */}
458
433
  {auditError && (
459
- <div className="flex min-h-7 items-center gap-2 rounded-[5px] px-2">
434
+ <div className="flex min-h-7 items-center gap-2 rounded-[5px] px-2 text-muted-foreground">
460
435
  <IconAlertCircle className="size-3.5 shrink-0 text-destructive" />
461
- <span className="text-[11px] text-muted-foreground">
462
- {auditError}
463
- </span>
436
+ <span className="!text-[11px]">{auditError}</span>
464
437
  </div>
465
438
  )}
466
439
 
467
- {/* Not yet run */}
468
440
  {notRun && (
469
- <div className="flex h-7 items-center gap-2 rounded-[5px] px-2 text-muted-foreground/55">
470
- <IconShieldCheck className="size-3.5 shrink-0" />
471
- <span className="truncate text-[11px]">Audit not run</span>
441
+ <div className="flex h-7 items-center rounded-[5px] px-2 text-muted-foreground/55">
442
+ <span className="truncate !text-[11px]">
443
+ Run a quick accessibility check.
444
+ </span>
472
445
  </div>
473
446
  )}
474
447
 
475
- {/* Loading */}
476
448
  {loading && !hasFindings && (
477
449
  <div className="flex h-7 items-center gap-2 rounded-[5px] px-2">
478
450
  <IconRefresh className="size-3.5 animate-spin text-muted-foreground/50" />
479
- <span className="text-[11px] text-muted-foreground/60">
451
+ <span className="!text-[11px] text-muted-foreground/60">
480
452
  Scanning…
481
453
  </span>
482
454
  </div>
483
455
  )}
484
456
 
485
- {/* All clear */}
486
457
  {!loading && !auditError && !notRun && !hasFindings && (
487
458
  <div className="flex h-7 items-center gap-2 rounded-[5px] px-2">
488
459
  <IconCheck className="size-3.5 text-emerald-500" />
489
- <span className="text-[11px] text-muted-foreground">
460
+ <span className="!text-[11px] text-muted-foreground">
490
461
  No issues found.
491
462
  </span>
492
463
  </div>
493
464
  )}
494
465
 
495
- {/* Findings list */}
496
466
  {hasFindings && (
497
- <div className="space-y-0.5">
467
+ <div className="flex flex-col gap-0.5">
498
468
  {[...errors, ...warnings, ...infos].map((finding) => (
499
469
  <FindingRow
500
470
  key={finding.id}
@@ -507,7 +477,6 @@ function A11ySection({
507
477
  </div>
508
478
  )}
509
479
 
510
- {/* Audit timestamp */}
511
480
  {auditedAt && (
512
481
  <p className="mt-1 px-2 text-[10px] text-muted-foreground/40">
513
482
  Last audited{" "}
@@ -565,7 +534,7 @@ function DiffRow({ entry }: { entry: VisualDiffEntry }) {
565
534
  >
566
535
  {cfg.label}
567
536
  </Badge>
568
- <span className="truncate text-[11px] text-foreground leading-snug">
537
+ <span className="truncate !text-[11px] text-foreground leading-snug">
569
538
  {entry.description ?? entry.id}
570
539
  </span>
571
540
  </div>
@@ -592,6 +561,10 @@ function VisualDiffSection({
592
561
  const hasDiff = diff.length > 0;
593
562
  const hasVersions = versionOptions.length > 0;
594
563
  const noVersionsSelected = !baseVersionId && !compareVersionId;
564
+ const shouldRender =
565
+ hasVersions || hasDiff || loading || !!diffError || !noVersionsSelected;
566
+
567
+ if (!shouldRender) return null;
595
568
 
596
569
  return (
597
570
  <section aria-labelledby="review-diff-heading">
@@ -599,7 +572,7 @@ function VisualDiffSection({
599
572
  <IconArrowsLeftRight className="size-3.5 text-muted-foreground" />
600
573
  <span
601
574
  id="review-diff-heading"
602
- className="text-[11px] font-semibold text-foreground"
575
+ className="!text-[11px] font-semibold text-foreground"
603
576
  >
604
577
  Visual diff
605
578
  </span>
@@ -613,10 +586,7 @@ function VisualDiffSection({
613
586
  )}
614
587
  </div>
615
588
 
616
- <Separator />
617
-
618
589
  <div className="space-y-1.5 py-1">
619
- {/* Version selectors */}
620
590
  {hasVersions && (
621
591
  <div className="flex items-center gap-1.5">
622
592
  <span className="shrink-0 text-[10px] text-muted-foreground/70">
@@ -638,11 +608,10 @@ function VisualDiffSection({
638
608
  </div>
639
609
  )}
640
610
 
641
- {/* States */}
642
611
  {diffError && (
643
612
  <div className="flex h-7 items-center gap-2 rounded-[5px] px-2">
644
613
  <IconAlertCircle className="size-3.5 shrink-0 text-destructive" />
645
- <span className="text-[11px] text-muted-foreground">
614
+ <span className="!text-[11px] text-muted-foreground">
646
615
  {diffError}
647
616
  </span>
648
617
  </div>
@@ -651,14 +620,14 @@ function VisualDiffSection({
651
620
  {loading && (
652
621
  <div className="flex h-7 items-center gap-2 rounded-[5px] px-2">
653
622
  <IconRefresh className="size-3.5 animate-spin text-muted-foreground/50" />
654
- <span className="text-[11px] text-muted-foreground/60">
623
+ <span className="!text-[11px] text-muted-foreground/60">
655
624
  Comparing…
656
625
  </span>
657
626
  </div>
658
627
  )}
659
628
 
660
629
  {!loading && !diffError && noVersionsSelected && !hasDiff && (
661
- <div className="flex h-7 items-center rounded-[5px] px-2 text-[11px] text-muted-foreground/55">
630
+ <div className="flex h-7 items-center rounded-[5px] px-2 !text-[11px] text-muted-foreground/55">
662
631
  {hasVersions ? "Choose versions to diff" : "No versions yet"}
663
632
  </div>
664
633
  )}
@@ -666,15 +635,14 @@ function VisualDiffSection({
666
635
  {!loading && !diffError && !noVersionsSelected && !hasDiff && (
667
636
  <div className="flex h-7 items-center gap-2 rounded-[5px] px-2">
668
637
  <IconCheck className="size-3.5 text-emerald-500" />
669
- <span className="text-[11px] text-muted-foreground">
638
+ <span className="!text-[11px] text-muted-foreground">
670
639
  No structural changes detected.
671
640
  </span>
672
641
  </div>
673
642
  )}
674
643
 
675
- {/* Diff rows */}
676
644
  {hasDiff && (
677
- <div className="space-y-0.5">
645
+ <div className="flex flex-col gap-0.5">
678
646
  {diff.map((entry) => (
679
647
  <DiffRow key={entry.id} entry={entry} />
680
648
  ))}
@@ -704,7 +672,6 @@ export function ReviewPanel({
704
672
  auditLoading,
705
673
  auditedAt,
706
674
  auditError,
707
- onRunAudit,
708
675
  visualDiff = [],
709
676
  versionOptions = [],
710
677
  baseVersionId,
@@ -717,9 +684,17 @@ export function ReviewPanel({
717
684
  onFixApplied,
718
685
  className,
719
686
  }: ReviewPanelProps) {
687
+ const showDiffSection =
688
+ versionOptions.length > 0 ||
689
+ visualDiff.length > 0 ||
690
+ diffLoading ||
691
+ !!diffError ||
692
+ !!baseVersionId ||
693
+ !!compareVersionId;
694
+
720
695
  return (
721
696
  <div
722
- className={cn("flex flex-col gap-2 text-[11px]", className)}
697
+ className={cn("flex flex-col gap-1 !text-[11px]", className)}
723
698
  data-testid="review-panel"
724
699
  >
725
700
  <A11ySection
@@ -727,21 +702,25 @@ export function ReviewPanel({
727
702
  loading={auditLoading}
728
703
  auditedAt={auditedAt}
729
704
  auditError={auditError}
730
- onRunAudit={onRunAudit}
731
705
  onFindingClick={onFindingClick}
732
706
  fixSource={fixSource}
733
707
  onFixApplied={onFixApplied}
734
708
  />
735
709
 
736
- <VisualDiffSection
737
- diff={visualDiff}
738
- versionOptions={versionOptions}
739
- baseVersionId={baseVersionId}
740
- compareVersionId={compareVersionId}
741
- onVersionChange={onVersionChange}
742
- loading={diffLoading}
743
- diffError={diffError}
744
- />
710
+ {showDiffSection ? (
711
+ <>
712
+ <Separator />
713
+ <VisualDiffSection
714
+ diff={visualDiff}
715
+ versionOptions={versionOptions}
716
+ baseVersionId={baseVersionId}
717
+ compareVersionId={compareVersionId}
718
+ onVersionChange={onVersionChange}
719
+ loading={diffLoading}
720
+ diffError={diffError}
721
+ />
722
+ </>
723
+ ) : null}
745
724
  </div>
746
725
  );
747
726
  }
@@ -271,7 +271,7 @@ export function StatesPanel({
271
271
  {/* ── Responsive breakpoints ── */}
272
272
  <section aria-label="Breakpoints">
273
273
  <div className="mb-1 flex items-center justify-between">
274
- <span className="text-[11px] font-medium text-muted-foreground">
274
+ <span className="!text-[11px] font-medium text-muted-foreground">
275
275
  Responsive
276
276
  </span>
277
277
  {onAddBreakpoint && (
@@ -346,7 +346,7 @@ export function StatesPanel({
346
346
  {/* ── Design states ── */}
347
347
  <section aria-label="Design states">
348
348
  <div className="mb-1 flex items-center justify-between">
349
- <span className="text-[11px] font-medium text-muted-foreground">
349
+ <span className="!text-[11px] font-medium text-muted-foreground">
350
350
  States
351
351
  </span>
352
352
  <div className="flex items-center gap-0.5">
@@ -461,7 +461,7 @@ export function StatesPanel({
461
461
 
462
462
  {/* Empty state (no user-created states yet) */}
463
463
  {!isLoading && states.length === 0 && !isAdding && (
464
- <div className="mt-1 flex h-7 items-center rounded-[5px] px-2 text-[11px] text-muted-foreground/55">
464
+ <div className="mt-1 flex h-7 items-center rounded-[5px] px-2 !text-[11px] text-muted-foreground/55">
465
465
  No saved states
466
466
  </div>
467
467
  )}
@@ -480,7 +480,7 @@ export function StatesPanel({
480
480
  value={newStateName}
481
481
  onChange={(e) => setNewStateName(e.target.value)}
482
482
  placeholder="State name…"
483
- className="h-6 min-w-0 flex-1 rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-1.5 text-[11px] text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-[var(--design-editor-accent-color)]"
483
+ className="h-6 min-w-0 flex-1 rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-1.5 !text-[11px] text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-[var(--design-editor-accent-color)]"
484
484
  onKeyDown={(e) => {
485
485
  if (e.key === "Escape") {
486
486
  setIsAdding(false);
@@ -491,7 +491,7 @@ export function StatesPanel({
491
491
  <Button
492
492
  type="submit"
493
493
  size="sm"
494
- className="h-6 cursor-pointer px-2 text-[11px]"
494
+ className="h-6 cursor-pointer px-2 !text-[11px]"
495
495
  disabled={!newStateName.trim() || createState.isPending}
496
496
  >
497
497
  Add
@@ -500,7 +500,7 @@ export function StatesPanel({
500
500
  type="button"
501
501
  variant="ghost"
502
502
  size="sm"
503
- className="h-6 cursor-pointer px-2 text-[11px]"
503
+ className="h-6 cursor-pointer px-2 !text-[11px]"
504
504
  onClick={() => {
505
505
  setIsAdding(false);
506
506
  setNewStateName("");
@@ -200,7 +200,7 @@ function TokenRow({
200
200
  {/* Friendly name */}
201
201
  <button
202
202
  type="button"
203
- className="min-w-0 flex-1 cursor-pointer truncate bg-transparent p-0 text-left text-[11px] text-foreground"
203
+ className="min-w-0 flex-1 cursor-pointer truncate bg-transparent p-0 text-left !text-[11px] text-foreground"
204
204
  onClick={onStartEdit}
205
205
  aria-label={`Edit ${token.name}`}
206
206
  title={token.name}
@@ -220,7 +220,7 @@ function TokenRow({
220
220
  if (e.key === "Escape") onCancelEdit();
221
221
  }}
222
222
  onBlur={onCommit}
223
- className="h-5 w-24 px-1 py-0 text-[11px] font-mono"
223
+ className="h-5 w-24 px-1 py-0 !text-[11px] font-mono md:!text-[11px]"
224
224
  />
225
225
  ) : (
226
226
  <button
@@ -360,7 +360,7 @@ function NewTokenPopover({ onAdd }: NewTokenPopoverProps) {
360
360
  type="button"
361
361
  variant="ghost"
362
362
  size="sm"
363
- className="h-6 cursor-pointer gap-1 px-2 text-[11px] text-muted-foreground hover:text-foreground"
363
+ className="h-6 cursor-pointer gap-1 px-2 !text-[11px] text-muted-foreground hover:text-foreground"
364
364
  >
365
365
  <IconPlus className="size-3" />
366
366
  {t("designEditor.tokens.newToken")}
@@ -375,7 +375,7 @@ function NewTokenPopover({ onAdd }: NewTokenPopoverProps) {
375
375
  <Input
376
376
  value={cssVar}
377
377
  onChange={(e) => setCssVar(e.target.value)}
378
- className="h-6 font-mono text-[11px]"
378
+ className="h-6 font-mono !text-[11px] md:!text-[11px]"
379
379
  placeholder="--my-token"
380
380
  />
381
381
  </div>
@@ -386,13 +386,13 @@ function NewTokenPopover({ onAdd }: NewTokenPopoverProps) {
386
386
  <Input
387
387
  value={value}
388
388
  onChange={(e) => setValue(e.target.value)}
389
- className="h-6 font-mono text-[11px]"
389
+ className="h-6 font-mono !text-[11px] md:!text-[11px]"
390
390
  placeholder="#3B82F6"
391
391
  />
392
392
  </div>
393
393
  <Button
394
394
  type="button"
395
- className="h-7 w-full cursor-pointer text-[11px]"
395
+ className="h-7 w-full cursor-pointer !text-[11px]"
396
396
  onClick={handleAdd}
397
397
  disabled={!cssVar || !value}
398
398
  >
@@ -506,7 +506,7 @@ function ImportTokensPopover({
506
506
  <PopoverContent align="end" className="w-72 p-3 text-[12px]">
507
507
  <div className="space-y-3">
508
508
  <div className="space-y-1">
509
- <p className="text-[11px] font-medium text-foreground">
509
+ <p className="!text-[11px] font-medium text-foreground">
510
510
  {t("designEditor.tokens.importTitle")}
511
511
  </p>
512
512
  <p className="text-[10px] leading-snug text-muted-foreground">
@@ -575,11 +575,11 @@ function ImportTokensPopover({
575
575
  value={text}
576
576
  onChange={(event) => setText(event.target.value)}
577
577
  placeholder={t("designEditor.tokens.pastePlaceholder")}
578
- className="min-h-24 resize-none font-mono text-[11px]"
578
+ className="min-h-24 resize-none font-mono !text-[11px]"
579
579
  />
580
580
  <Button
581
581
  type="button"
582
- className="h-7 w-full cursor-pointer text-[11px]"
582
+ className="h-7 w-full cursor-pointer !text-[11px]"
583
583
  disabled={isPending || !text.trim()}
584
584
  onClick={() => void runImport(() => onImportText(text))}
585
585
  >
@@ -720,7 +720,7 @@ export function TokensPanel({ designId, onTokensApplied }: TokensPanelProps) {
720
720
  <div className="flex items-center justify-between border-b border-border/60 px-3 py-2">
721
721
  <div className="flex items-center gap-1.5">
722
722
  <IconCode className="size-3.5 text-muted-foreground/60" />
723
- <span className="text-[11px] font-semibold text-foreground">
723
+ <span className="!text-[11px] font-semibold text-foreground">
724
724
  {t("designEditor.tokens.title")}
725
725
  </span>
726
726
  {tokenCount > 0 && (
@@ -772,7 +772,7 @@ export function TokensPanel({ designId, onTokensApplied }: TokensPanelProps) {
772
772
  {!isLoading && groups.length === 0 && (
773
773
  <div className="flex flex-col items-center gap-2 px-4 py-8 text-center">
774
774
  <IconPalette className="size-6 text-muted-foreground/30" />
775
- <p className="text-[11px] leading-snug text-muted-foreground/60">
775
+ <p className="!text-[11px] leading-snug text-muted-foreground/60">
776
776
  {t("designEditor.tokens.empty")}
777
777
  </p>
778
778
  <p className="text-[10px] text-muted-foreground/40">
@@ -58,7 +58,7 @@ export function TweaksPanelContent({
58
58
  ) : (
59
59
  <div className="flex flex-col items-center gap-2 py-6 text-center">
60
60
  <IconAdjustmentsHorizontal className="size-5 text-muted-foreground/40" />
61
- <p className="text-[11px] leading-snug text-muted-foreground/70">
61
+ <p className="!text-[11px] leading-snug text-muted-foreground/70">
62
62
  {t("designEditor.noTweakControls")}
63
63
  </p>
64
64
  {onRequestTweaks && (
@@ -66,7 +66,7 @@ export function TweaksPanelContent({
66
66
  type="button"
67
67
  variant="outline"
68
68
  size="sm"
69
- className="h-6 cursor-pointer border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2.5 text-[11px] text-foreground shadow-none hover:bg-[var(--design-editor-panel-raised-bg)] hover:text-foreground focus-visible:ring-1 focus-visible:ring-[var(--design-editor-accent-color)] focus-visible:ring-offset-0"
69
+ className="h-6 cursor-pointer border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-2.5 !text-[11px] text-foreground shadow-none hover:bg-[var(--design-editor-panel-raised-bg)] hover:text-foreground focus-visible:ring-1 focus-visible:ring-[var(--design-editor-accent-color)] focus-visible:ring-offset-0"
70
70
  onClick={(e) => onRequestTweaks(e.currentTarget)}
71
71
  >
72
72
  <IconPlus className="size-3" />
@@ -153,7 +153,7 @@ export function TweaksPanel({
153
153
  type="button"
154
154
  onMouseDown={(e) => e.stopPropagation()}
155
155
  onClick={() => setCollapsed((c) => !c)}
156
- className="cursor-pointer text-[11px] font-semibold text-foreground hover:text-foreground/80"
156
+ className="cursor-pointer !text-[11px] font-semibold text-foreground hover:text-foreground/80"
157
157
  >
158
158
  {t("designEditor.tweaks")}
159
159
  </button>
@@ -225,7 +225,9 @@ function TweakControl({
225
225
  if (tweak.type === "toggle") {
226
226
  return (
227
227
  <div className="flex h-6 items-center justify-between gap-1.5">
228
- <span className="text-[11px] text-muted-foreground">{tweak.label}</span>
228
+ <span className="!text-[11px] text-muted-foreground">
229
+ {tweak.label}
230
+ </span>
229
231
  <Switch
230
232
  checked={!!value}
231
233
  onCheckedChange={(checked) => onChange(checked)}
@@ -237,7 +239,7 @@ function TweakControl({
237
239
 
238
240
  return (
239
241
  <div className="space-y-1">
240
- <span className="text-[11px] text-muted-foreground">{tweak.label}</span>
242
+ <span className="!text-[11px] text-muted-foreground">{tweak.label}</span>
241
243
 
242
244
  {((tweak.type as string) === "color-swatch" ||
243
245
  (tweak.type as string) === "color-swatches") && (
@@ -271,7 +273,7 @@ function TweakControl({
271
273
  key={opt.value}
272
274
  onClick={() => onChange(opt.value)}
273
275
  className={cn(
274
- "flex flex-1 cursor-pointer items-center justify-center px-2 text-[11px] font-medium transition-colors",
276
+ "flex flex-1 cursor-pointer items-center justify-center px-2 !text-[11px] font-medium transition-colors",
275
277
  value === opt.value
276
278
  ? "bg-accent text-foreground"
277
279
  : "text-muted-foreground/70 hover:bg-accent/50 hover:text-foreground",
@@ -302,7 +304,7 @@ function TweakControl({
302
304
  onValueChange={([v]) => onChange(v)}
303
305
  className="flex-1"
304
306
  />
305
- <span className="min-w-[2ch] text-right text-[11px] tabular-nums text-muted-foreground">
307
+ <span className="min-w-[2ch] text-right !text-[11px] tabular-nums text-muted-foreground">
306
308
  {sliderValue}
307
309
  {tweak.unit ??
308
310
  (tweak.cssVar?.toLowerCase().includes("radius")