@agent-native/core 0.79.27 → 0.80.1

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 (497) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +34 -0
  3. package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
  4. package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +55 -1
  5. package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +5 -0
  6. package/corpus/core/docs/content/locales/de-DE/template-design.mdx +66 -1
  7. package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +5 -0
  8. package/corpus/core/docs/content/locales/es-ES/template-design.mdx +65 -1
  9. package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
  10. package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +64 -1
  11. package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
  12. package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +59 -1
  13. package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
  14. package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +62 -1
  15. package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
  16. package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +58 -1
  17. package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
  18. package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +62 -1
  19. package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
  20. package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +50 -1
  21. package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
  22. package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +52 -1
  23. package/corpus/core/docs/content/skills-guide.mdx +5 -0
  24. package/corpus/core/docs/content/template-design.mdx +59 -1
  25. package/corpus/core/package.json +2 -1
  26. package/corpus/core/src/agent/engine/index.ts +1 -0
  27. package/corpus/core/src/agent/engine/registry.ts +40 -0
  28. package/corpus/core/src/agent/production-agent.ts +6 -2
  29. package/corpus/core/src/application-state/handlers.ts +1 -1
  30. package/corpus/core/src/brand-kit/index.ts +1 -1
  31. package/corpus/core/src/cli/design-connect.ts +490 -0
  32. package/corpus/core/src/cli/index.ts +16 -0
  33. package/corpus/core/src/cli/skills.ts +144 -3
  34. package/corpus/core/src/client/AgentPanel.tsx +1 -1
  35. package/corpus/core/src/client/AssistantChat.tsx +43 -7
  36. package/corpus/core/src/client/MultiTabAssistantChat.tsx +1 -1
  37. package/corpus/core/src/client/agent-chat.ts +27 -3
  38. package/corpus/core/src/client/blocks/library/MermaidBlock.tsx +1 -1
  39. package/corpus/core/src/client/blocks/library/diagram.tsx +2 -2
  40. package/corpus/core/src/client/blocks/library/wireframe.tsx +1 -1
  41. package/corpus/core/src/client/chat/message-components.tsx +1 -1
  42. package/corpus/core/src/client/chat-model-groups.ts +1 -2
  43. package/corpus/core/src/client/components/LiveCursorOverlay.tsx +33 -66
  44. package/corpus/core/src/client/composer/TiptapComposer.tsx +99 -24
  45. package/corpus/core/src/client/composer/useVoiceDictation.ts +429 -260
  46. package/corpus/core/src/client/extensions/portable-extension.ts +1 -1
  47. package/corpus/core/src/client/frame-protocol.ts +17 -2
  48. package/corpus/core/src/client/rich-markdown-editor/RegistryBlockNode.tsx +2 -2
  49. package/corpus/core/src/client/sharing/ShareButton.tsx +20 -15
  50. package/corpus/core/src/client/use-agent-engine-configured.ts +80 -28
  51. package/corpus/core/src/code-agents/transcript-normalizer.ts +1 -1
  52. package/corpus/core/src/extensions/path.ts +1 -4
  53. package/corpus/core/src/integrations/a2a-continuation-processor.ts +1 -1
  54. package/corpus/core/src/mcp/build-server.ts +1 -1
  55. package/corpus/core/src/org/handlers.ts +5 -5
  56. package/corpus/core/src/org/plugin.ts +2 -2
  57. package/corpus/core/src/scripts/call-agent.ts +1 -1
  58. package/corpus/core/src/scripts/db/safety.ts +1 -1
  59. package/corpus/core/src/server/auth.ts +3 -0
  60. package/corpus/core/src/server/builder-design-systems.ts +308 -0
  61. package/corpus/core/src/server/core-routes-plugin.ts +29 -3
  62. package/corpus/core/src/server/index.ts +8 -0
  63. package/corpus/core/src/server/transcribe-voice.ts +57 -22
  64. package/corpus/core/src/shared/mcp-embed-headers.ts +23 -1
  65. package/corpus/core/src/styles/agent-native.css +60 -4
  66. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  67. package/corpus/core/src/usage/store.ts +2 -2
  68. package/corpus/core/src/vite/client.ts +2 -0
  69. package/corpus/core/src/voice/index.ts +18 -0
  70. package/corpus/core/src/voice/voice-cleanup-prompt.ts +38 -0
  71. package/corpus/core/src/voice/voice-context.ts +217 -0
  72. package/corpus/core/src/voice/voice-replacements.ts +75 -0
  73. package/corpus/templates/analytics/AGENTS.md +4 -3
  74. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +298 -15
  75. package/corpus/templates/analytics/actions/get-sql-dashboard.ts +9 -4
  76. package/corpus/templates/analytics/actions/list-session-recordings.ts +6 -1
  77. package/corpus/templates/analytics/actions/mutate-dashboard.ts +18 -2
  78. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +12 -2
  79. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +557 -400
  80. package/corpus/templates/analytics/app/global.css +0 -4
  81. package/corpus/templates/analytics/app/hooks/use-replay-storage-status.ts +66 -0
  82. package/corpus/templates/analytics/app/i18n/zh-TW.ts +39 -0
  83. package/corpus/templates/analytics/app/i18n-data.ts +424 -0
  84. package/corpus/templates/analytics/app/pages/Settings.tsx +333 -0
  85. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +2 -1
  86. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dashboard-layout.ts +121 -3
  87. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +82 -34
  88. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +7 -0
  89. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +144 -36
  90. package/corpus/templates/analytics/changelog/2026-06-28-ask-tab-now-matches-the-darker-app-background.md +6 -0
  91. package/corpus/templates/analytics/changelog/2026-06-28-dashboard-email-reports-now-use-cleaner-light-mode-snapshots.md +6 -0
  92. package/corpus/templates/analytics/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  93. package/corpus/templates/analytics/changelog/2026-06-28-sessions-now-show-only-signed-in-recordings-with-playable-re.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-06-29-analytics-agents-can-now-place-new-charts-into-requested-das.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-06-29-analytics-queries-now-report-failed-source-query-errors-inst.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-06-29-charts-can-now-be-dropped-between-full-dashboard-rows-to-cre.md +6 -0
  97. package/corpus/templates/analytics/changelog/2026-06-29-dashboard-email-reports-include-the-full-dashboard-image-wit.md +6 -0
  98. package/corpus/templates/analytics/changelog/2026-06-29-main-surface-border-reaches-the-top.md +6 -0
  99. package/corpus/templates/analytics/changelog/2026-06-29-session-replay-now-records-playable-sessions-in-production-a.md +6 -0
  100. package/corpus/templates/analytics/changelog/2026-06-29-set-up-session-replay-storage-from-settings-connect-builder-.md +6 -0
  101. package/corpus/templates/analytics/scripts/cleanup-empty-session-recordings.ts +102 -0
  102. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +3 -3
  103. package/corpus/templates/analytics/server/lib/dashboard-report.ts +75 -30
  104. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +5 -2
  105. package/corpus/templates/analytics/server/lib/real-data-actions.ts +81 -20
  106. package/corpus/templates/analytics/server/lib/replay-storage.ts +79 -0
  107. package/corpus/templates/analytics/server/lib/s3-upload-provider.ts +255 -0
  108. package/corpus/templates/analytics/server/lib/session-replay.ts +53 -12
  109. package/corpus/templates/analytics/server/plugins/agent-chat.ts +11 -2
  110. package/corpus/templates/analytics/server/plugins/onboarding.ts +97 -0
  111. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +4 -4
  112. package/corpus/templates/assets/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  113. package/corpus/templates/brain/app/components/layout/Layout.tsx +29 -2
  114. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +131 -42
  115. package/corpus/templates/brain/app/i18n/zh-TW.ts +2 -0
  116. package/corpus/templates/brain/app/i18n-data.ts +20 -0
  117. package/corpus/templates/brain/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  118. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +29 -1
  119. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +417 -299
  120. package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
  121. package/corpus/templates/calendar/app/i18n-data.ts +20 -0
  122. package/corpus/templates/calendar/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  123. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +6 -19
  124. package/corpus/templates/chat/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  125. package/corpus/templates/clips/AGENTS.md +4 -0
  126. package/corpus/templates/clips/actions/cleanup-transcript.ts +39 -9
  127. package/corpus/templates/clips/actions/finalize-meeting.ts +81 -12
  128. package/corpus/templates/clips/actions/lib/agents-md-context.ts +4 -1
  129. package/corpus/templates/clips/app/components/library/library-layout.tsx +3 -3
  130. package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +1 -1
  131. package/corpus/templates/clips/app/components/player/share-dialog.tsx +2 -2
  132. package/corpus/templates/clips/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
  133. package/corpus/templates/clips/desktop/src/lib/personal-vocabulary.ts +13 -8
  134. package/corpus/templates/clips/desktop/src/lib/recorder.ts +24 -0
  135. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +105 -5
  136. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +60 -1
  137. package/corpus/templates/content/actions/set-image-alt-text.ts +1 -1
  138. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +1 -1
  139. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +1 -1
  140. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +5 -5
  141. package/corpus/templates/content/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  142. package/corpus/templates/content/shared/document-export.ts +1 -1
  143. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -18
  144. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +154 -0
  145. package/corpus/templates/design/AGENTS.md +95 -5
  146. package/corpus/templates/design/DESIGN.md +82 -0
  147. package/corpus/templates/design/DEVELOPING.md +43 -0
  148. package/corpus/templates/design/actions/add-localhost-screens.ts +453 -0
  149. package/corpus/templates/design/actions/apply-shader.ts +277 -0
  150. package/corpus/templates/design/actions/apply-visual-edit.ts +303 -0
  151. package/corpus/templates/design/actions/connect-localhost.ts +183 -0
  152. package/corpus/templates/design/actions/edit-design.ts +195 -42
  153. package/corpus/templates/design/actions/generate-design.ts +71 -1
  154. package/corpus/templates/design/actions/generate-screens.ts +193 -0
  155. package/corpus/templates/design/actions/get-code-layer-projection.ts +191 -0
  156. package/corpus/templates/design/actions/get-shader.ts +119 -0
  157. package/corpus/templates/design/actions/index-design-system-with-builder.ts +259 -0
  158. package/corpus/templates/design/actions/list-localhost-connections.ts +95 -0
  159. package/corpus/templates/design/actions/navigate.ts +55 -2
  160. package/corpus/templates/design/actions/update-file.ts +9 -2
  161. package/corpus/templates/design/actions/view-screen.ts +68 -1
  162. package/corpus/templates/design/agent-native.app-skill.json +10 -0
  163. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +719 -0
  164. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +2120 -103
  165. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +74 -38
  166. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +401 -0
  167. package/corpus/templates/design/app/components/design/EditPanel.tsx +3966 -440
  168. package/corpus/templates/design/app/components/design/LayersPanel.tsx +1473 -0
  169. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +3940 -147
  170. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +700 -13
  171. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +105 -63
  172. package/corpus/templates/design/app/components/design/index.ts +0 -5
  173. package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +353 -0
  174. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +1589 -0
  175. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +511 -0
  176. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +395 -0
  177. package/corpus/templates/design/app/components/design/inspector/FigmaColorPicker.tsx +2010 -0
  178. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +601 -0
  179. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +242 -0
  180. package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +420 -0
  181. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +238 -0
  182. package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +71 -0
  183. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +575 -0
  184. package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +106 -0
  185. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +423 -0
  186. package/corpus/templates/design/app/components/design/inspector/figma-icons.tsx +741 -0
  187. package/corpus/templates/design/app/components/design/inspector/index.ts +87 -0
  188. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +201 -0
  189. package/corpus/templates/design/app/components/design/types.ts +23 -0
  190. package/corpus/templates/design/app/components/layout/Layout.tsx +24 -13
  191. package/corpus/templates/design/app/components/layout/Sidebar.tsx +4 -4
  192. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +474 -36
  193. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +22 -5
  194. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +24 -11
  195. package/corpus/templates/design/app/global.css +149 -5
  196. package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -0
  197. package/corpus/templates/design/app/hooks/use-navigation-state.ts +130 -8
  198. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +329 -0
  199. package/corpus/templates/design/app/i18n/zh-TW.ts +277 -0
  200. package/corpus/templates/design/app/i18n-data.ts +3028 -1
  201. package/corpus/templates/design/app/pages/DesignEditor.tsx +5831 -904
  202. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +57 -221
  203. package/corpus/templates/design/changelog/2026-06-28-annotate-mode-now-combines-drawing-and-comment-pins-in-one-c.md +6 -0
  204. package/corpus/templates/design/changelog/2026-06-28-design-editor-panel-borders-are-cleaner-so-the-canvas-edge-s.md +6 -0
  205. package/corpus/templates/design/changelog/2026-06-28-drawing-prompts-now-reliably-open-and-submit-to-the-design-a.md +6 -0
  206. package/corpus/templates/design/changelog/2026-06-28-editor-app-menus-now-use-an-outline-agent-native-mark-with-b.md +6 -0
  207. package/corpus/templates/design/changelog/2026-06-28-figma-style-code-design-mode.md +6 -0
  208. package/corpus/templates/design/changelog/2026-06-28-layer-selection-now-updates-chat-context-without-opening-the.md +6 -0
  209. package/corpus/templates/design/changelog/2026-06-28-layer-selections-now-preserve-hidden-and-locked-canvas-state.md +6 -0
  210. package/corpus/templates/design/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  211. package/corpus/templates/design/changelog/2026-06-28-live-cursors-now-keep-names-beside-a-cleaner-pointer-marker.md +6 -0
  212. package/corpus/templates/design/changelog/2026-06-28-mode-switching-now-lives-in-a-compact-bottom-right-icon-dock.md +6 -0
  213. package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-handles-zooming-drawing-opening-and-dele.md +6 -0
  214. package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-selects-screens-on-click-and-opens-them-.md +6 -0
  215. package/corpus/templates/design/changelog/2026-06-28-screen-overview-zooms-into-the-active-screen-with-smoother-e.md +6 -0
  216. package/corpus/templates/design/changelog/2026-06-28-selected-element-chips-in-chat-are-shorter-and-easier-to-sca.md +6 -0
  217. package/corpus/templates/design/changelog/2026-06-28-the-design-editor-toolbar-is-more-compact-and-the-app-menu-m.md +6 -0
  218. package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-at-the-top-of-the-design-sidebar-instead-of-.md +6 -0
  219. package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-in-the-right-inspector-beside-the-design-tab.md +6 -0
  220. package/corpus/templates/design/changelog/2026-06-29-active-sidebar-rows-use-soft-highlights.md +6 -0
  221. package/corpus/templates/design/changelog/2026-06-29-agents-can-now-open-screen-overview-focus-screens-and-add.md +6 -0
  222. package/corpus/templates/design/changelog/2026-06-29-canvas-selection-no-longer-flashes-broken-prototype-html-whe.md +6 -0
  223. package/corpus/templates/design/changelog/2026-06-29-command-menu-selections-are-clearer-in-dark-mode.md +6 -0
  224. package/corpus/templates/design/changelog/2026-06-29-design-agents-now-edit-broad-copy-changes-more-reliably.md +6 -0
  225. package/corpus/templates/design/changelog/2026-06-29-design-editor-extensions-now-run-inline-beside-the-artboard.md +6 -0
  226. package/corpus/templates/design/changelog/2026-06-29-design-mode-top-chrome-now-groups-collaborators-preview-shar.md +6 -0
  227. package/corpus/templates/design/changelog/2026-06-29-element-selection-now-stays-on-the-intended-layer-after-sele.md +6 -0
  228. package/corpus/templates/design/changelog/2026-06-29-screen-overview-full-view-controls-now-sit-above-frames-inst.md +6 -0
  229. package/corpus/templates/design/changelog/2026-06-29-screen-overview-tools-can-draw-shapes-create-screens-and-kee.md +6 -0
  230. package/corpus/templates/design/changelog/2026-06-29-sidebars-use-darker-chrome-and-chat-warns-immediately.md +6 -0
  231. package/corpus/templates/design/changelog/2026-06-29-the-pen-tool-now-creates-anchor-based-bezier-vectors-with-ha.md +6 -0
  232. package/corpus/templates/design/changelog/2026-06-29-visual-edit-can-open-localhost-routes-as-url-backed-screens.md +6 -0
  233. package/corpus/templates/design/package.json +1 -0
  234. package/corpus/templates/design/server/db/schema.ts +26 -0
  235. package/corpus/templates/design/server/handlers/import-figma-system.ts +38 -85
  236. package/corpus/templates/design/server/lib/design-snapshot.ts +9 -1
  237. package/corpus/templates/design/server/plugins/agent-chat.ts +3 -0
  238. package/corpus/templates/design/shared/api.ts +27 -0
  239. package/corpus/templates/design/shared/canvas-frames.ts +103 -0
  240. package/corpus/templates/design/shared/canvas-math.ts +1058 -0
  241. package/corpus/templates/design/shared/code-layer.ts +2412 -0
  242. package/corpus/templates/design/shared/color-utils.ts +180 -0
  243. package/corpus/templates/design/shared/generation-session.ts +61 -0
  244. package/corpus/templates/design/shared/html-content.ts +21 -0
  245. package/corpus/templates/design/shared/pen-path.ts +207 -0
  246. package/corpus/templates/design/shared/shader-presets.ts +782 -0
  247. package/corpus/templates/design/shared/shader-safety.ts +137 -0
  248. package/corpus/templates/design/shared/source-mode.ts +237 -0
  249. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +149 -6
  250. package/corpus/templates/forms/app/i18n/ar-SA.ts +2 -0
  251. package/corpus/templates/forms/app/i18n/de-DE.ts +2 -0
  252. package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
  253. package/corpus/templates/forms/app/i18n/es-ES.ts +2 -0
  254. package/corpus/templates/forms/app/i18n/fr-FR.ts +2 -0
  255. package/corpus/templates/forms/app/i18n/hi-IN.ts +2 -0
  256. package/corpus/templates/forms/app/i18n/ja-JP.ts +2 -0
  257. package/corpus/templates/forms/app/i18n/ko-KR.ts +2 -0
  258. package/corpus/templates/forms/app/i18n/pt-BR.ts +2 -0
  259. package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
  260. package/corpus/templates/forms/app/i18n/zh-TW.ts +2 -0
  261. package/corpus/templates/forms/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  262. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
  263. package/corpus/templates/macros/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
  264. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +408 -247
  265. package/corpus/templates/mail/app/i18n/ar-SA.ts +4 -0
  266. package/corpus/templates/mail/app/i18n/de-DE.ts +4 -0
  267. package/corpus/templates/mail/app/i18n/en-US.ts +4 -0
  268. package/corpus/templates/mail/app/i18n/es-ES.ts +4 -0
  269. package/corpus/templates/mail/app/i18n/fr-FR.ts +4 -0
  270. package/corpus/templates/mail/app/i18n/hi-IN.ts +4 -0
  271. package/corpus/templates/mail/app/i18n/ja-JP.ts +4 -0
  272. package/corpus/templates/mail/app/i18n/ko-KR.ts +4 -0
  273. package/corpus/templates/mail/app/i18n/pt-BR.ts +4 -0
  274. package/corpus/templates/mail/app/i18n/zh-CN.ts +4 -0
  275. package/corpus/templates/mail/app/i18n/zh-TW.ts +4 -0
  276. package/corpus/templates/mail/app/lib/utils.ts +2 -2
  277. package/corpus/templates/mail/changelog/2026-06-28-pinned-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  278. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +6 -8
  279. package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +1 -1
  280. package/corpus/templates/plan/app/global.css +61 -78
  281. package/corpus/templates/plan/app/pages/PlansPage.tsx +8 -0
  282. package/corpus/templates/plan/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  283. package/corpus/templates/plan/changelog/2026-06-28-plans-use-the-shared-neutral-light-and-dark-theme.md +6 -0
  284. package/corpus/templates/plan/changelog/2026-06-28-sending-open-feedback-from-a-plan-now-opens-the-inline-plan-.md +6 -0
  285. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +9 -10
  286. package/corpus/templates/slides/AGENTS.md +3 -2
  287. package/corpus/templates/slides/actions/import-file.ts +26 -17
  288. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +259 -0
  289. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +35 -167
  290. package/corpus/templates/slides/app/components/design-system/fig-import-response.ts +9 -13
  291. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +5 -5
  292. package/corpus/templates/slides/app/context/DeckContext.tsx +1 -1
  293. package/corpus/templates/slides/app/i18n/ar-SA.ts +9 -37
  294. package/corpus/templates/slides/app/i18n/de-DE.ts +10 -25
  295. package/corpus/templates/slides/app/i18n/en-US.ts +9 -26
  296. package/corpus/templates/slides/app/i18n/es-ES.ts +10 -28
  297. package/corpus/templates/slides/app/i18n/fr-FR.ts +10 -28
  298. package/corpus/templates/slides/app/i18n/hi-IN.ts +9 -26
  299. package/corpus/templates/slides/app/i18n/ja-JP.ts +10 -22
  300. package/corpus/templates/slides/app/i18n/ko-KR.ts +9 -23
  301. package/corpus/templates/slides/app/i18n/pt-BR.ts +10 -28
  302. package/corpus/templates/slides/app/i18n/zh-CN.ts +9 -22
  303. package/corpus/templates/slides/app/i18n/zh-TW.ts +9 -22
  304. package/corpus/templates/slides/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  305. package/corpus/templates/slides/server/handlers/import-figma-system.ts +44 -12
  306. package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
  307. package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +1 -1
  308. package/corpus/templates/videos/app/components/Sidebar.tsx +2 -2
  309. package/corpus/templates/videos/app/components/layout/Layout.tsx +29 -2
  310. package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +113 -30
  311. package/corpus/templates/videos/app/i18n/ar-SA.ts +2 -0
  312. package/corpus/templates/videos/app/i18n/de-DE.ts +2 -0
  313. package/corpus/templates/videos/app/i18n/en-US.ts +2 -0
  314. package/corpus/templates/videos/app/i18n/es-ES.ts +2 -0
  315. package/corpus/templates/videos/app/i18n/fr-FR.ts +2 -0
  316. package/corpus/templates/videos/app/i18n/hi-IN.ts +2 -0
  317. package/corpus/templates/videos/app/i18n/ja-JP.ts +2 -0
  318. package/corpus/templates/videos/app/i18n/ko-KR.ts +2 -0
  319. package/corpus/templates/videos/app/i18n/pt-BR.ts +2 -0
  320. package/corpus/templates/videos/app/i18n/zh-CN.ts +2 -0
  321. package/corpus/templates/videos/app/i18n/zh-TW.ts +2 -0
  322. package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  323. package/dist/agent/engine/index.d.ts +1 -1
  324. package/dist/agent/engine/index.d.ts.map +1 -1
  325. package/dist/agent/engine/index.js +1 -1
  326. package/dist/agent/engine/index.js.map +1 -1
  327. package/dist/agent/engine/registry.d.ts +9 -0
  328. package/dist/agent/engine/registry.d.ts.map +1 -1
  329. package/dist/agent/engine/registry.js +37 -0
  330. package/dist/agent/engine/registry.js.map +1 -1
  331. package/dist/agent/production-agent.d.ts.map +1 -1
  332. package/dist/agent/production-agent.js +4 -3
  333. package/dist/agent/production-agent.js.map +1 -1
  334. package/dist/application-state/handlers.js +1 -1
  335. package/dist/application-state/handlers.js.map +1 -1
  336. package/dist/brand-kit/index.d.ts +1 -1
  337. package/dist/brand-kit/index.js +1 -1
  338. package/dist/brand-kit/index.js.map +1 -1
  339. package/dist/cli/design-connect.d.ts +52 -0
  340. package/dist/cli/design-connect.d.ts.map +1 -0
  341. package/dist/cli/design-connect.js +409 -0
  342. package/dist/cli/design-connect.js.map +1 -0
  343. package/dist/cli/index.js +15 -0
  344. package/dist/cli/index.js.map +1 -1
  345. package/dist/cli/skills.d.ts +3 -0
  346. package/dist/cli/skills.d.ts.map +1 -1
  347. package/dist/cli/skills.js +139 -3
  348. package/dist/cli/skills.js.map +1 -1
  349. package/dist/client/AgentPanel.js +1 -1
  350. package/dist/client/AgentPanel.js.map +1 -1
  351. package/dist/client/AssistantChat.d.ts.map +1 -1
  352. package/dist/client/AssistantChat.js +38 -8
  353. package/dist/client/AssistantChat.js.map +1 -1
  354. package/dist/client/MultiTabAssistantChat.js +1 -1
  355. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  356. package/dist/client/agent-chat.d.ts +6 -0
  357. package/dist/client/agent-chat.d.ts.map +1 -1
  358. package/dist/client/agent-chat.js +17 -3
  359. package/dist/client/agent-chat.js.map +1 -1
  360. package/dist/client/blocks/library/MermaidBlock.js +1 -1
  361. package/dist/client/blocks/library/MermaidBlock.js.map +1 -1
  362. package/dist/client/blocks/library/diagram.js +1 -1
  363. package/dist/client/blocks/library/diagram.js.map +1 -1
  364. package/dist/client/blocks/library/wireframe.js +1 -1
  365. package/dist/client/blocks/library/wireframe.js.map +1 -1
  366. package/dist/client/chat/message-components.js +1 -1
  367. package/dist/client/chat/message-components.js.map +1 -1
  368. package/dist/client/chat-model-groups.d.ts.map +1 -1
  369. package/dist/client/chat-model-groups.js +1 -2
  370. package/dist/client/chat-model-groups.js.map +1 -1
  371. package/dist/client/components/LiveCursorOverlay.d.ts +1 -2
  372. package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
  373. package/dist/client/components/LiveCursorOverlay.js +19 -40
  374. package/dist/client/components/LiveCursorOverlay.js.map +1 -1
  375. package/dist/client/composer/TiptapComposer.d.ts +3 -1
  376. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  377. package/dist/client/composer/TiptapComposer.js +86 -24
  378. package/dist/client/composer/TiptapComposer.js.map +1 -1
  379. package/dist/client/composer/useVoiceDictation.d.ts +9 -0
  380. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  381. package/dist/client/composer/useVoiceDictation.js +154 -32
  382. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  383. package/dist/client/extensions/portable-extension.d.ts +1 -1
  384. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  385. package/dist/client/extensions/portable-extension.js.map +1 -1
  386. package/dist/client/frame-protocol.d.ts +17 -2
  387. package/dist/client/frame-protocol.d.ts.map +1 -1
  388. package/dist/client/frame-protocol.js.map +1 -1
  389. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +2 -2
  390. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
  391. package/dist/client/sharing/ShareButton.d.ts +2 -0
  392. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  393. package/dist/client/sharing/ShareButton.js +7 -6
  394. package/dist/client/sharing/ShareButton.js.map +1 -1
  395. package/dist/client/use-agent-engine-configured.d.ts +5 -0
  396. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  397. package/dist/client/use-agent-engine-configured.js +51 -25
  398. package/dist/client/use-agent-engine-configured.js.map +1 -1
  399. package/dist/code-agents/transcript-normalizer.js +1 -1
  400. package/dist/code-agents/transcript-normalizer.js.map +1 -1
  401. package/dist/collab/routes.d.ts +1 -1
  402. package/dist/extensions/path.d.ts +1 -1
  403. package/dist/extensions/path.d.ts.map +1 -1
  404. package/dist/extensions/path.js.map +1 -1
  405. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  406. package/dist/integrations/a2a-continuation-processor.js +1 -1
  407. package/dist/integrations/a2a-continuation-processor.js.map +1 -1
  408. package/dist/mcp/build-server.d.ts +1 -1
  409. package/dist/mcp/build-server.d.ts.map +1 -1
  410. package/dist/mcp/build-server.js.map +1 -1
  411. package/dist/notifications/routes.d.ts +3 -3
  412. package/dist/observability/routes.d.ts +5 -5
  413. package/dist/org/handlers.js +5 -5
  414. package/dist/org/handlers.js.map +1 -1
  415. package/dist/org/plugin.js +2 -2
  416. package/dist/org/plugin.js.map +1 -1
  417. package/dist/scripts/call-agent.js +1 -1
  418. package/dist/scripts/call-agent.js.map +1 -1
  419. package/dist/scripts/db/safety.js +1 -1
  420. package/dist/scripts/db/safety.js.map +1 -1
  421. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  422. package/dist/server/auth.d.ts.map +1 -1
  423. package/dist/server/auth.js +3 -0
  424. package/dist/server/auth.js.map +1 -1
  425. package/dist/server/builder-design-systems.d.ts +28 -0
  426. package/dist/server/builder-design-systems.d.ts.map +1 -0
  427. package/dist/server/builder-design-systems.js +217 -0
  428. package/dist/server/builder-design-systems.js.map +1 -0
  429. package/dist/server/core-routes-plugin.d.ts +1 -0
  430. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  431. package/dist/server/core-routes-plugin.js +20 -3
  432. package/dist/server/core-routes-plugin.js.map +1 -1
  433. package/dist/server/index.d.ts +1 -0
  434. package/dist/server/index.d.ts.map +1 -1
  435. package/dist/server/index.js +1 -0
  436. package/dist/server/index.js.map +1 -1
  437. package/dist/server/transcribe-voice.d.ts +1 -1
  438. package/dist/server/transcribe-voice.d.ts.map +1 -1
  439. package/dist/server/transcribe-voice.js +40 -24
  440. package/dist/server/transcribe-voice.js.map +1 -1
  441. package/dist/shared/mcp-embed-headers.d.ts +1 -0
  442. package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
  443. package/dist/shared/mcp-embed-headers.js +20 -1
  444. package/dist/shared/mcp-embed-headers.js.map +1 -1
  445. package/dist/styles/agent-native.css +60 -4
  446. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  447. package/dist/usage/store.js +2 -2
  448. package/dist/usage/store.js.map +1 -1
  449. package/dist/vite/client.d.ts.map +1 -1
  450. package/dist/vite/client.js +2 -0
  451. package/dist/vite/client.js.map +1 -1
  452. package/dist/voice/index.d.ts +5 -0
  453. package/dist/voice/index.d.ts.map +1 -0
  454. package/dist/voice/index.js +4 -0
  455. package/dist/voice/index.js.map +1 -0
  456. package/dist/voice/voice-cleanup-prompt.d.ts +6 -0
  457. package/dist/voice/voice-cleanup-prompt.d.ts.map +1 -0
  458. package/dist/voice/voice-cleanup-prompt.js +26 -0
  459. package/dist/voice/voice-cleanup-prompt.js.map +1 -0
  460. package/dist/voice/voice-context.d.ts +25 -0
  461. package/dist/voice/voice-context.d.ts.map +1 -0
  462. package/dist/voice/voice-context.js +156 -0
  463. package/dist/voice/voice-context.js.map +1 -0
  464. package/dist/voice/voice-replacements.d.ts +4 -0
  465. package/dist/voice/voice-replacements.d.ts.map +1 -0
  466. package/dist/voice/voice-replacements.js +52 -0
  467. package/dist/voice/voice-replacements.js.map +1 -0
  468. package/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
  469. package/docs/content/locales/ar-SA/template-design.mdx +55 -1
  470. package/docs/content/locales/de-DE/skills-guide.mdx +5 -0
  471. package/docs/content/locales/de-DE/template-design.mdx +66 -1
  472. package/docs/content/locales/es-ES/skills-guide.mdx +5 -0
  473. package/docs/content/locales/es-ES/template-design.mdx +65 -1
  474. package/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
  475. package/docs/content/locales/fr-FR/template-design.mdx +64 -1
  476. package/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
  477. package/docs/content/locales/hi-IN/template-design.mdx +59 -1
  478. package/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
  479. package/docs/content/locales/ja-JP/template-design.mdx +62 -1
  480. package/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
  481. package/docs/content/locales/ko-KR/template-design.mdx +58 -1
  482. package/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
  483. package/docs/content/locales/pt-BR/template-design.mdx +62 -1
  484. package/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
  485. package/docs/content/locales/zh-CN/template-design.mdx +50 -1
  486. package/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
  487. package/docs/content/locales/zh-TW/template-design.mdx +52 -1
  488. package/docs/content/skills-guide.mdx +5 -0
  489. package/docs/content/template-design.mdx +59 -1
  490. package/package.json +2 -1
  491. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  492. package/corpus/templates/design/actions/import-figma-file.ts +0 -166
  493. package/corpus/templates/design/app/components/design/DesignToolbar.tsx +0 -339
  494. package/corpus/templates/design/app/components/design/PresentMode.tsx +0 -68
  495. package/corpus/templates/design/app/components/design/ViewportTabs.tsx +0 -149
  496. package/corpus/templates/design/app/components/design/ZoomControls.tsx +0 -157
  497. package/corpus/templates/slides/server/lib/fig-design-system.ts +0 -110
@@ -0,0 +1,329 @@
1
+ import { useEffect, useRef } from "react";
2
+
3
+ export type DesignHotkeyTool =
4
+ | "move"
5
+ | "frame"
6
+ | "rectangle"
7
+ | "text"
8
+ | "pen"
9
+ | "hand"
10
+ | "comment"
11
+ | "scale";
12
+
13
+ export type DesignHotkeyDirection = "up" | "right" | "down" | "left";
14
+
15
+ export interface DesignHotkeyDetails {
16
+ event: KeyboardEvent;
17
+ key: string;
18
+ primary: boolean;
19
+ shift: boolean;
20
+ alt: boolean;
21
+ repeat: boolean;
22
+ }
23
+
24
+ export interface DesignHotkeyNudgeDetails extends DesignHotkeyDetails {
25
+ direction: DesignHotkeyDirection;
26
+ largeStep: boolean;
27
+ }
28
+
29
+ export interface DesignHotkeyTabDetails extends DesignHotkeyDetails {
30
+ backwards: boolean;
31
+ }
32
+
33
+ export type DesignHotkeyTarget = Window | Document | HTMLElement;
34
+ export type DesignHotkeyHandler = (details: DesignHotkeyDetails) => void;
35
+ export type DesignHotkeyToolHandler = (
36
+ tool: DesignHotkeyTool,
37
+ details: DesignHotkeyDetails,
38
+ ) => void;
39
+ export type DesignHotkeyNudgeHandler = (
40
+ details: DesignHotkeyNudgeDetails,
41
+ ) => void;
42
+ export type DesignHotkeyTabHandler = (details: DesignHotkeyTabDetails) => void;
43
+
44
+ export interface UseDesignHotkeysProps {
45
+ enabled?: boolean;
46
+ capture?: boolean;
47
+ target?: DesignHotkeyTarget | null;
48
+ preventDefault?: boolean;
49
+ ignoreEditableTargets?: boolean;
50
+ shouldHandleEvent?: (event: KeyboardEvent) => boolean;
51
+ onToolChange?: DesignHotkeyToolHandler;
52
+ onMoveTool?: DesignHotkeyHandler;
53
+ onFrameTool?: DesignHotkeyHandler;
54
+ onRectangleTool?: DesignHotkeyHandler;
55
+ onTextTool?: DesignHotkeyHandler;
56
+ onPenTool?: DesignHotkeyHandler;
57
+ onHandTool?: DesignHotkeyHandler;
58
+ onCommentTool?: DesignHotkeyHandler;
59
+ onScaleTool?: DesignHotkeyHandler;
60
+ onCopy?: DesignHotkeyHandler;
61
+ onCut?: DesignHotkeyHandler;
62
+ onPaste?: DesignHotkeyHandler;
63
+ onPasteOver?: DesignHotkeyHandler;
64
+ onCopyProps?: DesignHotkeyHandler;
65
+ onPasteProps?: DesignHotkeyHandler;
66
+ onCopyAsCode?: DesignHotkeyHandler;
67
+ onDuplicate?: DesignHotkeyHandler;
68
+ onDelete?: DesignHotkeyHandler;
69
+ onRename?: DesignHotkeyHandler;
70
+ onSelectAll?: DesignHotkeyHandler;
71
+ onGroup?: DesignHotkeyHandler;
72
+ onUngroup?: DesignHotkeyHandler;
73
+ onUndo?: DesignHotkeyHandler;
74
+ onRedo?: DesignHotkeyHandler;
75
+ onBringForward?: DesignHotkeyHandler;
76
+ onBringToFront?: DesignHotkeyHandler;
77
+ onSendBackward?: DesignHotkeyHandler;
78
+ onSendToBack?: DesignHotkeyHandler;
79
+ onEscape?: DesignHotkeyHandler;
80
+ onEnter?: DesignHotkeyHandler;
81
+ onTab?: DesignHotkeyTabHandler;
82
+ onNudge?: DesignHotkeyNudgeHandler;
83
+ onZoomIn?: DesignHotkeyHandler;
84
+ onZoomOut?: DesignHotkeyHandler;
85
+ onZoomReset?: DesignHotkeyHandler;
86
+ onZoomToFit?: DesignHotkeyHandler;
87
+ onZoomToSelection?: DesignHotkeyHandler;
88
+ }
89
+
90
+ const TOOL_SHORTCUTS: Record<
91
+ string,
92
+ { tool: DesignHotkeyTool; handler: keyof UseDesignHotkeysProps }
93
+ > = {
94
+ v: { tool: "move", handler: "onMoveTool" },
95
+ f: { tool: "frame", handler: "onFrameTool" },
96
+ r: { tool: "rectangle", handler: "onRectangleTool" },
97
+ t: { tool: "text", handler: "onTextTool" },
98
+ p: { tool: "pen", handler: "onPenTool" },
99
+ h: { tool: "hand", handler: "onHandTool" },
100
+ c: { tool: "comment", handler: "onCommentTool" },
101
+ k: { tool: "scale", handler: "onScaleTool" },
102
+ };
103
+
104
+ const ARROW_DIRECTIONS: Record<string, DesignHotkeyDirection> = {
105
+ ArrowUp: "up",
106
+ ArrowRight: "right",
107
+ ArrowDown: "down",
108
+ ArrowLeft: "left",
109
+ };
110
+
111
+ export function isDesignHotkeyEditableTarget(target: EventTarget | null) {
112
+ if (!target || typeof Element === "undefined") return false;
113
+ if (!(target instanceof Element)) return false;
114
+
115
+ const editable = target.closest(
116
+ [
117
+ "input",
118
+ "textarea",
119
+ "select",
120
+ "[contenteditable]",
121
+ '[role="textbox"]',
122
+ '[data-hotkeys-scope="text"]',
123
+ ].join(","),
124
+ );
125
+
126
+ if (!editable) return false;
127
+ if (editable instanceof HTMLElement && editable.isContentEditable) {
128
+ return true;
129
+ }
130
+ const tagName = editable.tagName.toLowerCase();
131
+ return tagName === "input" || tagName === "textarea" || tagName === "select";
132
+ }
133
+
134
+ function isFocusableChromeTarget(target: EventTarget | null) {
135
+ if (!target || typeof Element === "undefined") return false;
136
+ if (!(target instanceof Element)) return false;
137
+ if (target === document.body || target === document.documentElement) {
138
+ return false;
139
+ }
140
+ return Boolean(
141
+ target.closest(
142
+ [
143
+ "a[href]",
144
+ "button",
145
+ "summary",
146
+ "input",
147
+ "textarea",
148
+ "select",
149
+ "[contenteditable]",
150
+ '[role="button"]',
151
+ '[role="menuitem"]',
152
+ '[role="option"]',
153
+ '[role="tab"]',
154
+ '[tabindex]:not([tabindex="-1"])',
155
+ ].join(","),
156
+ ),
157
+ );
158
+ }
159
+
160
+ export function useDesignHotkeys(props: UseDesignHotkeysProps) {
161
+ const propsRef = useRef(props);
162
+
163
+ useEffect(() => {
164
+ propsRef.current = props;
165
+ }, [props]);
166
+
167
+ useEffect(() => {
168
+ const eventTarget =
169
+ props.target ??
170
+ (typeof window === "undefined" ? null : (window as DesignHotkeyTarget));
171
+ if (!eventTarget || props.enabled === false) return;
172
+
173
+ const handleKeyDown = (event: Event) => {
174
+ if (!(event instanceof KeyboardEvent)) return;
175
+ const current = propsRef.current;
176
+ if (current.enabled === false) return;
177
+ if (event.defaultPrevented || event.isComposing) return;
178
+ if (current.shouldHandleEvent && !current.shouldHandleEvent(event))
179
+ return;
180
+ if (
181
+ current.ignoreEditableTargets !== false &&
182
+ isDesignHotkeyEditableTarget(event.target)
183
+ ) {
184
+ return;
185
+ }
186
+
187
+ handleDesignHotkey(event, current);
188
+ };
189
+
190
+ eventTarget.addEventListener("keydown", handleKeyDown, {
191
+ capture: props.capture,
192
+ });
193
+ return () => {
194
+ eventTarget.removeEventListener("keydown", handleKeyDown, {
195
+ capture: props.capture,
196
+ });
197
+ };
198
+ }, [props.capture, props.enabled, props.target]);
199
+ }
200
+
201
+ function handleDesignHotkey(
202
+ event: KeyboardEvent,
203
+ props: UseDesignHotkeysProps,
204
+ ) {
205
+ const key = normalizedKey(event);
206
+ const primary = event.metaKey || event.ctrlKey;
207
+ const details: DesignHotkeyDetails = {
208
+ event,
209
+ key,
210
+ primary,
211
+ shift: event.shiftKey,
212
+ alt: event.altKey,
213
+ repeat: event.repeat,
214
+ };
215
+
216
+ const prevent = () => {
217
+ if (props.preventDefault !== false) event.preventDefault();
218
+ };
219
+
220
+ const run = (handler: DesignHotkeyHandler | undefined) => {
221
+ if (!handler) return false;
222
+ prevent();
223
+ handler(details);
224
+ return true;
225
+ };
226
+
227
+ const runTool = (
228
+ tool: DesignHotkeyTool,
229
+ handler: DesignHotkeyHandler | undefined,
230
+ ) => {
231
+ if (!handler && !props.onToolChange) return false;
232
+ prevent();
233
+ handler?.(details);
234
+ props.onToolChange?.(tool, details);
235
+ return true;
236
+ };
237
+
238
+ const runNudge = (direction: DesignHotkeyDirection) => {
239
+ if (!props.onNudge) return false;
240
+ prevent();
241
+ props.onNudge({
242
+ ...details,
243
+ direction,
244
+ largeStep: event.shiftKey,
245
+ });
246
+ return true;
247
+ };
248
+
249
+ if (!primary && !event.altKey && !event.shiftKey) {
250
+ const toolShortcut = TOOL_SHORTCUTS[key];
251
+ if (toolShortcut) {
252
+ return runTool(
253
+ toolShortcut.tool,
254
+ props[toolShortcut.handler] as DesignHotkeyHandler | undefined,
255
+ );
256
+ }
257
+ }
258
+
259
+ if (event.key in ARROW_DIRECTIONS && !primary && !event.altKey) {
260
+ return runNudge(ARROW_DIRECTIONS[event.key]);
261
+ }
262
+
263
+ if (event.key === "Escape") return run(props.onEscape);
264
+ if (event.key === "Enter") return run(props.onEnter);
265
+ if (
266
+ event.key === "Tab" &&
267
+ props.onTab &&
268
+ !isFocusableChromeTarget(event.target)
269
+ ) {
270
+ prevent();
271
+ props.onTab({ ...details, backwards: event.shiftKey });
272
+ return true;
273
+ }
274
+ if ((event.key === "Delete" || event.key === "Backspace") && !primary) {
275
+ return run(props.onDelete);
276
+ }
277
+
278
+ if (primary && key === "z") {
279
+ return event.shiftKey ? run(props.onRedo) : run(props.onUndo);
280
+ }
281
+ if (primary && key === "y") return run(props.onRedo);
282
+ if (primary && key === "a") return run(props.onSelectAll);
283
+ if (primary && key === "x") return run(props.onCut);
284
+ if (primary && key === "c") {
285
+ if (event.altKey) return run(props.onCopyProps);
286
+ if (event.shiftKey) return run(props.onCopyAsCode);
287
+ return run(props.onCopy);
288
+ }
289
+ if (primary && key === "v") {
290
+ if (event.altKey) return run(props.onPasteProps);
291
+ if (event.shiftKey) return run(props.onPasteOver);
292
+ return run(props.onPaste);
293
+ }
294
+ if (primary && key === "d") return run(props.onDuplicate);
295
+ if (primary && key === "g") {
296
+ return event.shiftKey ? run(props.onUngroup) : run(props.onGroup);
297
+ }
298
+
299
+ if (primary && (key === "=" || key === "+")) return run(props.onZoomIn);
300
+ if (primary && key === "-") return run(props.onZoomOut);
301
+ if (primary && key === "0") return run(props.onZoomReset);
302
+
303
+ const digit = digitFromEvent(event);
304
+ if ((primary || event.shiftKey) && digit === "1") {
305
+ return run(props.onZoomToFit);
306
+ }
307
+ if ((primary || event.shiftKey) && digit === "2") {
308
+ return run(props.onZoomToSelection);
309
+ }
310
+
311
+ if (primary && key === "]") {
312
+ return event.altKey ? run(props.onBringToFront) : run(props.onBringForward);
313
+ }
314
+ if (primary && key === "[") {
315
+ return event.altKey ? run(props.onSendToBack) : run(props.onSendBackward);
316
+ }
317
+
318
+ return false;
319
+ }
320
+
321
+ function normalizedKey(event: KeyboardEvent) {
322
+ if (event.key === " ") return "space";
323
+ return event.key.length === 1 ? event.key.toLowerCase() : event.key;
324
+ }
325
+
326
+ function digitFromEvent(event: KeyboardEvent) {
327
+ if (event.code.startsWith("Digit")) return event.code.slice("Digit".length);
328
+ return /^[0-9]$/.test(event.key) ? event.key : "";
329
+ }
@@ -52,10 +52,21 @@ const messages = {
52
52
  page: "頁面",
53
53
  typography: "版式",
54
54
  flexLayout: "彈性布局",
55
+ autoLayout: "自動布局",
56
+ positionLayout: "位置",
55
57
  layout: "布局",
56
58
  spacing: "間距",
57
59
  border: "邊界",
58
60
  fill: "充滿",
61
+ stroke: "描邊",
62
+ effects: "效果",
63
+ codeConfidence: "程式碼",
64
+ export: "匯出",
65
+ },
66
+ textResize: {
67
+ autoWidth: "自動寬度",
68
+ autoHeight: "自動高度",
69
+ fixed: "固定大小",
59
70
  },
60
71
  labels: {
61
72
  background: "背景",
@@ -76,6 +87,71 @@ const messages = {
76
87
  padding: "填充",
77
88
  margin: "利潤",
78
89
  radius: "半徑",
90
+ flexGrow: "增長",
91
+ flexShrink: "收縮",
92
+ flexBasis: "基準",
93
+ order: "順序",
94
+ alignSelf: "自身對齊",
95
+ gridColumn: "欄",
96
+ gridRow: "列",
97
+ position: "位置",
98
+ display: "顯示",
99
+ image: "圖片",
100
+ style: "樣式",
101
+ rotation: "旋轉",
102
+ flipHorizontal: "水平翻轉",
103
+ flipVertical: "垂直翻轉",
104
+ shadow: "陰影",
105
+ filter: "濾鏡",
106
+ addLayer: "新增圖層",
107
+ removeLayer: "移除圖層",
108
+ showLayer: "顯示圖層",
109
+ hideLayer: "隱藏圖層",
110
+ linkSides: "連結四邊",
111
+ unlinkSides: "取消連結四邊",
112
+ allSides: "全部",
113
+ cornerRadius: "圓角半徑",
114
+ independentCorners: "獨立圓角",
115
+ topLeft: "左上",
116
+ topRight: "右上",
117
+ bottomLeft: "左下",
118
+ bottomRight: "右下",
119
+ blend: "混合",
120
+ border: "邊框",
121
+ outline: "外框",
122
+ inside: "內側",
123
+ outside: "外側",
124
+ dropShadow: "投影",
125
+ addDropShadow: "新增投影",
126
+ innerShadow: "內陰影",
127
+ layerBlur: "圖層模糊",
128
+ blur: "模糊",
129
+ spread: "擴散",
130
+ },
131
+ selection: {
132
+ pageContext: "頁面預設",
133
+ },
134
+ layoutContext: {
135
+ container: "容器",
136
+ child: "子層",
137
+ gridChild: "格線子層",
138
+ parent: "父層",
139
+ flexContainer: "彈性",
140
+ notContainer: "一般流",
141
+ flexChild: "彈性子層",
142
+ flowChild: "流式子層",
143
+ flowDescription:
144
+ "此圖層位於一般文件流中。可使用位置控制進行明確偏移,或請代理調整結構布局。",
145
+ },
146
+ codeStatus: {
147
+ safeStyle: "安全樣式編輯",
148
+ safeStyleDescription:
149
+ "這些控制項會先套用即時樣式,再持久寫回 HTML 原始碼。",
150
+ classTarget: "穩定 class/id 目標",
151
+ selectorFallback: "選擇器備援",
152
+ agentStructural: "結構移動需要代理",
153
+ agentStructuralDescription:
154
+ "移動、包裹層與父層布局重寫需要代理保留意圖。",
79
155
  },
80
156
  sidePlaceholders: {
81
157
  top: "時間",
@@ -131,6 +207,36 @@ const messages = {
131
207
  stretch: "拉緊",
132
208
  baseline: "基線",
133
209
  },
210
+ alignSelfOptions: {
211
+ auto: "自動",
212
+ start: "起點",
213
+ center: "置中",
214
+ end: "終點",
215
+ stretch: "延展",
216
+ baseline: "基線",
217
+ },
218
+ displayOptions: {
219
+ block: "區塊",
220
+ flex: "彈性",
221
+ grid: "格線",
222
+ inline: "行內",
223
+ inlineBlock: "行內區塊",
224
+ none: "無",
225
+ },
226
+ positionOptions: {
227
+ static: "靜態",
228
+ relative: "相對",
229
+ absolute: "絕對",
230
+ fixed: "固定",
231
+ sticky: "黏著",
232
+ },
233
+ borderStyleOptions: {
234
+ none: "無",
235
+ solid: "實線",
236
+ dashed: "虛線",
237
+ dotted: "點線",
238
+ double: "雙線",
239
+ },
134
240
  },
135
241
  designEditor: {
136
242
  generationMayHaveStopped:
@@ -141,15 +247,38 @@ const messages = {
141
247
  notFound: "未找到設計",
142
248
  backToDesigns: "返回設計",
143
249
  clickToRename: "點選重新命名",
250
+ collaborators: "協作者",
144
251
  modes: {
252
+ annotate: "註解",
145
253
  comment: "評論",
146
254
  edit: "編輯",
147
255
  draw: "畫",
256
+ interact: "Interact",
257
+ screens: "螢幕",
258
+ },
259
+ fileTabs: "檔案",
260
+ tools: {
261
+ move: "移動",
262
+ frame: "畫框",
263
+ rect: "矩形",
264
+ line: "線條",
265
+ arrow: "箭頭",
266
+ ellipse: "橢圓",
267
+ polygon: "多邊形",
268
+ star: "星形",
269
+ imageVideo: "圖片/影片...",
270
+ text: "文字",
271
+ pen: "鋼筆",
272
+ hand: "手形",
273
+ scale: "縮放",
148
274
  },
149
275
  undo: "復原",
150
276
  undoShortcut: "復原 (⌘Z)",
151
277
  redo: "重做",
152
278
  redoShortcut: "重做 (⇧⌘Z)",
279
+ duplicate: "複製",
280
+ delete: "刪除",
281
+ view: "檢視",
153
282
  returnToCurrentScreen: "返回目前螢幕",
154
283
  openScreenOverview: "開啟螢幕概覽",
155
284
  currentScreen: "目前螢幕",
@@ -196,6 +325,16 @@ const messages = {
196
325
  addTweakControls: "新增調整控制項",
197
326
  closeTweaks: "關閉調整",
198
327
  noTweakControls: "還沒有調整控制項。",
328
+ extensions: "擴充功能",
329
+ addExtension: "擴充功能",
330
+ extensionsDocs: "文件",
331
+ extensionsPromptTitle: "這個擴充功能應該做什麼?",
332
+ extensionsPlaceholder: "樣式工具、選取輔助、畫板操作...",
333
+ extensionsEmptyTitle: "還沒有編輯器擴充功能",
334
+ extensionsEmptyDescription:
335
+ "建立一個小型檢查器擴充功能,用來讀取所選元素、呼叫操作,或請代理更新畫板。",
336
+ extensionsAvailable: "可用",
337
+ extensionsInstall: "新增",
199
338
  generatePlaceholder: "描述您想要建置的內容...",
200
339
  tweaksPromptTitle: "您想要哪些調整?",
201
340
  tweaksPlaceholder: "強調色選項、密度、圓角、深色模式...",
@@ -213,6 +352,29 @@ const messages = {
213
352
  closeOtherTabs: "關閉其他",
214
353
  closeTab: "關閉",
215
354
  fitToScreen: "適合螢幕",
355
+ patchProof: {
356
+ title: "補丁證明",
357
+ file: "檔案",
358
+ source: "來源",
359
+ capability: "能力",
360
+ pending: "已套用即時預覽;來源寫入待處理",
361
+ verified: "來源寫入已驗證;可回復",
362
+ rollback: "回復",
363
+ keep: "保留",
364
+ selectorMissing: "選取的元素已不在此畫面中。",
365
+ status: {
366
+ runtime: "已套用即時樣式",
367
+ queued: "正在寫入來源補丁",
368
+ applied: "補丁已套用",
369
+ failed: "補丁失敗",
370
+ rolledBack: "已回復",
371
+ },
372
+ },
373
+ capabilities: {
374
+ "deterministic-style-edit": "安全樣式編輯",
375
+ "deterministic-class-edit": "安全 class 編輯",
376
+ "agent-structural-edit": "結構移動需要代理",
377
+ },
216
378
  toasts: {
217
379
  codingHandoffError: "無法建立編碼交接",
218
380
  codingHandoffCopied: "編碼交接已複製",
@@ -231,7 +393,83 @@ const messages = {
231
393
  openScreenSvg: "匯出 SVG 前請先開啟一個螢幕",
232
394
  svgDownloaded: "SVG 已下載",
233
395
  svgExportError: "無法匯出 SVG",
396
+ screenDuplicated: "畫面已複製",
397
+ screenDuplicateError: "無法複製畫面",
398
+ copied: "已複製",
399
+ pasted: "已貼上",
400
+ deleted: "已刪除",
401
+ propsCopied: "屬性已複製",
402
+ propsPasted: "屬性已貼上",
403
+ primitiveInsertFailed: "無法將該圖層新增到畫面",
404
+ layerMoveFailed: "無法移動該圖層",
405
+ },
406
+ },
407
+ layersPanel: {
408
+ title: "圖層",
409
+ screens: "畫面",
410
+ thumbnail: "縮圖",
411
+ addScreen: "新增畫面",
412
+ searchPlaceholder: "搜尋圖層...",
413
+ empty: "沒有圖層",
414
+ noMatches: "沒有符合的圖層",
415
+ designLayers: "設計圖層",
416
+ codeLayers: "程式碼圖層",
417
+ elementLayers: "元素圖層",
418
+ collapse: "收合圖層",
419
+ expand: "展開圖層",
420
+ lock: "鎖定圖層",
421
+ unlock: "解除鎖定圖層",
422
+ hide: "隱藏圖層",
423
+ show: "顯示圖層",
424
+ rename: "重新命名圖層",
425
+ selected: "已選取 {{count}} 個",
426
+ },
427
+ multiScreenCanvas: {
428
+ duplicate: "複製",
429
+ fork: "分支",
430
+ fullView: "完整檢視",
431
+ preview: "預覽",
432
+ openAndDuplicate: "選取 {{display}}。使用完整檢視進行聚焦捲動。",
433
+ openAndPreview: "選取 {{display}}。使用完整檢視進行聚焦捲動。",
434
+ doubleClickToEdit: "使用完整檢視進行聚焦捲動",
435
+ sources: {
436
+ localhost: { label: "本機", title: "由本機開發伺服器渲染" },
437
+ fusion: { label: "Fusion 遠端", title: "由 Fusion 渲染" },
438
+ inline: { label: "內嵌", title: "由內嵌程式碼渲染" },
234
439
  },
440
+ previews: {
441
+ live: { label: "即時", shortLabel: "即時框架", title: "即時預覽" },
442
+ snapshot: { label: "快照", shortLabel: "快照", title: "靜態快取快照" },
443
+ preview: { label: "預覽", shortLabel: "預覽", title: "內嵌預覽" },
444
+ },
445
+ },
446
+ questionFlow: {
447
+ defaultTitle: "先塑造設計",
448
+ defaultDescription: "回答高槓桿選項。代理可判斷的部分可以略過。",
449
+ answeredCount: "已回答 {{answered}} / {{total}}",
450
+ requiredCount: "必填 {{answered}} / {{total}}",
451
+ multiSelectHelp: "多選題可選多個籤。方向很精確時請使用其他。",
452
+ ready: "已可繼續。",
453
+ answerRequired: "回答必填卡片後才能繼續。",
454
+ skip: "略過",
455
+ continue: "繼續",
456
+ chooseAny: "選取所有適用項目",
457
+ chooseOne: "選擇一項",
458
+ required: "必填",
459
+ textPlaceholder: "輸入您的回答...",
460
+ selectedCount: "已選取 {{count}} 個。繼續前可新增或移除籤。",
461
+ selectUseful: "選取所有有用項目。",
462
+ other: "其他",
463
+ otherDescription: "清楚告訴代理您的意思。",
464
+ customPlaceholder: "輸入自訂回答...",
465
+ recommended: "建議",
466
+ dragFiles: "將檔案拖到這裡或",
467
+ browse: "瀏覽",
468
+ removeFile: "移除 {{name}}",
469
+ exploreLabel: "探索幾個選項",
470
+ exploreDescription: "定案前先展示不同方向。",
471
+ decideLabel: "幫我決定",
472
+ decideDescription: "用判斷力繼續推進。",
235
473
  },
236
474
  promptDialog: {
237
475
  assetsTitle: "Assets",
@@ -270,6 +508,45 @@ const messages = {
270
508
  send: "傳送",
271
509
  commentSent: "評論已傳送",
272
510
  comment: "評論",
511
+ annotationQueue: "註記佇列",
512
+ annotationQueueCounts: "{{queued}} 排隊 · {{sent}} 已送出",
513
+ batchApply: "批次套用",
514
+ queued: "已排隊",
515
+ queuedStatus: "已排隊 - {{status}}",
516
+ commentSentStatus: "評論已傳送 - {{status}}",
517
+ commentStatus: "評論 - {{status}}",
518
+ anchorLabel: "錨點 {{id}}",
519
+ nearText: "靠近「{{text}}」",
520
+ submitShortcut: "{{mod}}+Enter 送出",
521
+ queue: "排隊",
522
+ pinStatus: {
523
+ deterministic: {
524
+ label: "確定性",
525
+ shortLabel: "直接",
526
+ detail: "已錨定到圖層或選擇器,通常可直接處理。",
527
+ },
528
+ "needs-agent": {
529
+ label: "需要代理",
530
+ shortLabel: "代理",
531
+ detail: "需要解讀,或只有畫布位置脈絡。",
532
+ },
533
+ conflict: {
534
+ label: "衝突",
535
+ shortLabel: "衝突",
536
+ detail: "可能與另一個佇列中的註解重疊或衝突。",
537
+ },
538
+ unsupported: {
539
+ label: "不支援",
540
+ shortLabel: "阻擋",
541
+ detail: "可能超出此畫布編輯範圍。",
542
+ },
543
+ },
544
+ pinStatusCount: {
545
+ direct: "直接 {{count}}",
546
+ agent: "代理 {{count}}",
547
+ conflict: "衝突 {{count}}",
548
+ blocked: "阻擋 {{count}}",
549
+ },
273
550
  },
274
551
  home: {
275
552
  pageTitle: "Design",