@agent-native/core 0.80.4 → 0.80.6

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 (341) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +28 -2
  3. package/corpus/core/docs/content/locales/ar-SA/real-time-collaboration.mdx +2 -2
  4. package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +1 -1
  5. package/corpus/core/docs/content/locales/de-DE/real-time-collaboration.mdx +3 -3
  6. package/corpus/core/docs/content/locales/de-DE/template-design.mdx +1 -1
  7. package/corpus/core/docs/content/locales/es-ES/real-time-collaboration.mdx +2 -2
  8. package/corpus/core/docs/content/locales/es-ES/template-design.mdx +1 -1
  9. package/corpus/core/docs/content/locales/fr-FR/real-time-collaboration.mdx +2 -2
  10. package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +1 -1
  11. package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +1 -1
  12. package/corpus/core/docs/content/locales/ja-JP/real-time-collaboration.mdx +2 -2
  13. package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +1 -1
  14. package/corpus/core/docs/content/locales/ko-KR/real-time-collaboration.mdx +2 -2
  15. package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +1 -1
  16. package/corpus/core/docs/content/locales/pt-BR/real-time-collaboration.mdx +2 -2
  17. package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +1 -1
  18. package/corpus/core/docs/content/locales/zh-CN/real-time-collaboration.mdx +2 -2
  19. package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +1 -1
  20. package/corpus/core/docs/content/locales/zh-TW/real-time-collaboration.mdx +2 -2
  21. package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +1 -1
  22. package/corpus/core/docs/content/real-time-collaboration.mdx +2 -2
  23. package/corpus/core/docs/content/template-design.mdx +1 -1
  24. package/corpus/core/package.json +3 -7
  25. package/corpus/core/src/action.ts +21 -0
  26. package/corpus/core/src/agent/durable-background.ts +32 -11
  27. package/corpus/core/src/agent/production-agent.ts +11 -1
  28. package/corpus/core/src/agent/run-loop-with-resume.ts +3 -1
  29. package/corpus/core/src/brand-kit/fig/index.ts +17 -37
  30. package/corpus/core/src/cli/create.ts +1 -0
  31. package/corpus/core/src/cli/index.ts +1 -1
  32. package/corpus/core/src/cli/mcp-config-writers.ts +187 -51
  33. package/corpus/core/src/cli/skills.ts +18 -3
  34. package/corpus/core/src/client/AssistantChat.tsx +11 -1
  35. package/corpus/core/src/client/agent-chat.ts +12 -1
  36. package/corpus/core/src/client/composer/PromptComposer.tsx +100 -41
  37. package/corpus/core/src/client/org/OrgSwitcher.tsx +1 -1
  38. package/corpus/core/src/client/sharing/ShareButton.tsx +3 -27
  39. package/corpus/core/src/collab/presence.ts +1 -1
  40. package/corpus/core/src/mcp/connect-route.ts +34 -5
  41. package/corpus/core/src/server/action-discovery.ts +4 -0
  42. package/corpus/core/src/server/agent-chat-plugin.ts +20 -0
  43. package/corpus/core/src/sharing/registry.ts +17 -0
  44. package/corpus/core/src/templates/default/pnpm-workspace.yaml +1 -0
  45. package/corpus/core/src/templates/workspace-root/pnpm-workspace.yaml +1 -0
  46. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +2 -0
  47. package/corpus/templates/analytics/actions/update-dashboard.ts +8 -0
  48. package/corpus/templates/analytics/app/components/layout/Layout.tsx +1 -1
  49. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +117 -33
  50. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +4 -0
  51. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +7 -0
  52. package/corpus/templates/analytics/changelog/2026-06-27-dashboards-can-now-nest-under-a-parent-in-the-sidebar-via-a-.md +6 -0
  53. package/corpus/templates/analytics/changelog/2026-06-29-analytics-pages-now-sit-closer-under-the-header-with-tighter.md +6 -0
  54. package/corpus/templates/assets/actions/generate-image-batch.ts +3 -0
  55. package/corpus/templates/assets/actions/generate-image.ts +3 -0
  56. package/corpus/templates/assets/changelog/2026-06-29-longer-agent-generation-window.md +6 -0
  57. package/corpus/templates/assets/netlify.toml +3 -3
  58. package/corpus/templates/assets/server/plugins/agent-chat.ts +4 -1
  59. package/corpus/templates/clips/app/components/capture-install-options.tsx +7 -8
  60. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +1 -1
  61. package/corpus/templates/content/AGENTS.md +57 -44
  62. package/corpus/templates/content/README.md +16 -0
  63. package/corpus/templates/content/actions/_builder-cms-read-client.ts +125 -0
  64. package/corpus/templates/content/actions/_builder-cms-source-adapter.ts +28 -6
  65. package/corpus/templates/content/actions/_builder-cms-write-adapter.ts +238 -69
  66. package/corpus/templates/content/actions/_builder-cms-write-settings.ts +125 -43
  67. package/corpus/templates/content/actions/_database-source-utils.ts +746 -97
  68. package/corpus/templates/content/actions/_database-utils.ts +17 -14
  69. package/corpus/templates/content/actions/_federation-join.ts +14 -2
  70. package/corpus/templates/content/actions/_join-suggestion.ts +89 -14
  71. package/corpus/templates/content/actions/_local-file-documents.ts +2 -1
  72. package/corpus/templates/content/actions/attach-content-database-source.ts +124 -5
  73. package/corpus/templates/content/actions/bind-content-database-source-field.ts +256 -0
  74. package/corpus/templates/content/actions/change-content-database-source-role.ts +420 -0
  75. package/corpus/templates/content/actions/create-document.ts +8 -0
  76. package/corpus/templates/content/actions/execute-builder-source-batch.ts +282 -0
  77. package/corpus/templates/content/actions/execute-builder-source-execution.ts +220 -8
  78. package/corpus/templates/content/actions/get-content-database.ts +10 -2
  79. package/corpus/templates/content/actions/prepare-builder-source-execution.ts +19 -2
  80. package/corpus/templates/content/actions/prepare-builder-source-review.ts +47 -15
  81. package/corpus/templates/content/actions/refresh-content-database-source.ts +11 -4
  82. package/corpus/templates/content/actions/review-content-database-source-change-set.ts +6 -2
  83. package/corpus/templates/content/actions/set-content-database-source-write-mode.ts +32 -12
  84. package/corpus/templates/content/actions/stage-builder-revision.ts +14 -10
  85. package/corpus/templates/content/actions/validate-builder-source-execution.ts +25 -3
  86. package/corpus/templates/content/app/blocks/BuilderDocsBlocks.tsx +10 -0
  87. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +1 -0
  88. package/corpus/templates/content/app/components/editor/ContentReferencePreview.tsx +185 -0
  89. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +1520 -553
  90. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +3 -0
  91. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +150 -1
  92. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +19 -0
  93. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +647 -66
  94. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +543 -204
  95. package/corpus/templates/content/app/components/editor/extensions/ContentReferenceNode.tsx +82 -0
  96. package/corpus/templates/content/app/global.css +9 -0
  97. package/corpus/templates/content/app/hooks/use-content-database.ts +62 -0
  98. package/corpus/templates/content/app/i18n/zh-TW.ts +76 -0
  99. package/corpus/templates/content/app/i18n-data.ts +924 -0
  100. package/corpus/templates/content/changelog/2026-06-29-builder-review-checks-now-preserve-publish-and-unpublish-cho.md +6 -0
  101. package/corpus/templates/content/changelog/2026-06-29-database-sources-can-now-be-added-as-more-rows-or-matched.md +6 -0
  102. package/corpus/templates/content/changelog/2026-06-29-fixed-loading-the-final-rows-in-larger-databases-without-bre.md +6 -0
  103. package/corpus/templates/content/changelog/2026-06-29-reusable-mdx-references-now-preview-linked-local-documents-i.md +6 -0
  104. package/corpus/templates/content/shared/api.ts +91 -1
  105. package/corpus/templates/content/shared/builder-docs-blocks.ts +8 -0
  106. package/corpus/templates/content/shared/builder-mdx.ts +141 -4
  107. package/corpus/templates/content/shared/nfm.ts +62 -0
  108. package/corpus/templates/content/vite.config.ts +14 -7
  109. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +10 -11
  110. package/corpus/templates/design/AGENTS.md +5 -0
  111. package/corpus/templates/design/_gitignore +7 -0
  112. package/corpus/templates/design/actions/apply-visual-edit.ts +22 -12
  113. package/corpus/templates/design/actions/create-design-system.ts +15 -4
  114. package/corpus/templates/design/actions/create-file.ts +20 -1
  115. package/corpus/templates/design/actions/delete-design-system.ts +2 -2
  116. package/corpus/templates/design/actions/duplicate-design.ts +35 -9
  117. package/corpus/templates/design/actions/generate-design.ts +146 -69
  118. package/corpus/templates/design/actions/generate-screens.ts +51 -19
  119. package/corpus/templates/design/actions/get-design-snapshot.ts +5 -1
  120. package/corpus/templates/design/actions/get-design.ts +2 -0
  121. package/corpus/templates/design/actions/import-design-project.ts +28 -9
  122. package/corpus/templates/design/actions/import-document.ts +22 -8
  123. package/corpus/templates/design/actions/index-design-system-with-builder.ts +6 -153
  124. package/corpus/templates/design/actions/navigate.ts +105 -54
  125. package/corpus/templates/design/actions/set-default-design-system.ts +17 -3
  126. package/corpus/templates/design/actions/show-design-questions.ts +2 -0
  127. package/corpus/templates/design/actions/update-design.ts +2 -1
  128. package/corpus/templates/design/actions/view-screen.ts +12 -6
  129. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +4 -4
  130. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +159 -41
  131. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +8 -4
  132. package/corpus/templates/design/app/components/design/DrawOverlay.tsx +37 -42
  133. package/corpus/templates/design/app/components/design/EditPanel.tsx +336 -183
  134. package/corpus/templates/design/app/components/design/LayersPanel.tsx +153 -34
  135. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +135 -33
  136. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +6 -0
  137. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +2 -1
  138. package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +4 -10
  139. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +84 -43
  140. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +4 -4
  141. package/corpus/templates/design/app/components/design/inspector/{FigmaColorPicker.tsx → DesignColorPicker.tsx} +89 -62
  142. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +14 -26
  143. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +40 -12
  144. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +13 -4
  145. package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +13 -13
  146. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +13 -9
  147. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +13 -4
  148. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +6 -6
  149. package/corpus/templates/design/app/components/design/inspector/{figma-icons.tsx → design-icons.tsx} +2 -2
  150. package/corpus/templates/design/app/components/design/inspector/index.ts +12 -12
  151. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +5 -2
  152. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +3 -3
  153. package/corpus/templates/design/app/components/layout/Layout.tsx +5 -2
  154. package/corpus/templates/design/app/components/layout/Sidebar.tsx +1 -1
  155. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +167 -91
  156. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +16 -3
  157. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +15 -0
  158. package/corpus/templates/design/app/global.css +4 -0
  159. package/corpus/templates/design/app/hooks/use-design-system.ts +4 -1
  160. package/corpus/templates/design/app/hooks/use-navigation-state.ts +38 -3
  161. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +9 -2
  162. package/corpus/templates/design/app/i18n/zh-TW.ts +22 -0
  163. package/corpus/templates/design/app/i18n-data.ts +527 -0
  164. package/corpus/templates/design/app/lib/design-systems.ts +6 -4
  165. package/corpus/templates/design/app/lib/design-templates.ts +15 -3
  166. package/corpus/templates/design/app/pages/DesignEditor.tsx +641 -158
  167. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +42 -34
  168. package/corpus/templates/design/app/pages/VisualEdit.tsx +100 -0
  169. package/corpus/templates/design/app/root.tsx +42 -9
  170. package/corpus/templates/design/app/routes/visual-edit.tsx +7 -0
  171. package/corpus/templates/design/changelog/2026-06-28-live-cursors-now-keep-names-beside-a-cleaner-pointer-marker.md +1 -1
  172. package/corpus/templates/design/changelog/2026-06-28-mode-switching-now-lives-in-a-compact-bottom-right-icon-dock.md +1 -1
  173. package/corpus/templates/design/changelog/2026-06-28-visual-code-design-mode.md +6 -0
  174. package/corpus/templates/design/changelog/2026-06-29-design-generation-prompts-now-show-connect-ai-before-sending.md +6 -0
  175. package/corpus/templates/design/changelog/2026-06-29-design-mode-top-chrome-now-groups-collaborators-preview-shar.md +1 -1
  176. package/corpus/templates/design/changelog/2026-06-29-fixed-design-editor-exports-and-gradient-edits-so-multi-scre.md +6 -0
  177. package/corpus/templates/design/changelog/2026-06-29-longer-hosted-agent-turns.md +6 -0
  178. package/corpus/templates/design/changelog/2026-06-29-png-export-handles-modern-css-color-functions-more-reliably.md +6 -0
  179. package/corpus/templates/design/changelog/2026-06-29-png-export-now-ignores-duplicate-clicks-while-a-download-is-.md +6 -0
  180. package/corpus/templates/design/changelog/2026-06-29-public-visual-edit-and-shared-design-links-now-invite-visito.md +6 -0
  181. package/corpus/templates/design/changelog/2026-06-29-visual-edit-actions-now-reject-missing-design-targets-before.md +6 -0
  182. package/corpus/templates/design/e2e/README.md +71 -0
  183. package/corpus/templates/design/e2e/global-setup.ts +157 -0
  184. package/corpus/templates/design/e2e/helpers.ts +148 -0
  185. package/corpus/templates/design/netlify.toml +3 -4
  186. package/corpus/templates/design/package.json +5 -1
  187. package/corpus/templates/design/playwright.config.ts +51 -0
  188. package/corpus/templates/design/server/handlers/index-design-system-with-builder.ts +121 -0
  189. package/corpus/templates/design/server/handlers/uploads.ts +89 -38
  190. package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +181 -0
  191. package/corpus/templates/design/server/lib/coding-handoff.ts +33 -4
  192. package/corpus/templates/design/server/lib/design-export.ts +35 -8
  193. package/corpus/templates/design/server/plugins/agent-chat.ts +4 -0
  194. package/corpus/templates/design/server/plugins/auth.ts +10 -1
  195. package/corpus/templates/design/server/routes/api/index-design-system-with-builder.post.ts +1 -0
  196. package/corpus/templates/design/shared/api.ts +2 -0
  197. package/corpus/templates/design/shared/apply-edits.ts +12 -8
  198. package/corpus/templates/design/shared/canvas-math.ts +19 -1
  199. package/corpus/templates/design/shared/code-layer.ts +87 -28
  200. package/corpus/templates/design/shared/generation-session.ts +1 -0
  201. package/corpus/templates/design/shared/resolve-tweaks.ts +4 -3
  202. package/corpus/templates/design/shared/shader-presets.ts +10 -0
  203. package/corpus/templates/design/shared/source-mode.ts +9 -0
  204. package/corpus/templates/design/vitest.config.ts +2 -1
  205. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +1 -1
  206. package/corpus/templates/plan/.agents/skills/visual-plan/references/canvas.md +1 -1
  207. package/corpus/templates/plan/AGENTS.md +1 -1
  208. package/corpus/templates/plan/actions/create-plan-design.ts +1 -1
  209. package/corpus/templates/plan/actions/validate-local-plan-source.ts +2 -10
  210. package/corpus/templates/plan/app/pages/PlansPage.tsx +1 -0
  211. package/corpus/templates/plan/docs/commenting-ux-plan.md +2 -2
  212. package/corpus/templates/plan/server/plan-content.ts +1 -1
  213. package/corpus/templates/plan/server/ui-plan-html.ts +2 -2
  214. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +6 -153
  215. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +53 -38
  216. package/corpus/templates/slides/app/components/design-system/{fig-import-response.ts → builder-index-response.ts} +9 -6
  217. package/corpus/templates/slides/app/components/visual-editor/MultiSelectChip.tsx +1 -1
  218. package/corpus/templates/slides/changelog/2026-06-29-design-system-setup-now-indexes-uploaded-design-files-throug.md +6 -0
  219. package/corpus/templates/slides/changelog/2026-06-29-longer-hosted-agent-turns.md +6 -0
  220. package/corpus/templates/slides/netlify.toml +3 -6
  221. package/corpus/templates/slides/server/handlers/index-design-system-with-builder.ts +116 -0
  222. package/corpus/templates/slides/server/lib/builder-design-system-proxy.ts +179 -0
  223. package/corpus/templates/slides/server/plugins/agent-chat.ts +4 -1
  224. package/corpus/templates/slides/server/routes/api/index-design-system-with-builder.post.ts +1 -0
  225. package/dist/action.d.ts +15 -0
  226. package/dist/action.d.ts.map +1 -1
  227. package/dist/action.js +6 -0
  228. package/dist/action.js.map +1 -1
  229. package/dist/agent/durable-background.d.ts +9 -7
  230. package/dist/agent/durable-background.d.ts.map +1 -1
  231. package/dist/agent/durable-background.js +27 -11
  232. package/dist/agent/durable-background.js.map +1 -1
  233. package/dist/agent/production-agent.d.ts +7 -0
  234. package/dist/agent/production-agent.d.ts.map +1 -1
  235. package/dist/agent/production-agent.js +4 -1
  236. package/dist/agent/production-agent.js.map +1 -1
  237. package/dist/agent/run-loop-with-resume.d.ts +2 -1
  238. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  239. package/dist/agent/run-loop-with-resume.js +2 -2
  240. package/dist/agent/run-loop-with-resume.js.map +1 -1
  241. package/dist/brand-kit/fig/index.d.ts +4 -4
  242. package/dist/brand-kit/fig/index.d.ts.map +1 -1
  243. package/dist/brand-kit/fig/index.js +14 -27
  244. package/dist/brand-kit/fig/index.js.map +1 -1
  245. package/dist/cli/create.d.ts.map +1 -1
  246. package/dist/cli/create.js +1 -0
  247. package/dist/cli/create.js.map +1 -1
  248. package/dist/cli/index.js +1 -1
  249. package/dist/cli/index.js.map +1 -1
  250. package/dist/cli/mcp-config-writers.d.ts +15 -7
  251. package/dist/cli/mcp-config-writers.d.ts.map +1 -1
  252. package/dist/cli/mcp-config-writers.js +198 -45
  253. package/dist/cli/mcp-config-writers.js.map +1 -1
  254. package/dist/cli/skills.d.ts +1 -1
  255. package/dist/cli/skills.d.ts.map +1 -1
  256. package/dist/cli/skills.js +18 -3
  257. package/dist/cli/skills.js.map +1 -1
  258. package/dist/client/AssistantChat.d.ts.map +1 -1
  259. package/dist/client/AssistantChat.js +11 -1
  260. package/dist/client/AssistantChat.js.map +1 -1
  261. package/dist/client/agent-chat.d.ts.map +1 -1
  262. package/dist/client/agent-chat.js +15 -2
  263. package/dist/client/agent-chat.js.map +1 -1
  264. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  265. package/dist/client/composer/PromptComposer.js +35 -1
  266. package/dist/client/composer/PromptComposer.js.map +1 -1
  267. package/dist/client/org/OrgSwitcher.js +1 -1
  268. package/dist/client/org/OrgSwitcher.js.map +1 -1
  269. package/dist/client/sharing/ShareButton.d.ts +1 -1
  270. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  271. package/dist/client/sharing/ShareButton.js +2 -15
  272. package/dist/client/sharing/ShareButton.js.map +1 -1
  273. package/dist/collab/presence.d.ts +1 -1
  274. package/dist/collab/presence.js +1 -1
  275. package/dist/collab/presence.js.map +1 -1
  276. package/dist/collab/routes.d.ts +1 -1
  277. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  278. package/dist/mcp/connect-route.d.ts.map +1 -1
  279. package/dist/mcp/connect-route.js +34 -5
  280. package/dist/mcp/connect-route.js.map +1 -1
  281. package/dist/notifications/routes.d.ts +2 -2
  282. package/dist/observability/routes.d.ts +8 -8
  283. package/dist/resources/handlers.d.ts +1 -1
  284. package/dist/server/action-discovery.d.ts.map +1 -1
  285. package/dist/server/action-discovery.js +5 -0
  286. package/dist/server/action-discovery.js.map +1 -1
  287. package/dist/server/agent-chat-plugin.d.ts +6 -0
  288. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  289. package/dist/server/agent-chat-plugin.js +12 -3
  290. package/dist/server/agent-chat-plugin.js.map +1 -1
  291. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  292. package/dist/sharing/registry.d.ts.map +1 -1
  293. package/dist/sharing/registry.js +11 -0
  294. package/dist/sharing/registry.js.map +1 -1
  295. package/dist/templates/default/pnpm-workspace.yaml +1 -0
  296. package/dist/templates/workspace-root/pnpm-workspace.yaml +1 -0
  297. package/docs/content/locales/ar-SA/real-time-collaboration.mdx +2 -2
  298. package/docs/content/locales/ar-SA/template-design.mdx +1 -1
  299. package/docs/content/locales/de-DE/real-time-collaboration.mdx +3 -3
  300. package/docs/content/locales/de-DE/template-design.mdx +1 -1
  301. package/docs/content/locales/es-ES/real-time-collaboration.mdx +2 -2
  302. package/docs/content/locales/es-ES/template-design.mdx +1 -1
  303. package/docs/content/locales/fr-FR/real-time-collaboration.mdx +2 -2
  304. package/docs/content/locales/fr-FR/template-design.mdx +1 -1
  305. package/docs/content/locales/hi-IN/template-design.mdx +1 -1
  306. package/docs/content/locales/ja-JP/real-time-collaboration.mdx +2 -2
  307. package/docs/content/locales/ja-JP/template-design.mdx +1 -1
  308. package/docs/content/locales/ko-KR/real-time-collaboration.mdx +2 -2
  309. package/docs/content/locales/ko-KR/template-design.mdx +1 -1
  310. package/docs/content/locales/pt-BR/real-time-collaboration.mdx +2 -2
  311. package/docs/content/locales/pt-BR/template-design.mdx +1 -1
  312. package/docs/content/locales/zh-CN/real-time-collaboration.mdx +2 -2
  313. package/docs/content/locales/zh-CN/template-design.mdx +1 -1
  314. package/docs/content/locales/zh-TW/real-time-collaboration.mdx +2 -2
  315. package/docs/content/locales/zh-TW/template-design.mdx +1 -1
  316. package/docs/content/real-time-collaboration.mdx +2 -2
  317. package/docs/content/template-design.mdx +1 -1
  318. package/package.json +3 -7
  319. package/src/templates/default/pnpm-workspace.yaml +1 -0
  320. package/src/templates/workspace-root/pnpm-workspace.yaml +1 -0
  321. package/corpus/core/src/brand-kit/fig/decode.ts +0 -410
  322. package/corpus/core/src/brand-kit/fig/extract-design-system.ts +0 -947
  323. package/corpus/core/src/brand-kit/fig/fig-to-html.ts +0 -1906
  324. package/corpus/templates/design/actions/import-figma.ts +0 -55
  325. package/corpus/templates/design/changelog/2026-06-28-figma-style-code-design-mode.md +0 -6
  326. package/corpus/templates/design/server/handlers/import-figma-system.ts +0 -86
  327. package/corpus/templates/design/server/routes/api/import-figma-system.post.ts +0 -1
  328. package/corpus/templates/slides/server/handlers/import-figma-system.ts +0 -101
  329. package/corpus/templates/slides/server/routes/api/import-figma-system.post.ts +0 -1
  330. package/dist/brand-kit/fig/decode.d.ts +0 -33
  331. package/dist/brand-kit/fig/decode.d.ts.map +0 -1
  332. package/dist/brand-kit/fig/decode.js +0 -358
  333. package/dist/brand-kit/fig/decode.js.map +0 -1
  334. package/dist/brand-kit/fig/extract-design-system.d.ts +0 -44
  335. package/dist/brand-kit/fig/extract-design-system.d.ts.map +0 -1
  336. package/dist/brand-kit/fig/extract-design-system.js +0 -752
  337. package/dist/brand-kit/fig/extract-design-system.js.map +0 -1
  338. package/dist/brand-kit/fig/fig-to-html.d.ts +0 -246
  339. package/dist/brand-kit/fig/fig-to-html.d.ts.map +0 -1
  340. package/dist/brand-kit/fig/fig-to-html.js +0 -1506
  341. package/dist/brand-kit/fig/fig-to-html.js.map +0 -1
@@ -7,11 +7,9 @@ import {
7
7
  getRequestOrgId,
8
8
  getRequestUserEmail,
9
9
  } from "@agent-native/core/server/request-context";
10
- import { eq } from "drizzle-orm";
11
- import { nanoid } from "nanoid";
12
10
  import { z } from "zod";
13
11
 
14
- import { getDb, schema } from "../server/db/index.js";
12
+ import { upsertBuilderProxyDesignSystem } from "../server/lib/builder-design-system-proxy.js";
15
13
 
16
14
  const MAX_CODE_FILES = 50;
17
15
  const MAX_TOTAL_CODE_BYTES = 2 * 1024 * 1024;
@@ -52,83 +50,6 @@ function makeFiles(
52
50
  return files;
53
51
  }
54
52
 
55
- function localBuilderDesignSystemId(builderDesignSystemId: string): string {
56
- const slug = builderDesignSystemId
57
- .replace(/[^a-zA-Z0-9_-]+/g, "-")
58
- .replace(/^-+|-+$/g, "")
59
- .slice(0, 96);
60
- return `builder-${slug || "design-system"}`;
61
- }
62
-
63
- function builderProxyData({
64
- builderDesignSystemId,
65
- jobId,
66
- builderUrl,
67
- projectName,
68
- description,
69
- }: {
70
- builderDesignSystemId: string;
71
- jobId: string;
72
- builderUrl: string;
73
- projectName?: string;
74
- description?: string;
75
- }) {
76
- return JSON.stringify({
77
- source: "builder",
78
- builderDesignSystemId,
79
- builderJobId: jobId,
80
- builderUrl,
81
- colors: {
82
- primary: "var(--primary)",
83
- secondary: "var(--secondary)",
84
- accent: "var(--accent)",
85
- background: "var(--background)",
86
- surface: "var(--card)",
87
- text: "var(--foreground)",
88
- textMuted: "var(--muted-foreground)",
89
- },
90
- typography: {
91
- headingFont: "inherit",
92
- bodyFont: "inherit",
93
- headingWeight: "700",
94
- bodyWeight: "400",
95
- headingSizes: { h1: "48px", h2: "32px", h3: "24px" },
96
- },
97
- spacing: { elementGap: "24px", pagePadding: "48px" },
98
- borders: { radius: "12px", accentWidth: "1px" },
99
- logos: [],
100
- notes: [
101
- "This is a local proxy for a Builder-indexed design system.",
102
- `Builder design system id: ${builderDesignSystemId}`,
103
- `Builder indexing job id: ${jobId}`,
104
- `Builder URL: ${builderUrl}`,
105
- projectName ? `Requested name: ${projectName}` : "",
106
- description ? `Context: ${description}` : "",
107
- "Use Builder as the source of truth for extracted tokens and guidance.",
108
- ]
109
- .filter(Boolean)
110
- .join("\n"),
111
- });
112
- }
113
-
114
- function builderProxyInstructions({
115
- builderDesignSystemId,
116
- jobId,
117
- builderUrl,
118
- }: {
119
- builderDesignSystemId: string;
120
- jobId: string;
121
- builderUrl: string;
122
- }) {
123
- return [
124
- "This design system is indexed and owned by Builder.",
125
- `Builder design system id: ${builderDesignSystemId}`,
126
- `Builder job id: ${jobId}`,
127
- `Builder URL: ${builderUrl}`,
128
- "When generating designs, treat Builder as the source of truth for the final extracted tokens, assets, and guidance.",
129
- ].join("\n");
130
- }
131
-
132
53
  export default defineAction({
133
54
  description:
134
55
  "Start Builder design-system indexing from a GitHub repository and/or code files. " +
@@ -174,86 +95,18 @@ export default defineAction({
174
95
  const ownerEmail = getRequestUserEmail();
175
96
  if (!ownerEmail) throw new Error("no authenticated user");
176
97
 
177
- const db = getDb();
178
- const now = new Date().toISOString();
179
- const orgId = getRequestOrgId();
180
- const baseLocalDesignSystemId = localBuilderDesignSystemId(
181
- result.designSystemId,
182
- );
183
- const title = projectName?.trim() || "Builder indexed design system";
184
- const localData = builderProxyData({
185
- builderDesignSystemId: result.designSystemId,
186
- jobId: result.jobId,
187
- builderUrl: result.builderUrl,
98
+ const proxy = await upsertBuilderProxyDesignSystem({
99
+ result,
100
+ ownerEmail,
101
+ orgId: getRequestOrgId(),
188
102
  projectName,
189
103
  description,
190
104
  });
191
- const customInstructions = builderProxyInstructions({
192
- builderDesignSystemId: result.designSystemId,
193
- jobId: result.jobId,
194
- builderUrl: result.builderUrl,
195
- });
196
- const [existing] = await db
197
- .select({
198
- id: schema.designSystems.id,
199
- ownerEmail: schema.designSystems.ownerEmail,
200
- })
201
- .from(schema.designSystems)
202
- .where(eq(schema.designSystems.id, baseLocalDesignSystemId))
203
- .limit(1);
204
- const localDesignSystemId =
205
- existing && existing.ownerEmail !== ownerEmail
206
- ? `${baseLocalDesignSystemId}-${nanoid(8)}`
207
- : baseLocalDesignSystemId;
208
- if (existing && existing.ownerEmail === ownerEmail) {
209
- await db
210
- .update(schema.designSystems)
211
- .set({
212
- title,
213
- description:
214
- description ??
215
- `Builder indexed design system ${result.designSystemId}`,
216
- data: localData,
217
- assets: "[]",
218
- customInstructions,
219
- updatedAt: now,
220
- })
221
- .where(eq(schema.designSystems.id, existing.id));
222
- } else {
223
- const [ownedSystem] = await db
224
- .select({ id: schema.designSystems.id })
225
- .from(schema.designSystems)
226
- .where(eq(schema.designSystems.ownerEmail, ownerEmail))
227
- .limit(1);
228
- await db.insert(schema.designSystems).values({
229
- id: localDesignSystemId,
230
- title,
231
- description:
232
- description ??
233
- `Builder indexed design system ${result.designSystemId}`,
234
- data: localData,
235
- assets: "[]",
236
- customInstructions,
237
- isDefault: !ownedSystem,
238
- ownerEmail,
239
- orgId,
240
- createdAt: now,
241
- updatedAt: now,
242
- });
243
- }
244
105
 
245
106
  return {
246
107
  ...result,
247
- localDesignSystemId,
108
+ ...proxy,
248
109
  uploadedFileCount: files.length,
249
- instructions: [
250
- "Builder design-system indexing has started.",
251
- `Builder design system: ${result.designSystemId}`,
252
- `Local selectable design system: ${localDesignSystemId}`,
253
- `Builder job: ${result.jobId}`,
254
- `Open: ${result.builderUrl}`,
255
- "Use the local design system id in Design flows; Builder remains the source of truth for the indexed brand kit.",
256
- ].join("\n"),
257
110
  };
258
111
  },
259
112
  });
@@ -21,6 +21,7 @@
21
21
  * --inspectorTab Inspector tab for designs: design, tweaks, or extensions
22
22
  * --fileId Screen/file id to focus in the design editor
23
23
  * --filename Screen filename to focus in the design editor
24
+ * --tool Design editor tool to activate
24
25
  * --designSystemId Design system ID (for design-systems view)
25
26
  * --path URL path to navigate to
26
27
  */
@@ -29,61 +30,110 @@ import { defineAction } from "@agent-native/core";
29
30
  import { writeAppState } from "@agent-native/core/application-state";
30
31
  import { z } from "zod";
31
32
 
33
+ const designEditorToolSchema = z.enum([
34
+ "move",
35
+ "frame",
36
+ "rect",
37
+ "line",
38
+ "arrow",
39
+ "ellipse",
40
+ "polygon",
41
+ "star",
42
+ "text",
43
+ "pen",
44
+ "hand",
45
+ "comment",
46
+ "draw",
47
+ "scale",
48
+ ]);
49
+
32
50
  export default defineAction({
33
51
  description:
34
- "Navigate the UI to a specific view or path. Views: list, editor, design-systems, present, templates, settings. Use --designId with editor/present views and --designSystemId with design-systems. For designs, use editorView=overview to show the infinite screens canvas, or editorView=single with fileId/filename/screen to focus a screen. Use inspectorTab=extensions to focus the in-editor extension panel.",
35
- schema: z.object({
36
- view: z
37
- .enum([
38
- "list",
39
- "editor",
40
- "design-systems",
41
- "present",
42
- "templates",
43
- "examples",
44
- "settings",
45
- ])
46
- .optional()
47
- .describe("View name to navigate to"),
48
- designId: z.string().optional().describe("Design ID for editor/present"),
49
- editorView: z
50
- .enum(["single", "overview"])
51
- .optional()
52
- .describe(
53
- "Design editor view: overview for the infinite screens canvas, single for a focused screen",
54
- ),
55
- viewMode: z
56
- .enum(["single", "overview"])
57
- .optional()
58
- .describe("Alias for editorView"),
59
- inspectorTab: z
60
- .enum(["design", "tweaks", "extensions"])
61
- .optional()
62
- .describe("Design editor inspector tab to focus"),
63
- inspector: z
64
- .enum(["design", "tweaks", "extensions"])
65
- .optional()
66
- .describe("Alias for inspectorTab"),
67
- fileId: z.string().optional().describe("Design file/screen ID to focus"),
68
- screenId: z.string().optional().describe("Alias for fileId"),
69
- filename: z
70
- .string()
71
- .optional()
72
- .describe("Design screen filename to focus, such as checkout.html"),
73
- screen: z
74
- .string()
75
- .optional()
76
- .describe("Screen id, filename, or name to focus"),
77
- zoom: z
78
- .number()
79
- .optional()
80
- .describe("Optional design canvas zoom percentage"),
81
- designSystemId: z
82
- .string()
83
- .optional()
84
- .describe("Design system ID for design-systems view"),
85
- path: z.string().optional().describe("URL path to navigate to"),
86
- }),
52
+ "Navigate the UI to a specific view or path. Views: list, editor, design-systems, present, templates, settings. Use --designId with editor/present views and --designSystemId with design-systems. For designs, use editorView=overview to show the infinite screens canvas, or editorView=single with fileId/filename/screen to focus a screen. Use inspectorTab=extensions to focus the in-editor extension panel. Use tool to activate a design editor tool.",
53
+ schema: z
54
+ .object({
55
+ view: z
56
+ .enum([
57
+ "list",
58
+ "editor",
59
+ "design-systems",
60
+ "present",
61
+ "templates",
62
+ "examples",
63
+ "settings",
64
+ ])
65
+ .optional()
66
+ .describe("View name to navigate to"),
67
+ designId: z.string().optional().describe("Design ID for editor/present"),
68
+ editorView: z
69
+ .enum(["single", "overview"])
70
+ .optional()
71
+ .describe(
72
+ "Design editor view: overview for the infinite screens canvas, single for a focused screen",
73
+ ),
74
+ viewMode: z
75
+ .enum(["single", "overview"])
76
+ .optional()
77
+ .describe("Alias for editorView"),
78
+ inspectorTab: z
79
+ .enum(["design", "tweaks", "extensions"])
80
+ .optional()
81
+ .describe("Design editor inspector tab to focus"),
82
+ inspector: z
83
+ .enum(["design", "tweaks", "extensions"])
84
+ .optional()
85
+ .describe("Alias for inspectorTab"),
86
+ fileId: z.string().optional().describe("Design file/screen ID to focus"),
87
+ screenId: z.string().optional().describe("Alias for fileId"),
88
+ filename: z
89
+ .string()
90
+ .optional()
91
+ .describe("Design screen filename to focus, such as checkout.html"),
92
+ screen: z
93
+ .string()
94
+ .optional()
95
+ .describe("Screen id, filename, or name to focus"),
96
+ zoom: z
97
+ .number()
98
+ .optional()
99
+ .describe("Optional design canvas zoom percentage"),
100
+ tool: designEditorToolSchema
101
+ .optional()
102
+ .describe("Optional design editor tool to activate"),
103
+ designSystemId: z
104
+ .string()
105
+ .optional()
106
+ .describe("Design system ID for design-systems view"),
107
+ path: z.string().optional().describe("URL path to navigate to"),
108
+ })
109
+ .superRefine((args, ctx) => {
110
+ const editorView = args.editorView ?? args.viewMode;
111
+ if (
112
+ (args.view === "editor" || args.view === "present") &&
113
+ !args.designId
114
+ ) {
115
+ ctx.addIssue({
116
+ code: z.ZodIssueCode.custom,
117
+ path: ["designId"],
118
+ message: `designId is required for ${args.view} view`,
119
+ });
120
+ }
121
+ if (
122
+ args.view === "editor" &&
123
+ editorView === "single" &&
124
+ !args.fileId &&
125
+ !args.screenId &&
126
+ !args.filename &&
127
+ !args.screen
128
+ ) {
129
+ ctx.addIssue({
130
+ code: z.ZodIssueCode.custom,
131
+ path: ["editorView"],
132
+ message:
133
+ "single editor view requires a fileId, screenId, filename, or screen",
134
+ });
135
+ }
136
+ }),
87
137
  http: false,
88
138
  run: async (args) => {
89
139
  if (!args.view && !args.path) {
@@ -101,6 +151,7 @@ export default defineAction({
101
151
  if (args.filename) nav.filename = args.filename;
102
152
  if (args.screen) nav.screen = args.screen;
103
153
  if (args.zoom !== undefined) nav.zoom = args.zoom;
154
+ if (args.tool) nav.tool = args.tool;
104
155
  if (args.designSystemId) nav.designSystemId = args.designSystemId;
105
156
  if (args.path) nav.path = args.path;
106
157
  await writeAppState("navigate", nav);
@@ -112,6 +163,6 @@ export default defineAction({
112
163
  args.fileId || args.screenId || args.filename || args.screen
113
164
  ? ` (screen: ${args.fileId ?? args.screenId ?? args.filename ?? args.screen})`
114
165
  : ""
115
- }${args.designSystemId ? ` (design system: ${args.designSystemId})` : ""}`;
166
+ }${args.tool ? ` (${args.tool} tool)` : ""}${args.designSystemId ? ` (design system: ${args.designSystemId})` : ""}`;
116
167
  },
117
168
  });
@@ -1,7 +1,10 @@
1
1
  import { defineAction } from "@agent-native/core";
2
- import { getRequestUserEmail } from "@agent-native/core/server/request-context";
2
+ import {
3
+ getRequestOrgId,
4
+ getRequestUserEmail,
5
+ } from "@agent-native/core/server/request-context";
3
6
  import { assertAccess } from "@agent-native/core/sharing";
4
- import { and, eq } from "drizzle-orm";
7
+ import { and, eq, isNull } from "drizzle-orm";
5
8
  import { z } from "zod";
6
9
 
7
10
  import { getDb, schema } from "../server/db/index.js";
@@ -20,6 +23,7 @@ export default defineAction({
20
23
 
21
24
  const userEmail = getRequestUserEmail();
22
25
  if (!userEmail) throw new Error("no authenticated user");
26
+ const orgId = getRequestOrgId();
23
27
 
24
28
  const [target] = await db
25
29
  .select({ ownerEmail: schema.designSystems.ownerEmail })
@@ -35,7 +39,17 @@ export default defineAction({
35
39
  await tx
36
40
  .update(schema.designSystems)
37
41
  .set({ isDefault: false, updatedAt: now })
38
- .where(eq(schema.designSystems.ownerEmail, userEmail));
42
+ .where(
43
+ orgId
44
+ ? and(
45
+ eq(schema.designSystems.ownerEmail, userEmail),
46
+ eq(schema.designSystems.orgId, orgId),
47
+ )
48
+ : and(
49
+ eq(schema.designSystems.ownerEmail, userEmail),
50
+ isNull(schema.designSystems.orgId),
51
+ ),
52
+ );
39
53
 
40
54
  await tx
41
55
  .update(schema.designSystems)
@@ -4,6 +4,8 @@ import { buildDeepLink } from "@agent-native/core/server";
4
4
  import { assertAccess } from "@agent-native/core/sharing";
5
5
  import { z } from "zod";
6
6
 
7
+ import "../server/db/index.js"; // ensure registerShareableResource runs
8
+
7
9
  function designDeepLink(designId: string): string {
8
10
  return buildDeepLink({
9
11
  app: "design",
@@ -20,6 +20,7 @@ export default defineAction({
20
20
  .describe("Updated project type"),
21
21
  designSystemId: z
22
22
  .string()
23
+ .min(1)
23
24
  .nullable()
24
25
  .optional()
25
26
  .describe("Design system ID to link, or null to unlink"),
@@ -41,7 +42,7 @@ export default defineAction({
41
42
  }
42
43
 
43
44
  await assertAccess("design", id, "editor");
44
- if (designSystemId) {
45
+ if (designSystemId != null) {
45
46
  await assertAccess("design-system", designSystemId, "viewer");
46
47
  }
47
48
 
@@ -26,9 +26,8 @@ export default defineAction({
26
26
  schema: z.object({}),
27
27
  http: false,
28
28
  run: async () => {
29
- const [navigation, designVariants, designSelection] = await Promise.all([
29
+ const [navigation, designSelection] = await Promise.all([
30
30
  readAppStateForCurrentTab("navigation"),
31
- readAppState("design-variants"),
32
31
  readAppStateForCurrentTab("design-selection"),
33
32
  ]);
34
33
  const designId =
@@ -44,6 +43,14 @@ export default defineAction({
44
43
  const generationSession = designId
45
44
  ? await readAppState(designGenerationSessionKey(designId))
46
45
  : undefined;
46
+ const designVariants = designId
47
+ ? await readAppState("design-variants").then((value) => {
48
+ if (!value || typeof value !== "object") return undefined;
49
+ return (value as { designId?: unknown }).designId === designId
50
+ ? value
51
+ : undefined;
52
+ })
53
+ : undefined;
47
54
 
48
55
  const screen: Record<string, unknown> = {};
49
56
  if (navigation) screen.navigation = navigation;
@@ -95,10 +102,9 @@ export default defineAction({
95
102
  id: designId,
96
103
  title: (access.resource as { title?: unknown }).title ?? null,
97
104
  screens: files,
98
- activeScreen:
99
- files.find((file) => file.id === activeFileId) ??
100
- files.find((file) => file.filename === activeFilename) ??
101
- null,
105
+ activeScreen: activeFileId
106
+ ? (files.find((file) => file.id === activeFileId) ?? null)
107
+ : (files.find((file) => file.filename === activeFilename) ?? null),
102
108
  canvasFrames: parseCanvasFrameGeometryById(data.canvasFrames),
103
109
  };
104
110
  }
@@ -209,7 +209,7 @@ const DEFAULT_LABELS: CanvasContextMenuLabels = {
209
209
  };
210
210
 
211
211
  const DEFAULT_SHORTCUTS: CanvasContextMenuShortcuts = {
212
- pasteHere: "⌘V",
212
+ pasteHere: "",
213
213
  selectAll: "⌘A",
214
214
  zoomToFit: "⇧1",
215
215
  zoomToSelection: "⇧2",
@@ -234,16 +234,16 @@ type ActionCallbackMap = Partial<
234
234
  Record<CanvasContextMenuAction, CanvasContextMenuActionHandler>
235
235
  >;
236
236
 
237
- // Figma-style menu chrome: compact, dark-border, subtle shadow, no animation jitter
237
+ // design-editor menu chrome: compact, dark-border, subtle shadow, no animation jitter
238
238
  const MENU_CONTENT_CLASS =
239
239
  "w-52 min-w-[200px] rounded-[6px] border border-[var(--design-editor-control-border)] bg-[var(--design-editor-panel-bg)] py-[3px] px-[3px] text-[12px] text-foreground shadow-[0_4px_16px_rgba(0,0,0,0.16),0_0_0_0.5px_rgba(0,0,0,0.08)] outline-none data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-[0.97] data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 duration-100";
240
- // Figma row height ~28px, full-width highlight on hover, no icon gap waste
240
+ // design row height ~28px, full-width highlight on hover, no icon gap waste
241
241
  const MENU_ITEM_CLASS =
242
242
  "flex h-7 cursor-default select-none items-center rounded-[4px] px-2 py-0 text-[12px] leading-none gap-0 focus:bg-[var(--design-editor-selection-color)] focus:text-white data-[disabled]:pointer-events-none data-[disabled]:opacity-35";
243
243
  // Submenu trigger mirrors item styles + chevron sizing
244
244
  const MENU_SUB_TRIGGER_CLASS =
245
245
  "flex h-7 cursor-default select-none items-center rounded-[4px] px-2 py-0 text-[12px] leading-none focus:bg-[var(--design-editor-selection-color)] focus:text-white data-[state=open]:bg-[var(--design-editor-selection-color)] data-[state=open]:text-white [&>svg:last-child]:ms-auto [&>svg:last-child]:size-3 [&>svg:last-child]:opacity-50";
246
- // Separator: 1px, full-width flush, Figma-like muted line
246
+ // Separator: 1px, full-width flush, design-editor muted line
247
247
  const MENU_SEPARATOR_CLASS =
248
248
  "mx-0 my-[3px] h-px bg-[var(--design-editor-control-border)] opacity-80";
249
249
  // Shortcut: right-aligned, muted, use system UI for symbol rendering