@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
@@ -1,6 +1,11 @@
1
1
  import { useT } from "@agent-native/core/client";
2
2
  import type { TweakDefinition } from "@shared/api";
3
- import { IconX, IconGripHorizontal, IconPlus } from "@tabler/icons-react";
3
+ import {
4
+ IconX,
5
+ IconGripHorizontal,
6
+ IconPlus,
7
+ IconAdjustmentsHorizontal,
8
+ } from "@tabler/icons-react";
4
9
  import { useState, useRef, useCallback } from "react";
5
10
 
6
11
  import { Button } from "@/components/ui/button";
@@ -22,6 +27,58 @@ interface TweaksPanelProps {
22
27
  visible: boolean;
23
28
  }
24
29
 
30
+ interface TweaksPanelContentProps {
31
+ tweaks: TweakDefinition[];
32
+ values: Record<string, string | number | boolean>;
33
+ onChange: (id: string, value: string | number | boolean) => void;
34
+ onRequestTweaks?: (anchor: HTMLElement) => void;
35
+ className?: string;
36
+ }
37
+
38
+ export function TweaksPanelContent({
39
+ tweaks,
40
+ values,
41
+ onChange,
42
+ onRequestTweaks,
43
+ className,
44
+ }: TweaksPanelContentProps) {
45
+ const t = useT();
46
+
47
+ return (
48
+ <div className={cn("space-y-1.5", className)}>
49
+ {tweaks.length > 0 ? (
50
+ tweaks.map((tweak) => (
51
+ <TweakControl
52
+ key={tweak.id}
53
+ tweak={tweak}
54
+ value={values[tweak.id] ?? tweak.defaultValue}
55
+ onChange={(v) => onChange(tweak.id, v)}
56
+ />
57
+ ))
58
+ ) : (
59
+ <div className="flex flex-col items-center gap-2 py-6 text-center">
60
+ <IconAdjustmentsHorizontal className="size-5 text-muted-foreground/40" />
61
+ <p className="text-[11px] leading-snug text-muted-foreground/70">
62
+ {t("designEditor.noTweakControls")}
63
+ </p>
64
+ {onRequestTweaks && (
65
+ <Button
66
+ type="button"
67
+ variant="outline"
68
+ size="sm"
69
+ className="h-6 cursor-pointer px-2.5 text-[11px]"
70
+ onClick={(e) => onRequestTweaks(e.currentTarget)}
71
+ >
72
+ <IconPlus className="size-3" />
73
+ {t("designEditor.addTweakControls")}
74
+ </Button>
75
+ )}
76
+ </div>
77
+ )}
78
+ </div>
79
+ );
80
+ }
81
+
25
82
  export function TweaksPanel({
26
83
  tweaks,
27
84
  values,
@@ -85,18 +142,18 @@ export function TweaksPanel({
85
142
  className="fixed z-[70] w-60 rounded-xl border border-border bg-card shadow-2xl backdrop-blur-sm"
86
143
  style={{ right: position.x, bottom: position.y }}
87
144
  >
88
- {/* Header — drag handle + collapse toggle */}
145
+ {/* Header — drag handle + collapse toggle + actions */}
89
146
  <div
90
- className="flex cursor-grab select-none items-center justify-between px-3 pt-2.5 pb-1.5 active:cursor-grabbing"
147
+ className="flex min-h-8 cursor-grab select-none items-center justify-between px-3 active:cursor-grabbing"
91
148
  onMouseDown={handleMouseDown}
92
149
  >
93
150
  <div className="flex items-center gap-1.5">
94
- <IconGripHorizontal className="h-3 w-3 text-muted-foreground/60" />
151
+ <IconGripHorizontal className="size-3 text-muted-foreground/40" />
95
152
  <button
96
153
  type="button"
97
154
  onMouseDown={(e) => e.stopPropagation()}
98
155
  onClick={() => setCollapsed((c) => !c)}
99
- className="cursor-pointer text-[11px] font-semibold uppercase tracking-wider text-muted-foreground hover:text-muted-foreground"
156
+ className="cursor-pointer text-[11px] font-semibold text-foreground hover:text-foreground/80"
100
157
  >
101
158
  {t("designEditor.tweaks")}
102
159
  </button>
@@ -114,10 +171,10 @@ export function TweaksPanel({
114
171
  e.stopPropagation();
115
172
  onRequestTweaks(e.currentTarget);
116
173
  }}
117
- className="size-6 cursor-pointer text-muted-foreground/70 hover:text-foreground"
174
+ className="size-6 cursor-pointer text-muted-foreground/60 hover:text-foreground"
118
175
  aria-label={t("designEditor.addTweaks")}
119
176
  >
120
- <IconPlus className="h-3.5 w-3.5" />
177
+ <IconPlus className="size-3" />
121
178
  </Button>
122
179
  </TooltipTrigger>
123
180
  <TooltipContent>{t("designEditor.addTweaks")}</TooltipContent>
@@ -130,46 +187,26 @@ export function TweaksPanel({
130
187
  e.stopPropagation();
131
188
  onClose();
132
189
  }}
133
- className="flex size-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 hover:bg-accent hover:text-muted-foreground"
190
+ className="flex size-6 cursor-pointer items-center justify-center rounded text-muted-foreground/60 hover:bg-accent hover:text-foreground"
134
191
  aria-label={t("designEditor.closeTweaks")}
135
192
  >
136
- <IconX className="h-3 w-3" />
193
+ <IconX className="size-3" />
137
194
  </button>
138
195
  </div>
139
196
  </div>
140
197
 
141
198
  {/* Body */}
142
199
  {!collapsed && (
143
- <div className="space-y-3.5 px-3 pb-3.5">
144
- {tweaks.length > 0 ? (
145
- tweaks.map((tweak) => (
146
- <TweakControl
147
- key={tweak.id}
148
- tweak={tweak}
149
- value={values[tweak.id] ?? tweak.defaultValue}
150
- onChange={(v) => onChange(tweak.id, v)}
151
- />
152
- ))
153
- ) : (
154
- <div className="space-y-2 rounded-lg border border-dashed border-border/80 bg-muted/20 p-3">
155
- <p className="text-xs leading-relaxed text-muted-foreground">
156
- {t("designEditor.noTweakControls")}
157
- </p>
158
- {onRequestTweaks && (
159
- <Button
160
- type="button"
161
- variant="outline"
162
- size="sm"
163
- className="h-8 w-full cursor-pointer text-xs"
164
- onClick={(e) => onRequestTweaks(e.currentTarget)}
165
- >
166
- <IconPlus className="h-3.5 w-3.5" />
167
- {t("designEditor.addTweakControls")}
168
- </Button>
169
- )}
170
- </div>
171
- )}
172
- </div>
200
+ <>
201
+ <div className="mx-3 border-t border-border/60" />
202
+ <TweaksPanelContent
203
+ tweaks={tweaks}
204
+ values={values}
205
+ onChange={onChange}
206
+ onRequestTweaks={onRequestTweaks}
207
+ className="px-3 py-2"
208
+ />
209
+ </>
173
210
  )}
174
211
  </div>
175
212
  );
@@ -184,15 +221,27 @@ function TweakControl({
184
221
  value: string | number | boolean;
185
222
  onChange: (v: string | number | boolean) => void;
186
223
  }) {
187
- return (
188
- <div>
189
- <div className="mb-1.5 text-[11px] text-muted-foreground">
190
- {tweak.label}
224
+ // Toggle gets an inline row; other types get a label above
225
+ if (tweak.type === "toggle") {
226
+ return (
227
+ <div className="flex h-6 items-center justify-between gap-1.5">
228
+ <span className="text-[11px] text-muted-foreground">{tweak.label}</span>
229
+ <Switch
230
+ checked={!!value}
231
+ onCheckedChange={(checked) => onChange(checked)}
232
+ className="scale-[0.7] origin-right"
233
+ />
191
234
  </div>
235
+ );
236
+ }
237
+
238
+ return (
239
+ <div className="space-y-1">
240
+ <span className="text-[11px] text-muted-foreground">{tweak.label}</span>
192
241
 
193
- {(tweak.type as string) === "color-swatch" ||
194
- (tweak.type as string) === "color-swatches" ? (
195
- <div className="flex gap-2">
242
+ {((tweak.type as string) === "color-swatch" ||
243
+ (tweak.type as string) === "color-swatches") && (
244
+ <div className="flex gap-1.5">
196
245
  {tweak.options?.map((opt) => (
197
246
  <Tooltip key={opt.value}>
198
247
  <TooltipTrigger asChild>
@@ -200,32 +249,32 @@ function TweakControl({
200
249
  type="button"
201
250
  onClick={() => onChange(opt.value)}
202
251
  className={cn(
203
- "h-6 w-6 cursor-pointer rounded-full",
252
+ "size-4 cursor-pointer rounded-sm transition-all",
204
253
  value === opt.value
205
- ? "ring-2 ring-white ring-offset-2 ring-offset-[hsl(240,5%,8%)]"
206
- : "ring-1 ring-white/10 hover:ring-white/30",
254
+ ? "ring-2 ring-foreground/80 ring-offset-1 ring-offset-card"
255
+ : "ring-1 ring-border/60 hover:ring-border",
207
256
  )}
208
- style={{ backgroundColor: opt.color || opt.value }}
257
+ style={{ backgroundColor: opt.color ?? opt.value }}
209
258
  />
210
259
  </TooltipTrigger>
211
260
  <TooltipContent>{opt.label}</TooltipContent>
212
261
  </Tooltip>
213
262
  ))}
214
263
  </div>
215
- ) : null}
264
+ )}
216
265
 
217
266
  {tweak.type === "segment" && (
218
- <div className="flex overflow-hidden rounded-lg border border-border">
267
+ <div className="flex h-6 overflow-hidden rounded border border-border">
219
268
  {tweak.options?.map((opt) => (
220
269
  <button
221
270
  type="button"
222
271
  key={opt.value}
223
272
  onClick={() => onChange(opt.value)}
224
273
  className={cn(
225
- "flex-1 cursor-pointer px-2.5 py-1 text-[11px] font-medium",
274
+ "flex flex-1 cursor-pointer items-center justify-center px-2 text-[11px] font-medium transition-colors",
226
275
  value === opt.value
227
276
  ? "bg-accent text-foreground"
228
- : "text-muted-foreground/70 hover:text-muted-foreground",
277
+ : "text-muted-foreground/70 hover:bg-accent/50 hover:text-foreground",
229
278
  )}
230
279
  >
231
280
  {opt.label}
@@ -235,7 +284,7 @@ function TweakControl({
235
284
  )}
236
285
 
237
286
  {tweak.type === "slider" && (
238
- <div className="flex items-center gap-2">
287
+ <div className="flex h-6 items-center gap-1.5">
239
288
  <Slider
240
289
  min={tweak.min ?? 0}
241
290
  max={tweak.max ?? 100}
@@ -244,19 +293,12 @@ function TweakControl({
244
293
  onValueChange={([v]) => onChange(v)}
245
294
  className="flex-1"
246
295
  />
247
- <span className="min-w-[2rem] text-right text-[11px] text-muted-foreground">
296
+ <span className="min-w-[2ch] text-right text-[11px] tabular-nums text-muted-foreground">
248
297
  {typeof value === "number" ? value : 50}
249
298
  {tweak.cssVar?.includes("radius") ? "px" : ""}
250
299
  </span>
251
300
  </div>
252
301
  )}
253
-
254
- {tweak.type === "toggle" && (
255
- <Switch
256
- checked={!!value}
257
- onCheckedChange={(checked) => onChange(checked)}
258
- />
259
- )}
260
302
  </div>
261
303
  );
262
304
  }
@@ -1,15 +1,10 @@
1
1
  export { DesignCanvas } from "./DesignCanvas";
2
- export { DesignToolbar } from "./DesignToolbar";
3
- export type { EditorMode } from "./DesignToolbar";
4
2
  export { DeviceFrame } from "./DeviceFrame";
5
3
  export { DrawOverlay } from "./DrawOverlay";
6
4
  export { EditPanel } from "./EditPanel";
7
5
  export { QuestionFlow } from "./QuestionFlow";
8
6
  export { TweaksPanel } from "./TweaksPanel";
9
7
  export { VariantGrid } from "./VariantGrid";
10
- export { ViewportTabs } from "./ViewportTabs";
11
- export { ZoomControls } from "./ZoomControls";
12
- export { PresentMode } from "./PresentMode";
13
8
  export type {
14
9
  DrawAnnotation,
15
10
  ElementInfo,
@@ -0,0 +1,353 @@
1
+ import type { ComponentType } from "react";
2
+
3
+ import {
4
+ Tooltip,
5
+ TooltipContent,
6
+ TooltipProvider,
7
+ TooltipTrigger,
8
+ } from "@/components/ui/tooltip";
9
+ import { cn } from "@/lib/utils";
10
+
11
+ export type AlignmentHorizontal = "left" | "center" | "right";
12
+ export type AlignmentVertical = "top" | "middle" | "bottom";
13
+ export type DistributionAxis = "horizontal" | "vertical";
14
+ export type FlowDirection = "horizontal" | "vertical";
15
+
16
+ export interface AlignmentMatrixValue {
17
+ horizontal: AlignmentHorizontal;
18
+ vertical: AlignmentVertical;
19
+ }
20
+
21
+ export interface AlignmentMatrixLabels {
22
+ title: string;
23
+ alignTopLeft: string;
24
+ alignTopCenter: string;
25
+ alignTopRight: string;
26
+ alignMiddleLeft: string;
27
+ alignCenter: string;
28
+ alignMiddleRight: string;
29
+ alignBottomLeft: string;
30
+ alignBottomCenter: string;
31
+ alignBottomRight: string;
32
+ distributeHorizontal: string;
33
+ distributeVertical: string;
34
+ }
35
+
36
+ export interface AlignmentMatrixProps {
37
+ value: AlignmentMatrixValue;
38
+ onChange: (value: AlignmentMatrixValue) => void;
39
+ onDistribute?: (axis: DistributionAxis) => void;
40
+ labels?: Partial<AlignmentMatrixLabels>;
41
+ disabled?: boolean;
42
+ className?: string;
43
+ /** Auto-layout flow direction — controls bar orientation in active cell */
44
+ direction?: FlowDirection;
45
+ }
46
+
47
+ type MatrixIcon = ComponentType<{ className?: string }>;
48
+
49
+ const DEFAULT_LABELS: AlignmentMatrixLabels = {
50
+ title: "Align", // i18n-ignore fallback component label
51
+ alignTopLeft: "Align top left", // i18n-ignore fallback component label
52
+ alignTopCenter: "Align top center", // i18n-ignore fallback component label
53
+ alignTopRight: "Align top right", // i18n-ignore fallback component label
54
+ alignMiddleLeft: "Align middle left", // i18n-ignore fallback component label
55
+ alignCenter: "Align center", // i18n-ignore fallback component label
56
+ alignMiddleRight: "Align middle right", // i18n-ignore fallback component label
57
+ alignBottomLeft: "Align bottom left", // i18n-ignore fallback component label
58
+ alignBottomCenter: "Align bottom center", // i18n-ignore fallback component label
59
+ alignBottomRight: "Align bottom right", // i18n-ignore fallback component label
60
+ distributeHorizontal: "Distribute horizontal spacing", // i18n-ignore fallback component label
61
+ distributeVertical: "Distribute vertical spacing", // i18n-ignore fallback component label
62
+ };
63
+
64
+ const MATRIX_OPTIONS: Array<{
65
+ horizontal: AlignmentHorizontal;
66
+ vertical: AlignmentVertical;
67
+ labelKey: keyof AlignmentMatrixLabels;
68
+ }> = [
69
+ { horizontal: "left", vertical: "top", labelKey: "alignTopLeft" },
70
+ { horizontal: "center", vertical: "top", labelKey: "alignTopCenter" },
71
+ { horizontal: "right", vertical: "top", labelKey: "alignTopRight" },
72
+ { horizontal: "left", vertical: "middle", labelKey: "alignMiddleLeft" },
73
+ { horizontal: "center", vertical: "middle", labelKey: "alignCenter" },
74
+ { horizontal: "right", vertical: "middle", labelKey: "alignMiddleRight" },
75
+ { horizontal: "left", vertical: "bottom", labelKey: "alignBottomLeft" },
76
+ { horizontal: "center", vertical: "bottom", labelKey: "alignBottomCenter" },
77
+ { horizontal: "right", vertical: "bottom", labelKey: "alignBottomRight" },
78
+ ];
79
+
80
+ /** Figma-style alignment cell: blue bars when active, faint dot when inactive. */
81
+ function AlignmentCell({
82
+ horizontal,
83
+ vertical,
84
+ active,
85
+ label,
86
+ disabled,
87
+ direction,
88
+ onClick,
89
+ }: {
90
+ horizontal: AlignmentHorizontal;
91
+ vertical: AlignmentVertical;
92
+ active: boolean;
93
+ label: string;
94
+ disabled: boolean;
95
+ direction: FlowDirection;
96
+ onClick: () => void;
97
+ }) {
98
+ return (
99
+ <Tooltip>
100
+ <TooltipTrigger asChild>
101
+ <button
102
+ type="button"
103
+ aria-label={label}
104
+ aria-pressed={active}
105
+ disabled={disabled}
106
+ onClick={onClick}
107
+ className={cn(
108
+ "flex size-[22px] items-center justify-center rounded-sm transition-colors",
109
+ "hover:bg-[var(--design-editor-control-bg)]",
110
+ disabled && "pointer-events-none opacity-40",
111
+ )}
112
+ >
113
+ {active ? (
114
+ <AlignmentBars
115
+ horizontal={horizontal}
116
+ vertical={vertical}
117
+ direction={direction}
118
+ />
119
+ ) : (
120
+ <span
121
+ className="block size-[3px] rounded-full bg-current opacity-20"
122
+ aria-hidden="true"
123
+ />
124
+ )}
125
+ </button>
126
+ </TooltipTrigger>
127
+ <TooltipContent className="text-xs">{label}</TooltipContent>
128
+ </Tooltip>
129
+ );
130
+ }
131
+
132
+ /**
133
+ * Renders the Figma-style blue bars for the active alignment cell.
134
+ *
135
+ * Bar orientation matches the flow direction:
136
+ * - HORIZONTAL flow → VERTICAL bars (tall, narrow), packed to the active
137
+ * horizontal edge (left/center/right), then aligned vertically.
138
+ * - VERTICAL flow → HORIZONTAL bars (wide, short), packed to the active
139
+ * vertical edge (top/middle/bottom), then aligned horizontally.
140
+ *
141
+ * No outer frame rect — Figma's active cell shows only the bars.
142
+ */
143
+ function AlignmentBars({
144
+ horizontal,
145
+ vertical,
146
+ direction,
147
+ }: {
148
+ horizontal: AlignmentHorizontal;
149
+ vertical: AlignmentVertical;
150
+ direction: FlowDirection;
151
+ }) {
152
+ const accent = "var(--design-editor-accent-color, #18a0fb)";
153
+ const size = 14; // SVG canvas size
154
+
155
+ return (
156
+ <svg
157
+ viewBox={`0 0 ${size} ${size}`}
158
+ width={size}
159
+ height={size}
160
+ fill="none"
161
+ aria-hidden="true"
162
+ >
163
+ {direction === "horizontal" ? (
164
+ <HorizontalFlowBars
165
+ horizontal={horizontal}
166
+ vertical={vertical}
167
+ accent={accent}
168
+ size={size}
169
+ />
170
+ ) : (
171
+ <VerticalFlowBars
172
+ horizontal={horizontal}
173
+ vertical={vertical}
174
+ accent={accent}
175
+ size={size}
176
+ />
177
+ )}
178
+ </svg>
179
+ );
180
+ }
181
+
182
+ /**
183
+ * HORIZONTAL flow: items are laid out left→right.
184
+ * Bars are VERTICAL (tall, narrow) representing child items.
185
+ * Packed toward the active horizontal edge; aligned vertically.
186
+ */
187
+ function HorizontalFlowBars({
188
+ horizontal,
189
+ vertical,
190
+ accent,
191
+ size,
192
+ }: {
193
+ horizontal: AlignmentHorizontal;
194
+ vertical: AlignmentVertical;
195
+ accent: string;
196
+ size: number;
197
+ }) {
198
+ // Two vertical bars of slightly different heights for visual interest
199
+ const barW = 2; // bar width
200
+ const barH = [7, 5]; // bar heights
201
+ const gap = 2; // gap between bars
202
+ const margin = 1.5; // distance from edge
203
+
204
+ // X positions: bars packed toward the horizontal alignment edge
205
+ const totalW = barW * 2 + gap;
206
+ const xStart =
207
+ horizontal === "left"
208
+ ? margin
209
+ : horizontal === "right"
210
+ ? size - margin - totalW
211
+ : (size - totalW) / 2;
212
+
213
+ // Y positions: each bar aligned to the vertical edge
214
+ const getBarY = (h: number) => {
215
+ if (vertical === "top") return margin;
216
+ if (vertical === "bottom") return size - margin - h;
217
+ return (size - h) / 2;
218
+ };
219
+
220
+ return (
221
+ <>
222
+ <rect
223
+ x={xStart}
224
+ y={getBarY(barH[0]!)}
225
+ width={barW}
226
+ height={barH[0]}
227
+ rx={0.5}
228
+ fill={accent}
229
+ />
230
+ <rect
231
+ x={xStart + barW + gap}
232
+ y={getBarY(barH[1]!)}
233
+ width={barW}
234
+ height={barH[1]}
235
+ rx={0.5}
236
+ fill={accent}
237
+ />
238
+ </>
239
+ );
240
+ }
241
+
242
+ /**
243
+ * VERTICAL flow: items are laid out top→bottom.
244
+ * Bars are HORIZONTAL (wide, short) representing child items.
245
+ * Packed toward the active vertical edge; aligned horizontally.
246
+ */
247
+ function VerticalFlowBars({
248
+ horizontal,
249
+ vertical,
250
+ accent,
251
+ size,
252
+ }: {
253
+ horizontal: AlignmentHorizontal;
254
+ vertical: AlignmentVertical;
255
+ accent: string;
256
+ size: number;
257
+ }) {
258
+ // Two horizontal bars of slightly different widths for visual interest
259
+ const barH = 2; // bar height
260
+ const barW = [7, 5]; // bar widths
261
+ const gap = 2; // gap between bars
262
+ const margin = 1.5; // distance from edge
263
+
264
+ // Y positions: bars packed toward the vertical alignment edge
265
+ const totalH = barH * 2 + gap;
266
+ const yStart =
267
+ vertical === "top"
268
+ ? margin
269
+ : vertical === "bottom"
270
+ ? size - margin - totalH
271
+ : (size - totalH) / 2;
272
+
273
+ // X positions: each bar aligned to the horizontal edge
274
+ const getBarX = (w: number) => {
275
+ if (horizontal === "left") return margin;
276
+ if (horizontal === "right") return size - margin - w;
277
+ return (size - w) / 2;
278
+ };
279
+
280
+ return (
281
+ <>
282
+ <rect
283
+ x={getBarX(barW[0]!)}
284
+ y={yStart}
285
+ width={barW[0]}
286
+ height={barH}
287
+ rx={0.5}
288
+ fill={accent}
289
+ />
290
+ <rect
291
+ x={getBarX(barW[1]!)}
292
+ y={yStart + barH + gap}
293
+ width={barW[1]}
294
+ height={barH}
295
+ rx={0.5}
296
+ fill={accent}
297
+ />
298
+ </>
299
+ );
300
+ }
301
+
302
+ export function AlignmentMatrix({
303
+ value,
304
+ onChange,
305
+ onDistribute,
306
+ labels,
307
+ disabled = false,
308
+ className,
309
+ direction = "horizontal",
310
+ }: AlignmentMatrixProps) {
311
+ const copy = { ...DEFAULT_LABELS, ...labels };
312
+
313
+ return (
314
+ <TooltipProvider delayDuration={250}>
315
+ <div className={cn("flex flex-col gap-0", className)}>
316
+ {/*
317
+ * 3×3 dot grid — Figma style.
318
+ * NO border, NO background box — bare grid of cells.
319
+ * Each cell is 22px; 3 cols = 66px total.
320
+ */}
321
+ <div
322
+ className="grid grid-cols-3"
323
+ style={{ width: 66 }}
324
+ role="group"
325
+ aria-label={copy.title}
326
+ >
327
+ {MATRIX_OPTIONS.map((option) => {
328
+ const active =
329
+ option.horizontal === value.horizontal &&
330
+ option.vertical === value.vertical;
331
+ return (
332
+ <AlignmentCell
333
+ key={`${option.horizontal}-${option.vertical}`}
334
+ horizontal={option.horizontal}
335
+ vertical={option.vertical}
336
+ active={active}
337
+ label={copy[option.labelKey]}
338
+ disabled={disabled}
339
+ direction={direction}
340
+ onClick={() =>
341
+ onChange({
342
+ horizontal: option.horizontal,
343
+ vertical: option.vertical,
344
+ })
345
+ }
346
+ />
347
+ );
348
+ })}
349
+ </div>
350
+ </div>
351
+ </TooltipProvider>
352
+ );
353
+ }