@agent-native/core 0.79.27 → 0.80.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 (346) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +26 -0
  3. package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +41 -0
  4. package/corpus/core/docs/content/locales/de-DE/template-design.mdx +51 -0
  5. package/corpus/core/docs/content/locales/es-ES/template-design.mdx +50 -0
  6. package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +49 -0
  7. package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +44 -0
  8. package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +46 -0
  9. package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +44 -0
  10. package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +48 -0
  11. package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +36 -0
  12. package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +38 -0
  13. package/corpus/core/docs/content/template-design.mdx +45 -0
  14. package/corpus/core/package.json +2 -1
  15. package/corpus/core/src/agent/engine/index.ts +1 -0
  16. package/corpus/core/src/agent/engine/registry.ts +40 -0
  17. package/corpus/core/src/agent/production-agent.ts +6 -2
  18. package/corpus/core/src/cli/design-connect.ts +490 -0
  19. package/corpus/core/src/cli/index.ts +16 -0
  20. package/corpus/core/src/cli/skills.ts +126 -3
  21. package/corpus/core/src/client/AssistantChat.tsx +43 -7
  22. package/corpus/core/src/client/agent-chat.ts +27 -3
  23. package/corpus/core/src/client/blocks/library/MermaidBlock.tsx +1 -1
  24. package/corpus/core/src/client/blocks/library/diagram.tsx +2 -2
  25. package/corpus/core/src/client/blocks/library/wireframe.tsx +1 -1
  26. package/corpus/core/src/client/chat/message-components.tsx +1 -1
  27. package/corpus/core/src/client/chat-model-groups.ts +1 -2
  28. package/corpus/core/src/client/components/LiveCursorOverlay.tsx +33 -66
  29. package/corpus/core/src/client/composer/TiptapComposer.tsx +99 -24
  30. package/corpus/core/src/client/composer/useVoiceDictation.ts +429 -260
  31. package/corpus/core/src/client/frame-protocol.ts +17 -2
  32. package/corpus/core/src/client/rich-markdown-editor/RegistryBlockNode.tsx +2 -2
  33. package/corpus/core/src/client/sharing/ShareButton.tsx +20 -15
  34. package/corpus/core/src/client/use-agent-engine-configured.ts +80 -28
  35. package/corpus/core/src/server/transcribe-voice.ts +57 -22
  36. package/corpus/core/src/shared/mcp-embed-headers.ts +23 -1
  37. package/corpus/core/src/styles/agent-native.css +56 -7
  38. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  39. package/corpus/core/src/vite/client.ts +2 -0
  40. package/corpus/core/src/voice/index.ts +18 -0
  41. package/corpus/core/src/voice/voice-cleanup-prompt.ts +38 -0
  42. package/corpus/core/src/voice/voice-context.ts +217 -0
  43. package/corpus/core/src/voice/voice-replacements.ts +75 -0
  44. package/corpus/templates/analytics/AGENTS.md +4 -3
  45. package/corpus/templates/analytics/actions/list-session-recordings.ts +6 -1
  46. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +557 -400
  47. package/corpus/templates/analytics/app/global.css +0 -4
  48. package/corpus/templates/analytics/app/i18n/zh-TW.ts +2 -0
  49. package/corpus/templates/analytics/app/i18n-data.ts +20 -0
  50. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +33 -8
  51. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +7 -0
  52. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +7 -0
  53. package/corpus/templates/analytics/changelog/2026-06-28-ask-tab-now-matches-the-darker-app-background.md +6 -0
  54. package/corpus/templates/analytics/changelog/2026-06-28-dashboard-email-reports-now-use-cleaner-light-mode-snapshots.md +6 -0
  55. package/corpus/templates/analytics/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  56. package/corpus/templates/analytics/changelog/2026-06-28-sessions-now-show-only-signed-in-recordings-with-playable-re.md +6 -0
  57. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +3 -3
  58. package/corpus/templates/analytics/server/lib/dashboard-report.ts +29 -7
  59. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +5 -2
  60. package/corpus/templates/analytics/server/lib/session-replay.ts +24 -4
  61. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +4 -4
  62. package/corpus/templates/assets/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  63. package/corpus/templates/brain/app/components/layout/Layout.tsx +29 -2
  64. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +131 -42
  65. package/corpus/templates/brain/app/i18n/zh-TW.ts +2 -0
  66. package/corpus/templates/brain/app/i18n-data.ts +20 -0
  67. package/corpus/templates/brain/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  68. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +29 -1
  69. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +417 -299
  70. package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
  71. package/corpus/templates/calendar/app/i18n-data.ts +20 -0
  72. package/corpus/templates/calendar/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  73. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +6 -19
  74. package/corpus/templates/chat/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  75. package/corpus/templates/clips/AGENTS.md +4 -0
  76. package/corpus/templates/clips/actions/cleanup-transcript.ts +39 -9
  77. package/corpus/templates/clips/actions/finalize-meeting.ts +81 -12
  78. package/corpus/templates/clips/actions/lib/agents-md-context.ts +4 -1
  79. package/corpus/templates/clips/app/components/library/library-layout.tsx +3 -3
  80. package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +1 -1
  81. package/corpus/templates/clips/app/components/player/share-dialog.tsx +2 -2
  82. package/corpus/templates/clips/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
  83. package/corpus/templates/clips/desktop/src/lib/personal-vocabulary.ts +13 -8
  84. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +60 -1
  85. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +1 -1
  86. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +1 -1
  87. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +5 -5
  88. package/corpus/templates/content/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  89. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +137 -0
  90. package/corpus/templates/design/AGENTS.md +95 -5
  91. package/corpus/templates/design/DESIGN.md +82 -0
  92. package/corpus/templates/design/DEVELOPING.md +43 -0
  93. package/corpus/templates/design/actions/add-localhost-screens.ts +426 -0
  94. package/corpus/templates/design/actions/apply-shader.ts +277 -0
  95. package/corpus/templates/design/actions/apply-visual-edit.ts +303 -0
  96. package/corpus/templates/design/actions/connect-localhost.ts +183 -0
  97. package/corpus/templates/design/actions/edit-design.ts +195 -42
  98. package/corpus/templates/design/actions/generate-design.ts +71 -1
  99. package/corpus/templates/design/actions/generate-screens.ts +193 -0
  100. package/corpus/templates/design/actions/get-code-layer-projection.ts +191 -0
  101. package/corpus/templates/design/actions/get-shader.ts +119 -0
  102. package/corpus/templates/design/actions/list-localhost-connections.ts +95 -0
  103. package/corpus/templates/design/actions/navigate.ts +55 -2
  104. package/corpus/templates/design/actions/view-screen.ts +68 -1
  105. package/corpus/templates/design/agent-native.app-skill.json +10 -0
  106. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +761 -0
  107. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +2057 -103
  108. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +74 -38
  109. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +399 -0
  110. package/corpus/templates/design/app/components/design/EditPanel.tsx +3185 -439
  111. package/corpus/templates/design/app/components/design/LayersPanel.tsx +1124 -0
  112. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +3116 -147
  113. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +700 -13
  114. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +107 -63
  115. package/corpus/templates/design/app/components/design/index.ts +0 -5
  116. package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +286 -0
  117. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +699 -0
  118. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +461 -0
  119. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +166 -0
  120. package/corpus/templates/design/app/components/design/inspector/FigmaColorPicker.tsx +1420 -0
  121. package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +420 -0
  122. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +215 -0
  123. package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +71 -0
  124. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +518 -0
  125. package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +106 -0
  126. package/corpus/templates/design/app/components/design/inspector/figma-icons.tsx +361 -0
  127. package/corpus/templates/design/app/components/design/inspector/index.ts +60 -0
  128. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +201 -0
  129. package/corpus/templates/design/app/components/design/types.ts +23 -0
  130. package/corpus/templates/design/app/components/layout/Layout.tsx +24 -13
  131. package/corpus/templates/design/app/components/layout/Sidebar.tsx +4 -4
  132. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +474 -36
  133. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +22 -5
  134. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +24 -11
  135. package/corpus/templates/design/app/global.css +121 -3
  136. package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -0
  137. package/corpus/templates/design/app/hooks/use-navigation-state.ts +130 -8
  138. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +329 -0
  139. package/corpus/templates/design/app/i18n/zh-TW.ts +264 -0
  140. package/corpus/templates/design/app/i18n-data.ts +2790 -1
  141. package/corpus/templates/design/app/pages/DesignEditor.tsx +5108 -851
  142. package/corpus/templates/design/changelog/2026-06-28-annotate-mode-now-combines-drawing-and-comment-pins-in-one-c.md +6 -0
  143. package/corpus/templates/design/changelog/2026-06-28-design-editor-panel-borders-are-cleaner-so-the-canvas-edge-s.md +6 -0
  144. package/corpus/templates/design/changelog/2026-06-28-drawing-prompts-now-reliably-open-and-submit-to-the-design-a.md +6 -0
  145. package/corpus/templates/design/changelog/2026-06-28-editor-app-menus-now-use-an-outline-agent-native-mark-with-b.md +6 -0
  146. package/corpus/templates/design/changelog/2026-06-28-figma-style-code-design-mode.md +6 -0
  147. package/corpus/templates/design/changelog/2026-06-28-layer-selection-now-updates-chat-context-without-opening-the.md +6 -0
  148. package/corpus/templates/design/changelog/2026-06-28-layer-selections-now-preserve-hidden-and-locked-canvas-state.md +6 -0
  149. package/corpus/templates/design/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  150. package/corpus/templates/design/changelog/2026-06-28-live-cursors-now-keep-names-beside-a-cleaner-pointer-marker.md +6 -0
  151. package/corpus/templates/design/changelog/2026-06-28-mode-switching-now-lives-in-a-compact-bottom-right-icon-dock.md +6 -0
  152. package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-handles-zooming-drawing-opening-and-dele.md +6 -0
  153. package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-selects-screens-on-click-and-opens-them-.md +6 -0
  154. package/corpus/templates/design/changelog/2026-06-28-screen-overview-zooms-into-the-active-screen-with-smoother-e.md +6 -0
  155. package/corpus/templates/design/changelog/2026-06-28-selected-element-chips-in-chat-are-shorter-and-easier-to-sca.md +6 -0
  156. package/corpus/templates/design/changelog/2026-06-28-the-design-editor-toolbar-is-more-compact-and-the-app-menu-m.md +6 -0
  157. package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-at-the-top-of-the-design-sidebar-instead-of-.md +6 -0
  158. package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-in-the-right-inspector-beside-the-design-tab.md +6 -0
  159. package/corpus/templates/design/changelog/2026-06-29-active-sidebar-rows-use-soft-highlights.md +6 -0
  160. package/corpus/templates/design/changelog/2026-06-29-agents-can-now-open-screen-overview-focus-screens-and-add.md +6 -0
  161. package/corpus/templates/design/changelog/2026-06-29-design-agents-now-edit-broad-copy-changes-more-reliably.md +6 -0
  162. package/corpus/templates/design/changelog/2026-06-29-design-editor-extensions-now-run-inline-beside-the-artboard.md +6 -0
  163. package/corpus/templates/design/changelog/2026-06-29-sidebars-use-darker-chrome-and-chat-warns-immediately.md +6 -0
  164. package/corpus/templates/design/changelog/2026-06-29-visual-edit-can-open-localhost-routes-as-url-backed-screens.md +6 -0
  165. package/corpus/templates/design/package.json +1 -0
  166. package/corpus/templates/design/server/db/schema.ts +26 -0
  167. package/corpus/templates/design/server/lib/design-snapshot.ts +1 -1
  168. package/corpus/templates/design/server/plugins/agent-chat.ts +3 -0
  169. package/corpus/templates/design/shared/api.ts +27 -0
  170. package/corpus/templates/design/shared/canvas-frames.ts +103 -0
  171. package/corpus/templates/design/shared/canvas-math.ts +1058 -0
  172. package/corpus/templates/design/shared/code-layer.ts +2212 -0
  173. package/corpus/templates/design/shared/color-utils.ts +180 -0
  174. package/corpus/templates/design/shared/generation-session.ts +61 -0
  175. package/corpus/templates/design/shared/shader-presets.ts +782 -0
  176. package/corpus/templates/design/shared/shader-safety.ts +137 -0
  177. package/corpus/templates/design/shared/source-mode.ts +237 -0
  178. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +149 -6
  179. package/corpus/templates/forms/app/i18n/ar-SA.ts +2 -0
  180. package/corpus/templates/forms/app/i18n/de-DE.ts +2 -0
  181. package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
  182. package/corpus/templates/forms/app/i18n/es-ES.ts +2 -0
  183. package/corpus/templates/forms/app/i18n/fr-FR.ts +2 -0
  184. package/corpus/templates/forms/app/i18n/hi-IN.ts +2 -0
  185. package/corpus/templates/forms/app/i18n/ja-JP.ts +2 -0
  186. package/corpus/templates/forms/app/i18n/ko-KR.ts +2 -0
  187. package/corpus/templates/forms/app/i18n/pt-BR.ts +2 -0
  188. package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
  189. package/corpus/templates/forms/app/i18n/zh-TW.ts +2 -0
  190. package/corpus/templates/forms/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  191. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
  192. package/corpus/templates/macros/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
  193. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +408 -247
  194. package/corpus/templates/mail/app/i18n/ar-SA.ts +4 -0
  195. package/corpus/templates/mail/app/i18n/de-DE.ts +4 -0
  196. package/corpus/templates/mail/app/i18n/en-US.ts +4 -0
  197. package/corpus/templates/mail/app/i18n/es-ES.ts +4 -0
  198. package/corpus/templates/mail/app/i18n/fr-FR.ts +4 -0
  199. package/corpus/templates/mail/app/i18n/hi-IN.ts +4 -0
  200. package/corpus/templates/mail/app/i18n/ja-JP.ts +4 -0
  201. package/corpus/templates/mail/app/i18n/ko-KR.ts +4 -0
  202. package/corpus/templates/mail/app/i18n/pt-BR.ts +4 -0
  203. package/corpus/templates/mail/app/i18n/zh-CN.ts +4 -0
  204. package/corpus/templates/mail/app/i18n/zh-TW.ts +4 -0
  205. package/corpus/templates/mail/changelog/2026-06-28-pinned-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  206. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +6 -8
  207. package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +1 -1
  208. package/corpus/templates/plan/app/global.css +61 -78
  209. package/corpus/templates/plan/app/pages/PlansPage.tsx +8 -0
  210. package/corpus/templates/plan/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  211. package/corpus/templates/plan/changelog/2026-06-28-plans-use-the-shared-neutral-light-and-dark-theme.md +6 -0
  212. package/corpus/templates/plan/changelog/2026-06-28-sending-open-feedback-from-a-plan-now-opens-the-inline-plan-.md +6 -0
  213. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +5 -5
  214. package/corpus/templates/slides/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  215. package/corpus/templates/videos/app/components/Sidebar.tsx +2 -2
  216. package/corpus/templates/videos/app/components/layout/Layout.tsx +29 -2
  217. package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +113 -30
  218. package/corpus/templates/videos/app/i18n/ar-SA.ts +2 -0
  219. package/corpus/templates/videos/app/i18n/de-DE.ts +2 -0
  220. package/corpus/templates/videos/app/i18n/en-US.ts +2 -0
  221. package/corpus/templates/videos/app/i18n/es-ES.ts +2 -0
  222. package/corpus/templates/videos/app/i18n/fr-FR.ts +2 -0
  223. package/corpus/templates/videos/app/i18n/hi-IN.ts +2 -0
  224. package/corpus/templates/videos/app/i18n/ja-JP.ts +2 -0
  225. package/corpus/templates/videos/app/i18n/ko-KR.ts +2 -0
  226. package/corpus/templates/videos/app/i18n/pt-BR.ts +2 -0
  227. package/corpus/templates/videos/app/i18n/zh-CN.ts +2 -0
  228. package/corpus/templates/videos/app/i18n/zh-TW.ts +2 -0
  229. package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  230. package/dist/agent/engine/index.d.ts +1 -1
  231. package/dist/agent/engine/index.d.ts.map +1 -1
  232. package/dist/agent/engine/index.js +1 -1
  233. package/dist/agent/engine/index.js.map +1 -1
  234. package/dist/agent/engine/registry.d.ts +9 -0
  235. package/dist/agent/engine/registry.d.ts.map +1 -1
  236. package/dist/agent/engine/registry.js +37 -0
  237. package/dist/agent/engine/registry.js.map +1 -1
  238. package/dist/agent/production-agent.d.ts.map +1 -1
  239. package/dist/agent/production-agent.js +4 -3
  240. package/dist/agent/production-agent.js.map +1 -1
  241. package/dist/cli/design-connect.d.ts +52 -0
  242. package/dist/cli/design-connect.d.ts.map +1 -0
  243. package/dist/cli/design-connect.js +409 -0
  244. package/dist/cli/design-connect.js.map +1 -0
  245. package/dist/cli/index.js +15 -0
  246. package/dist/cli/index.js.map +1 -1
  247. package/dist/cli/skills.d.ts +3 -0
  248. package/dist/cli/skills.d.ts.map +1 -1
  249. package/dist/cli/skills.js +121 -3
  250. package/dist/cli/skills.js.map +1 -1
  251. package/dist/client/AssistantChat.d.ts.map +1 -1
  252. package/dist/client/AssistantChat.js +38 -8
  253. package/dist/client/AssistantChat.js.map +1 -1
  254. package/dist/client/agent-chat.d.ts +6 -0
  255. package/dist/client/agent-chat.d.ts.map +1 -1
  256. package/dist/client/agent-chat.js +17 -3
  257. package/dist/client/agent-chat.js.map +1 -1
  258. package/dist/client/blocks/library/MermaidBlock.js +1 -1
  259. package/dist/client/blocks/library/MermaidBlock.js.map +1 -1
  260. package/dist/client/blocks/library/diagram.js +1 -1
  261. package/dist/client/blocks/library/diagram.js.map +1 -1
  262. package/dist/client/blocks/library/wireframe.js +1 -1
  263. package/dist/client/blocks/library/wireframe.js.map +1 -1
  264. package/dist/client/chat/message-components.js +1 -1
  265. package/dist/client/chat/message-components.js.map +1 -1
  266. package/dist/client/chat-model-groups.d.ts.map +1 -1
  267. package/dist/client/chat-model-groups.js +1 -2
  268. package/dist/client/chat-model-groups.js.map +1 -1
  269. package/dist/client/components/LiveCursorOverlay.d.ts +1 -2
  270. package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
  271. package/dist/client/components/LiveCursorOverlay.js +19 -40
  272. package/dist/client/components/LiveCursorOverlay.js.map +1 -1
  273. package/dist/client/composer/TiptapComposer.d.ts +3 -1
  274. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  275. package/dist/client/composer/TiptapComposer.js +86 -24
  276. package/dist/client/composer/TiptapComposer.js.map +1 -1
  277. package/dist/client/composer/useVoiceDictation.d.ts +9 -0
  278. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  279. package/dist/client/composer/useVoiceDictation.js +154 -32
  280. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  281. package/dist/client/frame-protocol.d.ts +17 -2
  282. package/dist/client/frame-protocol.d.ts.map +1 -1
  283. package/dist/client/frame-protocol.js.map +1 -1
  284. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +2 -2
  285. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
  286. package/dist/client/sharing/ShareButton.d.ts +2 -0
  287. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  288. package/dist/client/sharing/ShareButton.js +7 -6
  289. package/dist/client/sharing/ShareButton.js.map +1 -1
  290. package/dist/client/use-agent-engine-configured.d.ts +5 -0
  291. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  292. package/dist/client/use-agent-engine-configured.js +51 -25
  293. package/dist/client/use-agent-engine-configured.js.map +1 -1
  294. package/dist/collab/awareness.d.ts +2 -2
  295. package/dist/collab/awareness.d.ts.map +1 -1
  296. package/dist/collab/routes.d.ts +1 -1
  297. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  298. package/dist/notifications/routes.d.ts +3 -3
  299. package/dist/observability/routes.d.ts +8 -8
  300. package/dist/progress/routes.d.ts +1 -1
  301. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  302. package/dist/server/transcribe-voice.d.ts.map +1 -1
  303. package/dist/server/transcribe-voice.js +40 -24
  304. package/dist/server/transcribe-voice.js.map +1 -1
  305. package/dist/shared/mcp-embed-headers.d.ts +1 -0
  306. package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
  307. package/dist/shared/mcp-embed-headers.js +20 -1
  308. package/dist/shared/mcp-embed-headers.js.map +1 -1
  309. package/dist/styles/agent-native.css +56 -7
  310. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  311. package/dist/vite/client.d.ts.map +1 -1
  312. package/dist/vite/client.js +2 -0
  313. package/dist/vite/client.js.map +1 -1
  314. package/dist/voice/index.d.ts +5 -0
  315. package/dist/voice/index.d.ts.map +1 -0
  316. package/dist/voice/index.js +4 -0
  317. package/dist/voice/index.js.map +1 -0
  318. package/dist/voice/voice-cleanup-prompt.d.ts +6 -0
  319. package/dist/voice/voice-cleanup-prompt.d.ts.map +1 -0
  320. package/dist/voice/voice-cleanup-prompt.js +26 -0
  321. package/dist/voice/voice-cleanup-prompt.js.map +1 -0
  322. package/dist/voice/voice-context.d.ts +25 -0
  323. package/dist/voice/voice-context.d.ts.map +1 -0
  324. package/dist/voice/voice-context.js +156 -0
  325. package/dist/voice/voice-context.js.map +1 -0
  326. package/dist/voice/voice-replacements.d.ts +4 -0
  327. package/dist/voice/voice-replacements.d.ts.map +1 -0
  328. package/dist/voice/voice-replacements.js +52 -0
  329. package/dist/voice/voice-replacements.js.map +1 -0
  330. package/docs/content/locales/ar-SA/template-design.mdx +41 -0
  331. package/docs/content/locales/de-DE/template-design.mdx +51 -0
  332. package/docs/content/locales/es-ES/template-design.mdx +50 -0
  333. package/docs/content/locales/fr-FR/template-design.mdx +49 -0
  334. package/docs/content/locales/hi-IN/template-design.mdx +44 -0
  335. package/docs/content/locales/ja-JP/template-design.mdx +46 -0
  336. package/docs/content/locales/ko-KR/template-design.mdx +44 -0
  337. package/docs/content/locales/pt-BR/template-design.mdx +48 -0
  338. package/docs/content/locales/zh-CN/template-design.mdx +36 -0
  339. package/docs/content/locales/zh-TW/template-design.mdx +38 -0
  340. package/docs/content/template-design.mdx +45 -0
  341. package/package.json +2 -1
  342. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  343. package/corpus/templates/design/app/components/design/DesignToolbar.tsx +0 -339
  344. package/corpus/templates/design/app/components/design/PresentMode.tsx +0 -68
  345. package/corpus/templates/design/app/components/design/ViewportTabs.tsx +0 -149
  346. package/corpus/templates/design/app/components/design/ZoomControls.tsx +0 -157
@@ -22,6 +22,8 @@ import {
22
22
  IconCheck,
23
23
  IconEye,
24
24
  IconEyeOff,
25
+ IconLayoutSidebarLeftCollapse,
26
+ IconLayoutSidebarLeftExpand,
25
27
  } from "@tabler/icons-react";
26
28
  import {
27
29
  startOfMonth,
@@ -99,6 +101,8 @@ const navItems = [
99
101
  interface SidebarProps {
100
102
  open: boolean;
101
103
  onClose: () => void;
104
+ collapsed?: boolean;
105
+ onCollapsedChange?: (collapsed: boolean) => void;
102
106
  }
103
107
 
104
108
  const MONTH_LABELS = [
@@ -597,7 +601,12 @@ function GoogleAccountsSection({
597
601
  );
598
602
  }
599
603
 
600
- export function Sidebar({ open, onClose }: SidebarProps) {
604
+ export function Sidebar({
605
+ open,
606
+ onClose,
607
+ collapsed = false,
608
+ onCollapsedChange,
609
+ }: SidebarProps) {
601
610
  const location = useLocation();
602
611
  const navigate = useNavigate();
603
612
  const t = useT();
@@ -656,348 +665,457 @@ export function Sidebar({ open, onClose }: SidebarProps) {
656
665
 
657
666
  <aside
658
667
  data-open={open ? "true" : "false"}
668
+ data-collapsed={collapsed ? "true" : "false"}
659
669
  className={cn(
660
- "agent-layout-left-drawer calendar-app-sidebar fixed start-0 top-0 z-50 flex h-full w-56 min-w-0 flex-col overflow-hidden border-e border-border bg-card transition-transform duration-200 lg:static",
670
+ "agent-layout-left-drawer calendar-app-sidebar fixed start-0 top-0 z-50 flex h-full min-w-0 flex-col overflow-hidden border-e border-border bg-card transition-[width,translate] duration-200 ease-out lg:static",
671
+ collapsed ? "w-12" : "w-56",
661
672
  )}
662
673
  >
663
674
  {/* Logo */}
664
- <div className="flex h-12 shrink-0 items-center justify-between gap-2.5 border-b border-border px-4">
665
- <Link
666
- to="/"
667
- onClick={onClose}
668
- className="flex items-center gap-2 rounded outline-none focus-visible:ring-2 focus-visible:ring-ring"
669
- >
670
- <img
671
- src={appPath("/agent-native-icon-light.svg")}
672
- alt=""
673
- aria-hidden="true"
674
- className="block h-4 w-auto shrink-0 dark:hidden"
675
- />
676
- <img
677
- src={appPath("/agent-native-icon-dark.svg")}
678
- alt=""
679
- aria-hidden="true"
680
- className="hidden h-4 w-auto shrink-0 dark:block"
681
- />
682
- <span className="text-base font-semibold tracking-tight">
683
- {t("navigation.brand")}
684
- </span>
685
- </Link>
686
- </div>
687
-
688
- <div className="min-h-0 flex-1 overflow-y-auto">
689
- {/* Mini calendar */}
690
- <MiniCalendar
691
- selectedDate={selectedDate}
692
- onDateSelect={handleMiniCalendarDateSelect}
693
- />
694
-
695
- {/* Nav */}
696
- <nav className="space-y-0.5 border-t border-border p-2.5">
697
- {navItems.map((item) => {
698
- const isActive =
699
- item.path === "/"
700
- ? location.pathname === "/"
701
- : location.pathname.startsWith(item.path);
702
-
703
- return (
704
- <Link
705
- key={item.path}
706
- to={item.path}
707
- onClick={onClose}
708
- className={cn(
709
- "flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium transition-colors",
710
- isActive
711
- ? "bg-primary/10 text-primary"
712
- : "text-muted-foreground hover:bg-accent/60 hover:text-foreground",
713
- )}
714
- >
715
- <item.icon className="h-4 w-4" />
716
- {t(item.labelKey)}
717
- </Link>
718
- );
719
- })}
720
- </nav>
721
-
722
- {/* Google status / connect CTA */}
723
- {!googleStatus.isLoading && !isConnected && (
724
- <GoogleConnectSidebarButton />
725
- )}
726
-
727
- {isConnected && (googleStatus.data?.accounts?.length ?? 0) > 0 && (
728
- <GoogleAccountsSection
729
- accounts={googleStatus.data!.accounts!}
730
- onClose={onClose}
731
- />
675
+ <div
676
+ className={cn(
677
+ "flex h-12 shrink-0 items-center justify-between gap-2.5 border-b border-border",
678
+ collapsed ? "px-1" : "px-4",
732
679
  )}
733
-
734
- {/* Other Calendars people overlays + external ICS feeds combined */}
735
- <div className="border-t border-border px-1.5 py-1.5">
736
- <div className="flex min-h-8 items-center justify-between px-3">
737
- <div className="flex items-center gap-1">
738
- <span className="text-[11px] font-medium uppercase tracking-wider text-muted-foreground">
739
- {t("sidebar.otherCalendars")}
680
+ >
681
+ {collapsed && onCollapsedChange ? (
682
+ <Tooltip>
683
+ <TooltipTrigger asChild>
684
+ <Button
685
+ type="button"
686
+ variant="ghost"
687
+ size="icon"
688
+ className="h-10 w-10 shrink-0 text-muted-foreground"
689
+ onClick={() => onCollapsedChange(false)}
690
+ aria-label={t("sidebar.expandSidebar")}
691
+ >
692
+ <IconLayoutSidebarLeftExpand className="h-4 w-4 rtl:-scale-x-100" />
693
+ </Button>
694
+ </TooltipTrigger>
695
+ <TooltipContent side="right">
696
+ {t("sidebar.expandSidebar")}
697
+ </TooltipContent>
698
+ </Tooltip>
699
+ ) : (
700
+ <>
701
+ <Link
702
+ to="/"
703
+ onClick={onClose}
704
+ className="flex items-center gap-2 rounded outline-none focus-visible:ring-2 focus-visible:ring-ring"
705
+ >
706
+ <img
707
+ src={appPath("/agent-native-icon-light.svg")}
708
+ alt=""
709
+ aria-hidden="true"
710
+ className="block h-4 w-auto shrink-0 dark:hidden"
711
+ />
712
+ <img
713
+ src={appPath("/agent-native-icon-dark.svg")}
714
+ alt=""
715
+ aria-hidden="true"
716
+ className="hidden h-4 w-auto shrink-0 dark:block"
717
+ />
718
+ <span className="text-base font-semibold tracking-tight">
719
+ {t("navigation.brand")}
740
720
  </span>
721
+ </Link>
722
+ {onCollapsedChange ? (
741
723
  <Tooltip>
742
724
  <TooltipTrigger asChild>
743
- <span className="flex items-center text-muted-foreground/40 hover:text-muted-foreground cursor-default">
744
- <IconInfoCircle className="h-3 w-3" />
745
- </span>
725
+ <Button
726
+ type="button"
727
+ variant="ghost"
728
+ size="icon"
729
+ className="h-8 w-8 shrink-0 text-muted-foreground"
730
+ onClick={() => onCollapsedChange(!collapsed)}
731
+ aria-label={
732
+ collapsed
733
+ ? t("sidebar.expandSidebar")
734
+ : t("sidebar.collapseSidebar")
735
+ }
736
+ >
737
+ {collapsed ? (
738
+ <IconLayoutSidebarLeftExpand className="h-4 w-4 rtl:-scale-x-100" />
739
+ ) : (
740
+ <IconLayoutSidebarLeftCollapse className="h-4 w-4 rtl:-scale-x-100" />
741
+ )}
742
+ </Button>
746
743
  </TooltipTrigger>
747
744
  <TooltipContent side="right">
748
- <p>{t("sidebar.otherCalendarsDescription")}</p>
745
+ {collapsed
746
+ ? t("sidebar.expandSidebar")
747
+ : t("sidebar.collapseSidebar")}
749
748
  </TooltipContent>
750
749
  </Tooltip>
751
- </div>
752
- <button
753
- type="button"
754
- onClick={() => {
755
- setAddCalendarDefaultTab("people");
756
- setAddCalendarOpen(true);
757
- }}
758
- className="flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground"
759
- >
760
- <IconPlus className="h-3.5 w-3.5" />
761
- </button>
762
- </div>
763
- {(overlayPeople.length > 0 || externalCalendars.length > 0) && (
764
- <div className="mt-1 space-y-1">
765
- {overlayPeople.length > 0 && (
766
- <Collapsible
767
- open={peopleGroupOpen}
768
- onOpenChange={setPeopleGroupOpen}
769
- >
770
- <CollapsibleTrigger asChild>
771
- <button
772
- type="button"
773
- className="flex h-7 w-full items-center gap-1 rounded px-3 text-xs text-muted-foreground hover:bg-accent/50 hover:text-foreground"
774
- >
775
- {peopleGroupOpen ? (
776
- <IconChevronDown className="h-3 w-3" />
777
- ) : (
778
- <IconChevronRight className="h-3 w-3 rtl:-scale-x-100" />
750
+ ) : null}
751
+ </>
752
+ )}
753
+ </div>
754
+
755
+ <div className="min-h-0 flex-1 overflow-y-auto">
756
+ {collapsed ? (
757
+ <nav className="flex flex-col items-center gap-1 px-1 py-2">
758
+ {navItems.map((item) => {
759
+ const isActive =
760
+ item.path === "/"
761
+ ? location.pathname === "/"
762
+ : location.pathname.startsWith(item.path);
763
+ return (
764
+ <Tooltip key={item.path}>
765
+ <TooltipTrigger asChild>
766
+ <Link
767
+ to={item.path}
768
+ onClick={onClose}
769
+ aria-label={t(item.labelKey)}
770
+ className={cn(
771
+ "flex h-10 w-10 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent/60 hover:text-foreground",
772
+ isActive && "bg-primary/10 text-primary",
779
773
  )}
780
- <span className="min-w-0 flex-1 text-start">
781
- People
782
- </span>
783
- <span className="text-[10px]">
784
- {overlayPeople.length}
774
+ >
775
+ <item.icon className="h-4 w-4" />
776
+ </Link>
777
+ </TooltipTrigger>
778
+ <TooltipContent side="right">
779
+ {t(item.labelKey)}
780
+ </TooltipContent>
781
+ </Tooltip>
782
+ );
783
+ })}
784
+ </nav>
785
+ ) : (
786
+ <>
787
+ {/* Mini calendar */}
788
+ <MiniCalendar
789
+ selectedDate={selectedDate}
790
+ onDateSelect={handleMiniCalendarDateSelect}
791
+ />
792
+
793
+ {/* Nav */}
794
+ <nav className="space-y-0.5 border-t border-border p-2.5">
795
+ {navItems.map((item) => {
796
+ const isActive =
797
+ item.path === "/"
798
+ ? location.pathname === "/"
799
+ : location.pathname.startsWith(item.path);
800
+
801
+ return (
802
+ <Link
803
+ key={item.path}
804
+ to={item.path}
805
+ onClick={onClose}
806
+ className={cn(
807
+ "flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium transition-colors",
808
+ isActive
809
+ ? "bg-primary/10 text-primary"
810
+ : "text-muted-foreground hover:bg-accent/60 hover:text-foreground",
811
+ )}
812
+ >
813
+ <item.icon className="h-4 w-4" />
814
+ {t(item.labelKey)}
815
+ </Link>
816
+ );
817
+ })}
818
+ </nav>
819
+
820
+ {/* Google status / connect CTA */}
821
+ {!googleStatus.isLoading && !isConnected && (
822
+ <GoogleConnectSidebarButton />
823
+ )}
824
+
825
+ {isConnected &&
826
+ (googleStatus.data?.accounts?.length ?? 0) > 0 && (
827
+ <GoogleAccountsSection
828
+ accounts={googleStatus.data!.accounts!}
829
+ onClose={onClose}
830
+ />
831
+ )}
832
+
833
+ {/* Other Calendars — people overlays + external ICS feeds combined */}
834
+ <div className="border-t border-border px-1.5 py-1.5">
835
+ <div className="flex min-h-8 items-center justify-between px-3">
836
+ <div className="flex items-center gap-1">
837
+ <span className="text-[11px] font-medium uppercase tracking-wider text-muted-foreground">
838
+ {t("sidebar.otherCalendars")}
839
+ </span>
840
+ <Tooltip>
841
+ <TooltipTrigger asChild>
842
+ <span className="flex items-center text-muted-foreground/40 hover:text-muted-foreground cursor-default">
843
+ <IconInfoCircle className="h-3 w-3" />
785
844
  </span>
786
- </button>
787
- </CollapsibleTrigger>
788
- <CollapsibleContent className="space-y-0.5">
789
- {overlayPeople.map((person) => (
790
- <div
791
- key={person.email}
792
- className="group flex min-h-7 items-center gap-2 px-3 text-xs"
793
- >
794
- <ColorPickerPopover
795
- color={person.color}
796
- onColorChange={(color) =>
797
- updatePersonColor.mutate({
798
- email: person.email,
799
- color,
800
- })
801
- }
845
+ </TooltipTrigger>
846
+ <TooltipContent side="right">
847
+ <p>{t("sidebar.otherCalendarsDescription")}</p>
848
+ </TooltipContent>
849
+ </Tooltip>
850
+ </div>
851
+ <button
852
+ type="button"
853
+ onClick={() => {
854
+ setAddCalendarDefaultTab("people");
855
+ setAddCalendarOpen(true);
856
+ }}
857
+ className="flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground"
858
+ >
859
+ <IconPlus className="h-3.5 w-3.5" />
860
+ </button>
861
+ </div>
862
+ {(overlayPeople.length > 0 || externalCalendars.length > 0) && (
863
+ <div className="mt-1 space-y-1">
864
+ {overlayPeople.length > 0 && (
865
+ <Collapsible
866
+ open={peopleGroupOpen}
867
+ onOpenChange={setPeopleGroupOpen}
868
+ >
869
+ <CollapsibleTrigger asChild>
870
+ <button
871
+ type="button"
872
+ className="flex h-7 w-full items-center gap-1 rounded px-3 text-xs text-muted-foreground hover:bg-accent/50 hover:text-foreground"
802
873
  >
803
- <button
804
- type="button"
805
- className="shrink-0 cursor-pointer rounded-full p-0.5 hover:ring-2 hover:ring-border"
874
+ {peopleGroupOpen ? (
875
+ <IconChevronDown className="h-3 w-3" />
876
+ ) : (
877
+ <IconChevronRight className="h-3 w-3 rtl:-scale-x-100" />
878
+ )}
879
+ <span className="min-w-0 flex-1 text-start">
880
+ People
881
+ </span>
882
+ <span className="text-[10px]">
883
+ {overlayPeople.length}
884
+ </span>
885
+ </button>
886
+ </CollapsibleTrigger>
887
+ <CollapsibleContent className="space-y-0.5">
888
+ {overlayPeople.map((person) => (
889
+ <div
890
+ key={person.email}
891
+ className="group flex min-h-7 items-center gap-2 px-3 text-xs"
806
892
  >
893
+ <ColorPickerPopover
894
+ color={person.color}
895
+ onColorChange={(color) =>
896
+ updatePersonColor.mutate({
897
+ email: person.email,
898
+ color,
899
+ })
900
+ }
901
+ >
902
+ <button
903
+ type="button"
904
+ className="shrink-0 cursor-pointer rounded-full p-0.5 hover:ring-2 hover:ring-border"
905
+ >
906
+ <span
907
+ className={cn(
908
+ "block h-2.5 w-2.5 rounded-full",
909
+ isHiddenCalendar(
910
+ "people",
911
+ person.email,
912
+ ) && "opacity-40",
913
+ )}
914
+ style={{ backgroundColor: person.color }}
915
+ />
916
+ </button>
917
+ </ColorPickerPopover>
807
918
  <span
808
919
  className={cn(
809
- "block h-2.5 w-2.5 rounded-full",
810
- isHiddenCalendar("people", person.email) &&
811
- "opacity-40",
920
+ "min-w-0 flex-1 truncate",
921
+ isHiddenCalendar("people", person.email)
922
+ ? "text-muted-foreground/40"
923
+ : "text-muted-foreground",
812
924
  )}
813
- style={{ backgroundColor: person.color }}
814
- />
815
- </button>
816
- </ColorPickerPopover>
817
- <span
818
- className={cn(
819
- "min-w-0 flex-1 truncate",
820
- isHiddenCalendar("people", person.email)
821
- ? "text-muted-foreground/40"
822
- : "text-muted-foreground",
823
- )}
824
- >
825
- {person.name || person.email}
826
- </span>
827
- <div className="flex items-center">
828
- <Tooltip>
829
- <TooltipTrigger asChild>
925
+ >
926
+ {person.name || person.email}
927
+ </span>
928
+ <div className="flex items-center">
929
+ <Tooltip>
930
+ <TooltipTrigger asChild>
931
+ <button
932
+ type="button"
933
+ onClick={() =>
934
+ toggleHiddenCalendar(
935
+ "people",
936
+ person.email,
937
+ )
938
+ }
939
+ className="flex h-6 w-6 items-center justify-center rounded text-muted-foreground/40 hover:text-foreground group-hover:text-muted-foreground/80"
940
+ >
941
+ {isHiddenCalendar(
942
+ "people",
943
+ person.email,
944
+ ) ? (
945
+ <IconEyeOff className="h-3 w-3" />
946
+ ) : (
947
+ <IconEye className="h-3 w-3" />
948
+ )}
949
+ </button>
950
+ </TooltipTrigger>
951
+ <TooltipContent side="right">
952
+ {isHiddenCalendar("people", person.email)
953
+ ? t("sidebar.showCalendar")
954
+ : t("sidebar.hideCalendar")}
955
+ </TooltipContent>
956
+ </Tooltip>
830
957
  <button
831
958
  type="button"
832
959
  onClick={() =>
833
- toggleHiddenCalendar("people", person.email)
960
+ removePerson.mutate(person.email)
834
961
  }
835
- className="flex h-6 w-6 items-center justify-center rounded text-muted-foreground/40 hover:text-foreground group-hover:text-muted-foreground/80"
962
+ className="flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 opacity-0 hover:text-foreground group-hover:opacity-100"
836
963
  >
837
- {isHiddenCalendar("people", person.email) ? (
838
- <IconEyeOff className="h-3 w-3" />
839
- ) : (
840
- <IconEye className="h-3 w-3" />
841
- )}
964
+ <IconX className="h-3 w-3" />
842
965
  </button>
843
- </TooltipTrigger>
844
- <TooltipContent side="right">
845
- {isHiddenCalendar("people", person.email)
846
- ? t("sidebar.showCalendar")
847
- : t("sidebar.hideCalendar")}
848
- </TooltipContent>
849
- </Tooltip>
850
- <button
851
- type="button"
852
- onClick={() => removePerson.mutate(person.email)}
853
- className="flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 opacity-0 hover:text-foreground group-hover:opacity-100"
854
- >
855
- <IconX className="h-3 w-3" />
856
- </button>
857
- </div>
858
- </div>
859
- ))}
860
- </CollapsibleContent>
861
- </Collapsible>
862
- )}
966
+ </div>
967
+ </div>
968
+ ))}
969
+ </CollapsibleContent>
970
+ </Collapsible>
971
+ )}
863
972
 
864
- {externalCalendars.length > 0 && (
865
- <Collapsible
866
- open={feedsGroupOpen}
867
- onOpenChange={setFeedsGroupOpen}
868
- >
869
- <CollapsibleTrigger asChild>
870
- <button
871
- type="button"
872
- className="flex h-7 w-full items-center gap-1 rounded px-3 text-xs text-muted-foreground hover:bg-accent/50 hover:text-foreground"
973
+ {externalCalendars.length > 0 && (
974
+ <Collapsible
975
+ open={feedsGroupOpen}
976
+ onOpenChange={setFeedsGroupOpen}
873
977
  >
874
- {feedsGroupOpen ? (
875
- <IconChevronDown className="h-3 w-3" />
876
- ) : (
877
- <IconChevronRight className="h-3 w-3 rtl:-scale-x-100" />
878
- )}
879
- <span className="min-w-0 flex-1 text-start">Feeds</span>
880
- <span className="text-[10px]">
881
- {externalCalendars.length}
882
- </span>
883
- </button>
884
- </CollapsibleTrigger>
885
- <CollapsibleContent className="space-y-0.5">
886
- {externalCalendars.map((cal) => (
887
- <div
888
- key={cal.id}
889
- className="group flex min-h-7 items-center gap-2 px-3 text-xs"
890
- >
891
- <ColorPickerPopover
892
- color={cal.color}
893
- onColorChange={(color) =>
894
- updateExternalColor.mutate({ id: cal.id, color })
895
- }
978
+ <CollapsibleTrigger asChild>
979
+ <button
980
+ type="button"
981
+ className="flex h-7 w-full items-center gap-1 rounded px-3 text-xs text-muted-foreground hover:bg-accent/50 hover:text-foreground"
896
982
  >
897
- <button
898
- type="button"
899
- className="shrink-0 cursor-pointer rounded-full p-0.5 hover:ring-2 hover:ring-border"
983
+ {feedsGroupOpen ? (
984
+ <IconChevronDown className="h-3 w-3" />
985
+ ) : (
986
+ <IconChevronRight className="h-3 w-3 rtl:-scale-x-100" />
987
+ )}
988
+ <span className="min-w-0 flex-1 text-start">
989
+ Feeds
990
+ </span>
991
+ <span className="text-[10px]">
992
+ {externalCalendars.length}
993
+ </span>
994
+ </button>
995
+ </CollapsibleTrigger>
996
+ <CollapsibleContent className="space-y-0.5">
997
+ {externalCalendars.map((cal) => (
998
+ <div
999
+ key={cal.id}
1000
+ className="group flex min-h-7 items-center gap-2 px-3 text-xs"
900
1001
  >
1002
+ <ColorPickerPopover
1003
+ color={cal.color}
1004
+ onColorChange={(color) =>
1005
+ updateExternalColor.mutate({
1006
+ id: cal.id,
1007
+ color,
1008
+ })
1009
+ }
1010
+ >
1011
+ <button
1012
+ type="button"
1013
+ className="shrink-0 cursor-pointer rounded-full p-0.5 hover:ring-2 hover:ring-border"
1014
+ >
1015
+ <span
1016
+ className={cn(
1017
+ "block h-2.5 w-2.5 rounded-full",
1018
+ isHiddenCalendar("external", cal.id) &&
1019
+ "opacity-40",
1020
+ )}
1021
+ style={{ backgroundColor: cal.color }}
1022
+ />
1023
+ </button>
1024
+ </ColorPickerPopover>
901
1025
  <span
902
1026
  className={cn(
903
- "block h-2.5 w-2.5 rounded-full",
904
- isHiddenCalendar("external", cal.id) &&
905
- "opacity-40",
1027
+ "min-w-0 flex-1 truncate",
1028
+ isHiddenCalendar("external", cal.id)
1029
+ ? "text-muted-foreground/40"
1030
+ : "text-muted-foreground",
906
1031
  )}
907
- style={{ backgroundColor: cal.color }}
908
- />
909
- </button>
910
- </ColorPickerPopover>
911
- <span
912
- className={cn(
913
- "min-w-0 flex-1 truncate",
914
- isHiddenCalendar("external", cal.id)
915
- ? "text-muted-foreground/40"
916
- : "text-muted-foreground",
917
- )}
918
- >
919
- {cal.name}
920
- </span>
921
- <div className="flex items-center">
922
- <Tooltip>
923
- <TooltipTrigger asChild>
1032
+ >
1033
+ {cal.name}
1034
+ </span>
1035
+ <div className="flex items-center">
1036
+ <Tooltip>
1037
+ <TooltipTrigger asChild>
1038
+ <button
1039
+ type="button"
1040
+ onClick={() =>
1041
+ toggleHiddenCalendar("external", cal.id)
1042
+ }
1043
+ className="flex h-6 w-6 items-center justify-center rounded text-muted-foreground/40 hover:text-foreground group-hover:text-muted-foreground/80"
1044
+ >
1045
+ {isHiddenCalendar("external", cal.id) ? (
1046
+ <IconEyeOff className="h-3 w-3" />
1047
+ ) : (
1048
+ <IconEye className="h-3 w-3" />
1049
+ )}
1050
+ </button>
1051
+ </TooltipTrigger>
1052
+ <TooltipContent side="right">
1053
+ {isHiddenCalendar("external", cal.id)
1054
+ ? t("sidebar.showCalendar")
1055
+ : t("sidebar.hideCalendar")}
1056
+ </TooltipContent>
1057
+ </Tooltip>
924
1058
  <button
925
1059
  type="button"
926
- onClick={() =>
927
- toggleHiddenCalendar("external", cal.id)
928
- }
929
- className="flex h-6 w-6 items-center justify-center rounded text-muted-foreground/40 hover:text-foreground group-hover:text-muted-foreground/80"
1060
+ onClick={() => removeExternal.mutate(cal.id)}
1061
+ className="flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 opacity-0 hover:text-foreground group-hover:opacity-100"
930
1062
  >
931
- {isHiddenCalendar("external", cal.id) ? (
932
- <IconEyeOff className="h-3 w-3" />
933
- ) : (
934
- <IconEye className="h-3 w-3" />
935
- )}
1063
+ <IconX className="h-3 w-3" />
936
1064
  </button>
937
- </TooltipTrigger>
938
- <TooltipContent side="right">
939
- {isHiddenCalendar("external", cal.id)
940
- ? t("sidebar.showCalendar")
941
- : t("sidebar.hideCalendar")}
942
- </TooltipContent>
943
- </Tooltip>
944
- <button
945
- type="button"
946
- onClick={() => removeExternal.mutate(cal.id)}
947
- className="flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 opacity-0 hover:text-foreground group-hover:opacity-100"
948
- >
949
- <IconX className="h-3 w-3" />
950
- </button>
951
- </div>
952
- </div>
953
- ))}
954
- </CollapsibleContent>
955
- </Collapsible>
1065
+ </div>
1066
+ </div>
1067
+ ))}
1068
+ </CollapsibleContent>
1069
+ </Collapsible>
1070
+ )}
1071
+ </div>
956
1072
  )}
957
1073
  </div>
958
- )}
959
- </div>
1074
+ </>
1075
+ )}
960
1076
  </div>
961
1077
 
962
- <div className="shrink-0 border-t border-border">
963
- <div className="px-2.5 py-1.5">
964
- <ExtensionsSidebarSection />
965
- </div>
1078
+ {!collapsed ? (
1079
+ <div className="shrink-0">
1080
+ <div className="px-2.5 py-1.5">
1081
+ <ExtensionsSidebarSection />
1082
+ </div>
966
1083
 
967
- <div className="border-t border-border px-3 py-2">
968
- <OrgSwitcher reserveSpace />
969
- </div>
1084
+ <div className="px-3 py-2">
1085
+ <OrgSwitcher reserveSpace />
1086
+ </div>
970
1087
 
971
- <div className="flex items-center gap-1 border-t border-border px-1.5 py-1.5">
972
- <DevDatabaseLink />
973
- <div className="min-w-0 flex-1">
974
- <FeedbackButton className="px-3 py-2" />
1088
+ <div className="flex items-center gap-1 px-1.5 py-1.5">
1089
+ <DevDatabaseLink />
1090
+ <div className="min-w-0 flex-1">
1091
+ <FeedbackButton className="px-3 py-2" />
1092
+ </div>
1093
+ <Tooltip>
1094
+ <TooltipTrigger asChild>
1095
+ <Button
1096
+ variant="ghost"
1097
+ size="icon"
1098
+ className="h-8 w-8 text-muted-foreground"
1099
+ onClick={() =>
1100
+ window.dispatchEvent(new Event("calendar:open-shortcuts"))
1101
+ }
1102
+ >
1103
+ <IconKeyboard className="h-4 w-4" />
1104
+ </Button>
1105
+ </TooltipTrigger>
1106
+ <TooltipContent side="top">
1107
+ <p>
1108
+ {t("keyboardShortcuts.title")}{" "}
1109
+ <kbd className="ms-1 rounded border border-border bg-muted px-1 font-mono text-[10px]">
1110
+ ?
1111
+ </kbd>
1112
+ </p>
1113
+ </TooltipContent>
1114
+ </Tooltip>
1115
+ <ThemeToggle className="h-8 w-8" />
975
1116
  </div>
976
- <Tooltip>
977
- <TooltipTrigger asChild>
978
- <Button
979
- variant="ghost"
980
- size="icon"
981
- className="h-8 w-8 text-muted-foreground"
982
- onClick={() =>
983
- window.dispatchEvent(new Event("calendar:open-shortcuts"))
984
- }
985
- >
986
- <IconKeyboard className="h-4 w-4" />
987
- </Button>
988
- </TooltipTrigger>
989
- <TooltipContent side="top">
990
- <p>
991
- {t("keyboardShortcuts.title")}{" "}
992
- <kbd className="ms-1 rounded border border-border bg-muted px-1 font-mono text-[10px]">
993
- ?
994
- </kbd>
995
- </p>
996
- </TooltipContent>
997
- </Tooltip>
998
- <ThemeToggle className="h-8 w-8" />
999
1117
  </div>
1000
- </div>
1118
+ ) : null}
1001
1119
  </aside>
1002
1120
  </>
1003
1121
  );