@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
@@ -38,9 +38,9 @@ export interface BoardObjectEntry {
38
38
  rotation?: number;
39
39
  z?: number;
40
40
  };
41
- /** CSS fill colour (background). Defaults to theme primary tint when absent. */
41
+ /** CSS fill colour (background). Defaults to soft neutral gray when absent. */
42
42
  fill?: string;
43
- /** CSS stroke colour (border). Defaults to theme primary stroke when absent. */
43
+ /** CSS stroke colour (border). Defaults to darker neutral gray when absent. */
44
44
  stroke?: string;
45
45
  /** Stroke width in pixels. */
46
46
  strokeWidth?: number;
@@ -299,6 +299,12 @@ export type CodeLayerTreeNodeType =
299
299
  | "group"
300
300
  | "component"
301
301
  | "shape"
302
+ | "ellipse"
303
+ | "vector"
304
+ | "line"
305
+ | "arrow"
306
+ | "polygon"
307
+ | "star"
302
308
  | "text"
303
309
  | "image"
304
310
  | "element";
@@ -1668,6 +1674,22 @@ function treeTypeForNode(node: CodeLayerNode): CodeLayerTreeNodeType {
1668
1674
  if (primitiveKind === "text") return "text";
1669
1675
  if (primitiveKind === "frame") return "frame";
1670
1676
  if (primitiveKind === "image") return "image";
1677
+ if (
1678
+ primitiveKind === "ellipse" ||
1679
+ primitiveKind === "circle" ||
1680
+ primitiveKind === "oval"
1681
+ ) {
1682
+ return "ellipse";
1683
+ }
1684
+ // SVG-based vector primitives each get their own type so the layers panel
1685
+ // renders a true pen/line/arrow/polygon/star icon instead of falling
1686
+ // through to the rectangle ("shape") glyph.
1687
+ if (primitiveKind === "path") return "vector";
1688
+ if (primitiveKind === "line") return "line";
1689
+ if (primitiveKind === "arrow") return "arrow";
1690
+ if (primitiveKind === "polygon") return "polygon";
1691
+ if (primitiveKind === "star") return "star";
1692
+ // rectangle/rect and anything else still classify as a generic shape.
1671
1693
  return "shape";
1672
1694
  }
1673
1695
  if (TEXT_LAYER_TAGS.has(node.tag)) return "text";
@@ -1716,11 +1738,12 @@ function compactCodeLayerTreeNodes(
1716
1738
  nextAncestors,
1717
1739
  );
1718
1740
  const compactedNode: CodeLayerTreeNode = { ...node, children };
1719
- const promotedNodes =
1720
- isCollapsibleDocumentShellNode(compactedNode, nodesById) &&
1721
- children.length > 0
1722
- ? children
1723
- : [compactedNode];
1741
+ const promotedNodes = isCollapsibleDocumentShellNode(
1742
+ compactedNode,
1743
+ nodesById,
1744
+ )
1745
+ ? children
1746
+ : [compactedNode];
1724
1747
 
1725
1748
  for (const promotedNode of promotedNodes) {
1726
1749
  if (siblingIds.has(promotedNode.id)) continue;
@@ -1794,6 +1817,25 @@ function capabilitiesFor(element: ParsedElement): EditCapability[] {
1794
1817
  return capabilities;
1795
1818
  }
1796
1819
 
1820
+ // Internal nodes of an <svg> (the <path>/<polygon>/<circle>/... geometry) are
1821
+ // rendering primitives, never selectable design layers. Projecting them adds a
1822
+ // meaningless expandable child to every pen vector / line / arrow / polygon /
1823
+ // star (and to any inline SVG icon). Treat the <svg> as a leaf: skip everything
1824
+ // that has an <svg> ancestor.
1825
+ function hasSvgAncestor(
1826
+ element: ParsedElement,
1827
+ elements: ParsedElement[],
1828
+ ): boolean {
1829
+ let parentIndex = element.parentIndex;
1830
+ while (parentIndex !== undefined) {
1831
+ const parent = elements[parentIndex];
1832
+ if (!parent) break;
1833
+ if (parent.tag === "svg") return true;
1834
+ parentIndex = parent.parentIndex;
1835
+ }
1836
+ return false;
1837
+ }
1838
+
1797
1839
  function buildProjection(
1798
1840
  html: string,
1799
1841
  source: CodeLayerSource,
@@ -1808,6 +1850,7 @@ function buildProjection(
1808
1850
 
1809
1851
  for (const element of elements) {
1810
1852
  if (NON_VISUAL_TAGS.has(element.tag)) continue;
1853
+ if (hasSvgAncestor(element, elements)) continue;
1811
1854
  const nodeId = nodeIdFor(element, elements, source);
1812
1855
  nodeIdByElementIndex.set(element.index, nodeId);
1813
1856
  }
@@ -2038,9 +2081,10 @@ export function buildCodeLayerTree(
2038
2081
  const treeById = new Map<string, CodeLayerTreeNode>();
2039
2082
 
2040
2083
  for (const node of projection.nodes) {
2084
+ const componentName = node.componentInstance?.name;
2041
2085
  treeById.set(node.id, {
2042
2086
  id: node.id,
2043
- name: node.layerName,
2087
+ name: componentName ?? node.layerName,
2044
2088
  type: treeTypeForNode(node),
2045
2089
  tag: node.tag,
2046
2090
  selector: node.selector,
@@ -166,6 +166,33 @@ export function extractManagedMotionCss(html: string): string | null {
166
166
  return afterOpen.slice(0, closeMatch.index).trim();
167
167
  }
168
168
 
169
+ /**
170
+ * Inject or replace the managed `<style data-agent-native-motion>` block in an
171
+ * HTML document. Inserts before `</head>` when no managed block exists, or at
172
+ * the top of the document when there is no `<head>`.
173
+ */
174
+ export function injectManagedMotionCss(html: string, css: string): string {
175
+ const openRe = /<style\b(?=[^>]*\bdata-agent-native-motion\b)[^>]*>/i;
176
+ const openMatch = openRe.exec(html);
177
+ const block = `<style data-agent-native-motion>\n${css}\n</style>`;
178
+
179
+ if (openMatch) {
180
+ const bodyStart = openMatch.index + openMatch[0].length;
181
+ const afterOpen = html.slice(bodyStart);
182
+ const closeMatch = /<\s*\/\s*style\b[^>]*>/i.exec(afterOpen);
183
+ if (closeMatch) {
184
+ const closeEnd = bodyStart + closeMatch.index + closeMatch[0].length;
185
+ return html.slice(0, openMatch.index) + block + html.slice(closeEnd);
186
+ }
187
+ }
188
+
189
+ const headClose = html.lastIndexOf("</head>");
190
+ if (headClose !== -1) {
191
+ return html.slice(0, headClose) + block + "\n" + html.slice(headClose);
192
+ }
193
+ return block + "\n" + html;
194
+ }
195
+
169
196
  /**
170
197
  * Return the djb2 hash of a CSS string — useful for verifying stored
171
198
  * `compiled_hash` values without re-compiling a full timeline.
@@ -5,6 +5,7 @@ import {
5
5
  IconChartBar,
6
6
  } from "@tabler/icons-react";
7
7
  import { subDays } from "date-fns";
8
+ import type { CSSProperties } from "react";
8
9
  import { useState, useEffect } from "react";
9
10
  import { Link } from "react-router";
10
11
  import {
@@ -56,6 +57,15 @@ interface DailyProgressProps {
56
57
  fat: number;
57
58
  }
58
59
 
60
+ const chartTooltipContentStyle = {
61
+ backgroundColor: "hsl(var(--popover))",
62
+ border: "1px solid hsl(var(--border))",
63
+ borderRadius: "8px",
64
+ boxShadow: "0 4px 12px hsl(var(--foreground) / 0.12)",
65
+ color: "hsl(var(--popover-foreground))",
66
+ fontSize: "12px",
67
+ } satisfies CSSProperties;
68
+
59
69
  export function DailyProgress({
60
70
  totalCalories,
61
71
  totalBurnedCalories,
@@ -105,7 +115,7 @@ export function DailyProgress({
105
115
  };
106
116
 
107
117
  return (
108
- <div className="relative overflow-hidden rounded-2xl border border-white/[0.08] bg-white/[0.02] p-4 sm:p-5 backdrop-blur-sm">
118
+ <div className="relative overflow-hidden rounded-2xl border border-border bg-card p-4 sm:p-5">
109
119
  <div className="macros-summary-grid">
110
120
  {/* Left Side */}
111
121
  <div className="space-y-8 flex flex-col justify-center">
@@ -115,7 +125,7 @@ export function DailyProgress({
115
125
  {t("daily.summary")}
116
126
  </p>
117
127
  </div>
118
- <div className="px-3 py-1.5 rounded-full bg-white/[0.05] border border-white/[0.05] flex items-center">
128
+ <div className="px-3 py-1.5 rounded-full bg-muted/40 border border-border flex items-center">
119
129
  <span className="text-[10px] font-medium text-muted-foreground uppercase tracking-widest leading-none">
120
130
  {t("daily.goalWithValue", { value: goalCalories })}
121
131
  </span>
@@ -174,7 +184,7 @@ export function DailyProgress({
174
184
  </span>
175
185
  </div>
176
186
  </div>
177
- <div className="h-1.5 bg-white/[0.06] rounded-full overflow-hidden">
187
+ <div className="h-1.5 bg-muted rounded-full overflow-hidden">
178
188
  <div
179
189
  className={cn(
180
190
  "h-full transition-all duration-500 ease-out rounded-full",
@@ -194,7 +204,7 @@ export function DailyProgress({
194
204
  ].map((m) => (
195
205
  <div
196
206
  key={m.label}
197
- className="p-2.5 sm:p-3 rounded-xl bg-white/[0.03] border border-white/[0.04]"
207
+ className="p-2.5 sm:p-3 rounded-xl bg-muted/30 border border-border"
198
208
  >
199
209
  <p className="text-[10px] uppercase tracking-wider text-muted-foreground mb-1">
200
210
  {m.label}
@@ -209,14 +219,14 @@ export function DailyProgress({
209
219
  </div>
210
220
 
211
221
  {/* Right Side: Charts */}
212
- <div className="macros-summary-chart border-l border-white/[0.08] pl-8 flex-col justify-center transition-all duration-300">
222
+ <div className="macros-summary-chart border-l border-border pl-8 flex-col justify-center transition-all duration-300">
213
223
  <Tabs
214
224
  value={activeChart}
215
225
  onValueChange={setActiveChart}
216
226
  className="flex flex-col space-y-6"
217
227
  >
218
228
  <div className="flex items-center justify-between">
219
- <TabsList className="bg-white/[0.04] border border-white/[0.08] h-8">
229
+ <TabsList className="bg-muted/40 border border-border h-8">
220
230
  <TabsTrigger
221
231
  value="weight"
222
232
  className="gap-2 text-[10px] uppercase tracking-wider h-6 px-3"
@@ -237,7 +247,7 @@ export function DailyProgress({
237
247
  <Button
238
248
  variant="ghost"
239
249
  size="sm"
240
- className="h-8 px-2.5 text-[10px] uppercase tracking-widest text-muted-foreground/50 hover:text-foreground hover:bg-white/5 gap-2"
250
+ className="h-8 px-2.5 text-[10px] uppercase tracking-widest text-muted-foreground/50 hover:text-foreground hover:bg-accent gap-2"
241
251
  >
242
252
  {t("daily.last30Days")}{" "}
243
253
  <IconChartBar className="h-3.5 w-3.5" />
@@ -246,7 +256,7 @@ export function DailyProgress({
246
256
  </TooltipTrigger>
247
257
  <TooltipContent
248
258
  side="bottom"
249
- className="bg-zinc-900 border-white/10 text-[10px] uppercase tracking-widest py-1.5 px-3"
259
+ className="bg-popover border-border text-popover-foreground text-[10px] uppercase tracking-widest py-1.5 px-3"
250
260
  >
251
261
  {t("daily.viewFullAnalytics")}
252
262
  </TooltipContent>
@@ -260,7 +270,7 @@ export function DailyProgress({
260
270
  >
261
271
  <div className="h-[140px] w-full">
262
272
  {weightLoading ? (
263
- <Skeleton className="h-full w-full rounded-xl bg-white/[0.02]" />
273
+ <Skeleton className="h-full w-full rounded-xl bg-muted" />
264
274
  ) : weightHistory.length > 0 ? (
265
275
  <ResponsiveContainer width="100%" height="100%">
266
276
  <LineChart
@@ -273,15 +283,10 @@ export function DailyProgress({
273
283
  hide
274
284
  />
275
285
  <ChartTooltip
276
- contentStyle={{
277
- backgroundColor: "#09090b",
278
- border: "1px solid rgba(255,255,255,0.1)",
279
- borderRadius: "8px",
280
- boxShadow: "0 4px 12px rgba(0,0,0,0.5)",
281
- fontSize: "12px",
282
- color: "#fff",
286
+ contentStyle={chartTooltipContentStyle}
287
+ cursor={{
288
+ stroke: "hsl(var(--muted-foreground) / 0.25)",
283
289
  }}
284
- cursor={{ stroke: "rgba(255,255,255,0.1)" }}
285
290
  formatter={(value: any, name: any) => [
286
291
  `${value} lbs`,
287
292
  name === "trendWeight"
@@ -292,34 +297,34 @@ export function DailyProgress({
292
297
  <Line
293
298
  type="monotone"
294
299
  dataKey="weight"
295
- stroke="rgba(255,255,255,0.2)"
300
+ stroke="hsl(var(--muted-foreground) / 0.35)"
296
301
  strokeWidth={1}
297
302
  dot={{
298
- fill: "rgba(255,255,255,0.2)",
303
+ fill: "hsl(var(--muted-foreground) / 0.35)",
299
304
  r: 2,
300
305
  }}
301
306
  activeDot={{
302
307
  r: 4,
303
308
  strokeWidth: 0,
304
- fill: "#fff",
309
+ fill: "hsl(var(--foreground))",
305
310
  }}
306
311
  />
307
312
  <Line
308
313
  type="monotone"
309
314
  dataKey="trendWeight"
310
- stroke="#fff"
315
+ stroke="hsl(var(--foreground))"
311
316
  strokeWidth={2}
312
317
  dot={false}
313
318
  activeDot={{
314
319
  r: 4,
315
320
  strokeWidth: 0,
316
- fill: "#fff",
321
+ fill: "hsl(var(--foreground))",
317
322
  }}
318
323
  />
319
324
  </LineChart>
320
325
  </ResponsiveContainer>
321
326
  ) : (
322
- <div className="h-full flex items-center justify-center border border-dashed border-white/[0.06] rounded-xl">
327
+ <div className="h-full flex items-center justify-center border border-dashed border-border rounded-xl">
323
328
  <p className="text-xs text-muted-foreground">
324
329
  {t("daily.noWeightData")}
325
330
  </p>
@@ -341,7 +346,7 @@ export function DailyProgress({
341
346
  >
342
347
  <div className="h-[140px] w-full">
343
348
  {calorieLoading ? (
344
- <Skeleton className="h-full w-full rounded-xl bg-white/[0.02]" />
349
+ <Skeleton className="h-full w-full rounded-xl bg-muted" />
345
350
  ) : calorieHistory.length > 0 ? (
346
351
  <ResponsiveContainer width="100%" height="100%">
347
352
  <AreaChart
@@ -358,10 +363,14 @@ export function DailyProgress({
358
363
  >
359
364
  <stop
360
365
  offset="5%"
361
- stopColor="#fff"
366
+ stopColor="hsl(var(--foreground))"
362
367
  stopOpacity={0.1}
363
368
  />
364
- <stop offset="95%" stopColor="#fff" stopOpacity={0} />
369
+ <stop
370
+ offset="95%"
371
+ stopColor="hsl(var(--foreground))"
372
+ stopOpacity={0}
373
+ />
365
374
  </linearGradient>
366
375
  </defs>
367
376
  <XAxis dataKey="displayDate" hide />
@@ -370,15 +379,10 @@ export function DailyProgress({
370
379
  hide
371
380
  />
372
381
  <ChartTooltip
373
- contentStyle={{
374
- backgroundColor: "#09090b",
375
- border: "1px solid rgba(255,255,255,0.1)",
376
- borderRadius: "8px",
377
- boxShadow: "0 4px 12px rgba(0,0,0,0.5)",
378
- fontSize: "12px",
379
- color: "#fff",
382
+ contentStyle={chartTooltipContentStyle}
383
+ cursor={{
384
+ stroke: "hsl(var(--muted-foreground) / 0.25)",
380
385
  }}
381
- cursor={{ stroke: "rgba(255,255,255,0.1)" }}
382
386
  formatter={(value: any) => [
383
387
  `${value} kcal`,
384
388
  t("daily.netCalories"),
@@ -387,20 +391,20 @@ export function DailyProgress({
387
391
  <Area
388
392
  type="monotone"
389
393
  dataKey="netCalories"
390
- stroke="#fff"
394
+ stroke="hsl(var(--foreground))"
391
395
  strokeWidth={2}
392
396
  fillOpacity={1}
393
397
  fill="url(#colorNet)"
394
398
  activeDot={{
395
399
  r: 4,
396
400
  strokeWidth: 0,
397
- fill: "#fff",
401
+ fill: "hsl(var(--foreground))",
398
402
  }}
399
403
  />
400
404
  </AreaChart>
401
405
  </ResponsiveContainer>
402
406
  ) : (
403
- <div className="h-full flex items-center justify-center border border-dashed border-white/[0.06] rounded-xl">
407
+ <div className="h-full flex items-center justify-center border border-dashed border-border rounded-xl">
404
408
  <p className="text-xs text-muted-foreground">
405
409
  {t("daily.noActivityData")}
406
410
  </p>
@@ -26,7 +26,7 @@ export function ExerciseCard({
26
26
  }: ExerciseCardProps) {
27
27
  const t = useT();
28
28
  return (
29
- <div className="group relative flex items-center gap-3 sm:gap-4 p-3 sm:p-4 rounded-xl bg-white/[0.02] border border-white/[0.08] hover:bg-white/[0.04] overflow-hidden">
29
+ <div className="group relative flex items-center gap-3 overflow-hidden rounded-xl border border-border bg-card p-3 hover:bg-accent/40 sm:gap-4 sm:p-4">
30
30
  <div className="flex items-center justify-center w-9 h-9 shrink-0 rounded-lg bg-orange-500/10 border border-orange-500/20">
31
31
  <IconFlame className="h-4 w-4 text-orange-400" />
32
32
  </div>
@@ -59,7 +59,7 @@ export function ExerciseCard({
59
59
  variant="ghost"
60
60
  size="icon"
61
61
  aria-label={t("common.editNamed", { name: exercise.name })}
62
- className="h-9 w-9 md:h-7 md:w-7 text-muted-foreground/50 hover:text-foreground hover:bg-white/5"
62
+ className="h-9 w-9 text-muted-foreground/50 hover:bg-accent hover:text-foreground md:h-7 md:w-7"
63
63
  onClick={() => onEdit(exercise)}
64
64
  >
65
65
  <IconPencil className="h-4 w-4 md:h-3.5 md:w-3.5" />
@@ -26,7 +26,7 @@ export function MealCard({
26
26
  }: MealCardProps) {
27
27
  const t = useT();
28
28
  return (
29
- <div className="group relative flex items-center gap-3 sm:gap-4 p-3 sm:p-4 rounded-xl bg-white/[0.02] border border-white/[0.08] hover:bg-white/[0.04] overflow-hidden">
29
+ <div className="group relative flex items-center gap-3 overflow-hidden rounded-xl border border-border bg-card p-3 hover:bg-accent/40 sm:gap-4 sm:p-4">
30
30
  <div className="flex items-center justify-center w-9 h-9 shrink-0 rounded-lg bg-emerald-500/10 border border-emerald-500/20">
31
31
  <IconToolsKitchen2 className="h-4 w-4 text-emerald-400" />
32
32
  </div>
@@ -65,7 +65,7 @@ export function MealCard({
65
65
  variant="ghost"
66
66
  size="icon"
67
67
  aria-label={t("common.editNamed", { name: meal.name })}
68
- className="h-9 w-9 md:h-7 md:w-7 text-muted-foreground/50 hover:text-foreground hover:bg-white/5"
68
+ className="h-9 w-9 text-muted-foreground/50 hover:bg-accent hover:text-foreground md:h-7 md:w-7"
69
69
  onClick={() => onEdit(meal)}
70
70
  >
71
71
  <IconPencil className="h-4 w-4 md:h-3.5 md:w-3.5" />
@@ -193,7 +193,7 @@ export function VoiceDictation({ currentDate }: VoiceDictationProps) {
193
193
  >
194
194
  {(state === "listening" || state === "processing") && (
195
195
  <div className="animate-in fade-in slide-in-from-bottom-2 duration-200">
196
- <div className="bg-card/95 backdrop-blur-xl border border-white/10 rounded-2xl px-4 py-3 shadow-2xl max-w-[300px] md:max-w-[250px]">
196
+ <div className="max-w-[300px] rounded-2xl border border-border bg-card/95 px-4 py-3 shadow-2xl backdrop-blur-xl md:max-w-[250px]">
197
197
  {state === "listening" && (
198
198
  <div className="flex items-center gap-2">
199
199
  <div className="flex gap-1">
@@ -261,7 +261,7 @@ export function WeeklyCaloriesChart({
261
261
  />
262
262
  <Tooltip
263
263
  content={<CustomTooltip t={t} />}
264
- cursor={{ fill: "rgba(255,255,255,0.03)" }}
264
+ cursor={{ fill: "hsl(var(--muted) / 0.5)" }}
265
265
  />
266
266
  <ReferenceLine
267
267
  y={weeklyGoal}
@@ -40,7 +40,7 @@ export function WeightCard({
40
40
  const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);
41
41
 
42
42
  return (
43
- <div className="group relative flex items-center gap-3 sm:gap-4 p-3 sm:p-4 rounded-xl bg-white/[0.02] border border-white/[0.08] hover:bg-white/[0.04]">
43
+ <div className="group relative flex items-center gap-3 rounded-xl border border-border bg-card p-3 hover:bg-accent/40 sm:gap-4 sm:p-4">
44
44
  <div className="flex items-center justify-center w-9 h-9 shrink-0 rounded-lg bg-blue-500/10 border border-blue-500/20">
45
45
  <IconScale className="h-4 w-4 text-blue-400" />
46
46
  </div>
@@ -71,7 +71,7 @@ export function WeightCard({
71
71
  aria-label={t("weight.editWeightLabel", {
72
72
  weight: weight.weight,
73
73
  })}
74
- className="h-9 w-9 md:h-7 md:w-7 text-muted-foreground/50 hover:text-foreground hover:bg-white/5"
74
+ className="h-9 w-9 text-muted-foreground/50 hover:bg-accent hover:text-foreground md:h-7 md:w-7"
75
75
  onClick={() => onEdit(weight)}
76
76
  >
77
77
  <IconPencil className="h-4 w-4 md:h-3.5 md:w-3.5" />
@@ -73,7 +73,7 @@ export function WeightTracker({ currentDate }: WeightTrackerProps) {
73
73
  {isLoading && !hasOptimisticRows ? (
74
74
  <Skeleton className="h-16 w-full rounded-xl" />
75
75
  ) : !todayWeight ? (
76
- <div className="flex flex-col items-center justify-center py-12 text-center rounded-2xl bg-white/[0.02] border border-dashed border-white/[0.06]">
76
+ <div className="flex flex-col items-center justify-center rounded-2xl border border-dashed border-border bg-muted/30 py-12 text-center">
77
77
  <div className="p-3 rounded-full bg-blue-500/10 mb-3">
78
78
  <IconScale className="h-5 w-5 text-blue-500/50" />
79
79
  </div>
@@ -335,7 +335,7 @@ function SyncIndicator({ sidebarCollapsed }: { sidebarCollapsed: boolean }) {
335
335
  return (
336
336
  <div
337
337
  className={cn(
338
- "pointer-events-none fixed bottom-10 start-4 z-50 flex h-8 items-center gap-2 rounded-full border border-white/[0.06] bg-muted/80 px-3 text-xs text-muted-foreground shadow-sm backdrop-blur-sm md:bottom-8",
338
+ "pointer-events-none fixed bottom-10 start-4 z-50 flex h-8 items-center gap-2 rounded-full border border-border bg-muted/80 px-3 text-xs text-muted-foreground shadow-sm backdrop-blur-sm md:bottom-8",
339
339
  sidebarCollapsed
340
340
  ? "md:start-[calc(3.5rem+1rem)]"
341
341
  : "md:start-[calc(14rem+1rem)]",
@@ -129,12 +129,12 @@ export default function IndexPage() {
129
129
  <Button
130
130
  variant="ghost"
131
131
  size="icon"
132
- className="h-11 w-11 sm:h-8 sm:w-8 rounded-full text-muted-foreground hover:text-foreground hover:bg-white/5"
132
+ className="h-11 w-11 sm:h-8 sm:w-8 rounded-full text-muted-foreground hover:text-foreground hover:bg-accent"
133
133
  onClick={() => setDate(subDays(date, 1))}
134
134
  >
135
135
  <IconChevronLeft className="h-5 w-5 sm:h-4 sm:w-4 rtl:-scale-x-100" />
136
136
  </Button>
137
- <div className="min-w-[140px] sm:min-w-[160px] text-center px-3 sm:px-4 py-2 rounded-full bg-white/[0.03] border border-white/[0.06]">
137
+ <div className="min-w-[140px] sm:min-w-[160px] text-center px-3 sm:px-4 py-2 rounded-full bg-card border border-border">
138
138
  <span className="text-sm font-medium text-foreground">
139
139
  {isSameDay(date, new Date())
140
140
  ? t("entry.today")
@@ -144,7 +144,7 @@ export default function IndexPage() {
144
144
  <Button
145
145
  variant="ghost"
146
146
  size="icon"
147
- className="h-11 w-11 sm:h-8 sm:w-8 rounded-full text-muted-foreground hover:text-foreground hover:bg-white/5 disabled:opacity-30"
147
+ className="h-11 w-11 sm:h-8 sm:w-8 rounded-full text-muted-foreground hover:text-foreground hover:bg-accent disabled:opacity-30"
148
148
  onClick={() => setDate(addDays(date, 1))}
149
149
  disabled={isSameDay(date, new Date())}
150
150
  >
@@ -197,7 +197,7 @@ export default function IndexPage() {
197
197
  <Skeleton className="h-16 w-full rounded-xl" />
198
198
  </>
199
199
  ) : meals.length === 0 ? (
200
- <div className="flex flex-col items-center justify-center py-12 text-center rounded-2xl bg-white/[0.02] border border-dashed border-white/[0.06]">
200
+ <div className="flex flex-col items-center justify-center py-12 text-center rounded-2xl bg-card border border-dashed border-border">
201
201
  <div className="p-3 rounded-full bg-emerald-500/10 mb-3">
202
202
  <IconToolsKitchen2 className="h-5 w-5 text-emerald-500/50" />
203
203
  </div>
@@ -255,7 +255,7 @@ export default function IndexPage() {
255
255
  {exercisesLoading && !hasOptimisticExercises ? (
256
256
  <Skeleton className="h-16 w-full rounded-xl" />
257
257
  ) : exercises.length === 0 ? (
258
- <div className="flex flex-col items-center justify-center py-12 text-center rounded-2xl bg-white/[0.02] border border-dashed border-white/[0.06]">
258
+ <div className="flex flex-col items-center justify-center py-12 text-center rounded-2xl bg-card border border-dashed border-border">
259
259
  <div className="p-3 rounded-full bg-orange-500/10 mb-3">
260
260
  <IconBarbell className="h-5 w-5 text-orange-500/50" />
261
261
  </div>
@@ -54,7 +54,7 @@ export default function AnalyticsPage() {
54
54
  <IconCalendar className="w-3.5 h-3.5 me-1.5 sm:me-2 opacity-50" />
55
55
  <SelectValue placeholder={t("analytics.selectRange")} />
56
56
  </SelectTrigger>
57
- <SelectContent className="bg-zinc-900 border-white/10">
57
+ <SelectContent className="bg-popover border-border text-popover-foreground">
58
58
  <SelectItem value="7">
59
59
  {t("analytics.lastDays", { count: 7 })}
60
60
  </SelectItem>
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-06-30
4
+ ---
5
+
6
+ Dashboard loading and chart surfaces now use theme-aware colors in light and dark mode.
@@ -306,11 +306,11 @@ export function ComposeBubbleToolbar({
306
306
  setLinkUrl("");
307
307
  }
308
308
  }}
309
- className="bg-transparent border-none outline-none text-white text-sm w-48 px-1 py-0.5 placeholder:text-gray-400"
309
+ className="bg-transparent border-none outline-none text-popover-foreground text-sm w-48 px-1 py-0.5 placeholder:text-muted-foreground"
310
310
  />
311
311
  <button
312
312
  onClick={handleSetLink}
313
- className="text-xs text-blue-400 hover:text-blue-300 px-1.5 py-0.5 font-medium"
313
+ className="text-xs text-primary hover:text-primary/80 px-1.5 py-0.5 font-medium"
314
314
  >
315
315
  {t("mail.compose.apply")}
316
316
  </button>
@@ -319,8 +319,11 @@ export function ComposeBubbleToolbar({
319
319
  <div className="flex items-center gap-1 px-1">
320
320
  {isGenerating ? (
321
321
  <>
322
- <IconLoader2 size={14} className="animate-spin text-gray-400" />
323
- <span className="text-xs text-gray-400 px-1">
322
+ <IconLoader2
323
+ size={14}
324
+ className="animate-spin text-muted-foreground"
325
+ />
326
+ <span className="text-xs text-muted-foreground px-1">
324
327
  {t("mail.compose.generating")}
325
328
  </span>
326
329
  </>
@@ -344,13 +347,13 @@ export function ComposeBubbleToolbar({
344
347
  setAiPrompt("");
345
348
  }
346
349
  }}
347
- className="bg-transparent border-none outline-none text-white text-sm w-52 px-1 py-0.5 placeholder:text-gray-400 resize-none leading-snug"
350
+ className="bg-transparent border-none outline-none text-popover-foreground text-sm w-52 px-1 py-0.5 placeholder:text-muted-foreground resize-none leading-snug"
348
351
  />
349
352
  <Tooltip>
350
353
  <TooltipTrigger asChild>
351
354
  <button
352
355
  onClick={() => void handleAiAssist()}
353
- className="text-xs text-blue-400 hover:text-blue-300 px-1.5 py-0.5 font-medium shrink-0 self-end pb-1"
356
+ className="text-xs text-primary hover:text-primary/80 px-1.5 py-0.5 font-medium shrink-0 self-end pb-1"
354
357
  >
355
358
  {t("mail.compose.generate")}
356
359
  </button>
@@ -369,7 +372,7 @@ export function ComposeBubbleToolbar({
369
372
  {items.map((item, i) => {
370
373
  if ("type" in item && item.type === "divider") {
371
374
  return (
372
- <div key={`d-${i}`} className="w-px h-5 bg-gray-600 mx-0.5" />
375
+ <div key={`d-${i}`} className="w-px h-5 bg-border mx-0.5" />
373
376
  );
374
377
  }
375
378
  const {
@@ -391,8 +394,8 @@ export function ComposeBubbleToolbar({
391
394
  className={cn(
392
395
  "p-1.5 rounded transition-colors",
393
396
  active
394
- ? "bg-gray-600 text-white"
395
- : "text-gray-300 hover:bg-gray-700 hover:text-white",
397
+ ? "bg-accent text-accent-foreground"
398
+ : "text-popover-foreground/75 hover:bg-accent hover:text-accent-foreground",
396
399
  )}
397
400
  >
398
401
  <Icon size={14} strokeWidth={2.5} />
@@ -402,7 +405,7 @@ export function ComposeBubbleToolbar({
402
405
  </Tooltip>
403
406
  );
404
407
  })}
405
- <div className="w-px h-5 bg-gray-600 mx-0.5" />
408
+ <div className="w-px h-5 bg-border mx-0.5" />
406
409
  <Tooltip>
407
410
  <TooltipTrigger asChild>
408
411
  <button
@@ -412,7 +415,7 @@ export function ComposeBubbleToolbar({
412
415
  setShowAiInput(true);
413
416
  setShowLinkInput(false);
414
417
  }}
415
- className="p-1.5 rounded transition-colors text-gray-300 hover:bg-gray-700 hover:text-white"
418
+ className="p-1.5 rounded transition-colors text-popover-foreground/75 hover:bg-accent hover:text-accent-foreground"
416
419
  >
417
420
  <IconPencil size={14} strokeWidth={2.5} />
418
421
  </button>
@@ -525,12 +525,13 @@
525
525
  .bubble-toolbar {
526
526
  display: flex;
527
527
  align-items: center;
528
- background: hsl(0 0% 15%);
528
+ background: hsl(var(--popover));
529
+ color: hsl(var(--popover-foreground));
529
530
  border-radius: 8px;
530
531
  padding: 4px;
531
532
  box-shadow:
532
533
  0 4px 20px rgb(0 0 0 / 0.25),
533
- 0 0 0 1px rgb(255 255 255 / 0.06);
534
+ 0 0 0 1px hsl(var(--border));
534
535
  }
535
536
 
536
537
  /* ===== Slash Command Menu ===== */
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-06-30
4
+ ---
5
+
6
+ Compose floating toolbars now use theme-aware colors in light and dark mode.