@agent-native/core 0.120.2 → 0.120.4

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 (278) hide show
  1. package/corpus/README.md +3 -3
  2. package/corpus/core/CHANGELOG.md +28 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/cli/context-xray-local.ts +1 -1
  5. package/corpus/core/src/cli/index.ts +63 -18
  6. package/corpus/core/src/cli/skills.ts +5 -0
  7. package/corpus/core/src/cli/telemetry.ts +118 -1
  8. package/corpus/core/src/client/AgentPanel.tsx +10 -0
  9. package/corpus/core/src/client/CommandMenu.tsx +13 -1
  10. package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +39 -4
  11. package/corpus/core/src/client/analytics.ts +13 -0
  12. package/corpus/core/src/client/error-capture.ts +6 -1
  13. package/corpus/core/src/client/extensions/ExtensionsListPage.tsx +12 -5
  14. package/corpus/core/src/client/extensions/agent-native-extension-runtime.ts +1 -1
  15. package/corpus/core/src/client/navigation/index.ts +2 -0
  16. package/corpus/core/src/client/org/OrgSwitcher.tsx +14 -32
  17. package/corpus/core/src/client/settings/ExtensionsSettingsContent.tsx +1 -1
  18. package/corpus/core/src/extensions/theme.ts +1 -1
  19. package/corpus/core/src/localization/default-messages.ts +2 -0
  20. package/corpus/core/src/server/core-routes-plugin.ts +10 -1
  21. package/corpus/core/src/server/framework-request-handler.ts +17 -26
  22. package/corpus/core/src/styles/agent-native.css +13 -0
  23. package/corpus/core/src/templates/chat/app/components/layout/Layout.tsx +3 -0
  24. package/corpus/core/src/templates/chat/app/components/layout/Sidebar.tsx +78 -45
  25. package/corpus/core/src/templates/chat/app/global.css +1 -1
  26. package/corpus/core/src/templates/default/app/global.css +1 -1
  27. package/corpus/core/src/tracking/error-capture.ts +151 -0
  28. package/corpus/core/src/tracking/index.ts +5 -0
  29. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +1 -1
  30. package/corpus/templates/analytics/app/components/dashboard/DashboardHistoryPanel.tsx +1 -4
  31. package/corpus/templates/analytics/app/components/dashboard/DashboardPanelSkeleton.tsx +1 -1
  32. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +1 -1
  33. package/corpus/templates/analytics/app/components/dashboard/DateRangePicker.tsx +2 -2
  34. package/corpus/templates/analytics/app/components/dashboard/MetricCard.tsx +1 -1
  35. package/corpus/templates/analytics/app/components/dashboard/RecentActivity.tsx +1 -1
  36. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +1 -1
  37. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +1 -1
  38. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +41 -9
  39. package/corpus/templates/analytics/app/components/dashboard/StatsCard.tsx +1 -1
  40. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +1 -1
  41. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -0
  42. package/corpus/templates/analytics/app/components/layout/Layout.tsx +28 -14
  43. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +152 -124
  44. package/corpus/templates/analytics/app/global.css +5 -5
  45. package/corpus/templates/analytics/app/lib/dashboard-report-capture.ts +42 -0
  46. package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +1 -1
  47. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/ChartTypePicker.tsx +1 -1
  48. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/DateRangePicker.tsx +1 -1
  49. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventRow.tsx +1 -1
  50. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/SqlPreview.tsx +2 -2
  51. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +3 -3
  52. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/EmailReportDialog.tsx +2 -2
  53. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +1 -1
  54. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +1 -1
  55. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +162 -51
  56. package/corpus/templates/analytics/app/root.tsx +28 -0
  57. package/corpus/templates/analytics/changelog/2026-07-24-analytics-charts-now-explain-slow-loads-and-offer-a-direct-r.md +6 -0
  58. package/corpus/templates/analytics/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  59. package/corpus/templates/analytics/changelog/2026-07-24-daily-dashboard-emails-now-load-signed-reports-more-reliably.md +6 -0
  60. package/corpus/templates/analytics/changelog/2026-07-24-manage-agent-is-clearly-marked-as-a-link-to-its-dedicated-pa.md +6 -0
  61. package/corpus/templates/analytics/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  62. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +1 -1
  63. package/corpus/templates/analytics/server/db/schema.ts +5 -0
  64. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +21 -0
  65. package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +11 -0
  66. package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +54 -0
  67. package/corpus/templates/analytics/server/lib/dashboard-report.ts +235 -26
  68. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +4 -1
  69. package/corpus/templates/analytics/server/plugins/db.ts +9 -0
  70. package/corpus/templates/analytics/shared/dashboard-report-timeouts.ts +1 -1
  71. package/corpus/templates/assets/app/components/asset/AssetPreviewDialog.tsx +376 -0
  72. package/corpus/templates/assets/app/components/create/RecentDraftsSection.tsx +14 -4
  73. package/corpus/templates/assets/app/components/layout/Layout.tsx +5 -0
  74. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +118 -74
  75. package/corpus/templates/assets/app/global.css +1 -1
  76. package/corpus/templates/assets/app/i18n-data.ts +10 -0
  77. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +99 -10
  78. package/corpus/templates/assets/app/routes/library.tsx +21 -198
  79. package/corpus/templates/assets/changelog/2026-07-21-unified-asset-preview-click-any-asset-to-open-one-preview-wi.md +6 -0
  80. package/corpus/templates/assets/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  81. package/corpus/templates/assets/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  82. package/corpus/templates/brain/app/components/layout/Layout.tsx +3 -0
  83. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +76 -43
  84. package/corpus/templates/brain/app/global.css +1 -1
  85. package/corpus/templates/brain/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  86. package/corpus/templates/brain/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  87. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +67 -52
  88. package/corpus/templates/calendar/app/global.css +1 -1
  89. package/corpus/templates/calendar/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  90. package/corpus/templates/calendar/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  91. package/corpus/templates/chat/app/components/layout/Layout.tsx +3 -0
  92. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +78 -45
  93. package/corpus/templates/chat/app/global.css +1 -1
  94. package/corpus/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  95. package/corpus/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  96. package/corpus/templates/clips/app/components/library/library-layout.tsx +65 -31
  97. package/corpus/templates/clips/app/components/library/organization-switcher.tsx +2 -2
  98. package/corpus/templates/clips/app/components/player/video-player.tsx +16 -1
  99. package/corpus/templates/clips/app/global.css +1 -1
  100. package/corpus/templates/clips/app/hooks/use-view-tracking.ts +55 -12
  101. package/corpus/templates/clips/app/routes/embed.$shareId.tsx +6 -5
  102. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +7 -7
  103. package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -5
  104. package/corpus/templates/clips/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  105. package/corpus/templates/clips/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  106. package/corpus/templates/clips/server/plugins/db.ts +113 -68
  107. package/corpus/templates/content/actions/update-document.ts +145 -91
  108. package/corpus/templates/content/app/components/editor/CommentComposer.tsx +4 -1
  109. package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +366 -164
  110. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +51 -28
  111. package/corpus/templates/content/app/components/editor/database/sidebar.tsx +19 -8
  112. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +66 -42
  113. package/corpus/templates/content/app/global.css +1 -1
  114. package/corpus/templates/content/app/i18n-data.ts +15 -0
  115. package/corpus/templates/content/changelog/2026-07-23-shared-pages-now-keep-durable-content-visible-and-comment-th.md +6 -0
  116. package/corpus/templates/content/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  117. package/corpus/templates/content/changelog/2026-07-24-comment-drafts-now-stay-open-when-saving-fails-and-long-live.md +6 -0
  118. package/corpus/templates/content/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  119. package/corpus/templates/design/actions/update-file.ts +85 -18
  120. package/corpus/templates/design/app/components/layout/Sidebar.tsx +65 -30
  121. package/corpus/templates/design/app/entry.client.tsx +14 -1
  122. package/corpus/templates/design/app/global.css +1 -1
  123. package/corpus/templates/design/app/lib/design-save-outbox.ts +39 -0
  124. package/corpus/templates/design/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  125. package/corpus/templates/design/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  126. package/corpus/templates/dispatch/app/global.css +1 -1
  127. package/corpus/templates/dispatch/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  128. package/corpus/templates/dispatch/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  129. package/corpus/templates/forms/app/components/layout/Layout.tsx +3 -0
  130. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +72 -37
  131. package/corpus/templates/forms/app/global.css +1 -1
  132. package/corpus/templates/forms/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  133. package/corpus/templates/forms/changelog/2026-07-24-forms-sidebar-actions-now-keep-search-language-feedback-and-.md +6 -0
  134. package/corpus/templates/forms/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  135. package/corpus/templates/macros/app/components/DailyProgress.tsx +5 -5
  136. package/corpus/templates/macros/app/components/ExerciseCard.tsx +2 -2
  137. package/corpus/templates/macros/app/components/MealCard.tsx +2 -2
  138. package/corpus/templates/macros/app/components/WeightCard.tsx +2 -2
  139. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +56 -29
  140. package/corpus/templates/macros/app/components/ui/button.tsx +1 -2
  141. package/corpus/templates/macros/app/components/ui/card.tsx +1 -1
  142. package/corpus/templates/macros/app/global.css +1 -1
  143. package/corpus/templates/macros/app/routes/_index.tsx +1 -1
  144. package/corpus/templates/macros/app/routes/analytics.tsx +4 -7
  145. package/corpus/templates/macros/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  146. package/corpus/templates/macros/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  147. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +125 -37
  148. package/corpus/templates/mail/app/global.css +1 -1
  149. package/corpus/templates/mail/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  150. package/corpus/templates/mail/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  151. package/corpus/templates/plan/app/components/layout/Layout.tsx +3 -0
  152. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +90 -60
  153. package/corpus/templates/plan/app/global.css +1 -1
  154. package/corpus/templates/plan/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  155. package/corpus/templates/plan/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  156. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +69 -32
  157. package/corpus/templates/slides/app/global.css +1 -1
  158. package/corpus/templates/slides/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  159. package/corpus/templates/slides/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  160. package/corpus/templates/tasks/app/global.css +1 -1
  161. package/corpus/templates/tasks/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  162. package/corpus/toolkit/CHANGELOG.md +14 -0
  163. package/corpus/toolkit/README.md +8 -1
  164. package/corpus/toolkit/agent-native.eject.json +1 -1
  165. package/corpus/toolkit/package.json +1 -1
  166. package/corpus/toolkit/src/app-shell/index.ts +1 -0
  167. package/corpus/toolkit/src/app-shell/sidebar-footer-actions.tsx +48 -0
  168. package/corpus/toolkit/src/chat-history.css +52 -1
  169. package/corpus/toolkit/src/design-system/default-adapter.tsx +1 -1
  170. package/corpus/toolkit/src/editor/useCollabReconcile.ts +83 -15
  171. package/corpus/toolkit/src/ui/button.tsx +1 -2
  172. package/corpus/toolkit/src/ui/card.tsx +1 -1
  173. package/corpus/toolkit/src/ui/table.tsx +4 -11
  174. package/dist/cli/context-xray-local.js +1 -1
  175. package/dist/cli/context-xray-local.js.map +1 -1
  176. package/dist/cli/index.js +56 -17
  177. package/dist/cli/index.js.map +1 -1
  178. package/dist/cli/skills.d.ts.map +1 -1
  179. package/dist/cli/skills.js +5 -0
  180. package/dist/cli/skills.js.map +1 -1
  181. package/dist/cli/telemetry.d.ts +7 -0
  182. package/dist/cli/telemetry.d.ts.map +1 -1
  183. package/dist/cli/telemetry.js +91 -1
  184. package/dist/cli/telemetry.js.map +1 -1
  185. package/dist/client/AgentPanel.d.ts +7 -1
  186. package/dist/client/AgentPanel.d.ts.map +1 -1
  187. package/dist/client/AgentPanel.js +2 -2
  188. package/dist/client/AgentPanel.js.map +1 -1
  189. package/dist/client/CommandMenu.d.ts +2 -0
  190. package/dist/client/CommandMenu.d.ts.map +1 -1
  191. package/dist/client/CommandMenu.js +12 -1
  192. package/dist/client/CommandMenu.js.map +1 -1
  193. package/dist/client/agent-page/AgentTabsPage.d.ts +4 -0
  194. package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
  195. package/dist/client/agent-page/AgentTabsPage.js +8 -4
  196. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  197. package/dist/client/analytics.d.ts.map +1 -1
  198. package/dist/client/analytics.js +7 -0
  199. package/dist/client/analytics.js.map +1 -1
  200. package/dist/client/error-capture.d.ts.map +1 -1
  201. package/dist/client/error-capture.js +8 -1
  202. package/dist/client/error-capture.js.map +1 -1
  203. package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
  204. package/dist/client/extensions/ExtensionsListPage.js +2 -2
  205. package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
  206. package/dist/client/extensions/agent-native-extension-runtime.js +1 -1
  207. package/dist/client/extensions/agent-native-extension-runtime.js.map +1 -1
  208. package/dist/client/navigation/index.d.ts +1 -1
  209. package/dist/client/navigation/index.d.ts.map +1 -1
  210. package/dist/client/navigation/index.js +1 -1
  211. package/dist/client/navigation/index.js.map +1 -1
  212. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  213. package/dist/client/org/OrgSwitcher.js +9 -13
  214. package/dist/client/org/OrgSwitcher.js.map +1 -1
  215. package/dist/client/settings/ExtensionsSettingsContent.js +1 -1
  216. package/dist/client/settings/ExtensionsSettingsContent.js.map +1 -1
  217. package/dist/collab/awareness.d.ts +2 -2
  218. package/dist/collab/awareness.d.ts.map +1 -1
  219. package/dist/collab/struct-routes.d.ts +1 -1
  220. package/dist/extensions/theme.js +1 -1
  221. package/dist/extensions/theme.js.map +1 -1
  222. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  223. package/dist/localization/default-messages.d.ts +2 -0
  224. package/dist/localization/default-messages.d.ts.map +1 -1
  225. package/dist/localization/default-messages.js +2 -0
  226. package/dist/localization/default-messages.js.map +1 -1
  227. package/dist/provider-api/actions/provider-api.d.ts +2 -2
  228. package/dist/secrets/routes.d.ts +9 -9
  229. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  230. package/dist/server/core-routes-plugin.js +8 -1
  231. package/dist/server/core-routes-plugin.js.map +1 -1
  232. package/dist/server/framework-request-handler.d.ts.map +1 -1
  233. package/dist/server/framework-request-handler.js +17 -27
  234. package/dist/server/framework-request-handler.js.map +1 -1
  235. package/dist/server/realtime-token.d.ts +1 -1
  236. package/dist/styles/agent-native.css +13 -0
  237. package/dist/templates/chat/app/components/layout/Layout.tsx +3 -0
  238. package/dist/templates/chat/app/components/layout/Sidebar.tsx +78 -45
  239. package/dist/templates/chat/app/global.css +1 -1
  240. package/dist/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  241. package/dist/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  242. package/dist/templates/default/app/global.css +1 -1
  243. package/dist/tracking/error-capture.d.ts +14 -0
  244. package/dist/tracking/error-capture.d.ts.map +1 -0
  245. package/dist/tracking/error-capture.js +113 -0
  246. package/dist/tracking/error-capture.js.map +1 -0
  247. package/dist/tracking/index.d.ts +1 -0
  248. package/dist/tracking/index.d.ts.map +1 -1
  249. package/dist/tracking/index.js +1 -0
  250. package/dist/tracking/index.js.map +1 -1
  251. package/package.json +2 -2
  252. package/src/cli/context-xray-local.ts +1 -1
  253. package/src/cli/index.ts +63 -18
  254. package/src/cli/skills.ts +5 -0
  255. package/src/cli/telemetry.ts +118 -1
  256. package/src/client/AgentPanel.tsx +10 -0
  257. package/src/client/CommandMenu.tsx +13 -1
  258. package/src/client/agent-page/AgentTabsPage.tsx +39 -4
  259. package/src/client/analytics.ts +13 -0
  260. package/src/client/error-capture.ts +6 -1
  261. package/src/client/extensions/ExtensionsListPage.tsx +12 -5
  262. package/src/client/extensions/agent-native-extension-runtime.ts +1 -1
  263. package/src/client/navigation/index.ts +2 -0
  264. package/src/client/org/OrgSwitcher.tsx +14 -32
  265. package/src/client/settings/ExtensionsSettingsContent.tsx +1 -1
  266. package/src/extensions/theme.ts +1 -1
  267. package/src/localization/default-messages.ts +2 -0
  268. package/src/server/core-routes-plugin.ts +10 -1
  269. package/src/server/framework-request-handler.ts +17 -26
  270. package/src/styles/agent-native.css +13 -0
  271. package/src/templates/chat/app/components/layout/Layout.tsx +3 -0
  272. package/src/templates/chat/app/components/layout/Sidebar.tsx +78 -45
  273. package/src/templates/chat/app/global.css +1 -1
  274. package/src/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  275. package/src/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  276. package/src/templates/default/app/global.css +1 -1
  277. package/src/tracking/error-capture.ts +151 -0
  278. package/src/tracking/index.ts +5 -0
@@ -34,8 +34,6 @@ import {
34
34
  IconArrowUpRight,
35
35
  IconCheck,
36
36
  IconChevronDown,
37
- IconChevronLeft,
38
- IconChevronRight,
39
37
  IconClipboard,
40
38
  IconLibraryPhoto,
41
39
  IconPhotoPlus,
@@ -60,16 +58,10 @@ import {
60
58
  } from "react-router";
61
59
  import { toast } from "sonner";
62
60
 
61
+ import { AssetPreviewDialog as SharedAssetPreviewDialog } from "@/components/asset/AssetPreviewDialog";
63
62
  import { LibraryPresetGrid } from "@/components/library/LibraryPresetGrid";
64
63
  import { Badge } from "@/components/ui/badge";
65
64
  import { Button } from "@/components/ui/button";
66
- import {
67
- Dialog,
68
- DialogContent,
69
- DialogDescription,
70
- DialogTitle,
71
- DialogClose,
72
- } from "@/components/ui/dialog";
73
65
  import { Input } from "@/components/ui/input";
74
66
  import {
75
67
  Popover,
@@ -165,6 +157,12 @@ type Asset = {
165
157
  downloadUrl?: string;
166
158
  embedUrl?: string;
167
159
  embedPath?: string;
160
+ folderId?: string | null;
161
+ category?: string | null;
162
+ model?: string | null;
163
+ aspectRatio?: string | null;
164
+ durationSeconds?: number | null;
165
+ metadata?: Record<string, unknown> | null;
168
166
  libraryTitle?: string | null;
169
167
  lineage?: {
170
168
  label?: string | null;
@@ -829,7 +827,7 @@ function AssetOverlayImage({ asset }: { asset: Asset }) {
829
827
  src={source}
830
828
  crossOrigin={isCrossOriginPreview(source) ? "anonymous" : undefined}
831
829
  alt={asset.altText ?? asset.title ?? ""}
832
- className="max-h-[85vh] w-full rounded-lg object-contain"
830
+ className="max-h-[72vh] max-w-full rounded-lg object-contain"
833
831
  onError={() =>
834
832
  setSourceIndex((index) =>
835
833
  index + 1 < sources.length ? index + 1 : index,
@@ -1542,98 +1540,15 @@ function AssetPreviewDialog({
1542
1540
  assets: Asset[];
1543
1541
  onAssetChange: (asset: Asset | null) => void;
1544
1542
  }) {
1545
- const t = useT();
1546
1543
  return (
1547
- <Dialog
1548
- open={Boolean(asset)}
1549
- onOpenChange={(open) => {
1550
- if (!open) onAssetChange(null);
1551
- }}
1552
- >
1553
- {asset &&
1554
- (() => {
1555
- const previewIndex = assets.findIndex(
1556
- (candidate) => candidate.id === asset.id,
1557
- );
1558
- const hasPrev = previewIndex > 0;
1559
- const hasNext = previewIndex >= 0 && previewIndex < assets.length - 1;
1560
- const showPreviousAsset = () => {
1561
- if (hasPrev) onAssetChange(assets[previewIndex - 1]);
1562
- };
1563
- const showNextAsset = () => {
1564
- if (hasNext) onAssetChange(assets[previewIndex + 1]);
1565
- };
1566
- return (
1567
- <DialogContent
1568
- hideClose
1569
- onKeyDown={(event) => {
1570
- if (event.key === "ArrowLeft") showPreviousAsset();
1571
- if (event.key === "ArrowRight") showNextAsset();
1572
- }}
1573
- className="max-w-4xl border-0 bg-transparent p-0 shadow-none"
1574
- >
1575
- <DialogTitle className="sr-only">
1576
- {assetDisplayTitle(asset)}
1577
- </DialogTitle>
1578
- <DialogDescription className="sr-only">
1579
- {t("library.fullSizePreview", {
1580
- title: assetDisplayTitle(asset),
1581
- })}
1582
- </DialogDescription>
1583
- <div className="relative">
1584
- <div className="absolute right-2 top-2 z-10 flex items-center gap-2">
1585
- <Button asChild variant="outline" size="sm">
1586
- <Link to={`/asset/${encodeURIComponent(asset.id)}`}>
1587
- {t("library.viewDetails")}
1588
- </Link>
1589
- </Button>
1590
- <DialogClose
1591
- aria-label={t("library.closePreview")}
1592
- className="inline-flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white transition hover:bg-black/80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white"
1593
- >
1594
- <IconX className="h-5 w-5" />
1595
- </DialogClose>
1596
- </div>
1597
- {asset.mediaType === "video" ||
1598
- asset.mimeType?.startsWith("video/") ? (
1599
- <video
1600
- src={asset.previewUrl ?? asset.downloadUrl ?? asset.url}
1601
- poster={asset.thumbnailUrl}
1602
- controls
1603
- autoPlay
1604
- playsInline
1605
- className="max-h-[85vh] w-full rounded-lg bg-black object-contain"
1606
- />
1607
- ) : (
1608
- <AssetOverlayImage asset={asset} />
1609
- )}
1610
- </div>
1611
- {(hasPrev || hasNext) && (
1612
- <div className="mt-5 flex justify-center gap-2">
1613
- <button
1614
- type="button"
1615
- aria-label={t("library.previousImage")}
1616
- onClick={showPreviousAsset}
1617
- disabled={!hasPrev}
1618
- className="inline-flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white transition hover:bg-black/80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white disabled:cursor-not-allowed disabled:opacity-40"
1619
- >
1620
- <IconChevronLeft className="h-5 w-5" />
1621
- </button>
1622
- <button
1623
- type="button"
1624
- aria-label={t("library.nextImage")}
1625
- onClick={showNextAsset}
1626
- disabled={!hasNext}
1627
- className="inline-flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white transition hover:bg-black/80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white disabled:cursor-not-allowed disabled:opacity-40"
1628
- >
1629
- <IconChevronRight className="h-5 w-5" />
1630
- </button>
1631
- </div>
1632
- )}
1633
- </DialogContent>
1634
- );
1635
- })()}
1636
- </Dialog>
1544
+ <SharedAssetPreviewDialog
1545
+ asset={asset}
1546
+ assets={assets}
1547
+ onAssetChange={(next) => onAssetChange(next as Asset | null)}
1548
+ renderImage={(previewAsset) => (
1549
+ <AssetOverlayImage asset={previewAsset as Asset} />
1550
+ )}
1551
+ />
1637
1552
  );
1638
1553
  }
1639
1554
 
@@ -3487,103 +3402,11 @@ export function AssetPickerSurface() {
3487
3402
  )}
3488
3403
  </main>
3489
3404
 
3490
- <Dialog
3491
- open={Boolean(previewAsset)}
3492
- onOpenChange={(open) => {
3493
- if (!open) setPreviewAsset(null);
3494
- }}
3495
- >
3496
- {previewAsset &&
3497
- (() => {
3498
- const previewIndex = assets.findIndex(
3499
- (asset) => asset.id === previewAsset.id,
3500
- );
3501
- const hasPrev = previewIndex > 0;
3502
- const hasNext =
3503
- previewIndex >= 0 && previewIndex < assets.length - 1;
3504
- const showPreviousAsset = () => {
3505
- if (hasPrev) setPreviewAsset(assets[previewIndex - 1]);
3506
- };
3507
- const showNextAsset = () => {
3508
- if (hasNext) setPreviewAsset(assets[previewIndex + 1]);
3509
- };
3510
- return (
3511
- <DialogContent
3512
- hideClose
3513
- onKeyDown={(event) => {
3514
- if (event.key === "ArrowLeft") showPreviousAsset();
3515
- if (event.key === "ArrowRight") showNextAsset();
3516
- }}
3517
- className="max-w-4xl border-0 bg-transparent p-0 shadow-none"
3518
- >
3519
- <DialogTitle className="sr-only">
3520
- {assetDisplayTitle(previewAsset)}
3521
- </DialogTitle>
3522
- <DialogDescription className="sr-only">
3523
- {t("library.fullSizePreview", {
3524
- title: assetDisplayTitle(previewAsset),
3525
- })}
3526
- </DialogDescription>
3527
- <div className="relative">
3528
- <div className="absolute right-2 top-2 z-10 flex items-center gap-2">
3529
- <Button asChild variant="outline" size="sm">
3530
- <Link
3531
- to={`/asset/${encodeURIComponent(previewAsset.id)}`}
3532
- >
3533
- {t("library.viewDetails")}
3534
- </Link>
3535
- </Button>
3536
- <DialogClose
3537
- aria-label={t("library.closePreview")}
3538
- className="inline-flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white transition hover:bg-black/80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white"
3539
- >
3540
- <IconX className="h-5 w-5" />
3541
- </DialogClose>
3542
- </div>
3543
- {previewAsset.mediaType === "video" ||
3544
- previewAsset.mimeType?.startsWith("video/") ? (
3545
- <video
3546
- src={
3547
- previewAsset.previewUrl ??
3548
- previewAsset.downloadUrl ??
3549
- previewAsset.url
3550
- }
3551
- poster={previewAsset.thumbnailUrl}
3552
- controls
3553
- autoPlay
3554
- playsInline
3555
- className="max-h-[85vh] w-full rounded-lg bg-black object-contain"
3556
- />
3557
- ) : (
3558
- <AssetOverlayImage asset={previewAsset} />
3559
- )}
3560
- </div>
3561
- {(hasPrev || hasNext) && (
3562
- <div className="mt-5 flex justify-center gap-2">
3563
- <button
3564
- type="button"
3565
- aria-label={t("library.previousImage")}
3566
- onClick={showPreviousAsset}
3567
- disabled={!hasPrev}
3568
- className="inline-flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white transition hover:bg-black/80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white disabled:cursor-not-allowed disabled:opacity-40"
3569
- >
3570
- <IconChevronLeft className="h-5 w-5" />
3571
- </button>
3572
- <button
3573
- type="button"
3574
- aria-label={t("library.nextImage")}
3575
- onClick={showNextAsset}
3576
- disabled={!hasNext}
3577
- className="inline-flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white transition hover:bg-black/80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white disabled:cursor-not-allowed disabled:opacity-40"
3578
- >
3579
- <IconChevronRight className="h-5 w-5" />
3580
- </button>
3581
- </div>
3582
- )}
3583
- </DialogContent>
3584
- );
3585
- })()}
3586
- </Dialog>
3405
+ <AssetPreviewDialog
3406
+ asset={previewAsset}
3407
+ assets={assets}
3408
+ onAssetChange={setPreviewAsset}
3409
+ />
3587
3410
  </div>
3588
3411
  );
3589
3412
  }
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-21
4
+ ---
5
+
6
+ Unified asset preview: clicking an asset anywhere (create drafts, library, brand kits, generated candidates) now opens one side-panel preview with the image, a details panel, and next/previous navigation instead of a separate page
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Secondary controls and dashboard surfaces now use quieter borderless styling.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Sidebar utility controls now follow a consistent footer order.
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  AgentSidebar,
3
3
  focusAgentChat,
4
+ isAgentChatHomeHandoffActive,
4
5
  navigateWithAgentChatViewTransition,
5
6
  useAgentChatHomeHandoff,
6
7
  useAgentChatHomeHandoffLinks,
@@ -44,6 +45,7 @@ export function Layout({ children }: { children: React.ReactNode }) {
44
45
  activePath: location.pathname,
45
46
  enabled: !isAskRoute,
46
47
  });
48
+ const chatHomeHandoffPending = isAgentChatHomeHandoffActive("brain");
47
49
  useAgentChatHomeHandoffLinks({
48
50
  storageKey: "brain",
49
51
  chatPath: "/",
@@ -129,6 +131,7 @@ export function Layout({ children }: { children: React.ReactNode }) {
129
131
  <AgentSidebar
130
132
  position="right"
131
133
  chatViewTransition
134
+ chatViewTransitionHandoff={chatHomeHandoffPending}
132
135
  storageKey="brain"
133
136
  browserTabId={TAB_ID}
134
137
  openOnChatRunning={chatHomeHandoffActive}
@@ -5,9 +5,11 @@ import {
5
5
  } from "@agent-native/core/client/agent-chat";
6
6
  import { appPath } from "@agent-native/core/client/api-path";
7
7
  import { DevDatabaseLink } from "@agent-native/core/client/db-admin";
8
- import { useT } from "@agent-native/core/client/i18n";
8
+ import { LanguagePicker, useT } from "@agent-native/core/client/i18n";
9
+ import { openCommandMenu } from "@agent-native/core/client/navigation";
9
10
  import { OrgSwitcher } from "@agent-native/core/client/org";
10
11
  import { FeedbackButton } from "@agent-native/core/client/ui";
12
+ import { SidebarFooterActions } from "@agent-native/toolkit/app-shell";
11
13
  import {
12
14
  ChatHistoryRail,
13
15
  type ChatHistoryItem,
@@ -15,6 +17,7 @@ import {
15
17
  import {
16
18
  IconLayoutSidebarLeftCollapse,
17
19
  IconLayoutSidebarLeftExpand,
20
+ IconSearch,
18
21
  } from "@tabler/icons-react";
19
22
  import { useEffect, useMemo } from "react";
20
23
  import { Link, NavLink, useLocation, useNavigate } from "react-router";
@@ -86,7 +89,7 @@ function persistedActiveThreadId() {
86
89
  }
87
90
  }
88
91
 
89
- function BrainChatsSection() {
92
+ function BrainChatsSection({ open }: { open: boolean }) {
90
93
  const navigate = useNavigate();
91
94
  const t = useT();
92
95
  const {
@@ -181,38 +184,44 @@ function BrainChatsSection() {
181
184
  }
182
185
 
183
186
  return (
184
- <div className="mt-2 ms-4">
185
- <ChatHistoryRail
186
- items={chatItems}
187
- activeId={activeThreadId}
188
- onSelect={openThread}
189
- onNewChat={() => void handleNewChat()}
190
- railLabels={{
191
- newChat: t("chat.newChat"),
192
- showMore: t("chat.chats"),
193
- showLess: t("chat.chats"),
194
- }}
195
- previewCount={5}
196
- expandedCount={15}
197
- onTogglePin={(threadId) => {
198
- const thread = visibleThreads.find((item) => item.id === threadId);
199
- if (thread) void pinThread(threadId, !thread.pinnedAt);
200
- }}
201
- onRename={handleRenameThread}
202
- renameMaxLength={160}
203
- onDelete={(threadId) => void handleArchiveThread(threadId)}
204
- labels={{
205
- options: (item) =>
206
- t("chat.optionsFor", { title: item.titleText ?? "" }),
207
- renameInput: (item) =>
208
- t("chat.renameThread", { title: item.titleText ?? "" }),
209
- rename: t("chat.renameChat"),
210
- pin: t("chat.pinChat"),
211
- unpin: t("chat.unpinChat"),
212
- delete: t("chat.archiveChat"),
213
- }}
214
- className="min-w-0"
215
- />
187
+ <div
188
+ className="an-chat-history-rail__collapse"
189
+ data-state={open ? "open" : "closed"}
190
+ aria-hidden={!open}
191
+ >
192
+ <div className="ms-4">
193
+ <ChatHistoryRail
194
+ items={chatItems}
195
+ activeId={activeThreadId}
196
+ onSelect={openThread}
197
+ onNewChat={() => void handleNewChat()}
198
+ railLabels={{
199
+ newChat: t("chat.newChat"),
200
+ showMore: t("chat.chats"),
201
+ showLess: t("chat.chats"),
202
+ }}
203
+ previewCount={5}
204
+ expandedCount={15}
205
+ onTogglePin={(threadId) => {
206
+ const thread = visibleThreads.find((item) => item.id === threadId);
207
+ if (thread) void pinThread(threadId, !thread.pinnedAt);
208
+ }}
209
+ onRename={handleRenameThread}
210
+ renameMaxLength={160}
211
+ onDelete={(threadId) => void handleArchiveThread(threadId)}
212
+ labels={{
213
+ options: (item) =>
214
+ t("chat.optionsFor", { title: item.titleText ?? "" }),
215
+ renameInput: (item) =>
216
+ t("chat.renameThread", { title: item.titleText ?? "" }),
217
+ rename: t("chat.renameChat"),
218
+ pin: t("chat.pinChat"),
219
+ unpin: t("chat.unpinChat"),
220
+ delete: t("chat.archiveChat"),
221
+ }}
222
+ className="min-w-0"
223
+ />
224
+ </div>
216
225
  </div>
217
226
  );
218
227
  }
@@ -262,6 +271,31 @@ export function Sidebar({
262
271
  </TooltipContent>
263
272
  </Tooltip>
264
273
  ) : null;
274
+ const searchButton = (
275
+ <Tooltip>
276
+ <TooltipTrigger asChild>
277
+ <button
278
+ type="button"
279
+ onClick={openCommandMenu}
280
+ aria-label={t("navigation.search")}
281
+ className="flex size-8 items-center justify-center rounded-md text-sidebar-foreground/65 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
282
+ >
283
+ <IconSearch className="size-4" />
284
+ </button>
285
+ </TooltipTrigger>
286
+ <TooltipContent side="right">{t("navigation.search")}</TooltipContent>
287
+ </Tooltip>
288
+ );
289
+ const translateButton = (
290
+ <LanguagePicker variant="ghost-icon" label={t("settings.languageLabel")} />
291
+ );
292
+ const feedbackButton = (
293
+ <FeedbackButton
294
+ variant={collapsed ? "icon" : "sidebar"}
295
+ side="right"
296
+ className={collapsed ? "h-8 w-8" : "min-w-0"}
297
+ />
298
+ );
265
299
 
266
300
  return (
267
301
  <aside
@@ -360,7 +394,7 @@ export function Sidebar({
360
394
  link
361
395
  )}
362
396
  {!collapsed && item.view === "ask" && isAskRoute ? (
363
- <BrainChatsSection />
397
+ <BrainChatsSection open />
364
398
  ) : null}
365
399
  </div>
366
400
  );
@@ -408,16 +442,15 @@ export function Sidebar({
408
442
  {!collapsed ? (
409
443
  <div className="px-3 py-2">
410
444
  <DevDatabaseLink />
411
- <div className="flex items-center justify-end gap-1">
412
- <FeedbackButton className="min-w-0 flex-1" side="right" />
413
- {collapseButton}
414
- </div>
415
445
  </div>
416
446
  ) : null}
417
-
418
- {collapsed && collapseButton ? (
419
- <div className="flex justify-center px-2 py-2">{collapseButton}</div>
420
- ) : null}
447
+ <SidebarFooterActions
448
+ collapsed={collapsed}
449
+ feedback={feedbackButton}
450
+ translate={translateButton}
451
+ search={searchButton}
452
+ collapse={collapseButton}
453
+ />
421
454
  </div>
422
455
  </aside>
423
456
  );
@@ -22,7 +22,7 @@
22
22
  --muted-foreground: 0 0% 45%;
23
23
  --accent: 0 0% 95%;
24
24
  --accent-foreground: 0 0% 15%;
25
- --destructive: 0 84% 60%;
25
+ --destructive: 0 91% 71%;
26
26
  --destructive-foreground: 0 0% 98%;
27
27
  --border: 0 0% 90%;
28
28
  --input: 0 0% 90%;
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Secondary controls and dashboard surfaces now use quieter borderless styling.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-24
4
+ ---
5
+
6
+ Sidebar utility controls now follow a consistent footer order.
@@ -1,8 +1,10 @@
1
1
  import { appPath } from "@agent-native/core/client/api-path";
2
2
  import { DevDatabaseLink } from "@agent-native/core/client/db-admin";
3
- import { useT } from "@agent-native/core/client/i18n";
3
+ import { LanguagePicker, useT } from "@agent-native/core/client/i18n";
4
+ import { openCommandMenu } from "@agent-native/core/client/navigation";
4
5
  import { OrgSwitcher } from "@agent-native/core/client/org";
5
6
  import { FeedbackButton } from "@agent-native/core/client/ui";
7
+ import { SidebarFooterActions } from "@agent-native/toolkit/app-shell";
6
8
  import {
7
9
  IconHierarchy2,
8
10
  IconCalendar,
@@ -22,6 +24,7 @@ import {
22
24
  IconEyeOff,
23
25
  IconLayoutSidebarLeftCollapse,
24
26
  IconLayoutSidebarLeftExpand,
27
+ IconSearch,
25
28
  } from "@tabler/icons-react";
26
29
  import {
27
30
  startOfMonth,
@@ -703,6 +706,61 @@ export function Sidebar({
703
706
  onClose();
704
707
  }
705
708
 
709
+ const collapseButton = onCollapsedChange ? (
710
+ <Tooltip>
711
+ <TooltipTrigger asChild>
712
+ <Button
713
+ type="button"
714
+ variant="ghost"
715
+ size="icon"
716
+ className="h-8 w-8 shrink-0 text-muted-foreground"
717
+ onClick={() => onCollapsedChange(!collapsed)}
718
+ aria-label={
719
+ collapsed
720
+ ? t("sidebar.expandSidebar")
721
+ : t("sidebar.collapseSidebar")
722
+ }
723
+ >
724
+ {collapsed ? (
725
+ <IconLayoutSidebarLeftExpand className="h-4 w-4 rtl:-scale-x-100" />
726
+ ) : (
727
+ <IconLayoutSidebarLeftCollapse className="h-4 w-4 rtl:-scale-x-100" />
728
+ )}
729
+ </Button>
730
+ </TooltipTrigger>
731
+ <TooltipContent side="top">
732
+ {collapsed ? t("sidebar.expandSidebar") : t("sidebar.collapseSidebar")}
733
+ </TooltipContent>
734
+ </Tooltip>
735
+ ) : null;
736
+ const searchButton = (
737
+ <Tooltip>
738
+ <TooltipTrigger asChild>
739
+ <Button
740
+ type="button"
741
+ variant="ghost"
742
+ size="icon"
743
+ className="h-8 w-8 text-muted-foreground"
744
+ onClick={openCommandMenu}
745
+ aria-label={t("root.commandSearch")}
746
+ >
747
+ <IconSearch className="h-4 w-4" />
748
+ </Button>
749
+ </TooltipTrigger>
750
+ <TooltipContent side="top">{t("root.commandSearch")}</TooltipContent>
751
+ </Tooltip>
752
+ );
753
+ const translateButton = (
754
+ <LanguagePicker variant="ghost-icon" label={t("settings.languageLabel")} />
755
+ );
756
+ const feedbackButton = (
757
+ <FeedbackButton
758
+ variant={collapsed ? "icon" : "sidebar"}
759
+ side="right"
760
+ className={collapsed ? "h-8 w-8" : "min-w-0"}
761
+ />
762
+ );
763
+
706
764
  return (
707
765
  <>
708
766
  {/* Mobile overlay */}
@@ -728,25 +786,7 @@ export function Sidebar({
728
786
  collapsed ? "px-1" : "px-4",
729
787
  )}
730
788
  >
731
- {collapsed && onCollapsedChange ? (
732
- <Tooltip>
733
- <TooltipTrigger asChild>
734
- <Button
735
- type="button"
736
- variant="ghost"
737
- size="icon"
738
- className="h-10 w-10 shrink-0 text-muted-foreground"
739
- onClick={() => onCollapsedChange(false)}
740
- aria-label={t("sidebar.expandSidebar")}
741
- >
742
- <IconLayoutSidebarLeftExpand className="h-4 w-4 rtl:-scale-x-100" />
743
- </Button>
744
- </TooltipTrigger>
745
- <TooltipContent side="right">
746
- {t("sidebar.expandSidebar")}
747
- </TooltipContent>
748
- </Tooltip>
749
- ) : (
789
+ {!collapsed && (
750
790
  <>
751
791
  <Link
752
792
  to="/"
@@ -769,35 +809,6 @@ export function Sidebar({
769
809
  {t("navigation.brand")}
770
810
  </span>
771
811
  </Link>
772
- {onCollapsedChange ? (
773
- <Tooltip>
774
- <TooltipTrigger asChild>
775
- <Button
776
- type="button"
777
- variant="ghost"
778
- size="icon"
779
- className="h-8 w-8 shrink-0 text-muted-foreground"
780
- onClick={() => onCollapsedChange(!collapsed)}
781
- aria-label={
782
- collapsed
783
- ? t("sidebar.expandSidebar")
784
- : t("sidebar.collapseSidebar")
785
- }
786
- >
787
- {collapsed ? (
788
- <IconLayoutSidebarLeftExpand className="h-4 w-4 rtl:-scale-x-100" />
789
- ) : (
790
- <IconLayoutSidebarLeftCollapse className="h-4 w-4 rtl:-scale-x-100" />
791
- )}
792
- </Button>
793
- </TooltipTrigger>
794
- <TooltipContent side="right">
795
- {collapsed
796
- ? t("sidebar.expandSidebar")
797
- : t("sidebar.collapseSidebar")}
798
- </TooltipContent>
799
- </Tooltip>
800
- ) : null}
801
812
  </>
802
813
  )}
803
814
  </div>
@@ -1173,9 +1184,6 @@ export function Sidebar({
1173
1184
 
1174
1185
  <div className="flex items-center gap-1 px-1.5 py-1.5">
1175
1186
  <DevDatabaseLink />
1176
- <div className="min-w-0 flex-1">
1177
- <FeedbackButton className="px-3 py-2" />
1178
- </div>
1179
1187
  <Tooltip>
1180
1188
  <TooltipTrigger asChild>
1181
1189
  <Button
@@ -1202,6 +1210,13 @@ export function Sidebar({
1202
1210
  </div>
1203
1211
  </div>
1204
1212
  ) : null}
1213
+ <SidebarFooterActions
1214
+ collapsed={collapsed}
1215
+ feedback={feedbackButton}
1216
+ translate={translateButton}
1217
+ search={searchButton}
1218
+ collapse={collapseButton}
1219
+ />
1205
1220
  </aside>
1206
1221
  </>
1207
1222
  );