@agent-native/core 0.90.1 → 0.90.3

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 (714) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +26 -0
  3. package/corpus/core/docs/content/agent-native-toolkit.mdx +87 -80
  4. package/corpus/core/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
  5. package/corpus/core/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
  6. package/corpus/core/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
  7. package/corpus/core/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
  8. package/corpus/core/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
  9. package/corpus/core/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
  10. package/corpus/core/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
  11. package/corpus/core/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
  12. package/corpus/core/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
  13. package/corpus/core/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
  14. package/corpus/core/docs/content/toolkit-agent-ux.mdx +43 -0
  15. package/corpus/core/docs/content/toolkit-app-adapters.mdx +9 -0
  16. package/corpus/core/docs/content/toolkit-collaboration-ui.mdx +12 -0
  17. package/corpus/core/docs/content/toolkit-collaboration.mdx +74 -0
  18. package/corpus/core/docs/content/toolkit-command-navigation.mdx +106 -0
  19. package/corpus/core/docs/content/toolkit-comments-review.mdx +98 -0
  20. package/corpus/core/docs/content/toolkit-history.mdx +95 -0
  21. package/corpus/core/docs/content/toolkit-observability.mdx +41 -0
  22. package/corpus/core/docs/content/toolkit-org-team.mdx +80 -0
  23. package/corpus/core/docs/content/toolkit-resources.mdx +57 -0
  24. package/corpus/core/docs/content/toolkit-settings.mdx +65 -0
  25. package/corpus/core/docs/content/toolkit-setup-connections.mdx +109 -0
  26. package/corpus/core/docs/content/toolkit-sharing-ui.mdx +18 -6
  27. package/corpus/core/docs/content/toolkit-sharing.mdx +81 -0
  28. package/corpus/core/docs/content/toolkit-shell-hooks.mdx +9 -0
  29. package/corpus/core/docs/content/toolkit-ui.mdx +9 -0
  30. package/corpus/core/package.json +35 -1
  31. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +19 -1
  32. package/corpus/core/src/agent/engine/anthropic-engine.ts +25 -1
  33. package/corpus/core/src/agent/engine/registry.ts +23 -16
  34. package/corpus/core/src/agent/production-agent.ts +37 -6
  35. package/corpus/core/src/client/AgentPanel.tsx +1 -1
  36. package/corpus/core/src/client/command-navigation/index.ts +15 -0
  37. package/corpus/core/src/client/comments-review/index.ts +1 -0
  38. package/corpus/core/src/client/history/VersionHistoryPanel.tsx +145 -0
  39. package/corpus/core/src/client/history/index.ts +18 -0
  40. package/corpus/core/src/client/history/use-history.ts +86 -0
  41. package/corpus/core/src/client/index.ts +76 -9
  42. package/corpus/core/src/client/org/OrgSwitcher.tsx +6 -6
  43. package/corpus/core/src/client/org/RequireActiveOrg.tsx +2 -2
  44. package/corpus/core/src/client/org/TeamPage.tsx +3 -3
  45. package/corpus/core/src/client/org/hooks.ts +32 -0
  46. package/corpus/core/src/client/org/index.ts +30 -1
  47. package/corpus/core/src/client/org-team/index.ts +1 -0
  48. package/corpus/core/src/client/review/ReviewStatusBadge.tsx +39 -0
  49. package/corpus/core/src/client/review/ReviewThreadPanel.tsx +278 -0
  50. package/corpus/core/src/client/review/index.ts +25 -0
  51. package/corpus/core/src/client/review/use-review.ts +114 -0
  52. package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +11 -6
  53. package/corpus/core/src/client/settings/index.ts +11 -1
  54. package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +94 -0
  55. package/corpus/core/src/client/setup-connections/ProviderReadinessBadge.tsx +73 -0
  56. package/corpus/core/src/client/setup-connections/SetupConnectionsPage.tsx +94 -0
  57. package/corpus/core/src/client/setup-connections/index.ts +46 -0
  58. package/corpus/core/src/client/sharing/ShareButton.tsx +20 -14
  59. package/corpus/core/src/client/sharing/ShareDialog.tsx +3 -3
  60. package/corpus/core/src/client/use-action.ts +39 -2
  61. package/corpus/core/src/client/use-db-sync.ts +44 -18
  62. package/corpus/core/src/command-navigation/actions.ts +100 -0
  63. package/corpus/core/src/command-navigation/index.ts +12 -0
  64. package/corpus/core/src/comments-review/index.ts +1 -0
  65. package/corpus/core/src/db/create-get-db.ts +32 -2
  66. package/corpus/core/src/file-upload/builder.ts +24 -3
  67. package/corpus/core/src/file-upload/types.ts +3 -1
  68. package/corpus/core/src/history/actions/create-resource-version.ts +89 -0
  69. package/corpus/core/src/history/actions/get-resource-version.ts +60 -0
  70. package/corpus/core/src/history/actions/list-resource-history.ts +53 -0
  71. package/corpus/core/src/history/actions/list-resource-versions.ts +43 -0
  72. package/corpus/core/src/history/actions/restore-resource-version.ts +96 -0
  73. package/corpus/core/src/history/index.ts +27 -0
  74. package/corpus/core/src/history/registry.ts +99 -0
  75. package/corpus/core/src/history/store.ts +348 -0
  76. package/corpus/core/src/history/types.ts +69 -0
  77. package/corpus/core/src/index.ts +10 -0
  78. package/corpus/core/src/navigation/index.ts +170 -0
  79. package/corpus/core/src/org/index.ts +8 -0
  80. package/corpus/core/src/org/permissions.ts +30 -0
  81. package/corpus/core/src/org-team/index.ts +1 -0
  82. package/corpus/core/src/private-blob/registry.ts +1 -0
  83. package/corpus/core/src/review/actions/consume-review-feedback.ts +38 -0
  84. package/corpus/core/src/review/actions/create-review-comment.ts +107 -0
  85. package/corpus/core/src/review/actions/delete-review-comment.ts +55 -0
  86. package/corpus/core/src/review/actions/get-review-feedback.ts +54 -0
  87. package/corpus/core/src/review/actions/list-review-comments.ts +53 -0
  88. package/corpus/core/src/review/actions/reply-review-comment.ts +107 -0
  89. package/corpus/core/src/review/actions/resolve-review-thread.ts +60 -0
  90. package/corpus/core/src/review/actions/set-review-status.ts +58 -0
  91. package/corpus/core/src/review/index.ts +36 -0
  92. package/corpus/core/src/review/mentions.ts +44 -0
  93. package/corpus/core/src/review/registry.ts +99 -0
  94. package/corpus/core/src/review/store.ts +687 -0
  95. package/corpus/core/src/review/types.ts +97 -0
  96. package/corpus/core/src/server/action-discovery.ts +54 -0
  97. package/corpus/core/src/server/agent-engine-api-key-route.ts +5 -0
  98. package/corpus/core/src/server/credential-provider.ts +108 -0
  99. package/corpus/core/src/server/framework-request-handler.ts +52 -4
  100. package/corpus/core/src/setup-connections/index.ts +89 -0
  101. package/corpus/core/src/setup-connections/onboarding.ts +47 -0
  102. package/corpus/core/src/transcription/builder-transcription.ts +9 -2
  103. package/corpus/core/src/vite/action-types-plugin.ts +52 -0
  104. package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -1
  105. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +2 -2
  106. package/corpus/templates/analytics/app/global.css +22 -10
  107. package/corpus/templates/analytics/app/i18n/zh-TW.ts +6 -1
  108. package/corpus/templates/analytics/app/i18n-data.ts +81 -13
  109. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +2 -2
  110. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +2 -2
  111. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +528 -108
  112. package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +466 -183
  113. package/corpus/templates/analytics/changelog/2026-07-07-session-replays-load-sooner-show-clearer-activity-timelines-.md +6 -0
  114. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +5 -0
  115. package/corpus/templates/assets/.agents/skills/logo-composite/SKILL.md +34 -6
  116. package/corpus/templates/assets/AGENTS.md +23 -4
  117. package/corpus/templates/assets/actions/_generation-preset-settings.ts +48 -0
  118. package/corpus/templates/assets/actions/_helpers.ts +8 -1
  119. package/corpus/templates/assets/actions/_preset-skeleton-validation.ts +64 -0
  120. package/corpus/templates/assets/actions/create-generation-preset.ts +11 -3
  121. package/corpus/templates/assets/actions/generate-image-batch.ts +7 -2
  122. package/corpus/templates/assets/actions/generate-image.ts +342 -25
  123. package/corpus/templates/assets/actions/get-library.ts +4 -3
  124. package/corpus/templates/assets/actions/navigate.ts +2 -1
  125. package/corpus/templates/assets/actions/refresh-generation-run.ts +5 -1
  126. package/corpus/templates/assets/actions/update-asset.ts +1 -0
  127. package/corpus/templates/assets/actions/update-generation-preset.ts +8 -1
  128. package/corpus/templates/assets/actions/view-screen.ts +8 -1
  129. package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +9 -1
  130. package/corpus/templates/assets/app/hooks/use-image-model-menu.ts +1 -0
  131. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +11 -0
  132. package/corpus/templates/assets/app/i18n/zh-TW.ts +64 -0
  133. package/corpus/templates/assets/app/i18n-data.ts +650 -0
  134. package/corpus/templates/assets/app/routes/asset.$id.tsx +2 -1
  135. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +44 -33
  136. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +1474 -0
  137. package/corpus/templates/assets/app/routes/library.tsx +43 -1
  138. package/corpus/templates/assets/server/lib/generation.ts +366 -44
  139. package/corpus/templates/assets/server/lib/image-processing.ts +252 -0
  140. package/corpus/templates/assets/server/lib/preset-skeleton.ts +137 -0
  141. package/corpus/templates/assets/shared/api.ts +47 -0
  142. package/corpus/templates/brain/app/routes/settings.tsx +2 -2
  143. package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +32 -6
  144. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +120 -40
  145. package/corpus/templates/calendar/app/hooks/use-people.ts +55 -0
  146. package/corpus/templates/calendar/changelog/2026-07-07-guest-suggestions-now-find-coworkers-from-your-google-worksp.md +6 -0
  147. package/corpus/templates/calendar/changelog/2026-07-07-zoom-stays-selected-after-connecting-it-from-a-draft-event.md +6 -0
  148. package/corpus/templates/clips/actions/create-recording.ts +5 -1
  149. package/corpus/templates/clips/actions/finalize-recording.ts +140 -1
  150. package/corpus/templates/clips/actions/import-loom-recording.ts +1 -0
  151. package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +1 -0
  152. package/corpus/templates/clips/actions/request-transcript.ts +31 -0
  153. package/corpus/templates/clips/actions/set-thumbnail.ts +2 -0
  154. package/corpus/templates/clips/app/components/library/library-layout.tsx +7 -2
  155. package/corpus/templates/clips/app/components/library/organization-switcher.tsx +2 -2
  156. package/corpus/templates/clips/app/components/library/sort-menu.tsx +1 -1
  157. package/corpus/templates/clips/app/components/player/scrubber-position.ts +9 -0
  158. package/corpus/templates/clips/app/components/player/scrubber.tsx +5 -2
  159. package/corpus/templates/clips/app/components/player/share-dialog.tsx +69 -41
  160. package/corpus/templates/clips/app/components/player/video-player.tsx +38 -1
  161. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +114 -33
  162. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +3 -3
  163. package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +9 -19
  164. package/corpus/templates/clips/app/routes/_app.library._index.tsx +27 -1
  165. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +9 -3
  166. package/corpus/templates/clips/app/routes/record.tsx +178 -80
  167. package/corpus/templates/clips/changelog/2026-07-02-recordings-now-wait-for-storage-media-to-serve-before-finishing.md +6 -0
  168. package/corpus/templates/clips/changelog/2026-07-07-a-pending-app-update-no-longer-blocks-screen-recording-updat.md +6 -0
  169. package/corpus/templates/clips/changelog/2026-07-07-chrome-extension-recordings-keep-audio-after-refreshing-tab.md +6 -0
  170. package/corpus/templates/clips/changelog/2026-07-07-clip-playback-progress-now-starts-and-finishes-at-the-right-times.md +6 -0
  171. package/corpus/templates/clips/changelog/2026-07-07-sharing-public-clips-now-stays-focused-on-the-normal-link-wi.md +6 -0
  172. package/corpus/templates/clips/chrome-extension/src/background.ts +18 -0
  173. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +23 -8
  174. package/corpus/templates/clips/desktop/src/app.tsx +40 -3
  175. package/corpus/templates/clips/desktop/src/hooks/useMediaDevices.ts +19 -7
  176. package/corpus/templates/clips/desktop/src/lib/permissions.ts +2 -0
  177. package/corpus/templates/clips/desktop/src/lib/updater.ts +25 -2
  178. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +7 -0
  179. package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +1 -0
  180. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +23 -6
  181. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +28 -3
  182. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +13 -6
  183. package/corpus/templates/clips/shared/finalize-recovery.ts +35 -3
  184. package/corpus/templates/content/AGENTS.md +52 -52
  185. package/corpus/templates/content/actions/_builder-cms-read-client.ts +188 -8
  186. package/corpus/templates/content/actions/_builder-docs-client.ts +41 -3
  187. package/corpus/templates/content/actions/_database-source-utils.ts +998 -160
  188. package/corpus/templates/content/actions/_database-utils.ts +44 -4
  189. package/corpus/templates/content/actions/_notion-action-utils.ts +6 -2
  190. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +23 -1
  191. package/corpus/templates/content/actions/attach-content-database-source.ts +85 -12
  192. package/corpus/templates/content/actions/change-content-database-source-role.ts +9 -1
  193. package/corpus/templates/content/actions/delete-content-database.ts +1 -0
  194. package/corpus/templates/content/actions/delete-document.ts +337 -52
  195. package/corpus/templates/content/actions/get-document.ts +11 -2
  196. package/corpus/templates/content/actions/list-content-databases.ts +57 -9
  197. package/corpus/templates/content/actions/prepare-builder-source-review.ts +23 -6
  198. package/corpus/templates/content/actions/refresh-content-database-source.ts +26 -3
  199. package/corpus/templates/content/actions/restore-content-database.ts +1 -0
  200. package/corpus/templates/content/actions/update-document.ts +43 -0
  201. package/corpus/templates/content/app/components/editor/BuilderBodySyncingNotice.tsx +21 -0
  202. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +0 -1
  203. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +70 -28
  204. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +69 -17
  205. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +4 -4
  206. package/corpus/templates/content/app/components/editor/body-hydration.ts +112 -0
  207. package/corpus/templates/content/app/components/editor/builder-body-hydration-pump.ts +52 -0
  208. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +9076 -2876
  209. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +41 -1
  210. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +36 -11
  211. package/corpus/templates/content/app/components/editor/previewDocumentSaveController.ts +21 -1
  212. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +11 -1
  213. package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +11 -8
  214. package/corpus/templates/content/app/global.css +41 -0
  215. package/corpus/templates/content/app/hooks/use-content-database.ts +346 -42
  216. package/corpus/templates/content/app/hooks/use-db-sync.ts +9 -0
  217. package/corpus/templates/content/app/hooks/use-documents.ts +47 -0
  218. package/corpus/templates/content/app/hooks/use-notion.ts +12 -10
  219. package/corpus/templates/content/app/i18n/zh-TW.ts +35 -0
  220. package/corpus/templates/content/app/i18n-data.ts +355 -0
  221. package/corpus/templates/content/app/root.tsx +22 -0
  222. package/corpus/templates/content/changelog/2026-07-01-builder-database-sources-keep-loading-rows-in-the-background.md +6 -0
  223. package/corpus/templates/content/changelog/2026-07-01-builder-source-attach-starts-with-usable-rows.md +6 -0
  224. package/corpus/templates/content/changelog/2026-07-01-builder-source-attachment-now-stays-connected-after-large.md +6 -0
  225. package/corpus/templates/content/changelog/2026-07-01-builder-source-refreshes-now-show-progress-for-large-docs-blog.md +6 -0
  226. package/corpus/templates/content/changelog/2026-07-01-database-pages-now-delete-to-trash-without-route-errors.md +6 -0
  227. package/corpus/templates/content/changelog/2026-07-02-builder-source-refreshes-recover-from-stalled-background-row.md +6 -0
  228. package/corpus/templates/content/changelog/2026-07-02-builder-sourced-rows-open-with-sync-protection.md +6 -0
  229. package/corpus/templates/content/changelog/2026-07-02-database-rows-and-pages-open-faster-from-recently-loaded-dat.md +6 -0
  230. package/corpus/templates/content/changelog/2026-07-02-preview-panels-close-reliably-narrow-sidebar-row-actions-sta.md +6 -0
  231. package/corpus/templates/content/changelog/2026-07-06-builder-sync-progress-no-longer-shows-continue.md +6 -0
  232. package/corpus/templates/content/changelog/2026-07-07-permanently-deleting-trashed-databases-now-finishes-reliably.md +6 -0
  233. package/corpus/templates/content/shared/api.ts +13 -0
  234. package/corpus/templates/content/shared/builder-mdx.ts +16 -3
  235. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +23 -13
  236. package/corpus/templates/design/.agents/skills/responsive-breakpoints/SKILL.md +98 -0
  237. package/corpus/templates/design/.agents/skills/shader-fills/SKILL.md +162 -0
  238. package/corpus/templates/design/AGENTS.md +9 -2
  239. package/corpus/templates/design/actions/add-breakpoint.ts +6 -3
  240. package/corpus/templates/design/actions/apply-a11y-fix.ts +57 -37
  241. package/corpus/templates/design/actions/apply-component-prop-edit.ts +41 -20
  242. package/corpus/templates/design/actions/apply-motion-edit.ts +251 -38
  243. package/corpus/templates/design/actions/apply-shader-fill.ts +90 -66
  244. package/corpus/templates/design/actions/apply-visual-edit.ts +282 -55
  245. package/corpus/templates/design/actions/create-component.ts +29 -60
  246. package/corpus/templates/design/actions/create-file.ts +9 -2
  247. package/corpus/templates/design/actions/duplicate-design.ts +31 -2
  248. package/corpus/templates/design/actions/edit-design.ts +36 -38
  249. package/corpus/templates/design/actions/generate-design-title.ts +87 -0
  250. package/corpus/templates/design/actions/generate-design.ts +53 -18
  251. package/corpus/templates/design/actions/generate-screens.ts +108 -4
  252. package/corpus/templates/design/actions/get-motion-timeline.ts +35 -7
  253. package/corpus/templates/design/actions/insert-asset.ts +34 -29
  254. package/corpus/templates/design/actions/insert-design-native-asset.ts +129 -32
  255. package/corpus/templates/design/actions/insert-figma-library-asset.ts +35 -30
  256. package/corpus/templates/design/actions/present-design-variants.ts +7 -2
  257. package/corpus/templates/design/actions/remove-motion-timeline.ts +31 -36
  258. package/corpus/templates/design/actions/update-file.ts +190 -75
  259. package/corpus/templates/design/app/components/design/BreakpointBar.tsx +403 -0
  260. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +469 -222
  261. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +708 -53
  262. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +83 -3
  263. package/corpus/templates/design/app/components/design/EditPanel.tsx +1091 -6948
  264. package/corpus/templates/design/app/components/design/LayersPanel.tsx +419 -85
  265. package/corpus/templates/design/app/components/design/MotionDock.tsx +1124 -103
  266. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +2610 -1398
  267. package/corpus/templates/design/app/components/design/ReadOnlyDesignBanner.tsx +22 -0
  268. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2182 -235
  269. package/corpus/templates/design/app/components/design/bridge/motion-preview.bridge.ts +187 -11
  270. package/corpus/templates/design/app/components/design/bridge/shader-fill-preview.bridge.ts +376 -1
  271. package/corpus/templates/design/app/components/design/bridge/shader-runtime.bridge.ts +746 -0
  272. package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +17 -0
  273. package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +1 -1
  274. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +1 -3
  275. package/corpus/templates/design/app/components/design/code-workbench/quickinput/QuickInput.tsx +1 -1
  276. package/corpus/templates/design/app/components/design/edit-panel/appearance-properties.tsx +518 -0
  277. package/corpus/templates/design/app/components/design/edit-panel/code-inspect-helpers.tsx +562 -0
  278. package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +763 -0
  279. package/corpus/templates/design/app/components/design/edit-panel/document-colors.ts +94 -0
  280. package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +780 -0
  281. package/corpus/templates/design/app/components/design/edit-panel/element-classification.ts +446 -0
  282. package/corpus/templates/design/app/components/design/edit-panel/element-identity.ts +79 -0
  283. package/corpus/templates/design/app/components/design/edit-panel/field-primitives.tsx +315 -0
  284. package/corpus/templates/design/app/components/design/edit-panel/fill-gradient-helpers.ts +344 -0
  285. package/corpus/templates/design/app/components/design/edit-panel/fill-properties.tsx +594 -0
  286. package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +119 -0
  287. package/corpus/templates/design/app/components/design/edit-panel/inspector-controls.tsx +248 -0
  288. package/corpus/templates/design/app/components/design/edit-panel/interaction-state-helpers.ts +45 -0
  289. package/corpus/templates/design/app/components/design/edit-panel/layout-properties.tsx +693 -0
  290. package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +724 -0
  291. package/corpus/templates/design/app/components/design/edit-panel/position-helpers.ts +207 -0
  292. package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +628 -0
  293. package/corpus/templates/design/app/components/design/edit-panel/selection-helpers.ts +91 -0
  294. package/corpus/templates/design/app/components/design/edit-panel/stroke-properties.tsx +649 -0
  295. package/corpus/templates/design/app/components/design/edit-panel/style-change-types.ts +118 -0
  296. package/corpus/templates/design/app/components/design/edit-panel/style-options.ts +88 -0
  297. package/corpus/templates/design/app/components/design/edit-panel/transform-helpers.ts +100 -0
  298. package/corpus/templates/design/app/components/design/edit-panel/typography-helpers.ts +117 -0
  299. package/corpus/templates/design/app/components/design/edit-panel/typography-properties.tsx +501 -0
  300. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +91 -40
  301. package/corpus/templates/design/app/components/design/inspector/BreakpointOverrideIndicator.tsx +82 -0
  302. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +189 -87
  303. package/corpus/templates/design/app/components/design/inspector/GlslShaderPanel.tsx +1097 -0
  304. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +44 -0
  305. package/corpus/templates/design/app/components/design/inspector/InteractionStatePanel.tsx +258 -0
  306. package/corpus/templates/design/app/components/design/inspector/MotionKeyframeDiamond.tsx +144 -0
  307. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +99 -9
  308. package/corpus/templates/design/app/components/design/inspector/frame-size-presets.ts +116 -0
  309. package/corpus/templates/design/app/components/design/inspector/index.ts +26 -0
  310. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +29 -0
  311. package/corpus/templates/design/app/components/design/multi-screen/alt-hover-measurement.ts +171 -0
  312. package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +220 -0
  313. package/corpus/templates/design/app/components/design/multi-screen/chrome-transitions.ts +35 -0
  314. package/corpus/templates/design/app/components/design/multi-screen/cross-screen-drop.ts +134 -0
  315. package/corpus/templates/design/app/components/design/multi-screen/culling.ts +185 -0
  316. package/corpus/templates/design/app/components/design/multi-screen/gradient-overlay-geometry.ts +120 -0
  317. package/corpus/templates/design/app/components/design/multi-screen/types.ts +892 -0
  318. package/corpus/templates/design/app/components/design/multi-screen/vector-edit-geometry.ts +21 -0
  319. package/corpus/templates/design/app/components/design/types.ts +15 -0
  320. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +109 -5
  321. package/corpus/templates/design/app/global.css +8 -8
  322. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +259 -2
  323. package/corpus/templates/design/app/i18n/zh-TW.ts +163 -9
  324. package/corpus/templates/design/app/i18n-breakpoints.ts +205 -0
  325. package/corpus/templates/design/app/i18n-data.ts +1664 -152
  326. package/corpus/templates/design/app/i18n-motion.ts +563 -0
  327. package/corpus/templates/design/app/lib/design-import.ts +73 -0
  328. package/corpus/templates/design/app/pages/Index.tsx +41 -22
  329. package/corpus/templates/design/changelog/2026-06-29-design-inspector-controls-now-match-figmas-softer-dark-chrome.md +1 -1
  330. package/corpus/templates/design/changelog/2026-06-30-design-now-has-a-figma-style-left-rail-for-file-agent-assets.md +1 -1
  331. package/corpus/templates/design/changelog/2026-06-30-design-tools-now-use-a-quieter-figma-style-list-layout.md +1 -1
  332. package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +1 -1
  333. package/corpus/templates/design/changelog/2026-07-03-canvas-interactions-now-match-figma-rotation-aware-resizing-.md +1 -1
  334. package/corpus/templates/design/changelog/2026-07-03-layers-panel-matches-figma-top-layer-on-top-drag-with-auto-s.md +1 -1
  335. package/corpus/templates/design/changelog/2026-07-05-designs-get-ai-generated-names-from-your-prompt.md +6 -0
  336. package/corpus/templates/design/changelog/2026-07-05-local-code-screens-keep-their-connection-when-duplicated-and.md +6 -0
  337. package/corpus/templates/design/changelog/2026-07-05-press-a-to-draw-screens-on-the-canvas-inside-a-screen-it-dr.md +6 -0
  338. package/corpus/templates/design/changelog/2026-07-06-3d-rotation-and-perspective-controls-on-every-element.md +6 -0
  339. package/corpus/templates/design/changelog/2026-07-06-ai-generated-and-duplicated-screens-now-get-their-editor-sel.md +6 -0
  340. package/corpus/templates/design/changelog/2026-07-06-applying-shaders-and-fills-in-quick-succession-can-no-longer.md +6 -0
  341. package/corpus/templates/design/changelog/2026-07-06-breakpoint-frames-in-the-overview-now-support-click-to-selec.md +6 -0
  342. package/corpus/templates/design/changelog/2026-07-06-breakpoint-segments-in-the-inspector-now-show-a-device-icon-.md +6 -0
  343. package/corpus/templates/design/changelog/2026-07-06-breakpoint-targeting-now-lives-in-one-compact-control-in-the.md +6 -0
  344. package/corpus/templates/design/changelog/2026-07-06-canvas-edits-can-no-longer-be-overwritten-by-stale-collabora.md +6 -0
  345. package/corpus/templates/design/changelog/2026-07-06-canvas-edits-inside-screens-save-reliably-again.md +6 -0
  346. package/corpus/templates/design/changelog/2026-07-06-cleaner-inspector-removed-the-ask-ai-box-from-the-design-tab.md +6 -0
  347. package/corpus/templates/design/changelog/2026-07-06-clicking-empty-canvas-space-now-deselects-an-element-inside-.md +6 -0
  348. package/corpus/templates/design/changelog/2026-07-06-dragging-an-element-onto-a-rectangle-now-nests-it-inside-wit.md +6 -0
  349. package/corpus/templates/design/changelog/2026-07-06-dragging-screens-and-objects-on-the-canvas-is-now-much-smoot.md +6 -0
  350. package/corpus/templates/design/changelog/2026-07-06-drawing-a-shape-or-text-on-the-canvas-no-longer-flashes-away.md +6 -0
  351. package/corpus/templates/design/changelog/2026-07-06-dropping-an-element-between-two-others-inside-a-screen-now-s.md +6 -0
  352. package/corpus/templates/design/changelog/2026-07-06-duplicating-a-screen-now-places-the-copy-exactly-where-you-d.md +6 -0
  353. package/corpus/templates/design/changelog/2026-07-06-edit-gradients-directly-on-elements-inside-screens-scale-str.md +6 -0
  354. package/corpus/templates/design/changelog/2026-07-06-edits-from-collaborators-and-the-agent-now-update-the-canvas.md +6 -0
  355. package/corpus/templates/design/changelog/2026-07-06-fixed-a-bug-where-most-style-position-and-text-edits-briefly.md +6 -0
  356. package/corpus/templates/design/changelog/2026-07-06-fixed-a-confusing-raw-error-message-when-a-file-upload-fails.md +6 -0
  357. package/corpus/templates/design/changelog/2026-07-06-fixed-a-rare-case-where-an-edit-could-be-silently-overwritte.md +6 -0
  358. package/corpus/templates/design/changelog/2026-07-06-fixed-inserted-assets-sometimes-disappearing-reappearing-or-.md +6 -0
  359. package/corpus/templates/design/changelog/2026-07-06-fixed-inspector-value-scrubbing-producing-erratic-numbers-an.md +6 -0
  360. package/corpus/templates/design/changelog/2026-07-06-fixed-padding-gap-and-min-max-size-scrubbing-not-updating-th.md +6 -0
  361. package/corpus/templates/design/changelog/2026-07-06-fixed-text-stroke-color-turning-black-and-glyphs-disappearin.md +6 -0
  362. package/corpus/templates/design/changelog/2026-07-06-fixed-the-collapsed-effects-and-stroke-inspector-sections-sh.md +6 -0
  363. package/corpus/templates/design/changelog/2026-07-06-fixed-the-new-design-dialog-closing-unexpectedly-when-using-.md +6 -0
  364. package/corpus/templates/design/changelog/2026-07-06-fixed-the-typography-section-missing-when-selecting-text-nes.md +6 -0
  365. package/corpus/templates/design/changelog/2026-07-06-full-view-no-longer-flashes-back-to-the-overview-on-entry-no.md +6 -0
  366. package/corpus/templates/design/changelog/2026-07-06-keyframe-animation-timeline-per-property-keyframes-easing-cu.md +6 -0
  367. package/corpus/templates/design/changelog/2026-07-06-moving-restyling-and-scrubbing-values-on-elements-in-ai-gene.md +6 -0
  368. package/corpus/templates/design/changelog/2026-07-06-padding-and-corner-radius-value-scrubbing-now-snaps-to-whole.md +6 -0
  369. package/corpus/templates/design/changelog/2026-07-06-padding-handles-now-only-resize-on-the-handle-line-itself-sh.md +6 -0
  370. package/corpus/templates/design/changelog/2026-07-06-preview-and-edit-hover-focus-and-pressed-states-with-real-cs.md +6 -0
  371. package/corpus/templates/design/changelog/2026-07-06-promoting-an-element-to-a-component-now-works-correctly-for-.md +6 -0
  372. package/corpus/templates/design/changelog/2026-07-06-reduced-url-history-churn-and-selection-overlay-flicker-whil.md +6 -0
  373. package/corpus/templates/design/changelog/2026-07-06-removed-the-decorative-dot-before-screen-names-in-the-overvi.md +6 -0
  374. package/corpus/templates/design/changelog/2026-07-06-responsive-breakpoints-edit-at-any-width-with-cascading-over.md +6 -0
  375. package/corpus/templates/design/changelog/2026-07-06-screen-labels-no-longer-turn-blue-when-you-hover-inside-the-.md +6 -0
  376. package/corpus/templates/design/changelog/2026-07-06-scrolling-a-screen-with-an-element-selected-stays-smooth-on-.md +6 -0
  377. package/corpus/templates/design/changelog/2026-07-06-selecting-multiple-elements-and-dragging-now-moves-the-whole.md +6 -0
  378. package/corpus/templates/design/changelog/2026-07-06-selection-borders-handles-and-value-readouts-now-stay-the-sa.md +6 -0
  379. package/corpus/templates/design/changelog/2026-07-06-selection-handles-and-editing-chrome-now-stay-a-constant-siz.md +6 -0
  380. package/corpus/templates/design/changelog/2026-07-06-shader-fills-and-effects-ai-authored-or-preset-glsl-shaders-.md +6 -0
  381. package/corpus/templates/design/changelog/2026-07-06-text-drawn-on-the-canvas-now-defaults-to-white-and-inter-in-.md +6 -0
  382. package/corpus/templates/design/changelog/2026-07-06-text-dropped-into-a-shape-now-stays-readable-instead-of-disa.md +6 -0
  383. package/corpus/templates/design/changelog/2026-07-06-the-add-tweak-controls-prompt-no-longer-jumps-to-the-corner-.md +6 -0
  384. package/corpus/templates/design/changelog/2026-07-06-the-padding-value-readout-now-stays-visible-while-you-hover-.md +6 -0
  385. package/corpus/templates/design/changelog/2026-07-06-the-selected-element-attachment-now-clears-from-the-chat-com.md +6 -0
  386. package/corpus/templates/design/changelog/2026-07-06-the-zoom-menu-is-more-compact-with-tight-rows-and-right-alig.md +6 -0
  387. package/corpus/templates/design/changelog/2026-07-06-undo-and-redo-no-longer-flash-the-screen-changes-now-apply-i.md +6 -0
  388. package/corpus/templates/design/changelog/2026-07-06-zoom-presets-like-zoom-to-50-now-stay-on-the-focused-screen-.md +6 -0
  389. package/corpus/templates/design/server/lib/import-design-files.ts +11 -2
  390. package/corpus/templates/design/server/source-workspace.ts +139 -59
  391. package/corpus/templates/design/shared/board-file.ts +11 -2
  392. package/corpus/templates/design/shared/breakpoint-media.ts +543 -0
  393. package/corpus/templates/design/shared/canvas-math.ts +354 -35
  394. package/corpus/templates/design/shared/code-layer.ts +277 -8
  395. package/corpus/templates/design/shared/design-state.ts +11 -4
  396. package/corpus/templates/design/shared/interaction-states.ts +548 -0
  397. package/corpus/templates/design/shared/motion-compiler.ts +186 -23
  398. package/corpus/templates/design/shared/motion-easing.ts +294 -0
  399. package/corpus/templates/design/shared/motion-timeline.ts +400 -34
  400. package/corpus/templates/design/shared/prompt-title.ts +95 -0
  401. package/corpus/templates/design/shared/responsive-classes.ts +448 -10
  402. package/corpus/templates/design/shared/screen-annotation.ts +46 -0
  403. package/corpus/templates/design/shared/shader-fills.ts +1009 -0
  404. package/corpus/templates/design/shared/shader-presets.ts +852 -4
  405. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +15 -2
  406. package/corpus/templates/slides/app/components/editor/ImportButton.tsx +10 -1
  407. package/corpus/templates/slides/app/lib/upload-response.ts +71 -0
  408. package/corpus/templates/slides/app/pages/DeckEditor.tsx +2 -2
  409. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  410. package/dist/agent/engine/ai-sdk-engine.js +15 -1
  411. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  412. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  413. package/dist/agent/engine/anthropic-engine.js +20 -1
  414. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  415. package/dist/agent/engine/registry.d.ts.map +1 -1
  416. package/dist/agent/engine/registry.js +22 -14
  417. package/dist/agent/engine/registry.js.map +1 -1
  418. package/dist/agent/production-agent.d.ts.map +1 -1
  419. package/dist/agent/production-agent.js +27 -7
  420. package/dist/agent/production-agent.js.map +1 -1
  421. package/dist/client/AgentPanel.js +1 -1
  422. package/dist/client/AgentPanel.js.map +1 -1
  423. package/dist/client/command-navigation/index.d.ts +4 -0
  424. package/dist/client/command-navigation/index.d.ts.map +1 -0
  425. package/dist/client/command-navigation/index.js +4 -0
  426. package/dist/client/command-navigation/index.js.map +1 -0
  427. package/dist/client/comments-review/index.d.ts +2 -0
  428. package/dist/client/comments-review/index.d.ts.map +1 -0
  429. package/dist/client/comments-review/index.js +2 -0
  430. package/dist/client/comments-review/index.js.map +1 -0
  431. package/dist/client/history/VersionHistoryPanel.d.ts +18 -0
  432. package/dist/client/history/VersionHistoryPanel.d.ts.map +1 -0
  433. package/dist/client/history/VersionHistoryPanel.js +24 -0
  434. package/dist/client/history/VersionHistoryPanel.js.map +1 -0
  435. package/dist/client/history/index.d.ts +3 -0
  436. package/dist/client/history/index.d.ts.map +1 -0
  437. package/dist/client/history/index.js +3 -0
  438. package/dist/client/history/index.js.map +1 -0
  439. package/dist/client/history/use-history.d.ts +46 -0
  440. package/dist/client/history/use-history.d.ts.map +1 -0
  441. package/dist/client/history/use-history.js +18 -0
  442. package/dist/client/history/use-history.js.map +1 -0
  443. package/dist/client/index.d.ts +6 -4
  444. package/dist/client/index.d.ts.map +1 -1
  445. package/dist/client/index.js +6 -4
  446. package/dist/client/index.js.map +1 -1
  447. package/dist/client/org/OrgSwitcher.js +5 -5
  448. package/dist/client/org/OrgSwitcher.js.map +1 -1
  449. package/dist/client/org/RequireActiveOrg.js +2 -2
  450. package/dist/client/org/RequireActiveOrg.js.map +1 -1
  451. package/dist/client/org/TeamPage.js +3 -3
  452. package/dist/client/org/TeamPage.js.map +1 -1
  453. package/dist/client/org/hooks.d.ts +12 -1
  454. package/dist/client/org/hooks.d.ts.map +1 -1
  455. package/dist/client/org/hooks.js +15 -0
  456. package/dist/client/org/hooks.js.map +1 -1
  457. package/dist/client/org/index.d.ts +4 -2
  458. package/dist/client/org/index.d.ts.map +1 -1
  459. package/dist/client/org/index.js +3 -1
  460. package/dist/client/org/index.js.map +1 -1
  461. package/dist/client/org-team/index.d.ts +2 -0
  462. package/dist/client/org-team/index.d.ts.map +1 -0
  463. package/dist/client/org-team/index.js +2 -0
  464. package/dist/client/org-team/index.js.map +1 -0
  465. package/dist/client/review/ReviewStatusBadge.d.ts +7 -0
  466. package/dist/client/review/ReviewStatusBadge.d.ts.map +1 -0
  467. package/dist/client/review/ReviewStatusBadge.js +19 -0
  468. package/dist/client/review/ReviewStatusBadge.js.map +1 -0
  469. package/dist/client/review/ReviewThreadPanel.d.ts +20 -0
  470. package/dist/client/review/ReviewThreadPanel.d.ts.map +1 -0
  471. package/dist/client/review/ReviewThreadPanel.js +84 -0
  472. package/dist/client/review/ReviewThreadPanel.js.map +1 -0
  473. package/dist/client/review/index.d.ts +4 -0
  474. package/dist/client/review/index.d.ts.map +1 -0
  475. package/dist/client/review/index.js +4 -0
  476. package/dist/client/review/index.js.map +1 -0
  477. package/dist/client/review/use-review.d.ts +68 -0
  478. package/dist/client/review/use-review.d.ts.map +1 -0
  479. package/dist/client/review/use-review.js +22 -0
  480. package/dist/client/review/use-review.js.map +1 -0
  481. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
  482. package/dist/client/rich-markdown-editor/useCollabReconcile.js +11 -6
  483. package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
  484. package/dist/client/settings/index.d.ts +1 -1
  485. package/dist/client/settings/index.d.ts.map +1 -1
  486. package/dist/client/settings/index.js +1 -1
  487. package/dist/client/settings/index.js.map +1 -1
  488. package/dist/client/setup-connections/BuilderConnectCard.d.ts +9 -0
  489. package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -0
  490. package/dist/client/setup-connections/BuilderConnectCard.js +25 -0
  491. package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -0
  492. package/dist/client/setup-connections/ProviderReadinessBadge.d.ts +8 -0
  493. package/dist/client/setup-connections/ProviderReadinessBadge.d.ts.map +1 -0
  494. package/dist/client/setup-connections/ProviderReadinessBadge.js +32 -0
  495. package/dist/client/setup-connections/ProviderReadinessBadge.js.map +1 -0
  496. package/dist/client/setup-connections/SetupConnectionsPage.d.ts +17 -0
  497. package/dist/client/setup-connections/SetupConnectionsPage.d.ts.map +1 -0
  498. package/dist/client/setup-connections/SetupConnectionsPage.js +10 -0
  499. package/dist/client/setup-connections/SetupConnectionsPage.js.map +1 -0
  500. package/dist/client/setup-connections/index.d.ts +7 -0
  501. package/dist/client/setup-connections/index.d.ts.map +1 -0
  502. package/dist/client/setup-connections/index.js +7 -0
  503. package/dist/client/setup-connections/index.js.map +1 -0
  504. package/dist/client/sharing/ShareButton.d.ts +4 -4
  505. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  506. package/dist/client/sharing/ShareButton.js +13 -7
  507. package/dist/client/sharing/ShareButton.js.map +1 -1
  508. package/dist/client/sharing/ShareDialog.js +3 -3
  509. package/dist/client/sharing/ShareDialog.js.map +1 -1
  510. package/dist/client/use-action.d.ts +3 -0
  511. package/dist/client/use-action.d.ts.map +1 -1
  512. package/dist/client/use-action.js +34 -3
  513. package/dist/client/use-action.js.map +1 -1
  514. package/dist/client/use-db-sync.d.ts +4 -0
  515. package/dist/client/use-db-sync.d.ts.map +1 -1
  516. package/dist/client/use-db-sync.js +37 -18
  517. package/dist/client/use-db-sync.js.map +1 -1
  518. package/dist/collab/routes.d.ts +1 -1
  519. package/dist/command-navigation/actions.d.ts +25 -0
  520. package/dist/command-navigation/actions.d.ts.map +1 -0
  521. package/dist/command-navigation/actions.js +64 -0
  522. package/dist/command-navigation/actions.js.map +1 -0
  523. package/dist/command-navigation/index.d.ts +4 -0
  524. package/dist/command-navigation/index.d.ts.map +1 -0
  525. package/dist/command-navigation/index.js +4 -0
  526. package/dist/command-navigation/index.js.map +1 -0
  527. package/dist/comments-review/index.d.ts +2 -0
  528. package/dist/comments-review/index.d.ts.map +1 -0
  529. package/dist/comments-review/index.js +2 -0
  530. package/dist/comments-review/index.js.map +1 -0
  531. package/dist/db/create-get-db.d.ts +25 -0
  532. package/dist/db/create-get-db.d.ts.map +1 -1
  533. package/dist/db/create-get-db.js +25 -2
  534. package/dist/db/create-get-db.js.map +1 -1
  535. package/dist/file-upload/builder.d.ts.map +1 -1
  536. package/dist/file-upload/builder.js +18 -2
  537. package/dist/file-upload/builder.js.map +1 -1
  538. package/dist/file-upload/types.d.ts +3 -0
  539. package/dist/file-upload/types.d.ts.map +1 -1
  540. package/dist/file-upload/types.js.map +1 -1
  541. package/dist/history/actions/create-resource-version.d.ts +10 -0
  542. package/dist/history/actions/create-resource-version.d.ts.map +1 -0
  543. package/dist/history/actions/create-resource-version.js +65 -0
  544. package/dist/history/actions/create-resource-version.js.map +1 -0
  545. package/dist/history/actions/get-resource-version.d.ts +10 -0
  546. package/dist/history/actions/get-resource-version.d.ts.map +1 -0
  547. package/dist/history/actions/get-resource-version.js +38 -0
  548. package/dist/history/actions/get-resource-version.js.map +1 -0
  549. package/dist/history/actions/list-resource-history.d.ts +10 -0
  550. package/dist/history/actions/list-resource-history.d.ts.map +1 -0
  551. package/dist/history/actions/list-resource-history.js +45 -0
  552. package/dist/history/actions/list-resource-history.js.map +1 -0
  553. package/dist/history/actions/list-resource-versions.d.ts +10 -0
  554. package/dist/history/actions/list-resource-versions.d.ts.map +1 -0
  555. package/dist/history/actions/list-resource-versions.js +35 -0
  556. package/dist/history/actions/list-resource-versions.js.map +1 -0
  557. package/dist/history/actions/restore-resource-version.d.ts +11 -0
  558. package/dist/history/actions/restore-resource-version.d.ts.map +1 -0
  559. package/dist/history/actions/restore-resource-version.js +59 -0
  560. package/dist/history/actions/restore-resource-version.js.map +1 -0
  561. package/dist/history/index.d.ts +4 -0
  562. package/dist/history/index.d.ts.map +1 -0
  563. package/dist/history/index.js +3 -0
  564. package/dist/history/index.js.map +1 -0
  565. package/dist/history/registry.d.ts +10 -0
  566. package/dist/history/registry.d.ts.map +1 -0
  567. package/dist/history/registry.js +61 -0
  568. package/dist/history/registry.js.map +1 -0
  569. package/dist/history/store.d.ts +34 -0
  570. package/dist/history/store.d.ts.map +1 -0
  571. package/dist/history/store.js +265 -0
  572. package/dist/history/store.js.map +1 -0
  573. package/dist/history/types.d.ts +55 -0
  574. package/dist/history/types.d.ts.map +1 -0
  575. package/dist/history/types.js +2 -0
  576. package/dist/history/types.js.map +1 -0
  577. package/dist/index.d.ts +6 -0
  578. package/dist/index.d.ts.map +1 -1
  579. package/dist/index.js +6 -0
  580. package/dist/index.js.map +1 -1
  581. package/dist/navigation/index.d.ts +53 -0
  582. package/dist/navigation/index.d.ts.map +1 -0
  583. package/dist/navigation/index.js +105 -0
  584. package/dist/navigation/index.js.map +1 -0
  585. package/dist/observability/routes.d.ts +3 -3
  586. package/dist/org/index.d.ts +1 -0
  587. package/dist/org/index.d.ts.map +1 -1
  588. package/dist/org/index.js +1 -0
  589. package/dist/org/index.js.map +1 -1
  590. package/dist/org/permissions.d.ts +7 -0
  591. package/dist/org/permissions.d.ts.map +1 -0
  592. package/dist/org/permissions.js +21 -0
  593. package/dist/org/permissions.js.map +1 -0
  594. package/dist/org-team/index.d.ts +2 -0
  595. package/dist/org-team/index.d.ts.map +1 -0
  596. package/dist/org-team/index.js +2 -0
  597. package/dist/org-team/index.js.map +1 -0
  598. package/dist/private-blob/registry.d.ts.map +1 -1
  599. package/dist/private-blob/registry.js +1 -0
  600. package/dist/private-blob/registry.js.map +1 -1
  601. package/dist/resources/handlers.d.ts +2 -2
  602. package/dist/review/actions/consume-review-feedback.d.ts +9 -0
  603. package/dist/review/actions/consume-review-feedback.d.ts.map +1 -0
  604. package/dist/review/actions/consume-review-feedback.js +29 -0
  605. package/dist/review/actions/consume-review-feedback.js.map +1 -0
  606. package/dist/review/actions/create-review-comment.d.ts +18 -0
  607. package/dist/review/actions/create-review-comment.d.ts.map +1 -0
  608. package/dist/review/actions/create-review-comment.js +81 -0
  609. package/dist/review/actions/create-review-comment.js.map +1 -0
  610. package/dist/review/actions/delete-review-comment.d.ts +10 -0
  611. package/dist/review/actions/delete-review-comment.d.ts.map +1 -0
  612. package/dist/review/actions/delete-review-comment.js +45 -0
  613. package/dist/review/actions/delete-review-comment.js.map +1 -0
  614. package/dist/review/actions/get-review-feedback.d.ts +10 -0
  615. package/dist/review/actions/get-review-feedback.d.ts.map +1 -0
  616. package/dist/review/actions/get-review-feedback.js +45 -0
  617. package/dist/review/actions/get-review-feedback.js.map +1 -0
  618. package/dist/review/actions/list-review-comments.d.ts +13 -0
  619. package/dist/review/actions/list-review-comments.d.ts.map +1 -0
  620. package/dist/review/actions/list-review-comments.js +44 -0
  621. package/dist/review/actions/list-review-comments.js.map +1 -0
  622. package/dist/review/actions/reply-review-comment.d.ts +16 -0
  623. package/dist/review/actions/reply-review-comment.d.ts.map +1 -0
  624. package/dist/review/actions/reply-review-comment.js +84 -0
  625. package/dist/review/actions/reply-review-comment.js.map +1 -0
  626. package/dist/review/actions/resolve-review-thread.d.ts +11 -0
  627. package/dist/review/actions/resolve-review-thread.d.ts.map +1 -0
  628. package/dist/review/actions/resolve-review-thread.js +46 -0
  629. package/dist/review/actions/resolve-review-thread.js.map +1 -0
  630. package/dist/review/actions/set-review-status.d.ts +9 -0
  631. package/dist/review/actions/set-review-status.d.ts.map +1 -0
  632. package/dist/review/actions/set-review-status.js +43 -0
  633. package/dist/review/actions/set-review-status.js.map +1 -0
  634. package/dist/review/index.d.ts +5 -0
  635. package/dist/review/index.d.ts.map +1 -0
  636. package/dist/review/index.js +4 -0
  637. package/dist/review/index.js.map +1 -0
  638. package/dist/review/mentions.d.ts +4 -0
  639. package/dist/review/mentions.d.ts.map +1 -0
  640. package/dist/review/mentions.js +39 -0
  641. package/dist/review/mentions.js.map +1 -0
  642. package/dist/review/registry.d.ts +10 -0
  643. package/dist/review/registry.d.ts.map +1 -0
  644. package/dist/review/registry.js +61 -0
  645. package/dist/review/registry.js.map +1 -0
  646. package/dist/review/store.d.ts +63 -0
  647. package/dist/review/store.d.ts.map +1 -0
  648. package/dist/review/store.js +558 -0
  649. package/dist/review/store.js.map +1 -0
  650. package/dist/review/types.d.ts +77 -0
  651. package/dist/review/types.d.ts.map +1 -0
  652. package/dist/review/types.js +2 -0
  653. package/dist/review/types.js.map +1 -0
  654. package/dist/secrets/routes.d.ts +9 -9
  655. package/dist/server/action-discovery.d.ts.map +1 -1
  656. package/dist/server/action-discovery.js +54 -0
  657. package/dist/server/action-discovery.js.map +1 -1
  658. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  659. package/dist/server/agent-engine-api-key-route.d.ts.map +1 -1
  660. package/dist/server/agent-engine-api-key-route.js +5 -0
  661. package/dist/server/agent-engine-api-key-route.js.map +1 -1
  662. package/dist/server/credential-provider.d.ts +26 -0
  663. package/dist/server/credential-provider.d.ts.map +1 -1
  664. package/dist/server/credential-provider.js +82 -0
  665. package/dist/server/credential-provider.js.map +1 -1
  666. package/dist/server/framework-request-handler.d.ts.map +1 -1
  667. package/dist/server/framework-request-handler.js +37 -1
  668. package/dist/server/framework-request-handler.js.map +1 -1
  669. package/dist/setup-connections/index.d.ts +6 -0
  670. package/dist/setup-connections/index.d.ts.map +1 -0
  671. package/dist/setup-connections/index.js +6 -0
  672. package/dist/setup-connections/index.js.map +1 -0
  673. package/dist/setup-connections/onboarding.d.ts +14 -0
  674. package/dist/setup-connections/onboarding.d.ts.map +1 -0
  675. package/dist/setup-connections/onboarding.js +23 -0
  676. package/dist/setup-connections/onboarding.js.map +1 -0
  677. package/dist/transcription/builder-transcription.d.ts +1 -0
  678. package/dist/transcription/builder-transcription.d.ts.map +1 -1
  679. package/dist/transcription/builder-transcription.js +5 -2
  680. package/dist/transcription/builder-transcription.js.map +1 -1
  681. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  682. package/dist/vite/action-types-plugin.js +52 -0
  683. package/dist/vite/action-types-plugin.js.map +1 -1
  684. package/docs/content/agent-native-toolkit.mdx +87 -80
  685. package/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
  686. package/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
  687. package/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
  688. package/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
  689. package/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
  690. package/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
  691. package/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
  692. package/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
  693. package/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
  694. package/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
  695. package/docs/content/toolkit-agent-ux.mdx +43 -0
  696. package/docs/content/toolkit-app-adapters.mdx +9 -0
  697. package/docs/content/toolkit-collaboration-ui.mdx +12 -0
  698. package/docs/content/toolkit-collaboration.mdx +74 -0
  699. package/docs/content/toolkit-command-navigation.mdx +106 -0
  700. package/docs/content/toolkit-comments-review.mdx +98 -0
  701. package/docs/content/toolkit-history.mdx +95 -0
  702. package/docs/content/toolkit-observability.mdx +41 -0
  703. package/docs/content/toolkit-org-team.mdx +80 -0
  704. package/docs/content/toolkit-resources.mdx +57 -0
  705. package/docs/content/toolkit-settings.mdx +65 -0
  706. package/docs/content/toolkit-setup-connections.mdx +109 -0
  707. package/docs/content/toolkit-sharing-ui.mdx +18 -6
  708. package/docs/content/toolkit-sharing.mdx +81 -0
  709. package/docs/content/toolkit-shell-hooks.mdx +9 -0
  710. package/docs/content/toolkit-ui.mdx +9 -0
  711. package/package.json +36 -2
  712. package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +0 -153
  713. package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +0 -133
  714. package/corpus/templates/design/app/pages/DesignEditor.tsx +0 -22924
@@ -0,0 +1,21 @@
1
+ import type { Point } from "./types";
2
+
3
+ /** Path-local point -> canvas-space point, given the path's canvas origin. */
4
+ export function vectorEditLocalToCanvasPoint(
5
+ local: Point,
6
+ originCanvas: Point,
7
+ ): Point {
8
+ return { x: originCanvas.x + local.x, y: originCanvas.y + local.y };
9
+ }
10
+
11
+ /** Canvas-space point -> path-local point, given the path's canvas origin.
12
+ * Inverse of `vectorEditLocalToCanvasPoint`. */
13
+ export function vectorEditCanvasToLocalPoint(
14
+ canvasPoint: Point,
15
+ originCanvas: Point,
16
+ ): Point {
17
+ return {
18
+ x: canvasPoint.x - originCanvas.x,
19
+ y: canvasPoint.y - originCanvas.y,
20
+ };
21
+ }
@@ -15,6 +15,21 @@ export interface ElementInfo {
15
15
  componentName?: string;
16
16
  id?: string;
17
17
  sourceId?: string;
18
+ /**
19
+ * Node-id integrity (id-on-demand): a durable candidate id the bridge minted
20
+ * for this element because it has no stable `data-agent-native-node-id`
21
+ * (or other stable source id) at all — common on AI-generated screens,
22
+ * where every id-keyed host operation (move/reorder, style commits that
23
+ * resolve a targetNode, motion tracks, scrub) otherwise silently no-ops or
24
+ * throws `Node with data-agent-native-node-id="" not found in sourceHtml`.
25
+ * Only present when `sourceId` is absent/empty. The host should persist
26
+ * this value into the source as the element's real
27
+ * `data-agent-native-node-id` the moment it sees one (see
28
+ * DesignEditor.tsx's selection handlers), through the same guarded write
29
+ * path every other edit uses — after that every subsequent id-keyed op
30
+ * against this element resolves normally via `sourceId`.
31
+ */
32
+ pendingNodeId?: string;
18
33
  selector?: string;
19
34
  classes: string[];
20
35
  computedStyles: Record<string, string>;
@@ -339,6 +339,33 @@ function isNestedPromptPopoverTarget(target: EventTarget | null) {
339
339
  );
340
340
  }
341
341
 
342
+ // While a nested Radix Select/Popover/Dropdown is open, Radix locks
343
+ // `pointer-events` on everything outside its own portalled content so only
344
+ // that content (and its trigger) remain interactive. That lockout is what
345
+ // lets the interaction happen at all, but it also means the pointer/focus
346
+ // event that reaches our `onInteractOutside` handler resolves its `target`
347
+ // to `<html>`/`document` instead of the element the user actually clicked —
348
+ // the real target sits under a `pointer-events: none` ancestor, so the
349
+ // browser reports the outermost still-hit-testable node. That target fails
350
+ // any `closest()` containment check, so the click looks "outside" the
351
+ // dialog and dismisses it even though the user never left the popover.
352
+ //
353
+ // Rather than pattern-match on the resolved (and unreliable) target, check
354
+ // whether any of our nested portalled surfaces are currently open in the
355
+ // DOM — they're stamped with the same data attributes whether or not the
356
+ // interact-outside target correctly resolved into them. If one is open,
357
+ // this is never a genuine outside click.
358
+ function hasOpenNestedPromptPopoverSurface() {
359
+ if (typeof document === "undefined") return false;
360
+ return Boolean(
361
+ document.querySelector(
362
+ '[data-agent-native-composer-popover][data-state="open"],' +
363
+ "[data-assets-picker-dialog]," +
364
+ '[data-agent-native-prompt-select][data-state="open"]',
365
+ ),
366
+ );
367
+ }
368
+
342
369
  export default function PromptPopover({
343
370
  open,
344
371
  onOpenChange,
@@ -363,6 +390,38 @@ export default function PromptPopover({
363
390
  const [pickedAssets, setPickedAssets] = useState<UploadedFile[]>([]);
364
391
  const [selectedUploadFiles, setSelectedUploadFiles] = useState<File[]>([]);
365
392
  const [assetsPickerOpen, setAssetsPickerOpen] = useState(false);
393
+ // While the nested design-system Select is open, Radix disables pointer
394
+ // events on everything else and the click that closes the Select also
395
+ // moves focus back to its trigger. That focus-return is itself reported to
396
+ // the popover's dismissable layer as a "focus outside" interaction — and it
397
+ // fires *after* the Select has already unmounted its portalled content, so
398
+ // by then there is nothing left in the DOM for `onInteractOutside` to
399
+ // recognize as "still nested and open". Latch a short-lived flag the
400
+ // instant the Select reports closing, and have the popover's
401
+ // interact-outside guard also honor that flag so the popover survives the
402
+ // Select's own close-triggered focus shuffle. See PromptDialog R87/R91.
403
+ const justClosedNestedSelectRef = useRef(false);
404
+ const clearJustClosedNestedSelectTimeoutRef = useRef<ReturnType<
405
+ typeof setTimeout
406
+ > | null>(null);
407
+ const markNestedSelectJustClosed = useCallback(() => {
408
+ justClosedNestedSelectRef.current = true;
409
+ if (clearJustClosedNestedSelectTimeoutRef.current != null) {
410
+ clearTimeout(clearJustClosedNestedSelectTimeoutRef.current);
411
+ }
412
+ clearJustClosedNestedSelectTimeoutRef.current = setTimeout(() => {
413
+ justClosedNestedSelectRef.current = false;
414
+ clearJustClosedNestedSelectTimeoutRef.current = null;
415
+ }, 300);
416
+ }, []);
417
+ useEffect(
418
+ () => () => {
419
+ if (clearJustClosedNestedSelectTimeoutRef.current != null) {
420
+ clearTimeout(clearJustClosedNestedSelectTimeoutRef.current);
421
+ }
422
+ },
423
+ [],
424
+ );
366
425
 
367
426
  useEffect(() => {
368
427
  if (open) return;
@@ -502,10 +561,48 @@ export default function PromptPopover({
502
561
  [assetsPickerOpen, onOpenChange],
503
562
  );
504
563
 
505
- const hasVirtualAnchor = !centered && Boolean(anchorRef?.current);
506
- const virtualAnchorRef = anchorRef as React.RefObject<{
507
- getBoundingClientRect: () => DOMRect;
508
- }>;
564
+ const hasLiveVirtualAnchor = !centered && Boolean(anchorRef?.current);
565
+ // Radix keeps the closed popover mounted while the exit animation plays, but
566
+ // callers may clear `anchorRef` as soon as they close it. Latch the anchor
567
+ // mode from the last open render so the closing popover never swaps over to
568
+ // the static fallback anchor mid-exit (which re-anchored the fading popover
569
+ // to the top-left corner of the screen).
570
+ const anchorModeWhileOpenRef = useRef(hasLiveVirtualAnchor);
571
+ if (open) {
572
+ anchorModeWhileOpenRef.current = hasLiveVirtualAnchor;
573
+ }
574
+ const hasVirtualAnchor = open
575
+ ? hasLiveVirtualAnchor
576
+ : anchorModeWhileOpenRef.current;
577
+
578
+ // Stable virtual anchor that measures the live anchor element while it is
579
+ // attached and falls back to the last good rect afterwards. The anchor
580
+ // element can unmount on unrelated sidebar re-renders, and the ref can be
581
+ // cleared during the exit animation; measuring a detached element returns a
582
+ // zero rect, which used to reposition the popover to the viewport origin.
583
+ const latestAnchorRef = useRef(anchorRef);
584
+ latestAnchorRef.current = anchorRef;
585
+ const lastAnchorRectRef = useRef<DOMRect | null>(null);
586
+ const [virtualAnchorRef] = useState<
587
+ React.RefObject<{ getBoundingClientRect: () => DOMRect }>
588
+ >(() => ({
589
+ current: {
590
+ getBoundingClientRect: () => {
591
+ const el = latestAnchorRef.current?.current;
592
+ if (el?.isConnected) {
593
+ const rect = el.getBoundingClientRect();
594
+ if (rect.width > 0 || rect.height > 0) {
595
+ lastAnchorRectRef.current = rect;
596
+ return rect;
597
+ }
598
+ }
599
+ return (
600
+ lastAnchorRectRef.current ??
601
+ new DOMRect(window.innerWidth / 2, window.innerHeight / 2, 0, 0)
602
+ );
603
+ },
604
+ },
605
+ }));
509
606
 
510
607
  return (
511
608
  <Popover open={open} onOpenChange={handlePopoverOpenChange}>
@@ -539,7 +636,11 @@ export default function PromptPopover({
539
636
  if (assetsPickerOpen) event.preventDefault();
540
637
  }}
541
638
  onInteractOutside={(event) => {
542
- if (isNestedPromptPopoverTarget(event.target)) {
639
+ if (
640
+ isNestedPromptPopoverTarget(event.target) ||
641
+ hasOpenNestedPromptPopoverSurface() ||
642
+ justClosedNestedSelectRef.current
643
+ ) {
543
644
  event.preventDefault();
544
645
  }
545
646
  }}
@@ -588,6 +689,9 @@ export default function PromptPopover({
588
689
  onValueChange={(value) =>
589
690
  onDesignSystemChange?.(value === "none" ? null : value)
590
691
  }
692
+ onOpenChange={(nextOpen) => {
693
+ if (!nextOpen) markNestedSelectJustClosed();
694
+ }}
591
695
  disabled={designSystemsLoading}
592
696
  >
593
697
  <SelectTrigger className="h-8 min-w-0 flex-1 text-xs">
@@ -36,11 +36,11 @@
36
36
  --sidebar-accent-foreground: 0 0% 15%;
37
37
  --sidebar-border: 0 0% 90%;
38
38
  --sidebar-ring: 0 0% 40%;
39
- --design-editor-accent-color: hsl(213 91% 67%);
40
- --design-editor-accent-hover-color: hsl(213 72% 56%);
39
+ --design-editor-accent-color: hsl(205 100% 53%);
40
+ --design-editor-accent-hover-color: hsl(205 81% 42%);
41
41
  --design-editor-selection-color: color-mix(
42
42
  in srgb,
43
- hsl(213 91% 67%) 14%,
43
+ hsl(205 100% 53%) 14%,
44
44
  transparent
45
45
  );
46
46
  --design-editor-component-color: hsl(263 84% 64%);
@@ -69,7 +69,7 @@
69
69
  );
70
70
  --design-editor-selected-subtree-color: color-mix(
71
71
  in srgb,
72
- hsl(213 91% 67%) 9%,
72
+ hsl(205 100% 53%) 9%,
73
73
  transparent
74
74
  );
75
75
  --design-editor-panel-divider-color: color-mix(
@@ -122,11 +122,11 @@
122
122
  --sidebar-accent-foreground: 0 0% 90%;
123
123
  --sidebar-border: 0 0% 20%;
124
124
  --sidebar-ring: 0 0% 60%;
125
- --design-editor-accent-color: hsl(213 91% 67%);
126
- --design-editor-accent-hover-color: hsl(213 72% 56%);
125
+ --design-editor-accent-color: hsl(205 100% 53%);
126
+ --design-editor-accent-hover-color: hsl(205 81% 42%);
127
127
  --design-editor-selection-color: color-mix(
128
128
  in srgb,
129
- hsl(213 91% 67%) 24%,
129
+ hsl(205 100% 53%) 24%,
130
130
  transparent
131
131
  );
132
132
  --design-editor-component-color: hsl(263 88% 74%);
@@ -151,7 +151,7 @@
151
151
  );
152
152
  --design-editor-selected-subtree-color: color-mix(
153
153
  in srgb,
154
- hsl(213 91% 67%) 18%,
154
+ hsl(205 100% 53%) 18%,
155
155
  transparent
156
156
  );
157
157
  --design-editor-panel-divider-color: hsl(0 0% 22%);
@@ -41,6 +41,24 @@ export interface DesignHotkeyOpacityDetails extends DesignHotkeyDetails {
41
41
  opacity: number;
42
42
  }
43
43
 
44
+ export type DesignHotkeyAlignEdge =
45
+ | "left"
46
+ | "center-h"
47
+ | "right"
48
+ | "top"
49
+ | "center-v"
50
+ | "bottom";
51
+
52
+ export interface DesignHotkeyAlignDetails extends DesignHotkeyDetails {
53
+ edge: DesignHotkeyAlignEdge;
54
+ }
55
+
56
+ export type DesignHotkeyDistributeAxis = "horizontal" | "vertical";
57
+
58
+ export interface DesignHotkeyDistributeDetails extends DesignHotkeyDetails {
59
+ axis: DesignHotkeyDistributeAxis;
60
+ }
61
+
44
62
  export type DesignHotkeyTarget = Window | Document | HTMLElement;
45
63
  export type DesignHotkeyHandler = (details: DesignHotkeyDetails) => void;
46
64
  export type DesignHotkeyToolHandler = (
@@ -54,6 +72,12 @@ export type DesignHotkeyTabHandler = (details: DesignHotkeyTabDetails) => void;
54
72
  export type DesignHotkeyOpacityHandler = (
55
73
  details: DesignHotkeyOpacityDetails,
56
74
  ) => void;
75
+ export type DesignHotkeyAlignHandler = (
76
+ details: DesignHotkeyAlignDetails,
77
+ ) => void;
78
+ export type DesignHotkeyDistributeHandler = (
79
+ details: DesignHotkeyDistributeDetails,
80
+ ) => void;
57
81
 
58
82
  export interface UseDesignHotkeysProps {
59
83
  enabled?: boolean;
@@ -87,6 +111,9 @@ export interface UseDesignHotkeysProps {
87
111
  onSelectAll?: DesignHotkeyHandler;
88
112
  onGroup?: DesignHotkeyHandler;
89
113
  onUngroup?: DesignHotkeyHandler;
114
+ /** Figma's Cmd+Alt+G — "Frame selection": wrap the selection in a frame
115
+ * container (distinct from onGroup's plain-group wrapper). */
116
+ onFrameSelection?: DesignHotkeyHandler;
90
117
  onUndo?: DesignHotkeyHandler;
91
118
  onRedo?: DesignHotkeyHandler;
92
119
  onBringForward?: DesignHotkeyHandler;
@@ -113,6 +140,52 @@ export interface UseDesignHotkeysProps {
113
140
  * editable-target keystroke (already filtered by ignoreEditableTargets).
114
141
  */
115
142
  onOpacityChange?: DesignHotkeyOpacityHandler;
143
+ /** Figma's Cmd+Shift+H — toggle hide/show for the current selection (all
144
+ * selected layers/screens). */
145
+ onToggleHidden?: DesignHotkeyHandler;
146
+ /** Figma's Cmd+Shift+L — toggle lock/unlock for the current selection. */
147
+ onToggleLocked?: DesignHotkeyHandler;
148
+ /** Figma's Shift+H — flip the current selection horizontally. */
149
+ onFlipHorizontal?: DesignHotkeyHandler;
150
+ /** Figma's Shift+V — flip the current selection vertically. */
151
+ onFlipVertical?: DesignHotkeyHandler;
152
+ /** Figma's Shift+X — swap the current selection's fill and stroke. */
153
+ onSwapFillStroke?: DesignHotkeyHandler;
154
+ /** Figma's Shift+Cmd+R — paste to replace the current selection with the
155
+ * internal canvas clipboard's contents. */
156
+ onPasteToReplace?: DesignHotkeyHandler;
157
+ /**
158
+ * Figma's "I" — eyedropper: sample a color from anywhere on screen and
159
+ * apply it to the current selection. A one-shot action, not a tool (so it
160
+ * is intentionally NOT in TOOL_SHORTCUTS/onToolChange).
161
+ */
162
+ onEyedropper?: DesignHotkeyHandler;
163
+ /**
164
+ * Figma's Alt+A/D/W/S/H/V — align the current selection to left/right/top/
165
+ * bottom/center-h/center-v. Alt-only (no cmd/shift); moves the selection
166
+ * itself, matching the EditPanel Alignment row's `onAlignSelection`
167
+ * contract (see PositionLayoutProperties in EditPanel.tsx).
168
+ */
169
+ onAlignSelection?: DesignHotkeyAlignHandler;
170
+ /**
171
+ * Figma's Alt+Shift+H / Alt+Shift+V — distribute the selection evenly
172
+ * along the horizontal/vertical axis (3+ objects; first/last stay put).
173
+ */
174
+ onDistributeSelection?: DesignHotkeyDistributeHandler;
175
+ /** Figma's Ctrl+Alt+T (literal Control on every platform, not Cmd) — Tidy
176
+ * up: arrange the selection into a compact grid with uniform gaps. */
177
+ onTidyUp?: DesignHotkeyHandler;
178
+ /**
179
+ * Figma's Shift+A — Add auto layout. Shift-only so it never shadows the
180
+ * plain "a" frame-tool shortcut (TOOL_SHORTCUTS only fires with no
181
+ * modifiers held) or SHIFT_TOOL_SHORTCUTS (which has no "a" entry).
182
+ */
183
+ onAddAutoLayout?: DesignHotkeyHandler;
184
+ /** Figma's Cmd+\ — toggle Show/Hide UI (left rail, right panel, bottom
185
+ * toolbar chrome). */
186
+ onToggleUi?: DesignHotkeyHandler;
187
+ /** Figma's Shift+C — toggle Show/Hide comments (comment pins). */
188
+ onToggleComments?: DesignHotkeyHandler;
116
189
  }
117
190
 
118
191
  const TOOL_SHORTCUTS: Record<
@@ -121,6 +194,10 @@ const TOOL_SHORTCUTS: Record<
121
194
  > = {
122
195
  v: { tool: "move", handler: "onMoveTool" },
123
196
  f: { tool: "frame", handler: "onFrameTool" },
197
+ // Figma binds BOTH F and A to the frame tool; A is the muscle-memory
198
+ // favorite. Cmd+A (select all) is unaffected — tool shortcuts only fire
199
+ // with no modifiers held.
200
+ a: { tool: "frame", handler: "onFrameTool" },
124
201
  r: { tool: "rectangle", handler: "onRectangleTool" },
125
202
  o: { tool: "ellipse", handler: "onEllipseTool" },
126
203
  l: { tool: "line", handler: "onLineTool" },
@@ -299,6 +376,20 @@ function handleDesignHotkey(
299
376
  return true;
300
377
  };
301
378
 
379
+ const runAlign = (edge: DesignHotkeyAlignEdge) => {
380
+ if (!props.onAlignSelection) return false;
381
+ prevent();
382
+ props.onAlignSelection({ ...details, edge });
383
+ return true;
384
+ };
385
+
386
+ const runDistribute = (axis: DesignHotkeyDistributeAxis) => {
387
+ if (!props.onDistributeSelection) return false;
388
+ prevent();
389
+ props.onDistributeSelection({ ...details, axis });
390
+ return true;
391
+ };
392
+
302
393
  if (!primary && !event.altKey && event.shiftKey) {
303
394
  // H1: shift+key variant (e.g. Shift+L → arrow tool) takes priority over
304
395
  // the base binding for the same key while shift is held.
@@ -319,6 +410,12 @@ function handleDesignHotkey(
319
410
  props[toolShortcut.handler] as DesignHotkeyHandler | undefined,
320
411
  );
321
412
  }
413
+ // Figma's "I" — eyedropper. Deliberately NOT in TOOL_SHORTCUTS: it's a
414
+ // one-shot sample-and-apply action, not a persistent armed tool (no
415
+ // onToolChange call, no cursor mode to stay in).
416
+ if (key === "i") {
417
+ return run(props.onEyedropper);
418
+ }
322
419
  }
323
420
 
324
421
  if (event.key in ARROW_DIRECTIONS && !primary && !event.altKey) {
@@ -364,10 +461,28 @@ function handleDesignHotkey(
364
461
  return run(props.onPaste);
365
462
  }
366
463
  if (primary && key === "d") return run(props.onDuplicate);
464
+ // Figma's Shift+Cmd+R — "Paste to replace" — must be checked BEFORE plain
465
+ // Cmd+R (rename) so shift wins; onPasteToReplace absent falls through to
466
+ // rename so existing behavior is unaffected until the handler is wired.
467
+ if (primary && event.shiftKey && key === "r") {
468
+ return run(props.onPasteToReplace);
469
+ }
367
470
  if (primary && key === "r") return run(props.onRename);
471
+ // Cmd+Shift+H/L (hide/lock the current selection) must take precedence
472
+ // over any other h/l handling (e.g. the plain "h" hand-tool shortcut only
473
+ // fires with no modifiers held, so there's no real conflict, but this is
474
+ // checked first defensively to guarantee primary+shift+h/l always wins).
475
+ if (primary && event.shiftKey && key === "h") {
476
+ return run(props.onToggleHidden);
477
+ }
478
+ if (primary && event.shiftKey && key === "l") {
479
+ return run(props.onToggleLocked);
480
+ }
368
481
  if (primary && key === "g") {
369
- // Figma uses ⇧⌘G for ungroup; also support ⌥⌘G as an alias.
370
- if (event.shiftKey || event.altKey) return run(props.onUngroup);
482
+ // Figma: ⇧⌘G is ungroup. ⌥⌘G is a DIFFERENT command — "Frame selection"
483
+ // (wrap the selection in a frame) not an ungroup alias.
484
+ if (event.shiftKey) return run(props.onUngroup);
485
+ if (event.altKey) return run(props.onFrameSelection);
371
486
  return run(props.onGroup);
372
487
  }
373
488
 
@@ -375,6 +490,25 @@ function handleDesignHotkey(
375
490
  if (primary && key === "-") return run(props.onZoomOut);
376
491
  if (primary && key === "0") return run(props.onZoomReset);
377
492
 
493
+ // Figma: plain +/= and - (no modifiers) also zoom in/out.
494
+ if (!primary && !event.altKey && !event.shiftKey) {
495
+ if (key === "=" || key === "+") return run(props.onZoomIn);
496
+ if (key === "-") return run(props.onZoomOut);
497
+ }
498
+
499
+ // Figma: Shift+= ("+" on a US keyboard, since "+" is the shifted "=") also
500
+ // zooms in. Checked separately from the plain-modifier branch above (which
501
+ // requires !shiftKey) so this doesn't need to disturb that branch's other
502
+ // no-modifier-only guarantees; key === "+" already implies shift produced
503
+ // it on layouts where "+" isn't its own physical key, but this also covers
504
+ // event.code === "Equal" with shiftKey true for layouts that report key as
505
+ // "=" while shifted.
506
+ if (!primary && !event.altKey && event.shiftKey) {
507
+ if (key === "+" || (key === "=" && event.code === "Equal")) {
508
+ return run(props.onZoomIn);
509
+ }
510
+ }
511
+
378
512
  // H2: Cmd+Alt+K — create component from the current selection.
379
513
  if (primary && event.altKey && key === "k") {
380
514
  return run(props.onCreateComponent);
@@ -410,18 +544,141 @@ function handleDesignHotkey(
410
544
  return true;
411
545
  }
412
546
 
547
+ // Ground-truth Figma: plain ]/[ (no modifiers) are Bring to front / Send
548
+ // to back — the "big jump" commands. Cmd+]/Cmd+[ are Bring forward / Send
549
+ // backward (single-step reorder). Alt+Cmd+]/Alt+Cmd+[ are silent aliases
550
+ // of the plain front/back commands (kept for muscle memory / older
551
+ // bindings), NOT of forward/backward.
413
552
  if (primary && key === "]") {
414
553
  return event.altKey ? run(props.onBringToFront) : run(props.onBringForward);
415
554
  }
416
555
  if (primary && key === "[") {
417
556
  return event.altKey ? run(props.onSendToBack) : run(props.onSendBackward);
418
557
  }
558
+ if (!primary && !event.altKey && !event.shiftKey && key === "]") {
559
+ return run(props.onBringToFront);
560
+ }
561
+ if (!primary && !event.altKey && !event.shiftKey && key === "[") {
562
+ return run(props.onSendToBack);
563
+ }
564
+
565
+ // H3: Shift+H / Shift+V — flip selection horizontal/vertical. Checked
566
+ // after the primary+shift h/l (hide/lock) branch above so Cmd+Shift+H
567
+ // still wins; h/v aren't in SHIFT_TOOL_SHORTCUTS so there's no real
568
+ // shortcut collision here either.
569
+ if (!primary && !event.altKey && event.shiftKey && key === "h") {
570
+ return run(props.onFlipHorizontal);
571
+ }
572
+ if (!primary && !event.altKey && event.shiftKey && key === "v") {
573
+ return run(props.onFlipVertical);
574
+ }
575
+
576
+ // Figma: Shift+X — swap fill and stroke. Cmd+X (cut) is unaffected since
577
+ // this only fires when shift is held and no primary modifier is present.
578
+ if (!primary && !event.altKey && event.shiftKey && key === "x") {
579
+ return run(props.onSwapFillStroke);
580
+ }
581
+
582
+ // Figma: Alt+Shift+H / Alt+Shift+V — distribute the selection evenly along
583
+ // the horizontal/vertical axis. Checked BEFORE the plain Alt+H/Alt+V align
584
+ // bindings below so the shift-held distribute variant always wins over the
585
+ // no-shift align variant for the same letter.
586
+ if (!primary && event.altKey && event.shiftKey) {
587
+ if (key === "h") return runDistribute("horizontal");
588
+ if (key === "v") return runDistribute("vertical");
589
+ }
590
+
591
+ // Figma: Alt+A/D/W/S/H/V — align the selection to left/right/top/bottom/
592
+ // center-h/center-v. Alt-only (no cmd, no shift — shift+h/v are the
593
+ // distribute bindings just above, shift+a is Add auto layout below).
594
+ if (!primary && event.altKey && !event.shiftKey) {
595
+ if (key === "a") return runAlign("left");
596
+ if (key === "d") return runAlign("right");
597
+ if (key === "w") return runAlign("top");
598
+ if (key === "s") return runAlign("bottom");
599
+ if (key === "h") return runAlign("center-h");
600
+ if (key === "v") return runAlign("center-v");
601
+ }
602
+
603
+ // Figma: Ctrl+Alt+T — Tidy up. A rare Figma shortcut that stays literal
604
+ // Control on every platform (never remapped to Cmd on Mac), so this checks
605
+ // event.ctrlKey directly instead of the combined `primary` flag.
606
+ if (event.ctrlKey && event.altKey && !event.metaKey && key === "t") {
607
+ return run(props.onTidyUp);
608
+ }
609
+
610
+ // Figma: Shift+A — Add auto layout. Shift-only: plain "a" is the frame-tool
611
+ // shortcut (TOOL_SHORTCUTS, no-modifier only) and SHIFT_TOOL_SHORTCUTS has
612
+ // no "a" entry, so this can't shadow either.
613
+ if (!primary && !event.altKey && event.shiftKey && key === "a") {
614
+ return run(props.onAddAutoLayout);
615
+ }
616
+
617
+ // Figma: Cmd+\ — Show/Hide UI (empty-canvas context-menu item).
618
+ if (primary && key === "\\") {
619
+ return run(props.onToggleUi);
620
+ }
621
+
622
+ // Figma: Shift+C — Show/Hide comments. Plain "c" (no modifiers) is the
623
+ // comment-pin TOOL_SHORTCUTS entry, so shift+c can't shadow it.
624
+ if (!primary && !event.altKey && event.shiftKey && key === "c") {
625
+ return run(props.onToggleComments);
626
+ }
419
627
 
420
628
  return false;
421
629
  }
422
630
 
631
+ // Physical-position (event.code) letter/punctuation lookup used ONLY when
632
+ // event.altKey is true. On real macOS keyboards, Option+letter produces a
633
+ // composed/dead-key character in event.key (Option+A -> "å", Option+H ->
634
+ // "˙", Option+] tends to be unaffected but other punctuation isn't), so
635
+ // every alt-held combo must match on the physical key position instead of
636
+ // the printed character. This mirrors Figma's own behavior: its alt-letter
637
+ // shortcuts (align, distribute, frame-selection, create-component, z-order
638
+ // aliases, tidy up) fire from the QWERTY physical position regardless of
639
+ // what character Option composes on the active input layout.
640
+ const ALT_CODE_KEYS: Record<string, string> = {
641
+ KeyA: "a",
642
+ KeyB: "b",
643
+ KeyC: "c",
644
+ KeyD: "d",
645
+ KeyE: "e",
646
+ KeyF: "f",
647
+ KeyG: "g",
648
+ KeyH: "h",
649
+ KeyI: "i",
650
+ KeyJ: "j",
651
+ KeyK: "k",
652
+ KeyL: "l",
653
+ KeyM: "m",
654
+ KeyN: "n",
655
+ KeyO: "o",
656
+ KeyP: "p",
657
+ KeyQ: "q",
658
+ KeyR: "r",
659
+ KeyS: "s",
660
+ KeyT: "t",
661
+ KeyU: "u",
662
+ KeyV: "v",
663
+ KeyW: "w",
664
+ KeyX: "x",
665
+ KeyY: "y",
666
+ KeyZ: "z",
667
+ BracketRight: "]",
668
+ BracketLeft: "[",
669
+ };
670
+
423
671
  function normalizedKey(event: KeyboardEvent) {
424
672
  if (event.key === " ") return "space";
673
+ // Alt-held combos: derive the letter/punctuation from the physical key
674
+ // position (event.code) instead of the composed character (event.key).
675
+ // See ALT_CODE_KEYS above for why. Falls back to the plain event.key
676
+ // handling below for codes we don't map (e.g. Escape, Tab, arrows), so
677
+ // non-letter alt combos are unaffected.
678
+ if (event.altKey) {
679
+ const fromCode = ALT_CODE_KEYS[event.code];
680
+ if (fromCode) return fromCode;
681
+ }
425
682
  return event.key.length === 1 ? event.key.toLowerCase() : event.key;
426
683
  }
427
684