@agent-native/core 0.79.26 → 0.80.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2322) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +39 -0
  3. package/corpus/core/docs/content/a2a-protocol.mdx +97 -9
  4. package/corpus/core/docs/content/actions.mdx +65 -4
  5. package/corpus/core/docs/content/agent-mentions.mdx +68 -4
  6. package/corpus/core/docs/content/agent-surfaces.mdx +112 -8
  7. package/corpus/core/docs/content/agent-teams.mdx +171 -12
  8. package/corpus/core/docs/content/agent-web-surfaces.mdx +51 -4
  9. package/corpus/core/docs/content/authentication.mdx +122 -8
  10. package/corpus/core/docs/content/automations.mdx +110 -8
  11. package/corpus/core/docs/content/blueprint-installer.mdx +42 -4
  12. package/corpus/core/docs/content/cli-adapters.mdx +44 -4
  13. package/corpus/core/docs/content/client.mdx +79 -8
  14. package/corpus/core/docs/content/cloneable-saas.mdx +85 -8
  15. package/corpus/core/docs/content/code-agents-ui.mdx +98 -8
  16. package/corpus/core/docs/content/components.mdx +118 -8
  17. package/corpus/core/docs/content/context-awareness.mdx +98 -8
  18. package/corpus/core/docs/content/creating-templates.mdx +49 -4
  19. package/corpus/core/docs/content/cross-app-sso.mdx +109 -8
  20. package/corpus/core/docs/content/database.mdx +56 -4
  21. package/corpus/core/docs/content/deployment.mdx +103 -8
  22. package/corpus/core/docs/content/dispatch.mdx +134 -8
  23. package/corpus/core/docs/content/drop-in-agent.mdx +63 -4
  24. package/corpus/core/docs/content/durable-background-runs.mdx +98 -8
  25. package/corpus/core/docs/content/durable-resume.mdx +47 -4
  26. package/corpus/core/docs/content/embedding-sdk.mdx +83 -8
  27. package/corpus/core/docs/content/evals.mdx +102 -8
  28. package/corpus/core/docs/content/extensions.mdx +113 -9
  29. package/corpus/core/docs/content/external-agents.mdx +119 -8
  30. package/corpus/core/docs/content/faq.mdx +98 -8
  31. package/corpus/core/docs/content/file-uploads.mdx +61 -4
  32. package/corpus/core/docs/content/frames.mdx +90 -8
  33. package/corpus/core/docs/content/generative-ui.mdx +50 -4
  34. package/corpus/core/docs/content/getting-started.mdx +34 -4
  35. package/corpus/core/docs/content/harness-agents.mdx +77 -8
  36. package/corpus/core/docs/content/human-approval.mdx +50 -4
  37. package/corpus/core/docs/content/key-concepts.mdx +102 -8
  38. package/corpus/core/docs/content/local-file-mode.mdx +58 -4
  39. package/corpus/core/docs/content/locales/ar-SA/a2a-protocol.mdx +97 -9
  40. package/corpus/core/docs/content/locales/ar-SA/actions.mdx +65 -4
  41. package/corpus/core/docs/content/locales/ar-SA/agent-mentions.mdx +68 -4
  42. package/corpus/core/docs/content/locales/ar-SA/agent-surfaces.mdx +114 -8
  43. package/corpus/core/docs/content/locales/ar-SA/agent-teams.mdx +174 -12
  44. package/corpus/core/docs/content/locales/ar-SA/agent-web-surfaces.mdx +49 -4
  45. package/corpus/core/docs/content/locales/ar-SA/authentication.mdx +120 -8
  46. package/corpus/core/docs/content/locales/ar-SA/automations.mdx +110 -8
  47. package/corpus/core/docs/content/locales/ar-SA/blueprint-installer.mdx +42 -4
  48. package/corpus/core/docs/content/locales/ar-SA/cli-adapters.mdx +40 -4
  49. package/corpus/core/docs/content/locales/ar-SA/client.mdx +80 -8
  50. package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +85 -8
  51. package/corpus/core/docs/content/locales/ar-SA/code-agents-ui.mdx +99 -8
  52. package/corpus/core/docs/content/locales/ar-SA/components.mdx +114 -8
  53. package/corpus/core/docs/content/locales/ar-SA/context-awareness.mdx +100 -8
  54. package/corpus/core/docs/content/locales/ar-SA/creating-templates.mdx +51 -4
  55. package/corpus/core/docs/content/locales/ar-SA/cross-app-sso.mdx +109 -8
  56. package/corpus/core/docs/content/locales/ar-SA/database.mdx +52 -4
  57. package/corpus/core/docs/content/locales/ar-SA/deployment.mdx +103 -8
  58. package/corpus/core/docs/content/locales/ar-SA/dispatch.mdx +134 -8
  59. package/corpus/core/docs/content/locales/ar-SA/drop-in-agent.mdx +63 -4
  60. package/corpus/core/docs/content/locales/ar-SA/durable-resume.mdx +47 -4
  61. package/corpus/core/docs/content/locales/ar-SA/embedding-sdk.mdx +83 -8
  62. package/corpus/core/docs/content/locales/ar-SA/evals.mdx +102 -8
  63. package/corpus/core/docs/content/locales/ar-SA/extensions.mdx +113 -9
  64. package/corpus/core/docs/content/locales/ar-SA/external-agents.mdx +119 -8
  65. package/corpus/core/docs/content/locales/ar-SA/faq.mdx +98 -8
  66. package/corpus/core/docs/content/locales/ar-SA/file-uploads.mdx +61 -4
  67. package/corpus/core/docs/content/locales/ar-SA/frames.mdx +88 -8
  68. package/corpus/core/docs/content/locales/ar-SA/getting-started.mdx +34 -4
  69. package/corpus/core/docs/content/locales/ar-SA/harness-agents.mdx +79 -8
  70. package/corpus/core/docs/content/locales/ar-SA/human-approval.mdx +50 -4
  71. package/corpus/core/docs/content/locales/ar-SA/key-concepts.mdx +107 -8
  72. package/corpus/core/docs/content/locales/ar-SA/local-file-mode.mdx +56 -4
  73. package/corpus/core/docs/content/locales/ar-SA/mcp-apps.mdx +120 -10
  74. package/corpus/core/docs/content/locales/ar-SA/mcp-clients.mdx +133 -8
  75. package/corpus/core/docs/content/locales/ar-SA/mcp-protocol.mdx +105 -8
  76. package/corpus/core/docs/content/locales/ar-SA/messaging.mdx +115 -8
  77. package/corpus/core/docs/content/locales/ar-SA/migration-workbench.mdx +47 -4
  78. package/corpus/core/docs/content/locales/ar-SA/multi-app-workspace.mdx +91 -8
  79. package/corpus/core/docs/content/locales/ar-SA/multi-tenancy.mdx +80 -8
  80. package/corpus/core/docs/content/locales/ar-SA/native-chat-ui.mdx +104 -8
  81. package/corpus/core/docs/content/locales/ar-SA/notifications.mdx +135 -8
  82. package/corpus/core/docs/content/locales/ar-SA/observability.mdx +102 -8
  83. package/corpus/core/docs/content/locales/ar-SA/observational-memory.mdx +87 -8
  84. package/corpus/core/docs/content/locales/ar-SA/onboarding.mdx +45 -4
  85. package/corpus/core/docs/content/locales/ar-SA/plan-plugin.mdx +99 -8
  86. package/corpus/core/docs/content/locales/ar-SA/pr-visual-recap.mdx +125 -8
  87. package/corpus/core/docs/content/locales/ar-SA/processors.mdx +41 -4
  88. package/corpus/core/docs/content/locales/ar-SA/progress.mdx +46 -4
  89. package/corpus/core/docs/content/locales/ar-SA/pure-agent-apps.mdx +48 -4
  90. package/corpus/core/docs/content/locales/ar-SA/real-time-collaboration.mdx +102 -8
  91. package/corpus/core/docs/content/locales/ar-SA/recurring-jobs.mdx +59 -4
  92. package/corpus/core/docs/content/locales/ar-SA/routing.mdx +44 -5
  93. package/corpus/core/docs/content/locales/ar-SA/sandbox-adapters.mdx +43 -4
  94. package/corpus/core/docs/content/locales/ar-SA/security.mdx +80 -8
  95. package/corpus/core/docs/content/locales/ar-SA/server.mdx +173 -12
  96. package/corpus/core/docs/content/locales/ar-SA/sharing.mdx +45 -4
  97. package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +118 -9
  98. package/corpus/core/docs/content/locales/ar-SA/template-analytics.mdx +46 -4
  99. package/corpus/core/docs/content/locales/ar-SA/template-assets.mdx +62 -4
  100. package/corpus/core/docs/content/locales/ar-SA/template-brain.mdx +65 -4
  101. package/corpus/core/docs/content/locales/ar-SA/template-calendar.mdx +62 -4
  102. package/corpus/core/docs/content/locales/ar-SA/template-chat.mdx +61 -4
  103. package/corpus/core/docs/content/locales/ar-SA/template-clips.mdx +52 -4
  104. package/corpus/core/docs/content/locales/ar-SA/template-content.mdx +62 -4
  105. package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +101 -4
  106. package/corpus/core/docs/content/locales/ar-SA/template-dispatch.mdx +57 -4
  107. package/corpus/core/docs/content/locales/ar-SA/template-forms.mdx +62 -4
  108. package/corpus/core/docs/content/locales/ar-SA/template-mail.mdx +60 -4
  109. package/corpus/core/docs/content/locales/ar-SA/template-plan.mdx +61 -4
  110. package/corpus/core/docs/content/locales/ar-SA/template-slides.mdx +49 -4
  111. package/corpus/core/docs/content/locales/ar-SA/template-videos.mdx +53 -4
  112. package/corpus/core/docs/content/locales/ar-SA/tracking.mdx +54 -4
  113. package/corpus/core/docs/content/locales/ar-SA/using-your-agent.mdx +51 -4
  114. package/corpus/core/docs/content/locales/ar-SA/voice-input.mdx +43 -4
  115. package/corpus/core/docs/content/locales/ar-SA/what-is-agent-native.mdx +96 -8
  116. package/corpus/core/docs/content/locales/ar-SA/workspace-connections.mdx +128 -8
  117. package/corpus/core/docs/content/locales/ar-SA/workspace-management.mdx +50 -4
  118. package/corpus/core/docs/content/locales/ar-SA/workspace.mdx +112 -8
  119. package/corpus/core/docs/content/locales/ar-SA/writing-agent-instructions.mdx +41 -4
  120. package/corpus/core/docs/content/locales/de-DE/a2a-protocol.mdx +99 -9
  121. package/corpus/core/docs/content/locales/de-DE/actions.mdx +67 -4
  122. package/corpus/core/docs/content/locales/de-DE/agent-mentions.mdx +68 -4
  123. package/corpus/core/docs/content/locales/de-DE/agent-surfaces.mdx +116 -8
  124. package/corpus/core/docs/content/locales/de-DE/agent-teams.mdx +171 -12
  125. package/corpus/core/docs/content/locales/de-DE/agent-web-surfaces.mdx +51 -4
  126. package/corpus/core/docs/content/locales/de-DE/authentication.mdx +122 -8
  127. package/corpus/core/docs/content/locales/de-DE/automations.mdx +110 -8
  128. package/corpus/core/docs/content/locales/de-DE/blueprint-installer.mdx +42 -4
  129. package/corpus/core/docs/content/locales/de-DE/cli-adapters.mdx +44 -4
  130. package/corpus/core/docs/content/locales/de-DE/client.mdx +79 -8
  131. package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +85 -8
  132. package/corpus/core/docs/content/locales/de-DE/code-agents-ui.mdx +100 -8
  133. package/corpus/core/docs/content/locales/de-DE/components.mdx +118 -8
  134. package/corpus/core/docs/content/locales/de-DE/context-awareness.mdx +98 -8
  135. package/corpus/core/docs/content/locales/de-DE/creating-templates.mdx +51 -4
  136. package/corpus/core/docs/content/locales/de-DE/cross-app-sso.mdx +109 -8
  137. package/corpus/core/docs/content/locales/de-DE/database.mdx +52 -4
  138. package/corpus/core/docs/content/locales/de-DE/deployment.mdx +103 -8
  139. package/corpus/core/docs/content/locales/de-DE/dispatch.mdx +134 -8
  140. package/corpus/core/docs/content/locales/de-DE/drop-in-agent.mdx +63 -4
  141. package/corpus/core/docs/content/locales/de-DE/durable-resume.mdx +47 -4
  142. package/corpus/core/docs/content/locales/de-DE/embedding-sdk.mdx +85 -8
  143. package/corpus/core/docs/content/locales/de-DE/evals.mdx +102 -8
  144. package/corpus/core/docs/content/locales/de-DE/extensions.mdx +113 -9
  145. package/corpus/core/docs/content/locales/de-DE/external-agents.mdx +119 -8
  146. package/corpus/core/docs/content/locales/de-DE/faq.mdx +98 -8
  147. package/corpus/core/docs/content/locales/de-DE/file-uploads.mdx +61 -4
  148. package/corpus/core/docs/content/locales/de-DE/frames.mdx +88 -8
  149. package/corpus/core/docs/content/locales/de-DE/getting-started.mdx +34 -4
  150. package/corpus/core/docs/content/locales/de-DE/harness-agents.mdx +79 -8
  151. package/corpus/core/docs/content/locales/de-DE/human-approval.mdx +50 -4
  152. package/corpus/core/docs/content/locales/de-DE/key-concepts.mdx +104 -8
  153. package/corpus/core/docs/content/locales/de-DE/local-file-mode.mdx +58 -4
  154. package/corpus/core/docs/content/locales/de-DE/mcp-apps.mdx +120 -10
  155. package/corpus/core/docs/content/locales/de-DE/mcp-clients.mdx +133 -8
  156. package/corpus/core/docs/content/locales/de-DE/mcp-protocol.mdx +105 -8
  157. package/corpus/core/docs/content/locales/de-DE/messaging.mdx +115 -8
  158. package/corpus/core/docs/content/locales/de-DE/migration-workbench.mdx +47 -4
  159. package/corpus/core/docs/content/locales/de-DE/multi-app-workspace.mdx +91 -8
  160. package/corpus/core/docs/content/locales/de-DE/multi-tenancy.mdx +80 -8
  161. package/corpus/core/docs/content/locales/de-DE/native-chat-ui.mdx +108 -8
  162. package/corpus/core/docs/content/locales/de-DE/notifications.mdx +135 -8
  163. package/corpus/core/docs/content/locales/de-DE/observability.mdx +102 -8
  164. package/corpus/core/docs/content/locales/de-DE/observational-memory.mdx +92 -8
  165. package/corpus/core/docs/content/locales/de-DE/onboarding.mdx +45 -4
  166. package/corpus/core/docs/content/locales/de-DE/plan-plugin.mdx +99 -8
  167. package/corpus/core/docs/content/locales/de-DE/pr-visual-recap.mdx +125 -8
  168. package/corpus/core/docs/content/locales/de-DE/processors.mdx +41 -4
  169. package/corpus/core/docs/content/locales/de-DE/progress.mdx +46 -4
  170. package/corpus/core/docs/content/locales/de-DE/pure-agent-apps.mdx +50 -4
  171. package/corpus/core/docs/content/locales/de-DE/real-time-collaboration.mdx +104 -8
  172. package/corpus/core/docs/content/locales/de-DE/recurring-jobs.mdx +59 -4
  173. package/corpus/core/docs/content/locales/de-DE/routing.mdx +44 -5
  174. package/corpus/core/docs/content/locales/de-DE/sandbox-adapters.mdx +43 -4
  175. package/corpus/core/docs/content/locales/de-DE/security.mdx +80 -8
  176. package/corpus/core/docs/content/locales/de-DE/server.mdx +171 -12
  177. package/corpus/core/docs/content/locales/de-DE/sharing.mdx +45 -4
  178. package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +118 -9
  179. package/corpus/core/docs/content/locales/de-DE/template-analytics.mdx +46 -4
  180. package/corpus/core/docs/content/locales/de-DE/template-assets.mdx +62 -4
  181. package/corpus/core/docs/content/locales/de-DE/template-brain.mdx +69 -4
  182. package/corpus/core/docs/content/locales/de-DE/template-calendar.mdx +62 -4
  183. package/corpus/core/docs/content/locales/de-DE/template-chat.mdx +61 -4
  184. package/corpus/core/docs/content/locales/de-DE/template-clips.mdx +52 -4
  185. package/corpus/core/docs/content/locales/de-DE/template-content.mdx +60 -4
  186. package/corpus/core/docs/content/locales/de-DE/template-design.mdx +109 -4
  187. package/corpus/core/docs/content/locales/de-DE/template-dispatch.mdx +57 -4
  188. package/corpus/core/docs/content/locales/de-DE/template-forms.mdx +64 -4
  189. package/corpus/core/docs/content/locales/de-DE/template-mail.mdx +60 -4
  190. package/corpus/core/docs/content/locales/de-DE/template-plan.mdx +63 -4
  191. package/corpus/core/docs/content/locales/de-DE/template-slides.mdx +49 -4
  192. package/corpus/core/docs/content/locales/de-DE/template-videos.mdx +53 -4
  193. package/corpus/core/docs/content/locales/de-DE/tracking.mdx +54 -4
  194. package/corpus/core/docs/content/locales/de-DE/using-your-agent.mdx +51 -4
  195. package/corpus/core/docs/content/locales/de-DE/voice-input.mdx +45 -4
  196. package/corpus/core/docs/content/locales/de-DE/what-is-agent-native.mdx +100 -8
  197. package/corpus/core/docs/content/locales/de-DE/workspace-connections.mdx +128 -8
  198. package/corpus/core/docs/content/locales/de-DE/workspace-management.mdx +50 -4
  199. package/corpus/core/docs/content/locales/de-DE/workspace.mdx +111 -8
  200. package/corpus/core/docs/content/locales/de-DE/writing-agent-instructions.mdx +45 -4
  201. package/corpus/core/docs/content/locales/es-ES/a2a-protocol.mdx +99 -9
  202. package/corpus/core/docs/content/locales/es-ES/actions.mdx +67 -4
  203. package/corpus/core/docs/content/locales/es-ES/agent-mentions.mdx +68 -4
  204. package/corpus/core/docs/content/locales/es-ES/agent-surfaces.mdx +120 -8
  205. package/corpus/core/docs/content/locales/es-ES/agent-teams.mdx +172 -12
  206. package/corpus/core/docs/content/locales/es-ES/agent-web-surfaces.mdx +51 -4
  207. package/corpus/core/docs/content/locales/es-ES/authentication.mdx +122 -8
  208. package/corpus/core/docs/content/locales/es-ES/automations.mdx +110 -8
  209. package/corpus/core/docs/content/locales/es-ES/blueprint-installer.mdx +42 -4
  210. package/corpus/core/docs/content/locales/es-ES/cli-adapters.mdx +44 -4
  211. package/corpus/core/docs/content/locales/es-ES/client.mdx +79 -8
  212. package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +85 -8
  213. package/corpus/core/docs/content/locales/es-ES/code-agents-ui.mdx +101 -8
  214. package/corpus/core/docs/content/locales/es-ES/components.mdx +118 -8
  215. package/corpus/core/docs/content/locales/es-ES/context-awareness.mdx +98 -8
  216. package/corpus/core/docs/content/locales/es-ES/creating-templates.mdx +51 -4
  217. package/corpus/core/docs/content/locales/es-ES/cross-app-sso.mdx +109 -8
  218. package/corpus/core/docs/content/locales/es-ES/database.mdx +52 -4
  219. package/corpus/core/docs/content/locales/es-ES/deployment.mdx +103 -8
  220. package/corpus/core/docs/content/locales/es-ES/dispatch.mdx +134 -8
  221. package/corpus/core/docs/content/locales/es-ES/drop-in-agent.mdx +63 -4
  222. package/corpus/core/docs/content/locales/es-ES/durable-resume.mdx +47 -4
  223. package/corpus/core/docs/content/locales/es-ES/embedding-sdk.mdx +87 -8
  224. package/corpus/core/docs/content/locales/es-ES/evals.mdx +102 -8
  225. package/corpus/core/docs/content/locales/es-ES/extensions.mdx +113 -9
  226. package/corpus/core/docs/content/locales/es-ES/external-agents.mdx +119 -8
  227. package/corpus/core/docs/content/locales/es-ES/faq.mdx +98 -8
  228. package/corpus/core/docs/content/locales/es-ES/file-uploads.mdx +61 -4
  229. package/corpus/core/docs/content/locales/es-ES/frames.mdx +88 -8
  230. package/corpus/core/docs/content/locales/es-ES/getting-started.mdx +34 -4
  231. package/corpus/core/docs/content/locales/es-ES/harness-agents.mdx +79 -8
  232. package/corpus/core/docs/content/locales/es-ES/human-approval.mdx +50 -4
  233. package/corpus/core/docs/content/locales/es-ES/key-concepts.mdx +104 -8
  234. package/corpus/core/docs/content/locales/es-ES/local-file-mode.mdx +60 -4
  235. package/corpus/core/docs/content/locales/es-ES/mcp-apps.mdx +120 -10
  236. package/corpus/core/docs/content/locales/es-ES/mcp-clients.mdx +135 -8
  237. package/corpus/core/docs/content/locales/es-ES/mcp-protocol.mdx +105 -8
  238. package/corpus/core/docs/content/locales/es-ES/messaging.mdx +115 -8
  239. package/corpus/core/docs/content/locales/es-ES/migration-workbench.mdx +47 -4
  240. package/corpus/core/docs/content/locales/es-ES/multi-app-workspace.mdx +91 -8
  241. package/corpus/core/docs/content/locales/es-ES/multi-tenancy.mdx +80 -8
  242. package/corpus/core/docs/content/locales/es-ES/native-chat-ui.mdx +108 -8
  243. package/corpus/core/docs/content/locales/es-ES/notifications.mdx +135 -8
  244. package/corpus/core/docs/content/locales/es-ES/observability.mdx +104 -8
  245. package/corpus/core/docs/content/locales/es-ES/observational-memory.mdx +92 -8
  246. package/corpus/core/docs/content/locales/es-ES/onboarding.mdx +45 -4
  247. package/corpus/core/docs/content/locales/es-ES/plan-plugin.mdx +99 -8
  248. package/corpus/core/docs/content/locales/es-ES/pr-visual-recap.mdx +125 -8
  249. package/corpus/core/docs/content/locales/es-ES/processors.mdx +41 -4
  250. package/corpus/core/docs/content/locales/es-ES/progress.mdx +46 -4
  251. package/corpus/core/docs/content/locales/es-ES/pure-agent-apps.mdx +50 -4
  252. package/corpus/core/docs/content/locales/es-ES/real-time-collaboration.mdx +109 -8
  253. package/corpus/core/docs/content/locales/es-ES/recurring-jobs.mdx +59 -4
  254. package/corpus/core/docs/content/locales/es-ES/routing.mdx +44 -5
  255. package/corpus/core/docs/content/locales/es-ES/sandbox-adapters.mdx +44 -4
  256. package/corpus/core/docs/content/locales/es-ES/security.mdx +82 -8
  257. package/corpus/core/docs/content/locales/es-ES/server.mdx +173 -12
  258. package/corpus/core/docs/content/locales/es-ES/sharing.mdx +45 -4
  259. package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +118 -9
  260. package/corpus/core/docs/content/locales/es-ES/template-analytics.mdx +46 -4
  261. package/corpus/core/docs/content/locales/es-ES/template-assets.mdx +64 -4
  262. package/corpus/core/docs/content/locales/es-ES/template-brain.mdx +69 -4
  263. package/corpus/core/docs/content/locales/es-ES/template-calendar.mdx +62 -4
  264. package/corpus/core/docs/content/locales/es-ES/template-chat.mdx +61 -4
  265. package/corpus/core/docs/content/locales/es-ES/template-clips.mdx +52 -4
  266. package/corpus/core/docs/content/locales/es-ES/template-content.mdx +64 -4
  267. package/corpus/core/docs/content/locales/es-ES/template-design.mdx +108 -4
  268. package/corpus/core/docs/content/locales/es-ES/template-dispatch.mdx +57 -4
  269. package/corpus/core/docs/content/locales/es-ES/template-forms.mdx +64 -4
  270. package/corpus/core/docs/content/locales/es-ES/template-mail.mdx +60 -4
  271. package/corpus/core/docs/content/locales/es-ES/template-plan.mdx +61 -4
  272. package/corpus/core/docs/content/locales/es-ES/template-slides.mdx +49 -4
  273. package/corpus/core/docs/content/locales/es-ES/template-videos.mdx +53 -4
  274. package/corpus/core/docs/content/locales/es-ES/tracking.mdx +54 -4
  275. package/corpus/core/docs/content/locales/es-ES/using-your-agent.mdx +51 -4
  276. package/corpus/core/docs/content/locales/es-ES/voice-input.mdx +45 -4
  277. package/corpus/core/docs/content/locales/es-ES/what-is-agent-native.mdx +99 -8
  278. package/corpus/core/docs/content/locales/es-ES/workspace-connections.mdx +128 -8
  279. package/corpus/core/docs/content/locales/es-ES/workspace-management.mdx +50 -4
  280. package/corpus/core/docs/content/locales/es-ES/workspace.mdx +112 -8
  281. package/corpus/core/docs/content/locales/es-ES/writing-agent-instructions.mdx +46 -4
  282. package/corpus/core/docs/content/locales/fr-FR/a2a-protocol.mdx +97 -9
  283. package/corpus/core/docs/content/locales/fr-FR/actions.mdx +67 -4
  284. package/corpus/core/docs/content/locales/fr-FR/agent-mentions.mdx +68 -4
  285. package/corpus/core/docs/content/locales/fr-FR/agent-surfaces.mdx +118 -8
  286. package/corpus/core/docs/content/locales/fr-FR/agent-teams.mdx +172 -12
  287. package/corpus/core/docs/content/locales/fr-FR/agent-web-surfaces.mdx +51 -4
  288. package/corpus/core/docs/content/locales/fr-FR/authentication.mdx +122 -8
  289. package/corpus/core/docs/content/locales/fr-FR/automations.mdx +110 -8
  290. package/corpus/core/docs/content/locales/fr-FR/blueprint-installer.mdx +42 -4
  291. package/corpus/core/docs/content/locales/fr-FR/cli-adapters.mdx +44 -4
  292. package/corpus/core/docs/content/locales/fr-FR/client.mdx +81 -8
  293. package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +85 -8
  294. package/corpus/core/docs/content/locales/fr-FR/code-agents-ui.mdx +102 -8
  295. package/corpus/core/docs/content/locales/fr-FR/components.mdx +118 -8
  296. package/corpus/core/docs/content/locales/fr-FR/context-awareness.mdx +98 -8
  297. package/corpus/core/docs/content/locales/fr-FR/creating-templates.mdx +49 -4
  298. package/corpus/core/docs/content/locales/fr-FR/cross-app-sso.mdx +109 -8
  299. package/corpus/core/docs/content/locales/fr-FR/database.mdx +52 -4
  300. package/corpus/core/docs/content/locales/fr-FR/deployment.mdx +103 -8
  301. package/corpus/core/docs/content/locales/fr-FR/dispatch.mdx +134 -8
  302. package/corpus/core/docs/content/locales/fr-FR/drop-in-agent.mdx +63 -4
  303. package/corpus/core/docs/content/locales/fr-FR/durable-resume.mdx +47 -4
  304. package/corpus/core/docs/content/locales/fr-FR/embedding-sdk.mdx +87 -8
  305. package/corpus/core/docs/content/locales/fr-FR/evals.mdx +102 -8
  306. package/corpus/core/docs/content/locales/fr-FR/extensions.mdx +113 -9
  307. package/corpus/core/docs/content/locales/fr-FR/external-agents.mdx +119 -8
  308. package/corpus/core/docs/content/locales/fr-FR/faq.mdx +98 -8
  309. package/corpus/core/docs/content/locales/fr-FR/file-uploads.mdx +61 -4
  310. package/corpus/core/docs/content/locales/fr-FR/frames.mdx +90 -8
  311. package/corpus/core/docs/content/locales/fr-FR/getting-started.mdx +34 -4
  312. package/corpus/core/docs/content/locales/fr-FR/harness-agents.mdx +77 -8
  313. package/corpus/core/docs/content/locales/fr-FR/human-approval.mdx +50 -4
  314. package/corpus/core/docs/content/locales/fr-FR/key-concepts.mdx +106 -8
  315. package/corpus/core/docs/content/locales/fr-FR/local-file-mode.mdx +58 -4
  316. package/corpus/core/docs/content/locales/fr-FR/mcp-apps.mdx +120 -10
  317. package/corpus/core/docs/content/locales/fr-FR/mcp-clients.mdx +135 -8
  318. package/corpus/core/docs/content/locales/fr-FR/mcp-protocol.mdx +105 -8
  319. package/corpus/core/docs/content/locales/fr-FR/messaging.mdx +115 -8
  320. package/corpus/core/docs/content/locales/fr-FR/migration-workbench.mdx +47 -4
  321. package/corpus/core/docs/content/locales/fr-FR/multi-app-workspace.mdx +91 -8
  322. package/corpus/core/docs/content/locales/fr-FR/multi-tenancy.mdx +80 -8
  323. package/corpus/core/docs/content/locales/fr-FR/native-chat-ui.mdx +108 -8
  324. package/corpus/core/docs/content/locales/fr-FR/notifications.mdx +135 -8
  325. package/corpus/core/docs/content/locales/fr-FR/observability.mdx +104 -8
  326. package/corpus/core/docs/content/locales/fr-FR/observational-memory.mdx +89 -8
  327. package/corpus/core/docs/content/locales/fr-FR/onboarding.mdx +45 -4
  328. package/corpus/core/docs/content/locales/fr-FR/plan-plugin.mdx +99 -8
  329. package/corpus/core/docs/content/locales/fr-FR/pr-visual-recap.mdx +126 -8
  330. package/corpus/core/docs/content/locales/fr-FR/processors.mdx +41 -4
  331. package/corpus/core/docs/content/locales/fr-FR/progress.mdx +46 -4
  332. package/corpus/core/docs/content/locales/fr-FR/pure-agent-apps.mdx +48 -4
  333. package/corpus/core/docs/content/locales/fr-FR/real-time-collaboration.mdx +107 -8
  334. package/corpus/core/docs/content/locales/fr-FR/recurring-jobs.mdx +59 -4
  335. package/corpus/core/docs/content/locales/fr-FR/routing.mdx +44 -5
  336. package/corpus/core/docs/content/locales/fr-FR/sandbox-adapters.mdx +44 -4
  337. package/corpus/core/docs/content/locales/fr-FR/security.mdx +82 -8
  338. package/corpus/core/docs/content/locales/fr-FR/server.mdx +173 -12
  339. package/corpus/core/docs/content/locales/fr-FR/sharing.mdx +45 -4
  340. package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +118 -9
  341. package/corpus/core/docs/content/locales/fr-FR/template-analytics.mdx +46 -4
  342. package/corpus/core/docs/content/locales/fr-FR/template-assets.mdx +66 -4
  343. package/corpus/core/docs/content/locales/fr-FR/template-brain.mdx +69 -4
  344. package/corpus/core/docs/content/locales/fr-FR/template-calendar.mdx +62 -4
  345. package/corpus/core/docs/content/locales/fr-FR/template-chat.mdx +61 -4
  346. package/corpus/core/docs/content/locales/fr-FR/template-clips.mdx +52 -4
  347. package/corpus/core/docs/content/locales/fr-FR/template-content.mdx +64 -4
  348. package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +107 -4
  349. package/corpus/core/docs/content/locales/fr-FR/template-dispatch.mdx +57 -4
  350. package/corpus/core/docs/content/locales/fr-FR/template-forms.mdx +64 -4
  351. package/corpus/core/docs/content/locales/fr-FR/template-mail.mdx +60 -4
  352. package/corpus/core/docs/content/locales/fr-FR/template-plan.mdx +61 -4
  353. package/corpus/core/docs/content/locales/fr-FR/template-slides.mdx +49 -4
  354. package/corpus/core/docs/content/locales/fr-FR/template-videos.mdx +53 -4
  355. package/corpus/core/docs/content/locales/fr-FR/tracking.mdx +54 -4
  356. package/corpus/core/docs/content/locales/fr-FR/using-your-agent.mdx +51 -4
  357. package/corpus/core/docs/content/locales/fr-FR/voice-input.mdx +45 -4
  358. package/corpus/core/docs/content/locales/fr-FR/what-is-agent-native.mdx +101 -8
  359. package/corpus/core/docs/content/locales/fr-FR/workspace-connections.mdx +128 -8
  360. package/corpus/core/docs/content/locales/fr-FR/workspace-management.mdx +50 -4
  361. package/corpus/core/docs/content/locales/fr-FR/workspace.mdx +112 -8
  362. package/corpus/core/docs/content/locales/fr-FR/writing-agent-instructions.mdx +47 -4
  363. package/corpus/core/docs/content/locales/hi-IN/a2a-protocol.mdx +97 -9
  364. package/corpus/core/docs/content/locales/hi-IN/actions.mdx +63 -4
  365. package/corpus/core/docs/content/locales/hi-IN/agent-mentions.mdx +68 -4
  366. package/corpus/core/docs/content/locales/hi-IN/agent-surfaces.mdx +112 -8
  367. package/corpus/core/docs/content/locales/hi-IN/agent-teams.mdx +171 -12
  368. package/corpus/core/docs/content/locales/hi-IN/agent-web-surfaces.mdx +51 -4
  369. package/corpus/core/docs/content/locales/hi-IN/authentication.mdx +122 -8
  370. package/corpus/core/docs/content/locales/hi-IN/automations.mdx +110 -8
  371. package/corpus/core/docs/content/locales/hi-IN/blueprint-installer.mdx +42 -4
  372. package/corpus/core/docs/content/locales/hi-IN/cli-adapters.mdx +44 -4
  373. package/corpus/core/docs/content/locales/hi-IN/client.mdx +79 -8
  374. package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +85 -8
  375. package/corpus/core/docs/content/locales/hi-IN/code-agents-ui.mdx +96 -8
  376. package/corpus/core/docs/content/locales/hi-IN/components.mdx +114 -8
  377. package/corpus/core/docs/content/locales/hi-IN/context-awareness.mdx +102 -8
  378. package/corpus/core/docs/content/locales/hi-IN/creating-templates.mdx +53 -4
  379. package/corpus/core/docs/content/locales/hi-IN/cross-app-sso.mdx +109 -8
  380. package/corpus/core/docs/content/locales/hi-IN/database.mdx +52 -4
  381. package/corpus/core/docs/content/locales/hi-IN/deployment.mdx +103 -8
  382. package/corpus/core/docs/content/locales/hi-IN/dispatch.mdx +134 -8
  383. package/corpus/core/docs/content/locales/hi-IN/drop-in-agent.mdx +63 -4
  384. package/corpus/core/docs/content/locales/hi-IN/durable-resume.mdx +47 -4
  385. package/corpus/core/docs/content/locales/hi-IN/embedding-sdk.mdx +83 -8
  386. package/corpus/core/docs/content/locales/hi-IN/evals.mdx +100 -8
  387. package/corpus/core/docs/content/locales/hi-IN/extensions.mdx +113 -9
  388. package/corpus/core/docs/content/locales/hi-IN/external-agents.mdx +119 -8
  389. package/corpus/core/docs/content/locales/hi-IN/faq.mdx +96 -8
  390. package/corpus/core/docs/content/locales/hi-IN/file-uploads.mdx +61 -4
  391. package/corpus/core/docs/content/locales/hi-IN/frames.mdx +88 -8
  392. package/corpus/core/docs/content/locales/hi-IN/getting-started.mdx +34 -4
  393. package/corpus/core/docs/content/locales/hi-IN/harness-agents.mdx +77 -8
  394. package/corpus/core/docs/content/locales/hi-IN/human-approval.mdx +51 -4
  395. package/corpus/core/docs/content/locales/hi-IN/key-concepts.mdx +104 -8
  396. package/corpus/core/docs/content/locales/hi-IN/local-file-mode.mdx +58 -4
  397. package/corpus/core/docs/content/locales/hi-IN/mcp-apps.mdx +120 -10
  398. package/corpus/core/docs/content/locales/hi-IN/mcp-clients.mdx +133 -8
  399. package/corpus/core/docs/content/locales/hi-IN/mcp-protocol.mdx +105 -8
  400. package/corpus/core/docs/content/locales/hi-IN/messaging.mdx +115 -8
  401. package/corpus/core/docs/content/locales/hi-IN/migration-workbench.mdx +45 -4
  402. package/corpus/core/docs/content/locales/hi-IN/multi-app-workspace.mdx +91 -8
  403. package/corpus/core/docs/content/locales/hi-IN/multi-tenancy.mdx +80 -8
  404. package/corpus/core/docs/content/locales/hi-IN/native-chat-ui.mdx +106 -8
  405. package/corpus/core/docs/content/locales/hi-IN/notifications.mdx +135 -8
  406. package/corpus/core/docs/content/locales/hi-IN/observability.mdx +102 -8
  407. package/corpus/core/docs/content/locales/hi-IN/observational-memory.mdx +89 -8
  408. package/corpus/core/docs/content/locales/hi-IN/onboarding.mdx +45 -4
  409. package/corpus/core/docs/content/locales/hi-IN/plan-plugin.mdx +99 -8
  410. package/corpus/core/docs/content/locales/hi-IN/pr-visual-recap.mdx +126 -8
  411. package/corpus/core/docs/content/locales/hi-IN/processors.mdx +41 -4
  412. package/corpus/core/docs/content/locales/hi-IN/progress.mdx +46 -4
  413. package/corpus/core/docs/content/locales/hi-IN/pure-agent-apps.mdx +48 -4
  414. package/corpus/core/docs/content/locales/hi-IN/real-time-collaboration.mdx +106 -8
  415. package/corpus/core/docs/content/locales/hi-IN/recurring-jobs.mdx +59 -4
  416. package/corpus/core/docs/content/locales/hi-IN/routing.mdx +44 -5
  417. package/corpus/core/docs/content/locales/hi-IN/sandbox-adapters.mdx +43 -4
  418. package/corpus/core/docs/content/locales/hi-IN/security.mdx +78 -8
  419. package/corpus/core/docs/content/locales/hi-IN/server.mdx +169 -12
  420. package/corpus/core/docs/content/locales/hi-IN/sharing.mdx +45 -4
  421. package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +118 -9
  422. package/corpus/core/docs/content/locales/hi-IN/template-analytics.mdx +46 -4
  423. package/corpus/core/docs/content/locales/hi-IN/template-assets.mdx +62 -4
  424. package/corpus/core/docs/content/locales/hi-IN/template-brain.mdx +69 -4
  425. package/corpus/core/docs/content/locales/hi-IN/template-calendar.mdx +62 -4
  426. package/corpus/core/docs/content/locales/hi-IN/template-chat.mdx +59 -4
  427. package/corpus/core/docs/content/locales/hi-IN/template-clips.mdx +52 -4
  428. package/corpus/core/docs/content/locales/hi-IN/template-content.mdx +62 -4
  429. package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +102 -4
  430. package/corpus/core/docs/content/locales/hi-IN/template-dispatch.mdx +57 -4
  431. package/corpus/core/docs/content/locales/hi-IN/template-forms.mdx +64 -4
  432. package/corpus/core/docs/content/locales/hi-IN/template-mail.mdx +64 -4
  433. package/corpus/core/docs/content/locales/hi-IN/template-plan.mdx +61 -4
  434. package/corpus/core/docs/content/locales/hi-IN/template-slides.mdx +49 -4
  435. package/corpus/core/docs/content/locales/hi-IN/template-videos.mdx +53 -4
  436. package/corpus/core/docs/content/locales/hi-IN/tracking.mdx +54 -4
  437. package/corpus/core/docs/content/locales/hi-IN/using-your-agent.mdx +51 -4
  438. package/corpus/core/docs/content/locales/hi-IN/voice-input.mdx +43 -4
  439. package/corpus/core/docs/content/locales/hi-IN/what-is-agent-native.mdx +97 -8
  440. package/corpus/core/docs/content/locales/hi-IN/workspace-connections.mdx +128 -8
  441. package/corpus/core/docs/content/locales/hi-IN/workspace-management.mdx +50 -4
  442. package/corpus/core/docs/content/locales/hi-IN/workspace.mdx +111 -8
  443. package/corpus/core/docs/content/locales/hi-IN/writing-agent-instructions.mdx +40 -4
  444. package/corpus/core/docs/content/locales/ja-JP/a2a-protocol.mdx +97 -9
  445. package/corpus/core/docs/content/locales/ja-JP/actions.mdx +67 -4
  446. package/corpus/core/docs/content/locales/ja-JP/agent-mentions.mdx +68 -4
  447. package/corpus/core/docs/content/locales/ja-JP/agent-surfaces.mdx +116 -8
  448. package/corpus/core/docs/content/locales/ja-JP/agent-teams.mdx +172 -12
  449. package/corpus/core/docs/content/locales/ja-JP/agent-web-surfaces.mdx +51 -4
  450. package/corpus/core/docs/content/locales/ja-JP/authentication.mdx +122 -8
  451. package/corpus/core/docs/content/locales/ja-JP/automations.mdx +110 -8
  452. package/corpus/core/docs/content/locales/ja-JP/blueprint-installer.mdx +44 -4
  453. package/corpus/core/docs/content/locales/ja-JP/cli-adapters.mdx +44 -4
  454. package/corpus/core/docs/content/locales/ja-JP/client.mdx +79 -8
  455. package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +85 -8
  456. package/corpus/core/docs/content/locales/ja-JP/code-agents-ui.mdx +100 -8
  457. package/corpus/core/docs/content/locales/ja-JP/components.mdx +116 -8
  458. package/corpus/core/docs/content/locales/ja-JP/context-awareness.mdx +100 -8
  459. package/corpus/core/docs/content/locales/ja-JP/creating-templates.mdx +51 -4
  460. package/corpus/core/docs/content/locales/ja-JP/cross-app-sso.mdx +109 -8
  461. package/corpus/core/docs/content/locales/ja-JP/database.mdx +52 -4
  462. package/corpus/core/docs/content/locales/ja-JP/deployment.mdx +103 -8
  463. package/corpus/core/docs/content/locales/ja-JP/dispatch.mdx +134 -8
  464. package/corpus/core/docs/content/locales/ja-JP/drop-in-agent.mdx +63 -4
  465. package/corpus/core/docs/content/locales/ja-JP/durable-resume.mdx +47 -4
  466. package/corpus/core/docs/content/locales/ja-JP/embedding-sdk.mdx +85 -8
  467. package/corpus/core/docs/content/locales/ja-JP/evals.mdx +102 -8
  468. package/corpus/core/docs/content/locales/ja-JP/extensions.mdx +111 -9
  469. package/corpus/core/docs/content/locales/ja-JP/external-agents.mdx +119 -8
  470. package/corpus/core/docs/content/locales/ja-JP/faq.mdx +98 -8
  471. package/corpus/core/docs/content/locales/ja-JP/file-uploads.mdx +61 -4
  472. package/corpus/core/docs/content/locales/ja-JP/frames.mdx +88 -8
  473. package/corpus/core/docs/content/locales/ja-JP/getting-started.mdx +34 -4
  474. package/corpus/core/docs/content/locales/ja-JP/harness-agents.mdx +79 -8
  475. package/corpus/core/docs/content/locales/ja-JP/human-approval.mdx +50 -4
  476. package/corpus/core/docs/content/locales/ja-JP/key-concepts.mdx +105 -8
  477. package/corpus/core/docs/content/locales/ja-JP/local-file-mode.mdx +58 -4
  478. package/corpus/core/docs/content/locales/ja-JP/mcp-apps.mdx +119 -10
  479. package/corpus/core/docs/content/locales/ja-JP/mcp-clients.mdx +134 -8
  480. package/corpus/core/docs/content/locales/ja-JP/mcp-protocol.mdx +105 -8
  481. package/corpus/core/docs/content/locales/ja-JP/messaging.mdx +115 -8
  482. package/corpus/core/docs/content/locales/ja-JP/migration-workbench.mdx +47 -4
  483. package/corpus/core/docs/content/locales/ja-JP/multi-app-workspace.mdx +91 -8
  484. package/corpus/core/docs/content/locales/ja-JP/multi-tenancy.mdx +80 -8
  485. package/corpus/core/docs/content/locales/ja-JP/native-chat-ui.mdx +104 -8
  486. package/corpus/core/docs/content/locales/ja-JP/notifications.mdx +135 -8
  487. package/corpus/core/docs/content/locales/ja-JP/observability.mdx +104 -8
  488. package/corpus/core/docs/content/locales/ja-JP/observational-memory.mdx +89 -8
  489. package/corpus/core/docs/content/locales/ja-JP/onboarding.mdx +45 -4
  490. package/corpus/core/docs/content/locales/ja-JP/plan-plugin.mdx +99 -8
  491. package/corpus/core/docs/content/locales/ja-JP/pr-visual-recap.mdx +123 -8
  492. package/corpus/core/docs/content/locales/ja-JP/processors.mdx +39 -4
  493. package/corpus/core/docs/content/locales/ja-JP/progress.mdx +46 -4
  494. package/corpus/core/docs/content/locales/ja-JP/pure-agent-apps.mdx +48 -4
  495. package/corpus/core/docs/content/locales/ja-JP/real-time-collaboration.mdx +106 -8
  496. package/corpus/core/docs/content/locales/ja-JP/recurring-jobs.mdx +59 -4
  497. package/corpus/core/docs/content/locales/ja-JP/routing.mdx +44 -5
  498. package/corpus/core/docs/content/locales/ja-JP/sandbox-adapters.mdx +43 -4
  499. package/corpus/core/docs/content/locales/ja-JP/security.mdx +82 -8
  500. package/corpus/core/docs/content/locales/ja-JP/server.mdx +171 -12
  501. package/corpus/core/docs/content/locales/ja-JP/sharing.mdx +45 -4
  502. package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +118 -9
  503. package/corpus/core/docs/content/locales/ja-JP/template-analytics.mdx +46 -4
  504. package/corpus/core/docs/content/locales/ja-JP/template-assets.mdx +64 -4
  505. package/corpus/core/docs/content/locales/ja-JP/template-brain.mdx +67 -4
  506. package/corpus/core/docs/content/locales/ja-JP/template-calendar.mdx +62 -4
  507. package/corpus/core/docs/content/locales/ja-JP/template-chat.mdx +61 -4
  508. package/corpus/core/docs/content/locales/ja-JP/template-clips.mdx +52 -4
  509. package/corpus/core/docs/content/locales/ja-JP/template-content.mdx +62 -4
  510. package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +106 -4
  511. package/corpus/core/docs/content/locales/ja-JP/template-dispatch.mdx +57 -4
  512. package/corpus/core/docs/content/locales/ja-JP/template-forms.mdx +62 -4
  513. package/corpus/core/docs/content/locales/ja-JP/template-mail.mdx +62 -4
  514. package/corpus/core/docs/content/locales/ja-JP/template-plan.mdx +63 -4
  515. package/corpus/core/docs/content/locales/ja-JP/template-slides.mdx +49 -4
  516. package/corpus/core/docs/content/locales/ja-JP/template-videos.mdx +53 -4
  517. package/corpus/core/docs/content/locales/ja-JP/tracking.mdx +54 -4
  518. package/corpus/core/docs/content/locales/ja-JP/using-your-agent.mdx +51 -4
  519. package/corpus/core/docs/content/locales/ja-JP/voice-input.mdx +43 -4
  520. package/corpus/core/docs/content/locales/ja-JP/what-is-agent-native.mdx +96 -8
  521. package/corpus/core/docs/content/locales/ja-JP/workspace-connections.mdx +128 -8
  522. package/corpus/core/docs/content/locales/ja-JP/workspace-management.mdx +50 -4
  523. package/corpus/core/docs/content/locales/ja-JP/workspace.mdx +111 -8
  524. package/corpus/core/docs/content/locales/ja-JP/writing-agent-instructions.mdx +44 -4
  525. package/corpus/core/docs/content/locales/ko-KR/a2a-protocol.mdx +97 -9
  526. package/corpus/core/docs/content/locales/ko-KR/actions.mdx +63 -4
  527. package/corpus/core/docs/content/locales/ko-KR/agent-mentions.mdx +68 -4
  528. package/corpus/core/docs/content/locales/ko-KR/agent-surfaces.mdx +113 -8
  529. package/corpus/core/docs/content/locales/ko-KR/agent-teams.mdx +171 -12
  530. package/corpus/core/docs/content/locales/ko-KR/agent-web-surfaces.mdx +51 -4
  531. package/corpus/core/docs/content/locales/ko-KR/authentication.mdx +122 -8
  532. package/corpus/core/docs/content/locales/ko-KR/automations.mdx +110 -8
  533. package/corpus/core/docs/content/locales/ko-KR/blueprint-installer.mdx +42 -4
  534. package/corpus/core/docs/content/locales/ko-KR/cli-adapters.mdx +44 -4
  535. package/corpus/core/docs/content/locales/ko-KR/client.mdx +79 -8
  536. package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +85 -8
  537. package/corpus/core/docs/content/locales/ko-KR/code-agents-ui.mdx +96 -8
  538. package/corpus/core/docs/content/locales/ko-KR/components.mdx +112 -8
  539. package/corpus/core/docs/content/locales/ko-KR/context-awareness.mdx +96 -8
  540. package/corpus/core/docs/content/locales/ko-KR/creating-templates.mdx +51 -4
  541. package/corpus/core/docs/content/locales/ko-KR/cross-app-sso.mdx +109 -8
  542. package/corpus/core/docs/content/locales/ko-KR/database.mdx +52 -4
  543. package/corpus/core/docs/content/locales/ko-KR/deployment.mdx +103 -8
  544. package/corpus/core/docs/content/locales/ko-KR/dispatch.mdx +132 -8
  545. package/corpus/core/docs/content/locales/ko-KR/drop-in-agent.mdx +63 -4
  546. package/corpus/core/docs/content/locales/ko-KR/durable-resume.mdx +47 -4
  547. package/corpus/core/docs/content/locales/ko-KR/embedding-sdk.mdx +81 -8
  548. package/corpus/core/docs/content/locales/ko-KR/evals.mdx +102 -8
  549. package/corpus/core/docs/content/locales/ko-KR/extensions.mdx +111 -9
  550. package/corpus/core/docs/content/locales/ko-KR/external-agents.mdx +119 -8
  551. package/corpus/core/docs/content/locales/ko-KR/faq.mdx +96 -8
  552. package/corpus/core/docs/content/locales/ko-KR/file-uploads.mdx +61 -4
  553. package/corpus/core/docs/content/locales/ko-KR/frames.mdx +86 -8
  554. package/corpus/core/docs/content/locales/ko-KR/getting-started.mdx +34 -4
  555. package/corpus/core/docs/content/locales/ko-KR/harness-agents.mdx +77 -8
  556. package/corpus/core/docs/content/locales/ko-KR/human-approval.mdx +50 -4
  557. package/corpus/core/docs/content/locales/ko-KR/key-concepts.mdx +104 -8
  558. package/corpus/core/docs/content/locales/ko-KR/local-file-mode.mdx +56 -4
  559. package/corpus/core/docs/content/locales/ko-KR/mcp-apps.mdx +120 -10
  560. package/corpus/core/docs/content/locales/ko-KR/mcp-clients.mdx +133 -8
  561. package/corpus/core/docs/content/locales/ko-KR/mcp-protocol.mdx +105 -8
  562. package/corpus/core/docs/content/locales/ko-KR/messaging.mdx +115 -8
  563. package/corpus/core/docs/content/locales/ko-KR/migration-workbench.mdx +45 -4
  564. package/corpus/core/docs/content/locales/ko-KR/multi-app-workspace.mdx +91 -8
  565. package/corpus/core/docs/content/locales/ko-KR/multi-tenancy.mdx +80 -8
  566. package/corpus/core/docs/content/locales/ko-KR/native-chat-ui.mdx +104 -8
  567. package/corpus/core/docs/content/locales/ko-KR/notifications.mdx +135 -8
  568. package/corpus/core/docs/content/locales/ko-KR/observability.mdx +102 -8
  569. package/corpus/core/docs/content/locales/ko-KR/observational-memory.mdx +87 -8
  570. package/corpus/core/docs/content/locales/ko-KR/onboarding.mdx +44 -4
  571. package/corpus/core/docs/content/locales/ko-KR/plan-plugin.mdx +99 -8
  572. package/corpus/core/docs/content/locales/ko-KR/pr-visual-recap.mdx +125 -8
  573. package/corpus/core/docs/content/locales/ko-KR/processors.mdx +39 -4
  574. package/corpus/core/docs/content/locales/ko-KR/progress.mdx +46 -4
  575. package/corpus/core/docs/content/locales/ko-KR/pure-agent-apps.mdx +46 -4
  576. package/corpus/core/docs/content/locales/ko-KR/real-time-collaboration.mdx +104 -8
  577. package/corpus/core/docs/content/locales/ko-KR/recurring-jobs.mdx +59 -4
  578. package/corpus/core/docs/content/locales/ko-KR/routing.mdx +44 -5
  579. package/corpus/core/docs/content/locales/ko-KR/sandbox-adapters.mdx +41 -4
  580. package/corpus/core/docs/content/locales/ko-KR/security.mdx +78 -8
  581. package/corpus/core/docs/content/locales/ko-KR/server.mdx +171 -12
  582. package/corpus/core/docs/content/locales/ko-KR/sharing.mdx +45 -4
  583. package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +118 -9
  584. package/corpus/core/docs/content/locales/ko-KR/template-analytics.mdx +46 -4
  585. package/corpus/core/docs/content/locales/ko-KR/template-assets.mdx +62 -4
  586. package/corpus/core/docs/content/locales/ko-KR/template-brain.mdx +65 -4
  587. package/corpus/core/docs/content/locales/ko-KR/template-calendar.mdx +60 -4
  588. package/corpus/core/docs/content/locales/ko-KR/template-chat.mdx +59 -4
  589. package/corpus/core/docs/content/locales/ko-KR/template-clips.mdx +52 -4
  590. package/corpus/core/docs/content/locales/ko-KR/template-content.mdx +60 -4
  591. package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +102 -4
  592. package/corpus/core/docs/content/locales/ko-KR/template-dispatch.mdx +57 -4
  593. package/corpus/core/docs/content/locales/ko-KR/template-forms.mdx +60 -4
  594. package/corpus/core/docs/content/locales/ko-KR/template-mail.mdx +60 -4
  595. package/corpus/core/docs/content/locales/ko-KR/template-plan.mdx +57 -4
  596. package/corpus/core/docs/content/locales/ko-KR/template-slides.mdx +49 -4
  597. package/corpus/core/docs/content/locales/ko-KR/template-videos.mdx +53 -4
  598. package/corpus/core/docs/content/locales/ko-KR/tracking.mdx +54 -4
  599. package/corpus/core/docs/content/locales/ko-KR/using-your-agent.mdx +51 -4
  600. package/corpus/core/docs/content/locales/ko-KR/voice-input.mdx +43 -4
  601. package/corpus/core/docs/content/locales/ko-KR/what-is-agent-native.mdx +95 -8
  602. package/corpus/core/docs/content/locales/ko-KR/workspace-connections.mdx +128 -8
  603. package/corpus/core/docs/content/locales/ko-KR/workspace-management.mdx +50 -4
  604. package/corpus/core/docs/content/locales/ko-KR/workspace.mdx +111 -8
  605. package/corpus/core/docs/content/locales/ko-KR/writing-agent-instructions.mdx +38 -4
  606. package/corpus/core/docs/content/locales/pt-BR/a2a-protocol.mdx +99 -9
  607. package/corpus/core/docs/content/locales/pt-BR/actions.mdx +67 -4
  608. package/corpus/core/docs/content/locales/pt-BR/agent-mentions.mdx +68 -4
  609. package/corpus/core/docs/content/locales/pt-BR/agent-surfaces.mdx +116 -8
  610. package/corpus/core/docs/content/locales/pt-BR/agent-teams.mdx +172 -12
  611. package/corpus/core/docs/content/locales/pt-BR/agent-web-surfaces.mdx +51 -4
  612. package/corpus/core/docs/content/locales/pt-BR/authentication.mdx +122 -8
  613. package/corpus/core/docs/content/locales/pt-BR/automations.mdx +110 -8
  614. package/corpus/core/docs/content/locales/pt-BR/blueprint-installer.mdx +42 -4
  615. package/corpus/core/docs/content/locales/pt-BR/cli-adapters.mdx +44 -4
  616. package/corpus/core/docs/content/locales/pt-BR/client.mdx +81 -8
  617. package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +85 -8
  618. package/corpus/core/docs/content/locales/pt-BR/code-agents-ui.mdx +98 -8
  619. package/corpus/core/docs/content/locales/pt-BR/components.mdx +118 -8
  620. package/corpus/core/docs/content/locales/pt-BR/context-awareness.mdx +100 -8
  621. package/corpus/core/docs/content/locales/pt-BR/creating-templates.mdx +51 -4
  622. package/corpus/core/docs/content/locales/pt-BR/cross-app-sso.mdx +109 -8
  623. package/corpus/core/docs/content/locales/pt-BR/database.mdx +52 -4
  624. package/corpus/core/docs/content/locales/pt-BR/deployment.mdx +103 -8
  625. package/corpus/core/docs/content/locales/pt-BR/dispatch.mdx +134 -8
  626. package/corpus/core/docs/content/locales/pt-BR/drop-in-agent.mdx +63 -4
  627. package/corpus/core/docs/content/locales/pt-BR/durable-resume.mdx +47 -4
  628. package/corpus/core/docs/content/locales/pt-BR/embedding-sdk.mdx +87 -8
  629. package/corpus/core/docs/content/locales/pt-BR/evals.mdx +102 -8
  630. package/corpus/core/docs/content/locales/pt-BR/extensions.mdx +113 -9
  631. package/corpus/core/docs/content/locales/pt-BR/external-agents.mdx +119 -8
  632. package/corpus/core/docs/content/locales/pt-BR/faq.mdx +98 -8
  633. package/corpus/core/docs/content/locales/pt-BR/file-uploads.mdx +61 -4
  634. package/corpus/core/docs/content/locales/pt-BR/frames.mdx +88 -8
  635. package/corpus/core/docs/content/locales/pt-BR/getting-started.mdx +34 -4
  636. package/corpus/core/docs/content/locales/pt-BR/harness-agents.mdx +79 -8
  637. package/corpus/core/docs/content/locales/pt-BR/human-approval.mdx +50 -4
  638. package/corpus/core/docs/content/locales/pt-BR/key-concepts.mdx +104 -8
  639. package/corpus/core/docs/content/locales/pt-BR/local-file-mode.mdx +60 -4
  640. package/corpus/core/docs/content/locales/pt-BR/mcp-apps.mdx +120 -10
  641. package/corpus/core/docs/content/locales/pt-BR/mcp-clients.mdx +133 -8
  642. package/corpus/core/docs/content/locales/pt-BR/mcp-protocol.mdx +105 -8
  643. package/corpus/core/docs/content/locales/pt-BR/messaging.mdx +115 -8
  644. package/corpus/core/docs/content/locales/pt-BR/migration-workbench.mdx +47 -4
  645. package/corpus/core/docs/content/locales/pt-BR/multi-app-workspace.mdx +91 -8
  646. package/corpus/core/docs/content/locales/pt-BR/multi-tenancy.mdx +80 -8
  647. package/corpus/core/docs/content/locales/pt-BR/native-chat-ui.mdx +108 -8
  648. package/corpus/core/docs/content/locales/pt-BR/notifications.mdx +135 -8
  649. package/corpus/core/docs/content/locales/pt-BR/observability.mdx +104 -8
  650. package/corpus/core/docs/content/locales/pt-BR/observational-memory.mdx +92 -8
  651. package/corpus/core/docs/content/locales/pt-BR/onboarding.mdx +45 -4
  652. package/corpus/core/docs/content/locales/pt-BR/plan-plugin.mdx +99 -8
  653. package/corpus/core/docs/content/locales/pt-BR/pr-visual-recap.mdx +125 -8
  654. package/corpus/core/docs/content/locales/pt-BR/processors.mdx +41 -4
  655. package/corpus/core/docs/content/locales/pt-BR/progress.mdx +46 -4
  656. package/corpus/core/docs/content/locales/pt-BR/pure-agent-apps.mdx +48 -4
  657. package/corpus/core/docs/content/locales/pt-BR/real-time-collaboration.mdx +107 -8
  658. package/corpus/core/docs/content/locales/pt-BR/recurring-jobs.mdx +59 -4
  659. package/corpus/core/docs/content/locales/pt-BR/routing.mdx +44 -5
  660. package/corpus/core/docs/content/locales/pt-BR/sandbox-adapters.mdx +43 -4
  661. package/corpus/core/docs/content/locales/pt-BR/security.mdx +82 -8
  662. package/corpus/core/docs/content/locales/pt-BR/server.mdx +173 -12
  663. package/corpus/core/docs/content/locales/pt-BR/sharing.mdx +45 -4
  664. package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +118 -9
  665. package/corpus/core/docs/content/locales/pt-BR/template-analytics.mdx +46 -4
  666. package/corpus/core/docs/content/locales/pt-BR/template-assets.mdx +64 -4
  667. package/corpus/core/docs/content/locales/pt-BR/template-brain.mdx +69 -4
  668. package/corpus/core/docs/content/locales/pt-BR/template-calendar.mdx +62 -4
  669. package/corpus/core/docs/content/locales/pt-BR/template-chat.mdx +61 -4
  670. package/corpus/core/docs/content/locales/pt-BR/template-clips.mdx +52 -4
  671. package/corpus/core/docs/content/locales/pt-BR/template-content.mdx +64 -4
  672. package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +106 -4
  673. package/corpus/core/docs/content/locales/pt-BR/template-dispatch.mdx +57 -4
  674. package/corpus/core/docs/content/locales/pt-BR/template-forms.mdx +64 -4
  675. package/corpus/core/docs/content/locales/pt-BR/template-mail.mdx +60 -4
  676. package/corpus/core/docs/content/locales/pt-BR/template-plan.mdx +63 -4
  677. package/corpus/core/docs/content/locales/pt-BR/template-slides.mdx +49 -4
  678. package/corpus/core/docs/content/locales/pt-BR/template-videos.mdx +53 -4
  679. package/corpus/core/docs/content/locales/pt-BR/tracking.mdx +54 -4
  680. package/corpus/core/docs/content/locales/pt-BR/using-your-agent.mdx +51 -4
  681. package/corpus/core/docs/content/locales/pt-BR/voice-input.mdx +43 -4
  682. package/corpus/core/docs/content/locales/pt-BR/what-is-agent-native.mdx +101 -8
  683. package/corpus/core/docs/content/locales/pt-BR/workspace-connections.mdx +128 -8
  684. package/corpus/core/docs/content/locales/pt-BR/workspace-management.mdx +50 -4
  685. package/corpus/core/docs/content/locales/pt-BR/workspace.mdx +111 -8
  686. package/corpus/core/docs/content/locales/pt-BR/writing-agent-instructions.mdx +46 -4
  687. package/corpus/core/docs/content/locales/zh-CN/a2a-protocol.mdx +97 -9
  688. package/corpus/core/docs/content/locales/zh-CN/actions.mdx +65 -4
  689. package/corpus/core/docs/content/locales/zh-CN/agent-mentions.mdx +68 -4
  690. package/corpus/core/docs/content/locales/zh-CN/agent-surfaces.mdx +108 -8
  691. package/corpus/core/docs/content/locales/zh-CN/agent-teams.mdx +171 -12
  692. package/corpus/core/docs/content/locales/zh-CN/agent-web-surfaces.mdx +51 -4
  693. package/corpus/core/docs/content/locales/zh-CN/authentication.mdx +122 -8
  694. package/corpus/core/docs/content/locales/zh-CN/automations.mdx +110 -8
  695. package/corpus/core/docs/content/locales/zh-CN/blueprint-installer.mdx +42 -4
  696. package/corpus/core/docs/content/locales/zh-CN/cli-adapters.mdx +44 -4
  697. package/corpus/core/docs/content/locales/zh-CN/client.mdx +79 -8
  698. package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +83 -8
  699. package/corpus/core/docs/content/locales/zh-CN/code-agents-ui.mdx +94 -8
  700. package/corpus/core/docs/content/locales/zh-CN/components.mdx +112 -8
  701. package/corpus/core/docs/content/locales/zh-CN/context-awareness.mdx +96 -8
  702. package/corpus/core/docs/content/locales/zh-CN/creating-templates.mdx +51 -4
  703. package/corpus/core/docs/content/locales/zh-CN/cross-app-sso.mdx +107 -8
  704. package/corpus/core/docs/content/locales/zh-CN/database.mdx +52 -4
  705. package/corpus/core/docs/content/locales/zh-CN/deployment.mdx +103 -8
  706. package/corpus/core/docs/content/locales/zh-CN/dispatch.mdx +134 -8
  707. package/corpus/core/docs/content/locales/zh-CN/drop-in-agent.mdx +63 -4
  708. package/corpus/core/docs/content/locales/zh-CN/durable-resume.mdx +45 -4
  709. package/corpus/core/docs/content/locales/zh-CN/embedding-sdk.mdx +81 -8
  710. package/corpus/core/docs/content/locales/zh-CN/evals.mdx +100 -8
  711. package/corpus/core/docs/content/locales/zh-CN/extensions.mdx +111 -9
  712. package/corpus/core/docs/content/locales/zh-CN/external-agents.mdx +119 -8
  713. package/corpus/core/docs/content/locales/zh-CN/faq.mdx +96 -8
  714. package/corpus/core/docs/content/locales/zh-CN/file-uploads.mdx +61 -4
  715. package/corpus/core/docs/content/locales/zh-CN/frames.mdx +86 -8
  716. package/corpus/core/docs/content/locales/zh-CN/getting-started.mdx +34 -4
  717. package/corpus/core/docs/content/locales/zh-CN/harness-agents.mdx +79 -8
  718. package/corpus/core/docs/content/locales/zh-CN/human-approval.mdx +50 -4
  719. package/corpus/core/docs/content/locales/zh-CN/key-concepts.mdx +100 -8
  720. package/corpus/core/docs/content/locales/zh-CN/local-file-mode.mdx +56 -4
  721. package/corpus/core/docs/content/locales/zh-CN/mcp-apps.mdx +120 -10
  722. package/corpus/core/docs/content/locales/zh-CN/mcp-clients.mdx +133 -8
  723. package/corpus/core/docs/content/locales/zh-CN/mcp-protocol.mdx +105 -8
  724. package/corpus/core/docs/content/locales/zh-CN/messaging.mdx +115 -8
  725. package/corpus/core/docs/content/locales/zh-CN/migration-workbench.mdx +45 -4
  726. package/corpus/core/docs/content/locales/zh-CN/multi-app-workspace.mdx +91 -8
  727. package/corpus/core/docs/content/locales/zh-CN/multi-tenancy.mdx +80 -8
  728. package/corpus/core/docs/content/locales/zh-CN/native-chat-ui.mdx +104 -8
  729. package/corpus/core/docs/content/locales/zh-CN/notifications.mdx +135 -8
  730. package/corpus/core/docs/content/locales/zh-CN/observability.mdx +102 -8
  731. package/corpus/core/docs/content/locales/zh-CN/observational-memory.mdx +85 -8
  732. package/corpus/core/docs/content/locales/zh-CN/onboarding.mdx +44 -4
  733. package/corpus/core/docs/content/locales/zh-CN/plan-plugin.mdx +97 -8
  734. package/corpus/core/docs/content/locales/zh-CN/pr-visual-recap.mdx +123 -8
  735. package/corpus/core/docs/content/locales/zh-CN/processors.mdx +39 -4
  736. package/corpus/core/docs/content/locales/zh-CN/progress.mdx +46 -4
  737. package/corpus/core/docs/content/locales/zh-CN/pure-agent-apps.mdx +46 -4
  738. package/corpus/core/docs/content/locales/zh-CN/real-time-collaboration.mdx +98 -8
  739. package/corpus/core/docs/content/locales/zh-CN/recurring-jobs.mdx +59 -4
  740. package/corpus/core/docs/content/locales/zh-CN/routing.mdx +42 -5
  741. package/corpus/core/docs/content/locales/zh-CN/sandbox-adapters.mdx +41 -4
  742. package/corpus/core/docs/content/locales/zh-CN/security.mdx +78 -8
  743. package/corpus/core/docs/content/locales/zh-CN/server.mdx +169 -12
  744. package/corpus/core/docs/content/locales/zh-CN/sharing.mdx +45 -4
  745. package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +118 -9
  746. package/corpus/core/docs/content/locales/zh-CN/template-analytics.mdx +46 -4
  747. package/corpus/core/docs/content/locales/zh-CN/template-assets.mdx +58 -4
  748. package/corpus/core/docs/content/locales/zh-CN/template-brain.mdx +65 -4
  749. package/corpus/core/docs/content/locales/zh-CN/template-calendar.mdx +58 -4
  750. package/corpus/core/docs/content/locales/zh-CN/template-chat.mdx +57 -4
  751. package/corpus/core/docs/content/locales/zh-CN/template-clips.mdx +52 -4
  752. package/corpus/core/docs/content/locales/zh-CN/template-content.mdx +58 -4
  753. package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +94 -4
  754. package/corpus/core/docs/content/locales/zh-CN/template-dispatch.mdx +57 -4
  755. package/corpus/core/docs/content/locales/zh-CN/template-forms.mdx +58 -4
  756. package/corpus/core/docs/content/locales/zh-CN/template-mail.mdx +60 -4
  757. package/corpus/core/docs/content/locales/zh-CN/template-plan.mdx +57 -4
  758. package/corpus/core/docs/content/locales/zh-CN/template-slides.mdx +49 -4
  759. package/corpus/core/docs/content/locales/zh-CN/template-videos.mdx +51 -4
  760. package/corpus/core/docs/content/locales/zh-CN/tracking.mdx +54 -4
  761. package/corpus/core/docs/content/locales/zh-CN/using-your-agent.mdx +51 -4
  762. package/corpus/core/docs/content/locales/zh-CN/voice-input.mdx +43 -4
  763. package/corpus/core/docs/content/locales/zh-CN/what-is-agent-native.mdx +94 -8
  764. package/corpus/core/docs/content/locales/zh-CN/workspace-connections.mdx +126 -8
  765. package/corpus/core/docs/content/locales/zh-CN/workspace-management.mdx +50 -4
  766. package/corpus/core/docs/content/locales/zh-CN/workspace.mdx +110 -8
  767. package/corpus/core/docs/content/locales/zh-CN/writing-agent-instructions.mdx +38 -4
  768. package/corpus/core/docs/content/locales/zh-TW/a2a-protocol.mdx +97 -9
  769. package/corpus/core/docs/content/locales/zh-TW/actions.mdx +63 -4
  770. package/corpus/core/docs/content/locales/zh-TW/agent-mentions.mdx +68 -4
  771. package/corpus/core/docs/content/locales/zh-TW/agent-surfaces.mdx +108 -8
  772. package/corpus/core/docs/content/locales/zh-TW/agent-teams.mdx +171 -12
  773. package/corpus/core/docs/content/locales/zh-TW/agent-web-surfaces.mdx +51 -4
  774. package/corpus/core/docs/content/locales/zh-TW/authentication.mdx +122 -8
  775. package/corpus/core/docs/content/locales/zh-TW/automations.mdx +110 -8
  776. package/corpus/core/docs/content/locales/zh-TW/blueprint-installer.mdx +42 -4
  777. package/corpus/core/docs/content/locales/zh-TW/cli-adapters.mdx +44 -4
  778. package/corpus/core/docs/content/locales/zh-TW/client.mdx +79 -8
  779. package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +83 -8
  780. package/corpus/core/docs/content/locales/zh-TW/code-agents-ui.mdx +94 -8
  781. package/corpus/core/docs/content/locales/zh-TW/components.mdx +112 -8
  782. package/corpus/core/docs/content/locales/zh-TW/context-awareness.mdx +96 -8
  783. package/corpus/core/docs/content/locales/zh-TW/creating-templates.mdx +51 -4
  784. package/corpus/core/docs/content/locales/zh-TW/cross-app-sso.mdx +107 -8
  785. package/corpus/core/docs/content/locales/zh-TW/database.mdx +52 -4
  786. package/corpus/core/docs/content/locales/zh-TW/deployment.mdx +103 -8
  787. package/corpus/core/docs/content/locales/zh-TW/dispatch.mdx +134 -8
  788. package/corpus/core/docs/content/locales/zh-TW/drop-in-agent.mdx +63 -4
  789. package/corpus/core/docs/content/locales/zh-TW/durable-background-runs.mdx +88 -8
  790. package/corpus/core/docs/content/locales/zh-TW/durable-resume.mdx +45 -4
  791. package/corpus/core/docs/content/locales/zh-TW/embedding-sdk.mdx +83 -8
  792. package/corpus/core/docs/content/locales/zh-TW/evals.mdx +100 -8
  793. package/corpus/core/docs/content/locales/zh-TW/extensions.mdx +111 -9
  794. package/corpus/core/docs/content/locales/zh-TW/external-agents.mdx +119 -8
  795. package/corpus/core/docs/content/locales/zh-TW/faq.mdx +96 -8
  796. package/corpus/core/docs/content/locales/zh-TW/file-uploads.mdx +61 -4
  797. package/corpus/core/docs/content/locales/zh-TW/frames.mdx +86 -8
  798. package/corpus/core/docs/content/locales/zh-TW/getting-started.mdx +34 -4
  799. package/corpus/core/docs/content/locales/zh-TW/harness-agents.mdx +79 -8
  800. package/corpus/core/docs/content/locales/zh-TW/human-approval.mdx +50 -4
  801. package/corpus/core/docs/content/locales/zh-TW/key-concepts.mdx +100 -8
  802. package/corpus/core/docs/content/locales/zh-TW/local-file-mode.mdx +56 -4
  803. package/corpus/core/docs/content/locales/zh-TW/mcp-apps.mdx +120 -10
  804. package/corpus/core/docs/content/locales/zh-TW/mcp-clients.mdx +133 -8
  805. package/corpus/core/docs/content/locales/zh-TW/mcp-protocol.mdx +105 -8
  806. package/corpus/core/docs/content/locales/zh-TW/messaging.mdx +115 -8
  807. package/corpus/core/docs/content/locales/zh-TW/migration-workbench.mdx +45 -4
  808. package/corpus/core/docs/content/locales/zh-TW/multi-app-workspace.mdx +91 -8
  809. package/corpus/core/docs/content/locales/zh-TW/multi-tenancy.mdx +80 -8
  810. package/corpus/core/docs/content/locales/zh-TW/native-chat-ui.mdx +104 -8
  811. package/corpus/core/docs/content/locales/zh-TW/notifications.mdx +135 -8
  812. package/corpus/core/docs/content/locales/zh-TW/observability.mdx +102 -8
  813. package/corpus/core/docs/content/locales/zh-TW/observational-memory.mdx +85 -8
  814. package/corpus/core/docs/content/locales/zh-TW/onboarding.mdx +44 -4
  815. package/corpus/core/docs/content/locales/zh-TW/plan-plugin.mdx +97 -8
  816. package/corpus/core/docs/content/locales/zh-TW/pr-visual-recap.mdx +123 -8
  817. package/corpus/core/docs/content/locales/zh-TW/processors.mdx +39 -4
  818. package/corpus/core/docs/content/locales/zh-TW/progress.mdx +46 -4
  819. package/corpus/core/docs/content/locales/zh-TW/pure-agent-apps.mdx +46 -4
  820. package/corpus/core/docs/content/locales/zh-TW/real-time-collaboration.mdx +98 -8
  821. package/corpus/core/docs/content/locales/zh-TW/recurring-jobs.mdx +59 -4
  822. package/corpus/core/docs/content/locales/zh-TW/routing.mdx +42 -5
  823. package/corpus/core/docs/content/locales/zh-TW/sandbox-adapters.mdx +41 -4
  824. package/corpus/core/docs/content/locales/zh-TW/security.mdx +80 -8
  825. package/corpus/core/docs/content/locales/zh-TW/server.mdx +169 -12
  826. package/corpus/core/docs/content/locales/zh-TW/sharing.mdx +45 -4
  827. package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +118 -9
  828. package/corpus/core/docs/content/locales/zh-TW/template-analytics.mdx +46 -4
  829. package/corpus/core/docs/content/locales/zh-TW/template-assets.mdx +58 -4
  830. package/corpus/core/docs/content/locales/zh-TW/template-brain.mdx +65 -4
  831. package/corpus/core/docs/content/locales/zh-TW/template-calendar.mdx +58 -4
  832. package/corpus/core/docs/content/locales/zh-TW/template-chat.mdx +59 -4
  833. package/corpus/core/docs/content/locales/zh-TW/template-clips.mdx +52 -4
  834. package/corpus/core/docs/content/locales/zh-TW/template-content.mdx +58 -4
  835. package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +96 -4
  836. package/corpus/core/docs/content/locales/zh-TW/template-dispatch.mdx +57 -4
  837. package/corpus/core/docs/content/locales/zh-TW/template-forms.mdx +58 -4
  838. package/corpus/core/docs/content/locales/zh-TW/template-mail.mdx +60 -4
  839. package/corpus/core/docs/content/locales/zh-TW/template-plan.mdx +57 -4
  840. package/corpus/core/docs/content/locales/zh-TW/template-slides.mdx +49 -4
  841. package/corpus/core/docs/content/locales/zh-TW/template-videos.mdx +51 -4
  842. package/corpus/core/docs/content/locales/zh-TW/tracking.mdx +54 -4
  843. package/corpus/core/docs/content/locales/zh-TW/using-your-agent.mdx +51 -4
  844. package/corpus/core/docs/content/locales/zh-TW/voice-input.mdx +43 -4
  845. package/corpus/core/docs/content/locales/zh-TW/what-is-agent-native.mdx +94 -8
  846. package/corpus/core/docs/content/locales/zh-TW/workspace-connections.mdx +126 -8
  847. package/corpus/core/docs/content/locales/zh-TW/workspace-management.mdx +50 -4
  848. package/corpus/core/docs/content/locales/zh-TW/workspace.mdx +111 -8
  849. package/corpus/core/docs/content/locales/zh-TW/writing-agent-instructions.mdx +38 -4
  850. package/corpus/core/docs/content/mcp-apps.mdx +120 -10
  851. package/corpus/core/docs/content/mcp-clients.mdx +161 -8
  852. package/corpus/core/docs/content/mcp-protocol.mdx +105 -8
  853. package/corpus/core/docs/content/messaging.mdx +115 -8
  854. package/corpus/core/docs/content/migration-workbench.mdx +45 -4
  855. package/corpus/core/docs/content/multi-app-workspace.mdx +91 -8
  856. package/corpus/core/docs/content/multi-tenancy.mdx +80 -8
  857. package/corpus/core/docs/content/native-chat-ui.mdx +106 -8
  858. package/corpus/core/docs/content/notifications.mdx +135 -8
  859. package/corpus/core/docs/content/observability.mdx +102 -8
  860. package/corpus/core/docs/content/observational-memory.mdx +89 -8
  861. package/corpus/core/docs/content/onboarding.mdx +45 -4
  862. package/corpus/core/docs/content/plan-plugin.mdx +99 -8
  863. package/corpus/core/docs/content/pr-visual-recap.mdx +125 -8
  864. package/corpus/core/docs/content/processors.mdx +41 -4
  865. package/corpus/core/docs/content/progress.mdx +46 -4
  866. package/corpus/core/docs/content/pure-agent-apps.mdx +46 -4
  867. package/corpus/core/docs/content/real-time-collaboration.mdx +104 -8
  868. package/corpus/core/docs/content/recurring-jobs.mdx +59 -4
  869. package/corpus/core/docs/content/routing.mdx +44 -5
  870. package/corpus/core/docs/content/sandbox-adapters.mdx +43 -4
  871. package/corpus/core/docs/content/security.mdx +80 -8
  872. package/corpus/core/docs/content/server.mdx +173 -12
  873. package/corpus/core/docs/content/sharing.mdx +45 -4
  874. package/corpus/core/docs/content/skills-guide.mdx +118 -9
  875. package/corpus/core/docs/content/template-analytics.mdx +46 -4
  876. package/corpus/core/docs/content/template-assets.mdx +60 -4
  877. package/corpus/core/docs/content/template-brain.mdx +67 -4
  878. package/corpus/core/docs/content/template-calendar.mdx +62 -4
  879. package/corpus/core/docs/content/template-chat.mdx +61 -4
  880. package/corpus/core/docs/content/template-clips.mdx +52 -4
  881. package/corpus/core/docs/content/template-content.mdx +60 -4
  882. package/corpus/core/docs/content/template-design.mdx +103 -4
  883. package/corpus/core/docs/content/template-dispatch.mdx +57 -4
  884. package/corpus/core/docs/content/template-forms.mdx +62 -4
  885. package/corpus/core/docs/content/template-mail.mdx +60 -4
  886. package/corpus/core/docs/content/template-plan.mdx +61 -4
  887. package/corpus/core/docs/content/template-slides.mdx +49 -4
  888. package/corpus/core/docs/content/template-videos.mdx +51 -4
  889. package/corpus/core/docs/content/tracking.mdx +54 -4
  890. package/corpus/core/docs/content/using-your-agent.mdx +51 -4
  891. package/corpus/core/docs/content/voice-input.mdx +43 -4
  892. package/corpus/core/docs/content/what-is-agent-native.mdx +188 -8
  893. package/corpus/core/docs/content/workspace-connections.mdx +128 -8
  894. package/corpus/core/docs/content/workspace-management.mdx +50 -4
  895. package/corpus/core/docs/content/workspace.mdx +111 -8
  896. package/corpus/core/docs/content/writing-agent-instructions.mdx +45 -4
  897. package/corpus/core/package.json +2 -1
  898. package/corpus/core/src/agent/engine/index.ts +1 -0
  899. package/corpus/core/src/agent/engine/registry.ts +40 -0
  900. package/corpus/core/src/agent/production-agent.ts +6 -2
  901. package/corpus/core/src/application-state/store.ts +5 -5
  902. package/corpus/core/src/chat-threads/store.ts +2 -2
  903. package/corpus/core/src/cli/content-local.ts +374 -0
  904. package/corpus/core/src/cli/design-connect.ts +490 -0
  905. package/corpus/core/src/cli/index.ts +33 -0
  906. package/corpus/core/src/cli/skills.ts +355 -200
  907. package/corpus/core/src/client/AssistantChat.tsx +39 -3
  908. package/corpus/core/src/client/MultiTabAssistantChat.tsx +11 -93
  909. package/corpus/core/src/client/agent-chat.ts +27 -3
  910. package/corpus/core/src/client/analytics.ts +68 -15
  911. package/corpus/core/src/client/blocks/index.ts +2 -0
  912. package/corpus/core/src/client/blocks/library/MermaidBlock.tsx +1 -1
  913. package/corpus/core/src/client/blocks/library/diagram.config.ts +42 -18
  914. package/corpus/core/src/client/blocks/library/diagram.tsx +2 -2
  915. package/corpus/core/src/client/blocks/library/sanitize-html.ts +71 -6
  916. package/corpus/core/src/client/blocks/library/wireframe-kit.tsx +2 -2
  917. package/corpus/core/src/client/blocks/library/wireframe.tsx +9 -3
  918. package/corpus/core/src/client/blocks/mdx.ts +62 -1
  919. package/corpus/core/src/client/blocks/server.ts +2 -0
  920. package/corpus/core/src/client/blocks/types.ts +5 -4
  921. package/corpus/core/src/client/chat/message-components.tsx +2 -98
  922. package/corpus/core/src/client/chat-model-groups.ts +147 -0
  923. package/corpus/core/src/client/components/LiveCursorOverlay.tsx +33 -66
  924. package/corpus/core/src/client/components/ui/dialog.tsx +91 -0
  925. package/corpus/core/src/client/composer/ComposerPlusMenu.tsx +33 -290
  926. package/corpus/core/src/client/composer/TiptapComposer.tsx +99 -24
  927. package/corpus/core/src/client/composer/useVoiceDictation.ts +429 -260
  928. package/corpus/core/src/client/frame-protocol.ts +17 -2
  929. package/corpus/core/src/client/index.ts +2 -0
  930. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +614 -0
  931. package/corpus/core/src/client/resources/ResourcesPanel.tsx +411 -644
  932. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +239 -0
  933. package/corpus/core/src/client/rich-markdown-editor/RegistryBlockNode.tsx +2 -2
  934. package/corpus/core/src/client/settings/SettingsPanel.tsx +1 -1
  935. package/corpus/core/src/client/sharing/ShareButton.tsx +20 -15
  936. package/corpus/core/src/client/use-agent-engine-configured.ts +80 -28
  937. package/corpus/core/src/client/use-chat-models.ts +12 -104
  938. package/corpus/core/src/db/client.ts +0 -5
  939. package/corpus/core/src/integrations/adapters/email.ts +2 -2
  940. package/corpus/core/src/local-artifacts/index.ts +18 -0
  941. package/corpus/core/src/localization/default-messages.ts +81 -0
  942. package/corpus/core/src/localization/shared.ts +3 -3
  943. package/corpus/core/src/org/handlers.ts +2 -2
  944. package/corpus/core/src/resources/store.ts +7 -7
  945. package/corpus/core/src/server/core-routes-plugin.ts +34 -12
  946. package/corpus/core/src/server/transcribe-voice.ts +57 -22
  947. package/corpus/core/src/shared/mcp-embed-headers.ts +23 -1
  948. package/corpus/core/src/shared/mcp-integration-config.ts +101 -0
  949. package/corpus/core/src/styles/agent-native.css +58 -107
  950. package/corpus/core/src/styles/blocks.css +15 -3
  951. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  952. package/corpus/core/src/vite/client.ts +19 -0
  953. package/corpus/core/src/voice/index.ts +18 -0
  954. package/corpus/core/src/voice/voice-cleanup-prompt.ts +38 -0
  955. package/corpus/core/src/voice/voice-context.ts +217 -0
  956. package/corpus/core/src/voice/voice-replacements.ts +75 -0
  957. package/corpus/templates/analytics/AGENTS.md +4 -3
  958. package/corpus/templates/analytics/actions/list-session-recordings.ts +6 -1
  959. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +557 -400
  960. package/corpus/templates/analytics/app/global.css +22 -4
  961. package/corpus/templates/analytics/app/i18n/zh-TW.ts +3 -0
  962. package/corpus/templates/analytics/app/i18n-data.ts +21 -0
  963. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +33 -8
  964. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +7 -0
  965. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +32 -10
  966. package/corpus/templates/analytics/changelog/2026-06-28-ask-tab-now-matches-the-darker-app-background.md +6 -0
  967. package/corpus/templates/analytics/changelog/2026-06-28-dashboard-email-reports-now-use-cleaner-light-mode-snapshots.md +6 -0
  968. package/corpus/templates/analytics/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  969. package/corpus/templates/analytics/changelog/2026-06-28-sessions-now-show-only-signed-in-recordings-with-playable-re.md +6 -0
  970. package/corpus/templates/analytics/changelog/2026-06-28-sessions-shows-scoped-recordings-even-when-replay-events-are.md +6 -0
  971. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +3 -3
  972. package/corpus/templates/analytics/server/lib/dashboard-report.ts +29 -7
  973. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +5 -2
  974. package/corpus/templates/analytics/server/lib/session-replay.ts +21 -7
  975. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +4 -4
  976. package/corpus/templates/assets/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  977. package/corpus/templates/brain/app/components/layout/Layout.tsx +29 -2
  978. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +131 -42
  979. package/corpus/templates/brain/app/i18n/zh-TW.ts +2 -0
  980. package/corpus/templates/brain/app/i18n-data.ts +20 -0
  981. package/corpus/templates/brain/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  982. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +29 -1
  983. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +417 -299
  984. package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
  985. package/corpus/templates/calendar/app/i18n-data.ts +20 -0
  986. package/corpus/templates/calendar/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  987. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +6 -19
  988. package/corpus/templates/chat/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  989. package/corpus/templates/clips/AGENTS.md +8 -0
  990. package/corpus/templates/clips/actions/cleanup-transcript.ts +58 -10
  991. package/corpus/templates/clips/actions/finalize-meeting.ts +81 -12
  992. package/corpus/templates/clips/actions/get-builder-credit-status.ts +22 -0
  993. package/corpus/templates/clips/actions/get-recording-player-data.ts +18 -3
  994. package/corpus/templates/clips/actions/lib/agents-md-context.ts +4 -1
  995. package/corpus/templates/clips/actions/lib/builder-credits-state.ts +46 -0
  996. package/corpus/templates/clips/actions/lib/provider-transcript.ts +51 -0
  997. package/corpus/templates/clips/actions/regenerate-title.ts +18 -0
  998. package/corpus/templates/clips/actions/request-transcript.ts +56 -33
  999. package/corpus/templates/clips/actions/save-browser-transcript.ts +1 -17
  1000. package/corpus/templates/clips/app/components/library/library-layout.tsx +3 -3
  1001. package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +1 -1
  1002. package/corpus/templates/clips/app/components/player/share-dialog.tsx +2 -2
  1003. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +120 -11
  1004. package/corpus/templates/clips/app/i18n/ar-SA.ts +25 -0
  1005. package/corpus/templates/clips/app/i18n/de-DE.ts +25 -0
  1006. package/corpus/templates/clips/app/i18n/en-US.ts +25 -0
  1007. package/corpus/templates/clips/app/i18n/es-ES.ts +25 -0
  1008. package/corpus/templates/clips/app/i18n/fr-FR.ts +25 -0
  1009. package/corpus/templates/clips/app/i18n/hi-IN.ts +25 -0
  1010. package/corpus/templates/clips/app/i18n/ja-JP.ts +25 -0
  1011. package/corpus/templates/clips/app/i18n/ko-KR.ts +25 -0
  1012. package/corpus/templates/clips/app/i18n/pt-BR.ts +25 -0
  1013. package/corpus/templates/clips/app/i18n/zh-CN.ts +23 -0
  1014. package/corpus/templates/clips/app/i18n/zh-TW.ts +23 -0
  1015. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +69 -0
  1016. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +52 -2
  1017. package/corpus/templates/clips/app/routes/record.tsx +26 -15
  1018. package/corpus/templates/clips/changelog/2026-06-28-builder-credit-pauses-show-friendly-upgrade-guidance.md +6 -0
  1019. package/corpus/templates/clips/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
  1020. package/corpus/templates/clips/changelog/2026-06-28-transcription-now-auto-detects-spoken-language-instead-of-following.md +6 -0
  1021. package/corpus/templates/clips/changelog/2026-06-28-video-uploads-now-finish-when-duration-metadata-is-unavailable.md +6 -0
  1022. package/corpus/templates/clips/desktop/src/lib/personal-vocabulary.ts +13 -8
  1023. package/corpus/templates/clips/desktop/src/lib/transcription-engine.ts +7 -3
  1024. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +60 -1
  1025. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +30 -12
  1026. package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +6 -19
  1027. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +4 -3
  1028. package/corpus/templates/clips/shared/builder-credits.ts +120 -0
  1029. package/corpus/templates/clips/shared/recording-core.ts +26 -8
  1030. package/corpus/templates/content/AGENTS.md +23 -2
  1031. package/corpus/templates/content/actions/_builder-docs-client.ts +952 -0
  1032. package/corpus/templates/content/actions/_document-flush.ts +62 -0
  1033. package/corpus/templates/content/actions/_local-file-documents.ts +115 -18
  1034. package/corpus/templates/content/actions/check-builder-doc.ts +38 -0
  1035. package/corpus/templates/content/actions/delete-document.ts +8 -0
  1036. package/corpus/templates/content/actions/import-content-source.ts +12 -0
  1037. package/corpus/templates/content/actions/list-builder-docs.ts +29 -0
  1038. package/corpus/templates/content/actions/pull-builder-doc.ts +42 -0
  1039. package/corpus/templates/content/actions/pull-document.ts +9 -59
  1040. package/corpus/templates/content/actions/push-builder-doc.ts +45 -0
  1041. package/corpus/templates/content/app/blocks/BuilderDocsBlocks.tsx +254 -0
  1042. package/corpus/templates/content/app/blocks/contentBlockRegistry.tsx +4 -0
  1043. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +1 -1
  1044. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +1 -1
  1045. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +5 -5
  1046. package/corpus/templates/content/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  1047. package/corpus/templates/content/server/db/schema.ts +12 -0
  1048. package/corpus/templates/content/server/plugins/db.ts +23 -0
  1049. package/corpus/templates/content/shared/api.ts +1 -0
  1050. package/corpus/templates/content/shared/builder-docs-blocks.ts +361 -0
  1051. package/corpus/templates/content/shared/builder-mdx.ts +1037 -0
  1052. package/corpus/templates/content/shared/content-source.ts +6 -0
  1053. package/corpus/templates/content/shared/nfm-registry.ts +4 -0
  1054. package/corpus/templates/content/vite.config.ts +13 -0
  1055. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +137 -0
  1056. package/corpus/templates/design/AGENTS.md +95 -5
  1057. package/corpus/templates/design/DESIGN.md +82 -0
  1058. package/corpus/templates/design/DEVELOPING.md +43 -0
  1059. package/corpus/templates/design/actions/add-localhost-screens.ts +426 -0
  1060. package/corpus/templates/design/actions/apply-shader.ts +277 -0
  1061. package/corpus/templates/design/actions/apply-visual-edit.ts +303 -0
  1062. package/corpus/templates/design/actions/connect-localhost.ts +183 -0
  1063. package/corpus/templates/design/actions/edit-design.ts +195 -42
  1064. package/corpus/templates/design/actions/generate-design.ts +71 -1
  1065. package/corpus/templates/design/actions/generate-screens.ts +193 -0
  1066. package/corpus/templates/design/actions/get-code-layer-projection.ts +191 -0
  1067. package/corpus/templates/design/actions/get-shader.ts +119 -0
  1068. package/corpus/templates/design/actions/list-localhost-connections.ts +95 -0
  1069. package/corpus/templates/design/actions/navigate.ts +55 -2
  1070. package/corpus/templates/design/actions/view-screen.ts +68 -1
  1071. package/corpus/templates/design/agent-native.app-skill.json +10 -0
  1072. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +761 -0
  1073. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +2057 -103
  1074. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +74 -38
  1075. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +399 -0
  1076. package/corpus/templates/design/app/components/design/EditPanel.tsx +3185 -439
  1077. package/corpus/templates/design/app/components/design/LayersPanel.tsx +1124 -0
  1078. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +3116 -147
  1079. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +700 -13
  1080. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +107 -63
  1081. package/corpus/templates/design/app/components/design/index.ts +0 -5
  1082. package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +286 -0
  1083. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +699 -0
  1084. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +461 -0
  1085. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +166 -0
  1086. package/corpus/templates/design/app/components/design/inspector/FigmaColorPicker.tsx +1420 -0
  1087. package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +420 -0
  1088. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +215 -0
  1089. package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +71 -0
  1090. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +518 -0
  1091. package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +106 -0
  1092. package/corpus/templates/design/app/components/design/inspector/figma-icons.tsx +361 -0
  1093. package/corpus/templates/design/app/components/design/inspector/index.ts +60 -0
  1094. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +201 -0
  1095. package/corpus/templates/design/app/components/design/types.ts +23 -0
  1096. package/corpus/templates/design/app/components/layout/Layout.tsx +24 -13
  1097. package/corpus/templates/design/app/components/layout/Sidebar.tsx +4 -4
  1098. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +474 -36
  1099. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +22 -5
  1100. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +24 -11
  1101. package/corpus/templates/design/app/global.css +121 -3
  1102. package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -0
  1103. package/corpus/templates/design/app/hooks/use-navigation-state.ts +130 -8
  1104. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +329 -0
  1105. package/corpus/templates/design/app/i18n/zh-TW.ts +264 -0
  1106. package/corpus/templates/design/app/i18n-data.ts +2790 -1
  1107. package/corpus/templates/design/app/pages/DesignEditor.tsx +5108 -851
  1108. package/corpus/templates/design/changelog/2026-06-28-annotate-mode-now-combines-drawing-and-comment-pins-in-one-c.md +6 -0
  1109. package/corpus/templates/design/changelog/2026-06-28-design-editor-panel-borders-are-cleaner-so-the-canvas-edge-s.md +6 -0
  1110. package/corpus/templates/design/changelog/2026-06-28-drawing-prompts-now-reliably-open-and-submit-to-the-design-a.md +6 -0
  1111. package/corpus/templates/design/changelog/2026-06-28-editor-app-menus-now-use-an-outline-agent-native-mark-with-b.md +6 -0
  1112. package/corpus/templates/design/changelog/2026-06-28-figma-style-code-design-mode.md +6 -0
  1113. package/corpus/templates/design/changelog/2026-06-28-layer-selection-now-updates-chat-context-without-opening-the.md +6 -0
  1114. package/corpus/templates/design/changelog/2026-06-28-layer-selections-now-preserve-hidden-and-locked-canvas-state.md +6 -0
  1115. package/corpus/templates/design/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  1116. package/corpus/templates/design/changelog/2026-06-28-live-cursors-now-keep-names-beside-a-cleaner-pointer-marker.md +6 -0
  1117. package/corpus/templates/design/changelog/2026-06-28-mode-switching-now-lives-in-a-compact-bottom-right-icon-dock.md +6 -0
  1118. package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-handles-zooming-drawing-opening-and-dele.md +6 -0
  1119. package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-selects-screens-on-click-and-opens-them-.md +6 -0
  1120. package/corpus/templates/design/changelog/2026-06-28-screen-overview-zooms-into-the-active-screen-with-smoother-e.md +6 -0
  1121. package/corpus/templates/design/changelog/2026-06-28-selected-element-chips-in-chat-are-shorter-and-easier-to-sca.md +6 -0
  1122. package/corpus/templates/design/changelog/2026-06-28-the-design-editor-toolbar-is-more-compact-and-the-app-menu-m.md +6 -0
  1123. package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-at-the-top-of-the-design-sidebar-instead-of-.md +6 -0
  1124. package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-in-the-right-inspector-beside-the-design-tab.md +6 -0
  1125. package/corpus/templates/design/changelog/2026-06-29-active-sidebar-rows-use-soft-highlights.md +6 -0
  1126. package/corpus/templates/design/changelog/2026-06-29-agents-can-now-open-screen-overview-focus-screens-and-add.md +6 -0
  1127. package/corpus/templates/design/changelog/2026-06-29-design-agents-now-edit-broad-copy-changes-more-reliably.md +6 -0
  1128. package/corpus/templates/design/changelog/2026-06-29-design-editor-extensions-now-run-inline-beside-the-artboard.md +6 -0
  1129. package/corpus/templates/design/changelog/2026-06-29-sidebars-use-darker-chrome-and-chat-warns-immediately.md +6 -0
  1130. package/corpus/templates/design/changelog/2026-06-29-visual-edit-can-open-localhost-routes-as-url-backed-screens.md +6 -0
  1131. package/corpus/templates/design/package.json +1 -0
  1132. package/corpus/templates/design/server/db/schema.ts +26 -0
  1133. package/corpus/templates/design/server/lib/design-snapshot.ts +1 -1
  1134. package/corpus/templates/design/server/plugins/agent-chat.ts +3 -0
  1135. package/corpus/templates/design/shared/api.ts +27 -0
  1136. package/corpus/templates/design/shared/canvas-frames.ts +103 -0
  1137. package/corpus/templates/design/shared/canvas-math.ts +1058 -0
  1138. package/corpus/templates/design/shared/code-layer.ts +2212 -0
  1139. package/corpus/templates/design/shared/color-utils.ts +180 -0
  1140. package/corpus/templates/design/shared/generation-session.ts +61 -0
  1141. package/corpus/templates/design/shared/shader-presets.ts +782 -0
  1142. package/corpus/templates/design/shared/shader-safety.ts +137 -0
  1143. package/corpus/templates/design/shared/source-mode.ts +237 -0
  1144. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +149 -6
  1145. package/corpus/templates/forms/app/i18n/ar-SA.ts +2 -0
  1146. package/corpus/templates/forms/app/i18n/de-DE.ts +2 -0
  1147. package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
  1148. package/corpus/templates/forms/app/i18n/es-ES.ts +2 -0
  1149. package/corpus/templates/forms/app/i18n/fr-FR.ts +2 -0
  1150. package/corpus/templates/forms/app/i18n/hi-IN.ts +2 -0
  1151. package/corpus/templates/forms/app/i18n/ja-JP.ts +2 -0
  1152. package/corpus/templates/forms/app/i18n/ko-KR.ts +2 -0
  1153. package/corpus/templates/forms/app/i18n/pt-BR.ts +2 -0
  1154. package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
  1155. package/corpus/templates/forms/app/i18n/zh-TW.ts +2 -0
  1156. package/corpus/templates/forms/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  1157. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
  1158. package/corpus/templates/macros/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
  1159. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +408 -247
  1160. package/corpus/templates/mail/app/i18n/ar-SA.ts +4 -0
  1161. package/corpus/templates/mail/app/i18n/de-DE.ts +4 -0
  1162. package/corpus/templates/mail/app/i18n/en-US.ts +4 -0
  1163. package/corpus/templates/mail/app/i18n/es-ES.ts +4 -0
  1164. package/corpus/templates/mail/app/i18n/fr-FR.ts +4 -0
  1165. package/corpus/templates/mail/app/i18n/hi-IN.ts +4 -0
  1166. package/corpus/templates/mail/app/i18n/ja-JP.ts +4 -0
  1167. package/corpus/templates/mail/app/i18n/ko-KR.ts +4 -0
  1168. package/corpus/templates/mail/app/i18n/pt-BR.ts +4 -0
  1169. package/corpus/templates/mail/app/i18n/zh-CN.ts +4 -0
  1170. package/corpus/templates/mail/app/i18n/zh-TW.ts +4 -0
  1171. package/corpus/templates/mail/changelog/2026-06-28-pinned-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  1172. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +25 -92
  1173. package/corpus/templates/plan/.agents/skills/visual-plan/references/connection.md +51 -0
  1174. package/corpus/templates/plan/.agents/skills/visual-plan/references/document-quality.md +5 -1
  1175. package/corpus/templates/plan/.agents/skills/visual-plan/references/local-files.md +85 -0
  1176. package/corpus/templates/plan/.agents/skills/visual-plan/references/wireframe.md +21 -0
  1177. package/corpus/templates/plan/.agents/skills/visual-recap/SKILL.md +32 -104
  1178. package/corpus/templates/plan/.agents/skills/visual-recap/references/connection.md +51 -0
  1179. package/corpus/templates/plan/.agents/skills/visual-recap/references/local-files.md +85 -0
  1180. package/corpus/templates/plan/.agents/skills/visual-recap/references/wireframe.md +21 -0
  1181. package/corpus/templates/plan/actions/create-prototype-plan.ts +1 -1
  1182. package/corpus/templates/plan/actions/delete-visual-plan.ts +2 -2
  1183. package/corpus/templates/plan/actions/get-plan-blocks.ts +2 -0
  1184. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +6 -8
  1185. package/corpus/templates/plan/app/components/plan/CanvasArea.tsx +25 -29
  1186. package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +10 -5
  1187. package/corpus/templates/plan/app/components/plan/wireframe/html-artboard.css +15 -3
  1188. package/corpus/templates/plan/app/components/plan/wireframe/kit/rough.tsx +6 -6
  1189. package/corpus/templates/plan/app/components/plan/wireframe/sanitize-html.ts +71 -6
  1190. package/corpus/templates/plan/app/global.css +67 -81
  1191. package/corpus/templates/plan/app/pages/PlansPage.tsx +8 -0
  1192. package/corpus/templates/plan/app/root.tsx +31 -1
  1193. package/corpus/templates/plan/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  1194. package/corpus/templates/plan/changelog/2026-06-28-plan-canvases-stay-stable-while-panning-and-zooming-in-chrom.md +6 -0
  1195. package/corpus/templates/plan/changelog/2026-06-28-plan-wireframes-avoid-overlapping-sketch-lines-in-dense-mockups.md +6 -0
  1196. package/corpus/templates/plan/changelog/2026-06-28-plan-wireframes-ignore-host-color-utility-classes-so-canvas-.md +6 -0
  1197. package/corpus/templates/plan/changelog/2026-06-28-plans-use-the-shared-neutral-light-and-dark-theme.md +6 -0
  1198. package/corpus/templates/plan/changelog/2026-06-28-sending-open-feedback-from-a-plan-now-opens-the-inline-plan-.md +6 -0
  1199. package/corpus/templates/plan/changelog/2026-06-28-wireframe-style-can-now-be-switched-between-sketchy-and-clean.md +6 -0
  1200. package/corpus/templates/plan/server/plan-content.ts +62 -3
  1201. package/corpus/templates/plan/server/plan-mdx.ts +177 -2
  1202. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +5 -5
  1203. package/corpus/templates/slides/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  1204. package/corpus/templates/videos/app/components/Sidebar.tsx +2 -2
  1205. package/corpus/templates/videos/app/components/layout/Layout.tsx +29 -2
  1206. package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +113 -30
  1207. package/corpus/templates/videos/app/i18n/ar-SA.ts +2 -0
  1208. package/corpus/templates/videos/app/i18n/de-DE.ts +2 -0
  1209. package/corpus/templates/videos/app/i18n/en-US.ts +2 -0
  1210. package/corpus/templates/videos/app/i18n/es-ES.ts +2 -0
  1211. package/corpus/templates/videos/app/i18n/fr-FR.ts +2 -0
  1212. package/corpus/templates/videos/app/i18n/hi-IN.ts +2 -0
  1213. package/corpus/templates/videos/app/i18n/ja-JP.ts +2 -0
  1214. package/corpus/templates/videos/app/i18n/ko-KR.ts +2 -0
  1215. package/corpus/templates/videos/app/i18n/pt-BR.ts +2 -0
  1216. package/corpus/templates/videos/app/i18n/zh-CN.ts +2 -0
  1217. package/corpus/templates/videos/app/i18n/zh-TW.ts +2 -0
  1218. package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  1219. package/dist/agent/engine/index.d.ts +1 -1
  1220. package/dist/agent/engine/index.d.ts.map +1 -1
  1221. package/dist/agent/engine/index.js +1 -1
  1222. package/dist/agent/engine/index.js.map +1 -1
  1223. package/dist/agent/engine/registry.d.ts +9 -0
  1224. package/dist/agent/engine/registry.d.ts.map +1 -1
  1225. package/dist/agent/engine/registry.js +37 -0
  1226. package/dist/agent/engine/registry.js.map +1 -1
  1227. package/dist/agent/production-agent.d.ts.map +1 -1
  1228. package/dist/agent/production-agent.js +4 -3
  1229. package/dist/agent/production-agent.js.map +1 -1
  1230. package/dist/application-state/store.js +5 -5
  1231. package/dist/application-state/store.js.map +1 -1
  1232. package/dist/chat-threads/store.js +2 -2
  1233. package/dist/chat-threads/store.js.map +1 -1
  1234. package/dist/cli/content-local.d.ts +31 -0
  1235. package/dist/cli/content-local.d.ts.map +1 -0
  1236. package/dist/cli/content-local.js +300 -0
  1237. package/dist/cli/content-local.js.map +1 -0
  1238. package/dist/cli/design-connect.d.ts +52 -0
  1239. package/dist/cli/design-connect.d.ts.map +1 -0
  1240. package/dist/cli/design-connect.js +409 -0
  1241. package/dist/cli/design-connect.js.map +1 -0
  1242. package/dist/cli/index.js +31 -0
  1243. package/dist/cli/index.js.map +1 -1
  1244. package/dist/cli/skills.d.ts +13 -4
  1245. package/dist/cli/skills.d.ts.map +1 -1
  1246. package/dist/cli/skills.js +348 -200
  1247. package/dist/cli/skills.js.map +1 -1
  1248. package/dist/client/AssistantChat.d.ts.map +1 -1
  1249. package/dist/client/AssistantChat.js +34 -4
  1250. package/dist/client/AssistantChat.js.map +1 -1
  1251. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  1252. package/dist/client/MultiTabAssistantChat.js +8 -69
  1253. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  1254. package/dist/client/agent-chat.d.ts +6 -0
  1255. package/dist/client/agent-chat.d.ts.map +1 -1
  1256. package/dist/client/agent-chat.js +17 -3
  1257. package/dist/client/agent-chat.js.map +1 -1
  1258. package/dist/client/analytics.d.ts.map +1 -1
  1259. package/dist/client/analytics.js +48 -13
  1260. package/dist/client/analytics.js.map +1 -1
  1261. package/dist/client/blocks/index.d.ts +1 -1
  1262. package/dist/client/blocks/index.d.ts.map +1 -1
  1263. package/dist/client/blocks/index.js +1 -1
  1264. package/dist/client/blocks/index.js.map +1 -1
  1265. package/dist/client/blocks/library/MermaidBlock.js +1 -1
  1266. package/dist/client/blocks/library/MermaidBlock.js.map +1 -1
  1267. package/dist/client/blocks/library/diagram.config.d.ts +9 -9
  1268. package/dist/client/blocks/library/diagram.config.d.ts.map +1 -1
  1269. package/dist/client/blocks/library/diagram.config.js +36 -12
  1270. package/dist/client/blocks/library/diagram.config.js.map +1 -1
  1271. package/dist/client/blocks/library/diagram.js +1 -1
  1272. package/dist/client/blocks/library/diagram.js.map +1 -1
  1273. package/dist/client/blocks/library/sanitize-html.d.ts +3 -1
  1274. package/dist/client/blocks/library/sanitize-html.d.ts.map +1 -1
  1275. package/dist/client/blocks/library/sanitize-html.js +53 -5
  1276. package/dist/client/blocks/library/sanitize-html.js.map +1 -1
  1277. package/dist/client/blocks/library/wireframe-kit.d.ts +2 -2
  1278. package/dist/client/blocks/library/wireframe-kit.d.ts.map +1 -1
  1279. package/dist/client/blocks/library/wireframe-kit.js +2 -2
  1280. package/dist/client/blocks/library/wireframe-kit.js.map +1 -1
  1281. package/dist/client/blocks/library/wireframe.d.ts.map +1 -1
  1282. package/dist/client/blocks/library/wireframe.js +5 -2
  1283. package/dist/client/blocks/library/wireframe.js.map +1 -1
  1284. package/dist/client/blocks/mdx.d.ts +11 -0
  1285. package/dist/client/blocks/mdx.d.ts.map +1 -1
  1286. package/dist/client/blocks/mdx.js +47 -1
  1287. package/dist/client/blocks/mdx.js.map +1 -1
  1288. package/dist/client/blocks/server.d.ts +1 -1
  1289. package/dist/client/blocks/server.d.ts.map +1 -1
  1290. package/dist/client/blocks/server.js +1 -1
  1291. package/dist/client/blocks/server.js.map +1 -1
  1292. package/dist/client/blocks/types.d.ts +5 -4
  1293. package/dist/client/blocks/types.d.ts.map +1 -1
  1294. package/dist/client/blocks/types.js.map +1 -1
  1295. package/dist/client/chat/message-components.d.ts.map +1 -1
  1296. package/dist/client/chat/message-components.js +2 -12
  1297. package/dist/client/chat/message-components.js.map +1 -1
  1298. package/dist/client/chat-model-groups.d.ts +22 -0
  1299. package/dist/client/chat-model-groups.d.ts.map +1 -0
  1300. package/dist/client/chat-model-groups.js +93 -0
  1301. package/dist/client/chat-model-groups.js.map +1 -0
  1302. package/dist/client/components/LiveCursorOverlay.d.ts +1 -2
  1303. package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
  1304. package/dist/client/components/LiveCursorOverlay.js +19 -40
  1305. package/dist/client/components/LiveCursorOverlay.js.map +1 -1
  1306. package/dist/client/components/ui/dialog.d.ts +14 -0
  1307. package/dist/client/components/ui/dialog.d.ts.map +1 -0
  1308. package/dist/client/components/ui/dialog.js +21 -0
  1309. package/dist/client/components/ui/dialog.js.map +1 -0
  1310. package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
  1311. package/dist/client/composer/ComposerPlusMenu.js +24 -149
  1312. package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
  1313. package/dist/client/composer/TiptapComposer.d.ts +3 -1
  1314. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  1315. package/dist/client/composer/TiptapComposer.js +86 -24
  1316. package/dist/client/composer/TiptapComposer.js.map +1 -1
  1317. package/dist/client/composer/useVoiceDictation.d.ts +9 -0
  1318. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  1319. package/dist/client/composer/useVoiceDictation.js +154 -32
  1320. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  1321. package/dist/client/frame-protocol.d.ts +17 -2
  1322. package/dist/client/frame-protocol.d.ts.map +1 -1
  1323. package/dist/client/frame-protocol.js.map +1 -1
  1324. package/dist/client/index.d.ts +1 -1
  1325. package/dist/client/index.d.ts.map +1 -1
  1326. package/dist/client/index.js +1 -1
  1327. package/dist/client/index.js.map +1 -1
  1328. package/dist/client/resources/McpIntegrationDialog.d.ts +13 -0
  1329. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -0
  1330. package/dist/client/resources/McpIntegrationDialog.js +261 -0
  1331. package/dist/client/resources/McpIntegrationDialog.js.map +1 -0
  1332. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  1333. package/dist/client/resources/ResourcesPanel.js +74 -190
  1334. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  1335. package/dist/client/resources/mcp-integration-catalog.d.ts +30 -0
  1336. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -0
  1337. package/dist/client/resources/mcp-integration-catalog.js +191 -0
  1338. package/dist/client/resources/mcp-integration-catalog.js.map +1 -0
  1339. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +2 -2
  1340. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
  1341. package/dist/client/settings/SettingsPanel.js +1 -1
  1342. package/dist/client/settings/SettingsPanel.js.map +1 -1
  1343. package/dist/client/sharing/ShareButton.d.ts +2 -0
  1344. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  1345. package/dist/client/sharing/ShareButton.js +7 -6
  1346. package/dist/client/sharing/ShareButton.js.map +1 -1
  1347. package/dist/client/use-agent-engine-configured.d.ts +5 -0
  1348. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  1349. package/dist/client/use-agent-engine-configured.js +51 -25
  1350. package/dist/client/use-agent-engine-configured.js.map +1 -1
  1351. package/dist/client/use-chat-models.d.ts +2 -7
  1352. package/dist/client/use-chat-models.d.ts.map +1 -1
  1353. package/dist/client/use-chat-models.js +8 -78
  1354. package/dist/client/use-chat-models.js.map +1 -1
  1355. package/dist/collab/awareness.d.ts +2 -2
  1356. package/dist/collab/awareness.d.ts.map +1 -1
  1357. package/dist/collab/routes.d.ts +2 -2
  1358. package/dist/db/client.d.ts.map +1 -1
  1359. package/dist/db/client.js +0 -5
  1360. package/dist/db/client.js.map +1 -1
  1361. package/dist/integrations/adapters/email.js +2 -2
  1362. package/dist/integrations/adapters/email.js.map +1 -1
  1363. package/dist/local-artifacts/index.d.ts +6 -0
  1364. package/dist/local-artifacts/index.d.ts.map +1 -1
  1365. package/dist/local-artifacts/index.js +12 -0
  1366. package/dist/local-artifacts/index.js.map +1 -1
  1367. package/dist/localization/default-messages.d.ts +76 -0
  1368. package/dist/localization/default-messages.d.ts.map +1 -1
  1369. package/dist/localization/default-messages.js +76 -0
  1370. package/dist/localization/default-messages.js.map +1 -1
  1371. package/dist/localization/shared.d.ts +1 -1
  1372. package/dist/localization/shared.js +3 -3
  1373. package/dist/localization/shared.js.map +1 -1
  1374. package/dist/notifications/routes.d.ts +3 -3
  1375. package/dist/observability/routes.d.ts +6 -6
  1376. package/dist/org/handlers.js +2 -2
  1377. package/dist/org/handlers.js.map +1 -1
  1378. package/dist/progress/routes.d.ts +1 -1
  1379. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  1380. package/dist/resources/handlers.d.ts +2 -2
  1381. package/dist/resources/store.js +7 -7
  1382. package/dist/resources/store.js.map +1 -1
  1383. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  1384. package/dist/server/core-routes-plugin.d.ts +1 -0
  1385. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  1386. package/dist/server/core-routes-plugin.js +29 -11
  1387. package/dist/server/core-routes-plugin.js.map +1 -1
  1388. package/dist/server/transcribe-voice.d.ts +1 -1
  1389. package/dist/server/transcribe-voice.d.ts.map +1 -1
  1390. package/dist/server/transcribe-voice.js +40 -24
  1391. package/dist/server/transcribe-voice.js.map +1 -1
  1392. package/dist/shared/mcp-embed-headers.d.ts +1 -0
  1393. package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
  1394. package/dist/shared/mcp-embed-headers.js +20 -1
  1395. package/dist/shared/mcp-embed-headers.js.map +1 -1
  1396. package/dist/shared/mcp-integration-config.d.ts +27 -0
  1397. package/dist/shared/mcp-integration-config.d.ts.map +1 -0
  1398. package/dist/shared/mcp-integration-config.js +56 -0
  1399. package/dist/shared/mcp-integration-config.js.map +1 -0
  1400. package/dist/styles/agent-native.css +58 -107
  1401. package/dist/styles/blocks.css +15 -3
  1402. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  1403. package/dist/vite/client.d.ts +11 -0
  1404. package/dist/vite/client.d.ts.map +1 -1
  1405. package/dist/vite/client.js +4 -0
  1406. package/dist/vite/client.js.map +1 -1
  1407. package/dist/voice/index.d.ts +5 -0
  1408. package/dist/voice/index.d.ts.map +1 -0
  1409. package/dist/voice/index.js +4 -0
  1410. package/dist/voice/index.js.map +1 -0
  1411. package/dist/voice/voice-cleanup-prompt.d.ts +6 -0
  1412. package/dist/voice/voice-cleanup-prompt.d.ts.map +1 -0
  1413. package/dist/voice/voice-cleanup-prompt.js +26 -0
  1414. package/dist/voice/voice-cleanup-prompt.js.map +1 -0
  1415. package/dist/voice/voice-context.d.ts +25 -0
  1416. package/dist/voice/voice-context.d.ts.map +1 -0
  1417. package/dist/voice/voice-context.js +156 -0
  1418. package/dist/voice/voice-context.js.map +1 -0
  1419. package/dist/voice/voice-replacements.d.ts +4 -0
  1420. package/dist/voice/voice-replacements.d.ts.map +1 -0
  1421. package/dist/voice/voice-replacements.js +52 -0
  1422. package/dist/voice/voice-replacements.js.map +1 -0
  1423. package/docs/content/a2a-protocol.mdx +97 -9
  1424. package/docs/content/actions.mdx +65 -4
  1425. package/docs/content/agent-mentions.mdx +68 -4
  1426. package/docs/content/agent-surfaces.mdx +112 -8
  1427. package/docs/content/agent-teams.mdx +171 -12
  1428. package/docs/content/agent-web-surfaces.mdx +51 -4
  1429. package/docs/content/authentication.mdx +122 -8
  1430. package/docs/content/automations.mdx +110 -8
  1431. package/docs/content/blueprint-installer.mdx +42 -4
  1432. package/docs/content/cli-adapters.mdx +44 -4
  1433. package/docs/content/client.mdx +79 -8
  1434. package/docs/content/cloneable-saas.mdx +85 -8
  1435. package/docs/content/code-agents-ui.mdx +98 -8
  1436. package/docs/content/components.mdx +118 -8
  1437. package/docs/content/context-awareness.mdx +98 -8
  1438. package/docs/content/creating-templates.mdx +49 -4
  1439. package/docs/content/cross-app-sso.mdx +109 -8
  1440. package/docs/content/database.mdx +56 -4
  1441. package/docs/content/deployment.mdx +103 -8
  1442. package/docs/content/dispatch.mdx +134 -8
  1443. package/docs/content/drop-in-agent.mdx +63 -4
  1444. package/docs/content/durable-background-runs.mdx +98 -8
  1445. package/docs/content/durable-resume.mdx +47 -4
  1446. package/docs/content/embedding-sdk.mdx +83 -8
  1447. package/docs/content/evals.mdx +102 -8
  1448. package/docs/content/extensions.mdx +113 -9
  1449. package/docs/content/external-agents.mdx +119 -8
  1450. package/docs/content/faq.mdx +98 -8
  1451. package/docs/content/file-uploads.mdx +61 -4
  1452. package/docs/content/frames.mdx +90 -8
  1453. package/docs/content/generative-ui.mdx +50 -4
  1454. package/docs/content/getting-started.mdx +34 -4
  1455. package/docs/content/harness-agents.mdx +77 -8
  1456. package/docs/content/human-approval.mdx +50 -4
  1457. package/docs/content/key-concepts.mdx +102 -8
  1458. package/docs/content/local-file-mode.mdx +58 -4
  1459. package/docs/content/locales/ar-SA/a2a-protocol.mdx +97 -9
  1460. package/docs/content/locales/ar-SA/actions.mdx +65 -4
  1461. package/docs/content/locales/ar-SA/agent-mentions.mdx +68 -4
  1462. package/docs/content/locales/ar-SA/agent-surfaces.mdx +114 -8
  1463. package/docs/content/locales/ar-SA/agent-teams.mdx +174 -12
  1464. package/docs/content/locales/ar-SA/agent-web-surfaces.mdx +49 -4
  1465. package/docs/content/locales/ar-SA/authentication.mdx +120 -8
  1466. package/docs/content/locales/ar-SA/automations.mdx +110 -8
  1467. package/docs/content/locales/ar-SA/blueprint-installer.mdx +42 -4
  1468. package/docs/content/locales/ar-SA/cli-adapters.mdx +40 -4
  1469. package/docs/content/locales/ar-SA/client.mdx +80 -8
  1470. package/docs/content/locales/ar-SA/cloneable-saas.mdx +85 -8
  1471. package/docs/content/locales/ar-SA/code-agents-ui.mdx +99 -8
  1472. package/docs/content/locales/ar-SA/components.mdx +114 -8
  1473. package/docs/content/locales/ar-SA/context-awareness.mdx +100 -8
  1474. package/docs/content/locales/ar-SA/creating-templates.mdx +51 -4
  1475. package/docs/content/locales/ar-SA/cross-app-sso.mdx +109 -8
  1476. package/docs/content/locales/ar-SA/database.mdx +52 -4
  1477. package/docs/content/locales/ar-SA/deployment.mdx +103 -8
  1478. package/docs/content/locales/ar-SA/dispatch.mdx +134 -8
  1479. package/docs/content/locales/ar-SA/drop-in-agent.mdx +63 -4
  1480. package/docs/content/locales/ar-SA/durable-resume.mdx +47 -4
  1481. package/docs/content/locales/ar-SA/embedding-sdk.mdx +83 -8
  1482. package/docs/content/locales/ar-SA/evals.mdx +102 -8
  1483. package/docs/content/locales/ar-SA/extensions.mdx +113 -9
  1484. package/docs/content/locales/ar-SA/external-agents.mdx +119 -8
  1485. package/docs/content/locales/ar-SA/faq.mdx +98 -8
  1486. package/docs/content/locales/ar-SA/file-uploads.mdx +61 -4
  1487. package/docs/content/locales/ar-SA/frames.mdx +88 -8
  1488. package/docs/content/locales/ar-SA/getting-started.mdx +34 -4
  1489. package/docs/content/locales/ar-SA/harness-agents.mdx +79 -8
  1490. package/docs/content/locales/ar-SA/human-approval.mdx +50 -4
  1491. package/docs/content/locales/ar-SA/key-concepts.mdx +107 -8
  1492. package/docs/content/locales/ar-SA/local-file-mode.mdx +56 -4
  1493. package/docs/content/locales/ar-SA/mcp-apps.mdx +120 -10
  1494. package/docs/content/locales/ar-SA/mcp-clients.mdx +133 -8
  1495. package/docs/content/locales/ar-SA/mcp-protocol.mdx +105 -8
  1496. package/docs/content/locales/ar-SA/messaging.mdx +115 -8
  1497. package/docs/content/locales/ar-SA/migration-workbench.mdx +47 -4
  1498. package/docs/content/locales/ar-SA/multi-app-workspace.mdx +91 -8
  1499. package/docs/content/locales/ar-SA/multi-tenancy.mdx +80 -8
  1500. package/docs/content/locales/ar-SA/native-chat-ui.mdx +104 -8
  1501. package/docs/content/locales/ar-SA/notifications.mdx +135 -8
  1502. package/docs/content/locales/ar-SA/observability.mdx +102 -8
  1503. package/docs/content/locales/ar-SA/observational-memory.mdx +87 -8
  1504. package/docs/content/locales/ar-SA/onboarding.mdx +45 -4
  1505. package/docs/content/locales/ar-SA/plan-plugin.mdx +99 -8
  1506. package/docs/content/locales/ar-SA/pr-visual-recap.mdx +125 -8
  1507. package/docs/content/locales/ar-SA/processors.mdx +41 -4
  1508. package/docs/content/locales/ar-SA/progress.mdx +46 -4
  1509. package/docs/content/locales/ar-SA/pure-agent-apps.mdx +48 -4
  1510. package/docs/content/locales/ar-SA/real-time-collaboration.mdx +102 -8
  1511. package/docs/content/locales/ar-SA/recurring-jobs.mdx +59 -4
  1512. package/docs/content/locales/ar-SA/routing.mdx +44 -5
  1513. package/docs/content/locales/ar-SA/sandbox-adapters.mdx +43 -4
  1514. package/docs/content/locales/ar-SA/security.mdx +80 -8
  1515. package/docs/content/locales/ar-SA/server.mdx +173 -12
  1516. package/docs/content/locales/ar-SA/sharing.mdx +45 -4
  1517. package/docs/content/locales/ar-SA/skills-guide.mdx +118 -9
  1518. package/docs/content/locales/ar-SA/template-analytics.mdx +46 -4
  1519. package/docs/content/locales/ar-SA/template-assets.mdx +62 -4
  1520. package/docs/content/locales/ar-SA/template-brain.mdx +65 -4
  1521. package/docs/content/locales/ar-SA/template-calendar.mdx +62 -4
  1522. package/docs/content/locales/ar-SA/template-chat.mdx +61 -4
  1523. package/docs/content/locales/ar-SA/template-clips.mdx +52 -4
  1524. package/docs/content/locales/ar-SA/template-content.mdx +62 -4
  1525. package/docs/content/locales/ar-SA/template-design.mdx +101 -4
  1526. package/docs/content/locales/ar-SA/template-dispatch.mdx +57 -4
  1527. package/docs/content/locales/ar-SA/template-forms.mdx +62 -4
  1528. package/docs/content/locales/ar-SA/template-mail.mdx +60 -4
  1529. package/docs/content/locales/ar-SA/template-plan.mdx +61 -4
  1530. package/docs/content/locales/ar-SA/template-slides.mdx +49 -4
  1531. package/docs/content/locales/ar-SA/template-videos.mdx +53 -4
  1532. package/docs/content/locales/ar-SA/tracking.mdx +54 -4
  1533. package/docs/content/locales/ar-SA/using-your-agent.mdx +51 -4
  1534. package/docs/content/locales/ar-SA/voice-input.mdx +43 -4
  1535. package/docs/content/locales/ar-SA/what-is-agent-native.mdx +96 -8
  1536. package/docs/content/locales/ar-SA/workspace-connections.mdx +128 -8
  1537. package/docs/content/locales/ar-SA/workspace-management.mdx +50 -4
  1538. package/docs/content/locales/ar-SA/workspace.mdx +112 -8
  1539. package/docs/content/locales/ar-SA/writing-agent-instructions.mdx +41 -4
  1540. package/docs/content/locales/de-DE/a2a-protocol.mdx +99 -9
  1541. package/docs/content/locales/de-DE/actions.mdx +67 -4
  1542. package/docs/content/locales/de-DE/agent-mentions.mdx +68 -4
  1543. package/docs/content/locales/de-DE/agent-surfaces.mdx +116 -8
  1544. package/docs/content/locales/de-DE/agent-teams.mdx +171 -12
  1545. package/docs/content/locales/de-DE/agent-web-surfaces.mdx +51 -4
  1546. package/docs/content/locales/de-DE/authentication.mdx +122 -8
  1547. package/docs/content/locales/de-DE/automations.mdx +110 -8
  1548. package/docs/content/locales/de-DE/blueprint-installer.mdx +42 -4
  1549. package/docs/content/locales/de-DE/cli-adapters.mdx +44 -4
  1550. package/docs/content/locales/de-DE/client.mdx +79 -8
  1551. package/docs/content/locales/de-DE/cloneable-saas.mdx +85 -8
  1552. package/docs/content/locales/de-DE/code-agents-ui.mdx +100 -8
  1553. package/docs/content/locales/de-DE/components.mdx +118 -8
  1554. package/docs/content/locales/de-DE/context-awareness.mdx +98 -8
  1555. package/docs/content/locales/de-DE/creating-templates.mdx +51 -4
  1556. package/docs/content/locales/de-DE/cross-app-sso.mdx +109 -8
  1557. package/docs/content/locales/de-DE/database.mdx +52 -4
  1558. package/docs/content/locales/de-DE/deployment.mdx +103 -8
  1559. package/docs/content/locales/de-DE/dispatch.mdx +134 -8
  1560. package/docs/content/locales/de-DE/drop-in-agent.mdx +63 -4
  1561. package/docs/content/locales/de-DE/durable-resume.mdx +47 -4
  1562. package/docs/content/locales/de-DE/embedding-sdk.mdx +85 -8
  1563. package/docs/content/locales/de-DE/evals.mdx +102 -8
  1564. package/docs/content/locales/de-DE/extensions.mdx +113 -9
  1565. package/docs/content/locales/de-DE/external-agents.mdx +119 -8
  1566. package/docs/content/locales/de-DE/faq.mdx +98 -8
  1567. package/docs/content/locales/de-DE/file-uploads.mdx +61 -4
  1568. package/docs/content/locales/de-DE/frames.mdx +88 -8
  1569. package/docs/content/locales/de-DE/getting-started.mdx +34 -4
  1570. package/docs/content/locales/de-DE/harness-agents.mdx +79 -8
  1571. package/docs/content/locales/de-DE/human-approval.mdx +50 -4
  1572. package/docs/content/locales/de-DE/key-concepts.mdx +104 -8
  1573. package/docs/content/locales/de-DE/local-file-mode.mdx +58 -4
  1574. package/docs/content/locales/de-DE/mcp-apps.mdx +120 -10
  1575. package/docs/content/locales/de-DE/mcp-clients.mdx +133 -8
  1576. package/docs/content/locales/de-DE/mcp-protocol.mdx +105 -8
  1577. package/docs/content/locales/de-DE/messaging.mdx +115 -8
  1578. package/docs/content/locales/de-DE/migration-workbench.mdx +47 -4
  1579. package/docs/content/locales/de-DE/multi-app-workspace.mdx +91 -8
  1580. package/docs/content/locales/de-DE/multi-tenancy.mdx +80 -8
  1581. package/docs/content/locales/de-DE/native-chat-ui.mdx +108 -8
  1582. package/docs/content/locales/de-DE/notifications.mdx +135 -8
  1583. package/docs/content/locales/de-DE/observability.mdx +102 -8
  1584. package/docs/content/locales/de-DE/observational-memory.mdx +92 -8
  1585. package/docs/content/locales/de-DE/onboarding.mdx +45 -4
  1586. package/docs/content/locales/de-DE/plan-plugin.mdx +99 -8
  1587. package/docs/content/locales/de-DE/pr-visual-recap.mdx +125 -8
  1588. package/docs/content/locales/de-DE/processors.mdx +41 -4
  1589. package/docs/content/locales/de-DE/progress.mdx +46 -4
  1590. package/docs/content/locales/de-DE/pure-agent-apps.mdx +50 -4
  1591. package/docs/content/locales/de-DE/real-time-collaboration.mdx +104 -8
  1592. package/docs/content/locales/de-DE/recurring-jobs.mdx +59 -4
  1593. package/docs/content/locales/de-DE/routing.mdx +44 -5
  1594. package/docs/content/locales/de-DE/sandbox-adapters.mdx +43 -4
  1595. package/docs/content/locales/de-DE/security.mdx +80 -8
  1596. package/docs/content/locales/de-DE/server.mdx +171 -12
  1597. package/docs/content/locales/de-DE/sharing.mdx +45 -4
  1598. package/docs/content/locales/de-DE/skills-guide.mdx +118 -9
  1599. package/docs/content/locales/de-DE/template-analytics.mdx +46 -4
  1600. package/docs/content/locales/de-DE/template-assets.mdx +62 -4
  1601. package/docs/content/locales/de-DE/template-brain.mdx +69 -4
  1602. package/docs/content/locales/de-DE/template-calendar.mdx +62 -4
  1603. package/docs/content/locales/de-DE/template-chat.mdx +61 -4
  1604. package/docs/content/locales/de-DE/template-clips.mdx +52 -4
  1605. package/docs/content/locales/de-DE/template-content.mdx +60 -4
  1606. package/docs/content/locales/de-DE/template-design.mdx +109 -4
  1607. package/docs/content/locales/de-DE/template-dispatch.mdx +57 -4
  1608. package/docs/content/locales/de-DE/template-forms.mdx +64 -4
  1609. package/docs/content/locales/de-DE/template-mail.mdx +60 -4
  1610. package/docs/content/locales/de-DE/template-plan.mdx +63 -4
  1611. package/docs/content/locales/de-DE/template-slides.mdx +49 -4
  1612. package/docs/content/locales/de-DE/template-videos.mdx +53 -4
  1613. package/docs/content/locales/de-DE/tracking.mdx +54 -4
  1614. package/docs/content/locales/de-DE/using-your-agent.mdx +51 -4
  1615. package/docs/content/locales/de-DE/voice-input.mdx +45 -4
  1616. package/docs/content/locales/de-DE/what-is-agent-native.mdx +100 -8
  1617. package/docs/content/locales/de-DE/workspace-connections.mdx +128 -8
  1618. package/docs/content/locales/de-DE/workspace-management.mdx +50 -4
  1619. package/docs/content/locales/de-DE/workspace.mdx +111 -8
  1620. package/docs/content/locales/de-DE/writing-agent-instructions.mdx +45 -4
  1621. package/docs/content/locales/es-ES/a2a-protocol.mdx +99 -9
  1622. package/docs/content/locales/es-ES/actions.mdx +67 -4
  1623. package/docs/content/locales/es-ES/agent-mentions.mdx +68 -4
  1624. package/docs/content/locales/es-ES/agent-surfaces.mdx +120 -8
  1625. package/docs/content/locales/es-ES/agent-teams.mdx +172 -12
  1626. package/docs/content/locales/es-ES/agent-web-surfaces.mdx +51 -4
  1627. package/docs/content/locales/es-ES/authentication.mdx +122 -8
  1628. package/docs/content/locales/es-ES/automations.mdx +110 -8
  1629. package/docs/content/locales/es-ES/blueprint-installer.mdx +42 -4
  1630. package/docs/content/locales/es-ES/cli-adapters.mdx +44 -4
  1631. package/docs/content/locales/es-ES/client.mdx +79 -8
  1632. package/docs/content/locales/es-ES/cloneable-saas.mdx +85 -8
  1633. package/docs/content/locales/es-ES/code-agents-ui.mdx +101 -8
  1634. package/docs/content/locales/es-ES/components.mdx +118 -8
  1635. package/docs/content/locales/es-ES/context-awareness.mdx +98 -8
  1636. package/docs/content/locales/es-ES/creating-templates.mdx +51 -4
  1637. package/docs/content/locales/es-ES/cross-app-sso.mdx +109 -8
  1638. package/docs/content/locales/es-ES/database.mdx +52 -4
  1639. package/docs/content/locales/es-ES/deployment.mdx +103 -8
  1640. package/docs/content/locales/es-ES/dispatch.mdx +134 -8
  1641. package/docs/content/locales/es-ES/drop-in-agent.mdx +63 -4
  1642. package/docs/content/locales/es-ES/durable-resume.mdx +47 -4
  1643. package/docs/content/locales/es-ES/embedding-sdk.mdx +87 -8
  1644. package/docs/content/locales/es-ES/evals.mdx +102 -8
  1645. package/docs/content/locales/es-ES/extensions.mdx +113 -9
  1646. package/docs/content/locales/es-ES/external-agents.mdx +119 -8
  1647. package/docs/content/locales/es-ES/faq.mdx +98 -8
  1648. package/docs/content/locales/es-ES/file-uploads.mdx +61 -4
  1649. package/docs/content/locales/es-ES/frames.mdx +88 -8
  1650. package/docs/content/locales/es-ES/getting-started.mdx +34 -4
  1651. package/docs/content/locales/es-ES/harness-agents.mdx +79 -8
  1652. package/docs/content/locales/es-ES/human-approval.mdx +50 -4
  1653. package/docs/content/locales/es-ES/key-concepts.mdx +104 -8
  1654. package/docs/content/locales/es-ES/local-file-mode.mdx +60 -4
  1655. package/docs/content/locales/es-ES/mcp-apps.mdx +120 -10
  1656. package/docs/content/locales/es-ES/mcp-clients.mdx +135 -8
  1657. package/docs/content/locales/es-ES/mcp-protocol.mdx +105 -8
  1658. package/docs/content/locales/es-ES/messaging.mdx +115 -8
  1659. package/docs/content/locales/es-ES/migration-workbench.mdx +47 -4
  1660. package/docs/content/locales/es-ES/multi-app-workspace.mdx +91 -8
  1661. package/docs/content/locales/es-ES/multi-tenancy.mdx +80 -8
  1662. package/docs/content/locales/es-ES/native-chat-ui.mdx +108 -8
  1663. package/docs/content/locales/es-ES/notifications.mdx +135 -8
  1664. package/docs/content/locales/es-ES/observability.mdx +104 -8
  1665. package/docs/content/locales/es-ES/observational-memory.mdx +92 -8
  1666. package/docs/content/locales/es-ES/onboarding.mdx +45 -4
  1667. package/docs/content/locales/es-ES/plan-plugin.mdx +99 -8
  1668. package/docs/content/locales/es-ES/pr-visual-recap.mdx +125 -8
  1669. package/docs/content/locales/es-ES/processors.mdx +41 -4
  1670. package/docs/content/locales/es-ES/progress.mdx +46 -4
  1671. package/docs/content/locales/es-ES/pure-agent-apps.mdx +50 -4
  1672. package/docs/content/locales/es-ES/real-time-collaboration.mdx +109 -8
  1673. package/docs/content/locales/es-ES/recurring-jobs.mdx +59 -4
  1674. package/docs/content/locales/es-ES/routing.mdx +44 -5
  1675. package/docs/content/locales/es-ES/sandbox-adapters.mdx +44 -4
  1676. package/docs/content/locales/es-ES/security.mdx +82 -8
  1677. package/docs/content/locales/es-ES/server.mdx +173 -12
  1678. package/docs/content/locales/es-ES/sharing.mdx +45 -4
  1679. package/docs/content/locales/es-ES/skills-guide.mdx +118 -9
  1680. package/docs/content/locales/es-ES/template-analytics.mdx +46 -4
  1681. package/docs/content/locales/es-ES/template-assets.mdx +64 -4
  1682. package/docs/content/locales/es-ES/template-brain.mdx +69 -4
  1683. package/docs/content/locales/es-ES/template-calendar.mdx +62 -4
  1684. package/docs/content/locales/es-ES/template-chat.mdx +61 -4
  1685. package/docs/content/locales/es-ES/template-clips.mdx +52 -4
  1686. package/docs/content/locales/es-ES/template-content.mdx +64 -4
  1687. package/docs/content/locales/es-ES/template-design.mdx +108 -4
  1688. package/docs/content/locales/es-ES/template-dispatch.mdx +57 -4
  1689. package/docs/content/locales/es-ES/template-forms.mdx +64 -4
  1690. package/docs/content/locales/es-ES/template-mail.mdx +60 -4
  1691. package/docs/content/locales/es-ES/template-plan.mdx +61 -4
  1692. package/docs/content/locales/es-ES/template-slides.mdx +49 -4
  1693. package/docs/content/locales/es-ES/template-videos.mdx +53 -4
  1694. package/docs/content/locales/es-ES/tracking.mdx +54 -4
  1695. package/docs/content/locales/es-ES/using-your-agent.mdx +51 -4
  1696. package/docs/content/locales/es-ES/voice-input.mdx +45 -4
  1697. package/docs/content/locales/es-ES/what-is-agent-native.mdx +99 -8
  1698. package/docs/content/locales/es-ES/workspace-connections.mdx +128 -8
  1699. package/docs/content/locales/es-ES/workspace-management.mdx +50 -4
  1700. package/docs/content/locales/es-ES/workspace.mdx +112 -8
  1701. package/docs/content/locales/es-ES/writing-agent-instructions.mdx +46 -4
  1702. package/docs/content/locales/fr-FR/a2a-protocol.mdx +97 -9
  1703. package/docs/content/locales/fr-FR/actions.mdx +67 -4
  1704. package/docs/content/locales/fr-FR/agent-mentions.mdx +68 -4
  1705. package/docs/content/locales/fr-FR/agent-surfaces.mdx +118 -8
  1706. package/docs/content/locales/fr-FR/agent-teams.mdx +172 -12
  1707. package/docs/content/locales/fr-FR/agent-web-surfaces.mdx +51 -4
  1708. package/docs/content/locales/fr-FR/authentication.mdx +122 -8
  1709. package/docs/content/locales/fr-FR/automations.mdx +110 -8
  1710. package/docs/content/locales/fr-FR/blueprint-installer.mdx +42 -4
  1711. package/docs/content/locales/fr-FR/cli-adapters.mdx +44 -4
  1712. package/docs/content/locales/fr-FR/client.mdx +81 -8
  1713. package/docs/content/locales/fr-FR/cloneable-saas.mdx +85 -8
  1714. package/docs/content/locales/fr-FR/code-agents-ui.mdx +102 -8
  1715. package/docs/content/locales/fr-FR/components.mdx +118 -8
  1716. package/docs/content/locales/fr-FR/context-awareness.mdx +98 -8
  1717. package/docs/content/locales/fr-FR/creating-templates.mdx +49 -4
  1718. package/docs/content/locales/fr-FR/cross-app-sso.mdx +109 -8
  1719. package/docs/content/locales/fr-FR/database.mdx +52 -4
  1720. package/docs/content/locales/fr-FR/deployment.mdx +103 -8
  1721. package/docs/content/locales/fr-FR/dispatch.mdx +134 -8
  1722. package/docs/content/locales/fr-FR/drop-in-agent.mdx +63 -4
  1723. package/docs/content/locales/fr-FR/durable-resume.mdx +47 -4
  1724. package/docs/content/locales/fr-FR/embedding-sdk.mdx +87 -8
  1725. package/docs/content/locales/fr-FR/evals.mdx +102 -8
  1726. package/docs/content/locales/fr-FR/extensions.mdx +113 -9
  1727. package/docs/content/locales/fr-FR/external-agents.mdx +119 -8
  1728. package/docs/content/locales/fr-FR/faq.mdx +98 -8
  1729. package/docs/content/locales/fr-FR/file-uploads.mdx +61 -4
  1730. package/docs/content/locales/fr-FR/frames.mdx +90 -8
  1731. package/docs/content/locales/fr-FR/getting-started.mdx +34 -4
  1732. package/docs/content/locales/fr-FR/harness-agents.mdx +77 -8
  1733. package/docs/content/locales/fr-FR/human-approval.mdx +50 -4
  1734. package/docs/content/locales/fr-FR/key-concepts.mdx +106 -8
  1735. package/docs/content/locales/fr-FR/local-file-mode.mdx +58 -4
  1736. package/docs/content/locales/fr-FR/mcp-apps.mdx +120 -10
  1737. package/docs/content/locales/fr-FR/mcp-clients.mdx +135 -8
  1738. package/docs/content/locales/fr-FR/mcp-protocol.mdx +105 -8
  1739. package/docs/content/locales/fr-FR/messaging.mdx +115 -8
  1740. package/docs/content/locales/fr-FR/migration-workbench.mdx +47 -4
  1741. package/docs/content/locales/fr-FR/multi-app-workspace.mdx +91 -8
  1742. package/docs/content/locales/fr-FR/multi-tenancy.mdx +80 -8
  1743. package/docs/content/locales/fr-FR/native-chat-ui.mdx +108 -8
  1744. package/docs/content/locales/fr-FR/notifications.mdx +135 -8
  1745. package/docs/content/locales/fr-FR/observability.mdx +104 -8
  1746. package/docs/content/locales/fr-FR/observational-memory.mdx +89 -8
  1747. package/docs/content/locales/fr-FR/onboarding.mdx +45 -4
  1748. package/docs/content/locales/fr-FR/plan-plugin.mdx +99 -8
  1749. package/docs/content/locales/fr-FR/pr-visual-recap.mdx +126 -8
  1750. package/docs/content/locales/fr-FR/processors.mdx +41 -4
  1751. package/docs/content/locales/fr-FR/progress.mdx +46 -4
  1752. package/docs/content/locales/fr-FR/pure-agent-apps.mdx +48 -4
  1753. package/docs/content/locales/fr-FR/real-time-collaboration.mdx +107 -8
  1754. package/docs/content/locales/fr-FR/recurring-jobs.mdx +59 -4
  1755. package/docs/content/locales/fr-FR/routing.mdx +44 -5
  1756. package/docs/content/locales/fr-FR/sandbox-adapters.mdx +44 -4
  1757. package/docs/content/locales/fr-FR/security.mdx +82 -8
  1758. package/docs/content/locales/fr-FR/server.mdx +173 -12
  1759. package/docs/content/locales/fr-FR/sharing.mdx +45 -4
  1760. package/docs/content/locales/fr-FR/skills-guide.mdx +118 -9
  1761. package/docs/content/locales/fr-FR/template-analytics.mdx +46 -4
  1762. package/docs/content/locales/fr-FR/template-assets.mdx +66 -4
  1763. package/docs/content/locales/fr-FR/template-brain.mdx +69 -4
  1764. package/docs/content/locales/fr-FR/template-calendar.mdx +62 -4
  1765. package/docs/content/locales/fr-FR/template-chat.mdx +61 -4
  1766. package/docs/content/locales/fr-FR/template-clips.mdx +52 -4
  1767. package/docs/content/locales/fr-FR/template-content.mdx +64 -4
  1768. package/docs/content/locales/fr-FR/template-design.mdx +107 -4
  1769. package/docs/content/locales/fr-FR/template-dispatch.mdx +57 -4
  1770. package/docs/content/locales/fr-FR/template-forms.mdx +64 -4
  1771. package/docs/content/locales/fr-FR/template-mail.mdx +60 -4
  1772. package/docs/content/locales/fr-FR/template-plan.mdx +61 -4
  1773. package/docs/content/locales/fr-FR/template-slides.mdx +49 -4
  1774. package/docs/content/locales/fr-FR/template-videos.mdx +53 -4
  1775. package/docs/content/locales/fr-FR/tracking.mdx +54 -4
  1776. package/docs/content/locales/fr-FR/using-your-agent.mdx +51 -4
  1777. package/docs/content/locales/fr-FR/voice-input.mdx +45 -4
  1778. package/docs/content/locales/fr-FR/what-is-agent-native.mdx +101 -8
  1779. package/docs/content/locales/fr-FR/workspace-connections.mdx +128 -8
  1780. package/docs/content/locales/fr-FR/workspace-management.mdx +50 -4
  1781. package/docs/content/locales/fr-FR/workspace.mdx +112 -8
  1782. package/docs/content/locales/fr-FR/writing-agent-instructions.mdx +47 -4
  1783. package/docs/content/locales/hi-IN/a2a-protocol.mdx +97 -9
  1784. package/docs/content/locales/hi-IN/actions.mdx +63 -4
  1785. package/docs/content/locales/hi-IN/agent-mentions.mdx +68 -4
  1786. package/docs/content/locales/hi-IN/agent-surfaces.mdx +112 -8
  1787. package/docs/content/locales/hi-IN/agent-teams.mdx +171 -12
  1788. package/docs/content/locales/hi-IN/agent-web-surfaces.mdx +51 -4
  1789. package/docs/content/locales/hi-IN/authentication.mdx +122 -8
  1790. package/docs/content/locales/hi-IN/automations.mdx +110 -8
  1791. package/docs/content/locales/hi-IN/blueprint-installer.mdx +42 -4
  1792. package/docs/content/locales/hi-IN/cli-adapters.mdx +44 -4
  1793. package/docs/content/locales/hi-IN/client.mdx +79 -8
  1794. package/docs/content/locales/hi-IN/cloneable-saas.mdx +85 -8
  1795. package/docs/content/locales/hi-IN/code-agents-ui.mdx +96 -8
  1796. package/docs/content/locales/hi-IN/components.mdx +114 -8
  1797. package/docs/content/locales/hi-IN/context-awareness.mdx +102 -8
  1798. package/docs/content/locales/hi-IN/creating-templates.mdx +53 -4
  1799. package/docs/content/locales/hi-IN/cross-app-sso.mdx +109 -8
  1800. package/docs/content/locales/hi-IN/database.mdx +52 -4
  1801. package/docs/content/locales/hi-IN/deployment.mdx +103 -8
  1802. package/docs/content/locales/hi-IN/dispatch.mdx +134 -8
  1803. package/docs/content/locales/hi-IN/drop-in-agent.mdx +63 -4
  1804. package/docs/content/locales/hi-IN/durable-resume.mdx +47 -4
  1805. package/docs/content/locales/hi-IN/embedding-sdk.mdx +83 -8
  1806. package/docs/content/locales/hi-IN/evals.mdx +100 -8
  1807. package/docs/content/locales/hi-IN/extensions.mdx +113 -9
  1808. package/docs/content/locales/hi-IN/external-agents.mdx +119 -8
  1809. package/docs/content/locales/hi-IN/faq.mdx +96 -8
  1810. package/docs/content/locales/hi-IN/file-uploads.mdx +61 -4
  1811. package/docs/content/locales/hi-IN/frames.mdx +88 -8
  1812. package/docs/content/locales/hi-IN/getting-started.mdx +34 -4
  1813. package/docs/content/locales/hi-IN/harness-agents.mdx +77 -8
  1814. package/docs/content/locales/hi-IN/human-approval.mdx +51 -4
  1815. package/docs/content/locales/hi-IN/key-concepts.mdx +104 -8
  1816. package/docs/content/locales/hi-IN/local-file-mode.mdx +58 -4
  1817. package/docs/content/locales/hi-IN/mcp-apps.mdx +120 -10
  1818. package/docs/content/locales/hi-IN/mcp-clients.mdx +133 -8
  1819. package/docs/content/locales/hi-IN/mcp-protocol.mdx +105 -8
  1820. package/docs/content/locales/hi-IN/messaging.mdx +115 -8
  1821. package/docs/content/locales/hi-IN/migration-workbench.mdx +45 -4
  1822. package/docs/content/locales/hi-IN/multi-app-workspace.mdx +91 -8
  1823. package/docs/content/locales/hi-IN/multi-tenancy.mdx +80 -8
  1824. package/docs/content/locales/hi-IN/native-chat-ui.mdx +106 -8
  1825. package/docs/content/locales/hi-IN/notifications.mdx +135 -8
  1826. package/docs/content/locales/hi-IN/observability.mdx +102 -8
  1827. package/docs/content/locales/hi-IN/observational-memory.mdx +89 -8
  1828. package/docs/content/locales/hi-IN/onboarding.mdx +45 -4
  1829. package/docs/content/locales/hi-IN/plan-plugin.mdx +99 -8
  1830. package/docs/content/locales/hi-IN/pr-visual-recap.mdx +126 -8
  1831. package/docs/content/locales/hi-IN/processors.mdx +41 -4
  1832. package/docs/content/locales/hi-IN/progress.mdx +46 -4
  1833. package/docs/content/locales/hi-IN/pure-agent-apps.mdx +48 -4
  1834. package/docs/content/locales/hi-IN/real-time-collaboration.mdx +106 -8
  1835. package/docs/content/locales/hi-IN/recurring-jobs.mdx +59 -4
  1836. package/docs/content/locales/hi-IN/routing.mdx +44 -5
  1837. package/docs/content/locales/hi-IN/sandbox-adapters.mdx +43 -4
  1838. package/docs/content/locales/hi-IN/security.mdx +78 -8
  1839. package/docs/content/locales/hi-IN/server.mdx +169 -12
  1840. package/docs/content/locales/hi-IN/sharing.mdx +45 -4
  1841. package/docs/content/locales/hi-IN/skills-guide.mdx +118 -9
  1842. package/docs/content/locales/hi-IN/template-analytics.mdx +46 -4
  1843. package/docs/content/locales/hi-IN/template-assets.mdx +62 -4
  1844. package/docs/content/locales/hi-IN/template-brain.mdx +69 -4
  1845. package/docs/content/locales/hi-IN/template-calendar.mdx +62 -4
  1846. package/docs/content/locales/hi-IN/template-chat.mdx +59 -4
  1847. package/docs/content/locales/hi-IN/template-clips.mdx +52 -4
  1848. package/docs/content/locales/hi-IN/template-content.mdx +62 -4
  1849. package/docs/content/locales/hi-IN/template-design.mdx +102 -4
  1850. package/docs/content/locales/hi-IN/template-dispatch.mdx +57 -4
  1851. package/docs/content/locales/hi-IN/template-forms.mdx +64 -4
  1852. package/docs/content/locales/hi-IN/template-mail.mdx +64 -4
  1853. package/docs/content/locales/hi-IN/template-plan.mdx +61 -4
  1854. package/docs/content/locales/hi-IN/template-slides.mdx +49 -4
  1855. package/docs/content/locales/hi-IN/template-videos.mdx +53 -4
  1856. package/docs/content/locales/hi-IN/tracking.mdx +54 -4
  1857. package/docs/content/locales/hi-IN/using-your-agent.mdx +51 -4
  1858. package/docs/content/locales/hi-IN/voice-input.mdx +43 -4
  1859. package/docs/content/locales/hi-IN/what-is-agent-native.mdx +97 -8
  1860. package/docs/content/locales/hi-IN/workspace-connections.mdx +128 -8
  1861. package/docs/content/locales/hi-IN/workspace-management.mdx +50 -4
  1862. package/docs/content/locales/hi-IN/workspace.mdx +111 -8
  1863. package/docs/content/locales/hi-IN/writing-agent-instructions.mdx +40 -4
  1864. package/docs/content/locales/ja-JP/a2a-protocol.mdx +97 -9
  1865. package/docs/content/locales/ja-JP/actions.mdx +67 -4
  1866. package/docs/content/locales/ja-JP/agent-mentions.mdx +68 -4
  1867. package/docs/content/locales/ja-JP/agent-surfaces.mdx +116 -8
  1868. package/docs/content/locales/ja-JP/agent-teams.mdx +172 -12
  1869. package/docs/content/locales/ja-JP/agent-web-surfaces.mdx +51 -4
  1870. package/docs/content/locales/ja-JP/authentication.mdx +122 -8
  1871. package/docs/content/locales/ja-JP/automations.mdx +110 -8
  1872. package/docs/content/locales/ja-JP/blueprint-installer.mdx +44 -4
  1873. package/docs/content/locales/ja-JP/cli-adapters.mdx +44 -4
  1874. package/docs/content/locales/ja-JP/client.mdx +79 -8
  1875. package/docs/content/locales/ja-JP/cloneable-saas.mdx +85 -8
  1876. package/docs/content/locales/ja-JP/code-agents-ui.mdx +100 -8
  1877. package/docs/content/locales/ja-JP/components.mdx +116 -8
  1878. package/docs/content/locales/ja-JP/context-awareness.mdx +100 -8
  1879. package/docs/content/locales/ja-JP/creating-templates.mdx +51 -4
  1880. package/docs/content/locales/ja-JP/cross-app-sso.mdx +109 -8
  1881. package/docs/content/locales/ja-JP/database.mdx +52 -4
  1882. package/docs/content/locales/ja-JP/deployment.mdx +103 -8
  1883. package/docs/content/locales/ja-JP/dispatch.mdx +134 -8
  1884. package/docs/content/locales/ja-JP/drop-in-agent.mdx +63 -4
  1885. package/docs/content/locales/ja-JP/durable-resume.mdx +47 -4
  1886. package/docs/content/locales/ja-JP/embedding-sdk.mdx +85 -8
  1887. package/docs/content/locales/ja-JP/evals.mdx +102 -8
  1888. package/docs/content/locales/ja-JP/extensions.mdx +111 -9
  1889. package/docs/content/locales/ja-JP/external-agents.mdx +119 -8
  1890. package/docs/content/locales/ja-JP/faq.mdx +98 -8
  1891. package/docs/content/locales/ja-JP/file-uploads.mdx +61 -4
  1892. package/docs/content/locales/ja-JP/frames.mdx +88 -8
  1893. package/docs/content/locales/ja-JP/getting-started.mdx +34 -4
  1894. package/docs/content/locales/ja-JP/harness-agents.mdx +79 -8
  1895. package/docs/content/locales/ja-JP/human-approval.mdx +50 -4
  1896. package/docs/content/locales/ja-JP/key-concepts.mdx +105 -8
  1897. package/docs/content/locales/ja-JP/local-file-mode.mdx +58 -4
  1898. package/docs/content/locales/ja-JP/mcp-apps.mdx +119 -10
  1899. package/docs/content/locales/ja-JP/mcp-clients.mdx +134 -8
  1900. package/docs/content/locales/ja-JP/mcp-protocol.mdx +105 -8
  1901. package/docs/content/locales/ja-JP/messaging.mdx +115 -8
  1902. package/docs/content/locales/ja-JP/migration-workbench.mdx +47 -4
  1903. package/docs/content/locales/ja-JP/multi-app-workspace.mdx +91 -8
  1904. package/docs/content/locales/ja-JP/multi-tenancy.mdx +80 -8
  1905. package/docs/content/locales/ja-JP/native-chat-ui.mdx +104 -8
  1906. package/docs/content/locales/ja-JP/notifications.mdx +135 -8
  1907. package/docs/content/locales/ja-JP/observability.mdx +104 -8
  1908. package/docs/content/locales/ja-JP/observational-memory.mdx +89 -8
  1909. package/docs/content/locales/ja-JP/onboarding.mdx +45 -4
  1910. package/docs/content/locales/ja-JP/plan-plugin.mdx +99 -8
  1911. package/docs/content/locales/ja-JP/pr-visual-recap.mdx +123 -8
  1912. package/docs/content/locales/ja-JP/processors.mdx +39 -4
  1913. package/docs/content/locales/ja-JP/progress.mdx +46 -4
  1914. package/docs/content/locales/ja-JP/pure-agent-apps.mdx +48 -4
  1915. package/docs/content/locales/ja-JP/real-time-collaboration.mdx +106 -8
  1916. package/docs/content/locales/ja-JP/recurring-jobs.mdx +59 -4
  1917. package/docs/content/locales/ja-JP/routing.mdx +44 -5
  1918. package/docs/content/locales/ja-JP/sandbox-adapters.mdx +43 -4
  1919. package/docs/content/locales/ja-JP/security.mdx +82 -8
  1920. package/docs/content/locales/ja-JP/server.mdx +171 -12
  1921. package/docs/content/locales/ja-JP/sharing.mdx +45 -4
  1922. package/docs/content/locales/ja-JP/skills-guide.mdx +118 -9
  1923. package/docs/content/locales/ja-JP/template-analytics.mdx +46 -4
  1924. package/docs/content/locales/ja-JP/template-assets.mdx +64 -4
  1925. package/docs/content/locales/ja-JP/template-brain.mdx +67 -4
  1926. package/docs/content/locales/ja-JP/template-calendar.mdx +62 -4
  1927. package/docs/content/locales/ja-JP/template-chat.mdx +61 -4
  1928. package/docs/content/locales/ja-JP/template-clips.mdx +52 -4
  1929. package/docs/content/locales/ja-JP/template-content.mdx +62 -4
  1930. package/docs/content/locales/ja-JP/template-design.mdx +106 -4
  1931. package/docs/content/locales/ja-JP/template-dispatch.mdx +57 -4
  1932. package/docs/content/locales/ja-JP/template-forms.mdx +62 -4
  1933. package/docs/content/locales/ja-JP/template-mail.mdx +62 -4
  1934. package/docs/content/locales/ja-JP/template-plan.mdx +63 -4
  1935. package/docs/content/locales/ja-JP/template-slides.mdx +49 -4
  1936. package/docs/content/locales/ja-JP/template-videos.mdx +53 -4
  1937. package/docs/content/locales/ja-JP/tracking.mdx +54 -4
  1938. package/docs/content/locales/ja-JP/using-your-agent.mdx +51 -4
  1939. package/docs/content/locales/ja-JP/voice-input.mdx +43 -4
  1940. package/docs/content/locales/ja-JP/what-is-agent-native.mdx +96 -8
  1941. package/docs/content/locales/ja-JP/workspace-connections.mdx +128 -8
  1942. package/docs/content/locales/ja-JP/workspace-management.mdx +50 -4
  1943. package/docs/content/locales/ja-JP/workspace.mdx +111 -8
  1944. package/docs/content/locales/ja-JP/writing-agent-instructions.mdx +44 -4
  1945. package/docs/content/locales/ko-KR/a2a-protocol.mdx +97 -9
  1946. package/docs/content/locales/ko-KR/actions.mdx +63 -4
  1947. package/docs/content/locales/ko-KR/agent-mentions.mdx +68 -4
  1948. package/docs/content/locales/ko-KR/agent-surfaces.mdx +113 -8
  1949. package/docs/content/locales/ko-KR/agent-teams.mdx +171 -12
  1950. package/docs/content/locales/ko-KR/agent-web-surfaces.mdx +51 -4
  1951. package/docs/content/locales/ko-KR/authentication.mdx +122 -8
  1952. package/docs/content/locales/ko-KR/automations.mdx +110 -8
  1953. package/docs/content/locales/ko-KR/blueprint-installer.mdx +42 -4
  1954. package/docs/content/locales/ko-KR/cli-adapters.mdx +44 -4
  1955. package/docs/content/locales/ko-KR/client.mdx +79 -8
  1956. package/docs/content/locales/ko-KR/cloneable-saas.mdx +85 -8
  1957. package/docs/content/locales/ko-KR/code-agents-ui.mdx +96 -8
  1958. package/docs/content/locales/ko-KR/components.mdx +112 -8
  1959. package/docs/content/locales/ko-KR/context-awareness.mdx +96 -8
  1960. package/docs/content/locales/ko-KR/creating-templates.mdx +51 -4
  1961. package/docs/content/locales/ko-KR/cross-app-sso.mdx +109 -8
  1962. package/docs/content/locales/ko-KR/database.mdx +52 -4
  1963. package/docs/content/locales/ko-KR/deployment.mdx +103 -8
  1964. package/docs/content/locales/ko-KR/dispatch.mdx +132 -8
  1965. package/docs/content/locales/ko-KR/drop-in-agent.mdx +63 -4
  1966. package/docs/content/locales/ko-KR/durable-resume.mdx +47 -4
  1967. package/docs/content/locales/ko-KR/embedding-sdk.mdx +81 -8
  1968. package/docs/content/locales/ko-KR/evals.mdx +102 -8
  1969. package/docs/content/locales/ko-KR/extensions.mdx +111 -9
  1970. package/docs/content/locales/ko-KR/external-agents.mdx +119 -8
  1971. package/docs/content/locales/ko-KR/faq.mdx +96 -8
  1972. package/docs/content/locales/ko-KR/file-uploads.mdx +61 -4
  1973. package/docs/content/locales/ko-KR/frames.mdx +86 -8
  1974. package/docs/content/locales/ko-KR/getting-started.mdx +34 -4
  1975. package/docs/content/locales/ko-KR/harness-agents.mdx +77 -8
  1976. package/docs/content/locales/ko-KR/human-approval.mdx +50 -4
  1977. package/docs/content/locales/ko-KR/key-concepts.mdx +104 -8
  1978. package/docs/content/locales/ko-KR/local-file-mode.mdx +56 -4
  1979. package/docs/content/locales/ko-KR/mcp-apps.mdx +120 -10
  1980. package/docs/content/locales/ko-KR/mcp-clients.mdx +133 -8
  1981. package/docs/content/locales/ko-KR/mcp-protocol.mdx +105 -8
  1982. package/docs/content/locales/ko-KR/messaging.mdx +115 -8
  1983. package/docs/content/locales/ko-KR/migration-workbench.mdx +45 -4
  1984. package/docs/content/locales/ko-KR/multi-app-workspace.mdx +91 -8
  1985. package/docs/content/locales/ko-KR/multi-tenancy.mdx +80 -8
  1986. package/docs/content/locales/ko-KR/native-chat-ui.mdx +104 -8
  1987. package/docs/content/locales/ko-KR/notifications.mdx +135 -8
  1988. package/docs/content/locales/ko-KR/observability.mdx +102 -8
  1989. package/docs/content/locales/ko-KR/observational-memory.mdx +87 -8
  1990. package/docs/content/locales/ko-KR/onboarding.mdx +44 -4
  1991. package/docs/content/locales/ko-KR/plan-plugin.mdx +99 -8
  1992. package/docs/content/locales/ko-KR/pr-visual-recap.mdx +125 -8
  1993. package/docs/content/locales/ko-KR/processors.mdx +39 -4
  1994. package/docs/content/locales/ko-KR/progress.mdx +46 -4
  1995. package/docs/content/locales/ko-KR/pure-agent-apps.mdx +46 -4
  1996. package/docs/content/locales/ko-KR/real-time-collaboration.mdx +104 -8
  1997. package/docs/content/locales/ko-KR/recurring-jobs.mdx +59 -4
  1998. package/docs/content/locales/ko-KR/routing.mdx +44 -5
  1999. package/docs/content/locales/ko-KR/sandbox-adapters.mdx +41 -4
  2000. package/docs/content/locales/ko-KR/security.mdx +78 -8
  2001. package/docs/content/locales/ko-KR/server.mdx +171 -12
  2002. package/docs/content/locales/ko-KR/sharing.mdx +45 -4
  2003. package/docs/content/locales/ko-KR/skills-guide.mdx +118 -9
  2004. package/docs/content/locales/ko-KR/template-analytics.mdx +46 -4
  2005. package/docs/content/locales/ko-KR/template-assets.mdx +62 -4
  2006. package/docs/content/locales/ko-KR/template-brain.mdx +65 -4
  2007. package/docs/content/locales/ko-KR/template-calendar.mdx +60 -4
  2008. package/docs/content/locales/ko-KR/template-chat.mdx +59 -4
  2009. package/docs/content/locales/ko-KR/template-clips.mdx +52 -4
  2010. package/docs/content/locales/ko-KR/template-content.mdx +60 -4
  2011. package/docs/content/locales/ko-KR/template-design.mdx +102 -4
  2012. package/docs/content/locales/ko-KR/template-dispatch.mdx +57 -4
  2013. package/docs/content/locales/ko-KR/template-forms.mdx +60 -4
  2014. package/docs/content/locales/ko-KR/template-mail.mdx +60 -4
  2015. package/docs/content/locales/ko-KR/template-plan.mdx +57 -4
  2016. package/docs/content/locales/ko-KR/template-slides.mdx +49 -4
  2017. package/docs/content/locales/ko-KR/template-videos.mdx +53 -4
  2018. package/docs/content/locales/ko-KR/tracking.mdx +54 -4
  2019. package/docs/content/locales/ko-KR/using-your-agent.mdx +51 -4
  2020. package/docs/content/locales/ko-KR/voice-input.mdx +43 -4
  2021. package/docs/content/locales/ko-KR/what-is-agent-native.mdx +95 -8
  2022. package/docs/content/locales/ko-KR/workspace-connections.mdx +128 -8
  2023. package/docs/content/locales/ko-KR/workspace-management.mdx +50 -4
  2024. package/docs/content/locales/ko-KR/workspace.mdx +111 -8
  2025. package/docs/content/locales/ko-KR/writing-agent-instructions.mdx +38 -4
  2026. package/docs/content/locales/pt-BR/a2a-protocol.mdx +99 -9
  2027. package/docs/content/locales/pt-BR/actions.mdx +67 -4
  2028. package/docs/content/locales/pt-BR/agent-mentions.mdx +68 -4
  2029. package/docs/content/locales/pt-BR/agent-surfaces.mdx +116 -8
  2030. package/docs/content/locales/pt-BR/agent-teams.mdx +172 -12
  2031. package/docs/content/locales/pt-BR/agent-web-surfaces.mdx +51 -4
  2032. package/docs/content/locales/pt-BR/authentication.mdx +122 -8
  2033. package/docs/content/locales/pt-BR/automations.mdx +110 -8
  2034. package/docs/content/locales/pt-BR/blueprint-installer.mdx +42 -4
  2035. package/docs/content/locales/pt-BR/cli-adapters.mdx +44 -4
  2036. package/docs/content/locales/pt-BR/client.mdx +81 -8
  2037. package/docs/content/locales/pt-BR/cloneable-saas.mdx +85 -8
  2038. package/docs/content/locales/pt-BR/code-agents-ui.mdx +98 -8
  2039. package/docs/content/locales/pt-BR/components.mdx +118 -8
  2040. package/docs/content/locales/pt-BR/context-awareness.mdx +100 -8
  2041. package/docs/content/locales/pt-BR/creating-templates.mdx +51 -4
  2042. package/docs/content/locales/pt-BR/cross-app-sso.mdx +109 -8
  2043. package/docs/content/locales/pt-BR/database.mdx +52 -4
  2044. package/docs/content/locales/pt-BR/deployment.mdx +103 -8
  2045. package/docs/content/locales/pt-BR/dispatch.mdx +134 -8
  2046. package/docs/content/locales/pt-BR/drop-in-agent.mdx +63 -4
  2047. package/docs/content/locales/pt-BR/durable-resume.mdx +47 -4
  2048. package/docs/content/locales/pt-BR/embedding-sdk.mdx +87 -8
  2049. package/docs/content/locales/pt-BR/evals.mdx +102 -8
  2050. package/docs/content/locales/pt-BR/extensions.mdx +113 -9
  2051. package/docs/content/locales/pt-BR/external-agents.mdx +119 -8
  2052. package/docs/content/locales/pt-BR/faq.mdx +98 -8
  2053. package/docs/content/locales/pt-BR/file-uploads.mdx +61 -4
  2054. package/docs/content/locales/pt-BR/frames.mdx +88 -8
  2055. package/docs/content/locales/pt-BR/getting-started.mdx +34 -4
  2056. package/docs/content/locales/pt-BR/harness-agents.mdx +79 -8
  2057. package/docs/content/locales/pt-BR/human-approval.mdx +50 -4
  2058. package/docs/content/locales/pt-BR/key-concepts.mdx +104 -8
  2059. package/docs/content/locales/pt-BR/local-file-mode.mdx +60 -4
  2060. package/docs/content/locales/pt-BR/mcp-apps.mdx +120 -10
  2061. package/docs/content/locales/pt-BR/mcp-clients.mdx +133 -8
  2062. package/docs/content/locales/pt-BR/mcp-protocol.mdx +105 -8
  2063. package/docs/content/locales/pt-BR/messaging.mdx +115 -8
  2064. package/docs/content/locales/pt-BR/migration-workbench.mdx +47 -4
  2065. package/docs/content/locales/pt-BR/multi-app-workspace.mdx +91 -8
  2066. package/docs/content/locales/pt-BR/multi-tenancy.mdx +80 -8
  2067. package/docs/content/locales/pt-BR/native-chat-ui.mdx +108 -8
  2068. package/docs/content/locales/pt-BR/notifications.mdx +135 -8
  2069. package/docs/content/locales/pt-BR/observability.mdx +104 -8
  2070. package/docs/content/locales/pt-BR/observational-memory.mdx +92 -8
  2071. package/docs/content/locales/pt-BR/onboarding.mdx +45 -4
  2072. package/docs/content/locales/pt-BR/plan-plugin.mdx +99 -8
  2073. package/docs/content/locales/pt-BR/pr-visual-recap.mdx +125 -8
  2074. package/docs/content/locales/pt-BR/processors.mdx +41 -4
  2075. package/docs/content/locales/pt-BR/progress.mdx +46 -4
  2076. package/docs/content/locales/pt-BR/pure-agent-apps.mdx +48 -4
  2077. package/docs/content/locales/pt-BR/real-time-collaboration.mdx +107 -8
  2078. package/docs/content/locales/pt-BR/recurring-jobs.mdx +59 -4
  2079. package/docs/content/locales/pt-BR/routing.mdx +44 -5
  2080. package/docs/content/locales/pt-BR/sandbox-adapters.mdx +43 -4
  2081. package/docs/content/locales/pt-BR/security.mdx +82 -8
  2082. package/docs/content/locales/pt-BR/server.mdx +173 -12
  2083. package/docs/content/locales/pt-BR/sharing.mdx +45 -4
  2084. package/docs/content/locales/pt-BR/skills-guide.mdx +118 -9
  2085. package/docs/content/locales/pt-BR/template-analytics.mdx +46 -4
  2086. package/docs/content/locales/pt-BR/template-assets.mdx +64 -4
  2087. package/docs/content/locales/pt-BR/template-brain.mdx +69 -4
  2088. package/docs/content/locales/pt-BR/template-calendar.mdx +62 -4
  2089. package/docs/content/locales/pt-BR/template-chat.mdx +61 -4
  2090. package/docs/content/locales/pt-BR/template-clips.mdx +52 -4
  2091. package/docs/content/locales/pt-BR/template-content.mdx +64 -4
  2092. package/docs/content/locales/pt-BR/template-design.mdx +106 -4
  2093. package/docs/content/locales/pt-BR/template-dispatch.mdx +57 -4
  2094. package/docs/content/locales/pt-BR/template-forms.mdx +64 -4
  2095. package/docs/content/locales/pt-BR/template-mail.mdx +60 -4
  2096. package/docs/content/locales/pt-BR/template-plan.mdx +63 -4
  2097. package/docs/content/locales/pt-BR/template-slides.mdx +49 -4
  2098. package/docs/content/locales/pt-BR/template-videos.mdx +53 -4
  2099. package/docs/content/locales/pt-BR/tracking.mdx +54 -4
  2100. package/docs/content/locales/pt-BR/using-your-agent.mdx +51 -4
  2101. package/docs/content/locales/pt-BR/voice-input.mdx +43 -4
  2102. package/docs/content/locales/pt-BR/what-is-agent-native.mdx +101 -8
  2103. package/docs/content/locales/pt-BR/workspace-connections.mdx +128 -8
  2104. package/docs/content/locales/pt-BR/workspace-management.mdx +50 -4
  2105. package/docs/content/locales/pt-BR/workspace.mdx +111 -8
  2106. package/docs/content/locales/pt-BR/writing-agent-instructions.mdx +46 -4
  2107. package/docs/content/locales/zh-CN/a2a-protocol.mdx +97 -9
  2108. package/docs/content/locales/zh-CN/actions.mdx +65 -4
  2109. package/docs/content/locales/zh-CN/agent-mentions.mdx +68 -4
  2110. package/docs/content/locales/zh-CN/agent-surfaces.mdx +108 -8
  2111. package/docs/content/locales/zh-CN/agent-teams.mdx +171 -12
  2112. package/docs/content/locales/zh-CN/agent-web-surfaces.mdx +51 -4
  2113. package/docs/content/locales/zh-CN/authentication.mdx +122 -8
  2114. package/docs/content/locales/zh-CN/automations.mdx +110 -8
  2115. package/docs/content/locales/zh-CN/blueprint-installer.mdx +42 -4
  2116. package/docs/content/locales/zh-CN/cli-adapters.mdx +44 -4
  2117. package/docs/content/locales/zh-CN/client.mdx +79 -8
  2118. package/docs/content/locales/zh-CN/cloneable-saas.mdx +83 -8
  2119. package/docs/content/locales/zh-CN/code-agents-ui.mdx +94 -8
  2120. package/docs/content/locales/zh-CN/components.mdx +112 -8
  2121. package/docs/content/locales/zh-CN/context-awareness.mdx +96 -8
  2122. package/docs/content/locales/zh-CN/creating-templates.mdx +51 -4
  2123. package/docs/content/locales/zh-CN/cross-app-sso.mdx +107 -8
  2124. package/docs/content/locales/zh-CN/database.mdx +52 -4
  2125. package/docs/content/locales/zh-CN/deployment.mdx +103 -8
  2126. package/docs/content/locales/zh-CN/dispatch.mdx +134 -8
  2127. package/docs/content/locales/zh-CN/drop-in-agent.mdx +63 -4
  2128. package/docs/content/locales/zh-CN/durable-resume.mdx +45 -4
  2129. package/docs/content/locales/zh-CN/embedding-sdk.mdx +81 -8
  2130. package/docs/content/locales/zh-CN/evals.mdx +100 -8
  2131. package/docs/content/locales/zh-CN/extensions.mdx +111 -9
  2132. package/docs/content/locales/zh-CN/external-agents.mdx +119 -8
  2133. package/docs/content/locales/zh-CN/faq.mdx +96 -8
  2134. package/docs/content/locales/zh-CN/file-uploads.mdx +61 -4
  2135. package/docs/content/locales/zh-CN/frames.mdx +86 -8
  2136. package/docs/content/locales/zh-CN/getting-started.mdx +34 -4
  2137. package/docs/content/locales/zh-CN/harness-agents.mdx +79 -8
  2138. package/docs/content/locales/zh-CN/human-approval.mdx +50 -4
  2139. package/docs/content/locales/zh-CN/key-concepts.mdx +100 -8
  2140. package/docs/content/locales/zh-CN/local-file-mode.mdx +56 -4
  2141. package/docs/content/locales/zh-CN/mcp-apps.mdx +120 -10
  2142. package/docs/content/locales/zh-CN/mcp-clients.mdx +133 -8
  2143. package/docs/content/locales/zh-CN/mcp-protocol.mdx +105 -8
  2144. package/docs/content/locales/zh-CN/messaging.mdx +115 -8
  2145. package/docs/content/locales/zh-CN/migration-workbench.mdx +45 -4
  2146. package/docs/content/locales/zh-CN/multi-app-workspace.mdx +91 -8
  2147. package/docs/content/locales/zh-CN/multi-tenancy.mdx +80 -8
  2148. package/docs/content/locales/zh-CN/native-chat-ui.mdx +104 -8
  2149. package/docs/content/locales/zh-CN/notifications.mdx +135 -8
  2150. package/docs/content/locales/zh-CN/observability.mdx +102 -8
  2151. package/docs/content/locales/zh-CN/observational-memory.mdx +85 -8
  2152. package/docs/content/locales/zh-CN/onboarding.mdx +44 -4
  2153. package/docs/content/locales/zh-CN/plan-plugin.mdx +97 -8
  2154. package/docs/content/locales/zh-CN/pr-visual-recap.mdx +123 -8
  2155. package/docs/content/locales/zh-CN/processors.mdx +39 -4
  2156. package/docs/content/locales/zh-CN/progress.mdx +46 -4
  2157. package/docs/content/locales/zh-CN/pure-agent-apps.mdx +46 -4
  2158. package/docs/content/locales/zh-CN/real-time-collaboration.mdx +98 -8
  2159. package/docs/content/locales/zh-CN/recurring-jobs.mdx +59 -4
  2160. package/docs/content/locales/zh-CN/routing.mdx +42 -5
  2161. package/docs/content/locales/zh-CN/sandbox-adapters.mdx +41 -4
  2162. package/docs/content/locales/zh-CN/security.mdx +78 -8
  2163. package/docs/content/locales/zh-CN/server.mdx +169 -12
  2164. package/docs/content/locales/zh-CN/sharing.mdx +45 -4
  2165. package/docs/content/locales/zh-CN/skills-guide.mdx +118 -9
  2166. package/docs/content/locales/zh-CN/template-analytics.mdx +46 -4
  2167. package/docs/content/locales/zh-CN/template-assets.mdx +58 -4
  2168. package/docs/content/locales/zh-CN/template-brain.mdx +65 -4
  2169. package/docs/content/locales/zh-CN/template-calendar.mdx +58 -4
  2170. package/docs/content/locales/zh-CN/template-chat.mdx +57 -4
  2171. package/docs/content/locales/zh-CN/template-clips.mdx +52 -4
  2172. package/docs/content/locales/zh-CN/template-content.mdx +58 -4
  2173. package/docs/content/locales/zh-CN/template-design.mdx +94 -4
  2174. package/docs/content/locales/zh-CN/template-dispatch.mdx +57 -4
  2175. package/docs/content/locales/zh-CN/template-forms.mdx +58 -4
  2176. package/docs/content/locales/zh-CN/template-mail.mdx +60 -4
  2177. package/docs/content/locales/zh-CN/template-plan.mdx +57 -4
  2178. package/docs/content/locales/zh-CN/template-slides.mdx +49 -4
  2179. package/docs/content/locales/zh-CN/template-videos.mdx +51 -4
  2180. package/docs/content/locales/zh-CN/tracking.mdx +54 -4
  2181. package/docs/content/locales/zh-CN/using-your-agent.mdx +51 -4
  2182. package/docs/content/locales/zh-CN/voice-input.mdx +43 -4
  2183. package/docs/content/locales/zh-CN/what-is-agent-native.mdx +94 -8
  2184. package/docs/content/locales/zh-CN/workspace-connections.mdx +126 -8
  2185. package/docs/content/locales/zh-CN/workspace-management.mdx +50 -4
  2186. package/docs/content/locales/zh-CN/workspace.mdx +110 -8
  2187. package/docs/content/locales/zh-CN/writing-agent-instructions.mdx +38 -4
  2188. package/docs/content/locales/zh-TW/a2a-protocol.mdx +97 -9
  2189. package/docs/content/locales/zh-TW/actions.mdx +63 -4
  2190. package/docs/content/locales/zh-TW/agent-mentions.mdx +68 -4
  2191. package/docs/content/locales/zh-TW/agent-surfaces.mdx +108 -8
  2192. package/docs/content/locales/zh-TW/agent-teams.mdx +171 -12
  2193. package/docs/content/locales/zh-TW/agent-web-surfaces.mdx +51 -4
  2194. package/docs/content/locales/zh-TW/authentication.mdx +122 -8
  2195. package/docs/content/locales/zh-TW/automations.mdx +110 -8
  2196. package/docs/content/locales/zh-TW/blueprint-installer.mdx +42 -4
  2197. package/docs/content/locales/zh-TW/cli-adapters.mdx +44 -4
  2198. package/docs/content/locales/zh-TW/client.mdx +79 -8
  2199. package/docs/content/locales/zh-TW/cloneable-saas.mdx +83 -8
  2200. package/docs/content/locales/zh-TW/code-agents-ui.mdx +94 -8
  2201. package/docs/content/locales/zh-TW/components.mdx +112 -8
  2202. package/docs/content/locales/zh-TW/context-awareness.mdx +96 -8
  2203. package/docs/content/locales/zh-TW/creating-templates.mdx +51 -4
  2204. package/docs/content/locales/zh-TW/cross-app-sso.mdx +107 -8
  2205. package/docs/content/locales/zh-TW/database.mdx +52 -4
  2206. package/docs/content/locales/zh-TW/deployment.mdx +103 -8
  2207. package/docs/content/locales/zh-TW/dispatch.mdx +134 -8
  2208. package/docs/content/locales/zh-TW/drop-in-agent.mdx +63 -4
  2209. package/docs/content/locales/zh-TW/durable-background-runs.mdx +88 -8
  2210. package/docs/content/locales/zh-TW/durable-resume.mdx +45 -4
  2211. package/docs/content/locales/zh-TW/embedding-sdk.mdx +83 -8
  2212. package/docs/content/locales/zh-TW/evals.mdx +100 -8
  2213. package/docs/content/locales/zh-TW/extensions.mdx +111 -9
  2214. package/docs/content/locales/zh-TW/external-agents.mdx +119 -8
  2215. package/docs/content/locales/zh-TW/faq.mdx +96 -8
  2216. package/docs/content/locales/zh-TW/file-uploads.mdx +61 -4
  2217. package/docs/content/locales/zh-TW/frames.mdx +86 -8
  2218. package/docs/content/locales/zh-TW/getting-started.mdx +34 -4
  2219. package/docs/content/locales/zh-TW/harness-agents.mdx +79 -8
  2220. package/docs/content/locales/zh-TW/human-approval.mdx +50 -4
  2221. package/docs/content/locales/zh-TW/key-concepts.mdx +100 -8
  2222. package/docs/content/locales/zh-TW/local-file-mode.mdx +56 -4
  2223. package/docs/content/locales/zh-TW/mcp-apps.mdx +120 -10
  2224. package/docs/content/locales/zh-TW/mcp-clients.mdx +133 -8
  2225. package/docs/content/locales/zh-TW/mcp-protocol.mdx +105 -8
  2226. package/docs/content/locales/zh-TW/messaging.mdx +115 -8
  2227. package/docs/content/locales/zh-TW/migration-workbench.mdx +45 -4
  2228. package/docs/content/locales/zh-TW/multi-app-workspace.mdx +91 -8
  2229. package/docs/content/locales/zh-TW/multi-tenancy.mdx +80 -8
  2230. package/docs/content/locales/zh-TW/native-chat-ui.mdx +104 -8
  2231. package/docs/content/locales/zh-TW/notifications.mdx +135 -8
  2232. package/docs/content/locales/zh-TW/observability.mdx +102 -8
  2233. package/docs/content/locales/zh-TW/observational-memory.mdx +85 -8
  2234. package/docs/content/locales/zh-TW/onboarding.mdx +44 -4
  2235. package/docs/content/locales/zh-TW/plan-plugin.mdx +97 -8
  2236. package/docs/content/locales/zh-TW/pr-visual-recap.mdx +123 -8
  2237. package/docs/content/locales/zh-TW/processors.mdx +39 -4
  2238. package/docs/content/locales/zh-TW/progress.mdx +46 -4
  2239. package/docs/content/locales/zh-TW/pure-agent-apps.mdx +46 -4
  2240. package/docs/content/locales/zh-TW/real-time-collaboration.mdx +98 -8
  2241. package/docs/content/locales/zh-TW/recurring-jobs.mdx +59 -4
  2242. package/docs/content/locales/zh-TW/routing.mdx +42 -5
  2243. package/docs/content/locales/zh-TW/sandbox-adapters.mdx +41 -4
  2244. package/docs/content/locales/zh-TW/security.mdx +80 -8
  2245. package/docs/content/locales/zh-TW/server.mdx +169 -12
  2246. package/docs/content/locales/zh-TW/sharing.mdx +45 -4
  2247. package/docs/content/locales/zh-TW/skills-guide.mdx +118 -9
  2248. package/docs/content/locales/zh-TW/template-analytics.mdx +46 -4
  2249. package/docs/content/locales/zh-TW/template-assets.mdx +58 -4
  2250. package/docs/content/locales/zh-TW/template-brain.mdx +65 -4
  2251. package/docs/content/locales/zh-TW/template-calendar.mdx +58 -4
  2252. package/docs/content/locales/zh-TW/template-chat.mdx +59 -4
  2253. package/docs/content/locales/zh-TW/template-clips.mdx +52 -4
  2254. package/docs/content/locales/zh-TW/template-content.mdx +58 -4
  2255. package/docs/content/locales/zh-TW/template-design.mdx +96 -4
  2256. package/docs/content/locales/zh-TW/template-dispatch.mdx +57 -4
  2257. package/docs/content/locales/zh-TW/template-forms.mdx +58 -4
  2258. package/docs/content/locales/zh-TW/template-mail.mdx +60 -4
  2259. package/docs/content/locales/zh-TW/template-plan.mdx +57 -4
  2260. package/docs/content/locales/zh-TW/template-slides.mdx +49 -4
  2261. package/docs/content/locales/zh-TW/template-videos.mdx +51 -4
  2262. package/docs/content/locales/zh-TW/tracking.mdx +54 -4
  2263. package/docs/content/locales/zh-TW/using-your-agent.mdx +51 -4
  2264. package/docs/content/locales/zh-TW/voice-input.mdx +43 -4
  2265. package/docs/content/locales/zh-TW/what-is-agent-native.mdx +94 -8
  2266. package/docs/content/locales/zh-TW/workspace-connections.mdx +126 -8
  2267. package/docs/content/locales/zh-TW/workspace-management.mdx +50 -4
  2268. package/docs/content/locales/zh-TW/workspace.mdx +111 -8
  2269. package/docs/content/locales/zh-TW/writing-agent-instructions.mdx +38 -4
  2270. package/docs/content/mcp-apps.mdx +120 -10
  2271. package/docs/content/mcp-clients.mdx +161 -8
  2272. package/docs/content/mcp-protocol.mdx +105 -8
  2273. package/docs/content/messaging.mdx +115 -8
  2274. package/docs/content/migration-workbench.mdx +45 -4
  2275. package/docs/content/multi-app-workspace.mdx +91 -8
  2276. package/docs/content/multi-tenancy.mdx +80 -8
  2277. package/docs/content/native-chat-ui.mdx +106 -8
  2278. package/docs/content/notifications.mdx +135 -8
  2279. package/docs/content/observability.mdx +102 -8
  2280. package/docs/content/observational-memory.mdx +89 -8
  2281. package/docs/content/onboarding.mdx +45 -4
  2282. package/docs/content/plan-plugin.mdx +99 -8
  2283. package/docs/content/pr-visual-recap.mdx +125 -8
  2284. package/docs/content/processors.mdx +41 -4
  2285. package/docs/content/progress.mdx +46 -4
  2286. package/docs/content/pure-agent-apps.mdx +46 -4
  2287. package/docs/content/real-time-collaboration.mdx +104 -8
  2288. package/docs/content/recurring-jobs.mdx +59 -4
  2289. package/docs/content/routing.mdx +44 -5
  2290. package/docs/content/sandbox-adapters.mdx +43 -4
  2291. package/docs/content/security.mdx +80 -8
  2292. package/docs/content/server.mdx +173 -12
  2293. package/docs/content/sharing.mdx +45 -4
  2294. package/docs/content/skills-guide.mdx +118 -9
  2295. package/docs/content/template-analytics.mdx +46 -4
  2296. package/docs/content/template-assets.mdx +60 -4
  2297. package/docs/content/template-brain.mdx +67 -4
  2298. package/docs/content/template-calendar.mdx +62 -4
  2299. package/docs/content/template-chat.mdx +61 -4
  2300. package/docs/content/template-clips.mdx +52 -4
  2301. package/docs/content/template-content.mdx +60 -4
  2302. package/docs/content/template-design.mdx +103 -4
  2303. package/docs/content/template-dispatch.mdx +57 -4
  2304. package/docs/content/template-forms.mdx +62 -4
  2305. package/docs/content/template-mail.mdx +60 -4
  2306. package/docs/content/template-plan.mdx +61 -4
  2307. package/docs/content/template-slides.mdx +49 -4
  2308. package/docs/content/template-videos.mdx +51 -4
  2309. package/docs/content/tracking.mdx +54 -4
  2310. package/docs/content/using-your-agent.mdx +51 -4
  2311. package/docs/content/voice-input.mdx +43 -4
  2312. package/docs/content/what-is-agent-native.mdx +188 -8
  2313. package/docs/content/workspace-connections.mdx +128 -8
  2314. package/docs/content/workspace-management.mdx +50 -4
  2315. package/docs/content/workspace.mdx +111 -8
  2316. package/docs/content/writing-agent-instructions.mdx +45 -4
  2317. package/package.json +2 -1
  2318. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  2319. package/corpus/templates/design/app/components/design/DesignToolbar.tsx +0 -339
  2320. package/corpus/templates/design/app/components/design/PresentMode.tsx +0 -68
  2321. package/corpus/templates/design/app/components/design/ViewportTabs.tsx +0 -149
  2322. package/corpus/templates/design/app/components/design/ZoomControls.tsx +0 -157
@@ -1,9 +1,57 @@
1
1
  import { useT } from "@agent-native/core/client";
2
- import { IconPointer } from "@tabler/icons-react";
3
- import { useCallback, useEffect, useState } from "react";
2
+ import type { TweakDefinition } from "@shared/api";
3
+ import {
4
+ alphaToOpacity,
5
+ parseCssColor,
6
+ rgbaToCss,
7
+ withColorOpacity,
8
+ } from "@shared/color-utils";
9
+ import {
10
+ IconAlignCenter,
11
+ IconAlignJustified,
12
+ IconAlignLeft,
13
+ IconAlignRight,
14
+ IconBorderStyle,
15
+ IconBrush,
16
+ IconChevronDown,
17
+ IconChevronRight,
18
+ IconCode,
19
+ IconComponents,
20
+ IconEye,
21
+ IconEyeOff,
22
+ IconFlipHorizontal,
23
+ IconFlipVertical,
24
+ IconFrame,
25
+ IconLayoutGrid,
26
+ IconLayoutAlignBottom,
27
+ IconLayoutAlignCenter,
28
+ IconLayoutAlignLeft,
29
+ IconLayoutAlignMiddle,
30
+ IconLayoutAlignRight,
31
+ IconLayoutAlignTop,
32
+ IconLetterCase,
33
+ IconLetterSpacing,
34
+ IconLineHeight,
35
+ IconLink,
36
+ IconMaximize,
37
+ IconMinus,
38
+ IconPalette,
39
+ IconPhoto,
40
+ IconPlus,
41
+ IconTypography,
42
+ IconUnlink,
43
+ IconVector,
44
+ } from "@tabler/icons-react";
45
+ import { useCallback, useEffect, useState, type ReactNode } from "react";
4
46
 
47
+ import { Button } from "@/components/ui/button";
5
48
  import { Input } from "@/components/ui/input";
6
49
  import { Label } from "@/components/ui/label";
50
+ import {
51
+ Popover,
52
+ PopoverContent,
53
+ PopoverTrigger,
54
+ } from "@/components/ui/popover";
7
55
  import {
8
56
  Select,
9
57
  SelectContent,
@@ -11,16 +59,59 @@ import {
11
59
  SelectTrigger,
12
60
  SelectValue,
13
61
  } from "@/components/ui/select";
14
- import { Separator } from "@/components/ui/separator";
15
62
  import { Slider } from "@/components/ui/slider";
63
+ import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
64
+ import {
65
+ Tooltip,
66
+ TooltipContent,
67
+ TooltipTrigger,
68
+ } from "@/components/ui/tooltip";
16
69
  import { cn } from "@/lib/utils";
17
70
 
71
+ import {
72
+ DesignExtensionsPanel,
73
+ type DesignExtensionSlotContext,
74
+ } from "./DesignExtensionsPanel";
75
+ import {
76
+ AutoLayoutMatrix,
77
+ ConstraintsWidget,
78
+ ExportSettingsPanel,
79
+ FigmaColorPicker,
80
+ ScrubInput,
81
+ type AlignmentMatrixValue,
82
+ type AutoLayoutMatrixValue,
83
+ type AutoLayoutSizing,
84
+ type AutoLayoutSizingAxis,
85
+ type ConstraintsValue,
86
+ type ExportSettingsValue,
87
+ type FigmaFillRow,
88
+ type FigmaFillRowPatch,
89
+ type FigmaGradientStop,
90
+ type FigmaGradientStopPatch,
91
+ type FigmaGradientType,
92
+ } from "./inspector";
93
+ import type { FigmaPaintType } from "./inspector/FigmaColorPicker";
94
+ import { TweaksPanelContent } from "./TweaksPanel";
18
95
  import type { ElementInfo } from "./types";
19
96
 
97
+ export type InspectorTab = "design" | "tweaks" | "extensions";
98
+
20
99
  interface EditPanelProps {
21
100
  selectedElement: ElementInfo | null;
22
101
  pageStyles?: Record<string, string>;
102
+ zoom?: number;
103
+ width?: number;
104
+ activeTab?: InspectorTab;
105
+ onActiveTabChange?: (tab: InspectorTab) => void;
106
+ tweaks?: TweakDefinition[];
107
+ tweakValues?: Record<string, string | number | boolean>;
108
+ extensionContext?: DesignExtensionSlotContext;
109
+ onTweakChange?: (id: string, value: string | number | boolean) => void;
110
+ onRequestTweaks?: (anchor: HTMLElement) => void;
23
111
  onStyleChange: (property: string, value: string) => void;
112
+ onStylesChange?: (styles: Record<string, string>) => void;
113
+ onExport?: (settings: ExportSettingsValue) => void;
114
+ exporting?: boolean;
24
115
  }
25
116
 
26
117
  /**
@@ -74,10 +165,8 @@ function PropInput({
74
165
  };
75
166
 
76
167
  return (
77
- <div className="flex items-center gap-2">
78
- <Label className="text-xs text-muted-foreground w-20 shrink-0">
79
- {label}
80
- </Label>
168
+ <div className="flex items-center gap-1.5">
169
+ <FieldLabel>{label}</FieldLabel>
81
170
  <Input
82
171
  type={type}
83
172
  value={draft}
@@ -98,82 +187,551 @@ function PropInput({
98
187
  }
99
188
  }}
100
189
  placeholder={placeholder}
101
- className="h-7 text-xs"
190
+ className="h-6 min-w-0 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-1.5 text-[11px] shadow-none focus-visible:ring-1 focus-visible:ring-[var(--design-editor-accent-color)]"
102
191
  />
103
192
  </div>
104
193
  );
105
194
  }
106
195
 
107
- /** Compact color input: label + color swatch + text input */
196
+ /** Compact color input: label + Figma-style picker popover. */
108
197
  function ColorInput({
109
198
  label,
110
199
  value,
111
200
  onChange,
201
+ backgroundImage,
202
+ onBackgroundImageChange,
203
+ blendMode,
204
+ onBlendModeChange,
205
+ supportsLayeredFills = false,
112
206
  }: {
113
207
  label: string;
114
208
  value: string;
115
209
  onChange: (value: string) => void;
210
+ backgroundImage?: string;
211
+ onBackgroundImageChange?: (value: string) => void;
212
+ blendMode?: string;
213
+ onBlendModeChange?: (value: string) => void;
214
+ supportsLayeredFills?: boolean;
116
215
  }) {
117
- const t = useT();
118
216
  const [draft, setDraft] = useState(value);
217
+ const [selectedFillId, setSelectedFillId] = useState(SOLID_FILL_ID);
218
+ const [selectedStopId, setSelectedStopId] = useState<string | undefined>();
119
219
 
120
220
  useEffect(() => {
121
221
  setDraft(value);
122
222
  }, [value]);
123
223
 
224
+ const backgroundLayers = splitCssLayers(backgroundImage || "");
225
+ const selectedLayerIndex = fillLayerIndex(selectedFillId);
226
+ const selectedGradient =
227
+ selectedLayerIndex !== null
228
+ ? parseGradientLayer(backgroundLayers[selectedLayerIndex] || "")
229
+ : null;
230
+ const fallbackGradientIndex = backgroundLayers.findIndex((layer) =>
231
+ Boolean(parseGradientLayer(layer)),
232
+ );
233
+ const activeGradientIndex =
234
+ selectedGradient && selectedLayerIndex !== null
235
+ ? selectedLayerIndex
236
+ : fallbackGradientIndex >= 0
237
+ ? fallbackGradientIndex
238
+ : null;
239
+ const activeGradient =
240
+ activeGradientIndex !== null
241
+ ? parseGradientLayer(backgroundLayers[activeGradientIndex] || "")
242
+ : null;
243
+ const activeStopIds =
244
+ activeGradient?.stops.map((stop) => stop.id).join("|") ?? "";
245
+
246
+ useEffect(() => {
247
+ if (
248
+ selectedFillId !== SOLID_FILL_ID &&
249
+ (selectedLayerIndex === null ||
250
+ selectedLayerIndex >= backgroundLayers.length)
251
+ ) {
252
+ setSelectedFillId(SOLID_FILL_ID);
253
+ }
254
+ }, [backgroundLayers.length, selectedFillId, selectedLayerIndex]);
255
+
256
+ useEffect(() => {
257
+ if (!activeStopIds) {
258
+ if (selectedStopId) setSelectedStopId(undefined);
259
+ return;
260
+ }
261
+ const stopIds = activeStopIds.split("|").filter(Boolean);
262
+ if (!selectedStopId || !stopIds.includes(selectedStopId)) {
263
+ setSelectedStopId(stopIds[0]);
264
+ }
265
+ }, [activeStopIds, selectedStopId]);
266
+
124
267
  const setNext = (next: string) => {
125
268
  setDraft(next);
126
269
  onChange(next);
127
270
  };
128
271
 
272
+ const replaceBackgroundLayer = (index: number, nextLayer: string) => {
273
+ if (!onBackgroundImageChange) return;
274
+ const nextLayers = [...backgroundLayers];
275
+ nextLayers[index] = nextLayer;
276
+ onBackgroundImageChange(joinCssLayers(nextLayers));
277
+ };
278
+
279
+ const removeBackgroundLayer = (index: number) => {
280
+ if (!onBackgroundImageChange) return;
281
+ const nextLayers = backgroundLayers.filter(
282
+ (_, layerIndex) => layerIndex !== index,
283
+ );
284
+ onBackgroundImageChange(joinCssLayers(nextLayers));
285
+ setSelectedFillId(SOLID_FILL_ID);
286
+ };
287
+
288
+ const fillRows = supportsLayeredFills
289
+ ? buildFillRows(
290
+ draft || value || "#000000",
291
+ backgroundLayers,
292
+ selectedFillId,
293
+ )
294
+ : undefined;
295
+
296
+ const handleFillChange = (id: string, patch: FigmaFillRowPatch) => {
297
+ if (id === SOLID_FILL_ID) {
298
+ if (patch.value !== undefined) setNext(patch.value);
299
+ if (patch.opacity !== undefined) {
300
+ const parsed = parseCssColor(patch.value ?? draft);
301
+ if (parsed) setNext(rgbaToCss(withColorOpacity(parsed, patch.opacity)));
302
+ }
303
+ return;
304
+ }
305
+
306
+ const index = fillLayerIndex(id);
307
+ if (index === null || !onBackgroundImageChange) return;
308
+ const currentLayer = backgroundLayers[index] || "";
309
+ if (patch.value !== undefined) {
310
+ replaceBackgroundLayer(index, patch.value);
311
+ return;
312
+ }
313
+ if (patch.opacity === undefined) return;
314
+ const gradient = parseGradientLayer(currentLayer);
315
+ if (!gradient) return;
316
+ replaceBackgroundLayer(
317
+ index,
318
+ buildGradientLayer(
319
+ gradient.type,
320
+ gradient.stops.map((stop) => ({
321
+ ...stop,
322
+ opacity: patch.opacity,
323
+ })),
324
+ ),
325
+ );
326
+ };
327
+
328
+ const handleAddFill = onBackgroundImageChange
329
+ ? () => {
330
+ const nextLayers = [
331
+ defaultGradientLayer("linear", draft || value || "#000000"),
332
+ ...backgroundLayers,
333
+ ];
334
+ onBackgroundImageChange(joinCssLayers(nextLayers));
335
+ setSelectedFillId(fillLayerId(0));
336
+ setSelectedStopId("stop-0");
337
+ }
338
+ : undefined;
339
+
340
+ const handleRemoveFill = onBackgroundImageChange
341
+ ? (id: string) => {
342
+ const index = fillLayerIndex(id);
343
+ if (index === null) return;
344
+ removeBackgroundLayer(index);
345
+ }
346
+ : undefined;
347
+
348
+ const handleGradientTypeChange =
349
+ activeGradient && activeGradientIndex !== null
350
+ ? (type: FigmaGradientType) => {
351
+ replaceBackgroundLayer(
352
+ activeGradientIndex,
353
+ buildGradientLayer(type, activeGradient.stops),
354
+ );
355
+ }
356
+ : undefined;
357
+
358
+ const handleGradientStopChange =
359
+ activeGradient && activeGradientIndex !== null
360
+ ? (id: string, patch: FigmaGradientStopPatch) => {
361
+ const nextStops = activeGradient.stops.map((stop) =>
362
+ stop.id === id ? { ...stop, ...patch } : stop,
363
+ );
364
+ replaceBackgroundLayer(
365
+ activeGradientIndex,
366
+ buildGradientLayer(activeGradient.type, nextStops),
367
+ );
368
+ }
369
+ : undefined;
370
+
371
+ const handleAddGradientStop = onBackgroundImageChange
372
+ ? () => {
373
+ if (activeGradient && activeGradientIndex !== null) {
374
+ const nextStop: FigmaGradientStop = {
375
+ id: `stop-${activeGradient.stops.length}`,
376
+ color: draft || "#000000",
377
+ position: 50,
378
+ opacity: 100,
379
+ };
380
+ replaceBackgroundLayer(
381
+ activeGradientIndex,
382
+ buildGradientLayer(activeGradient.type, [
383
+ ...activeGradient.stops,
384
+ nextStop,
385
+ ]),
386
+ );
387
+ setSelectedStopId(nextStop.id);
388
+ return;
389
+ }
390
+
391
+ onBackgroundImageChange(
392
+ joinCssLayers([
393
+ defaultGradientLayer("linear", draft || value || "#000000"),
394
+ ...backgroundLayers,
395
+ ]),
396
+ );
397
+ setSelectedFillId(fillLayerId(0));
398
+ setSelectedStopId("stop-0");
399
+ }
400
+ : undefined;
401
+
402
+ const handleRemoveGradientStop =
403
+ activeGradient && activeGradientIndex !== null
404
+ ? (id: string) => {
405
+ if (activeGradient.stops.length <= 2) return;
406
+ const nextStops = activeGradient.stops.filter(
407
+ (stop) => stop.id !== id,
408
+ );
409
+ replaceBackgroundLayer(
410
+ activeGradientIndex,
411
+ buildGradientLayer(activeGradient.type, nextStops),
412
+ );
413
+ setSelectedStopId(nextStops[0]?.id);
414
+ }
415
+ : undefined;
416
+
417
+ const selectedPaintType: FigmaPaintType =
418
+ selectedFillId !== SOLID_FILL_ID
419
+ ? selectedGradient
420
+ ? selectedGradient.type
421
+ : "image"
422
+ : colorHasVisibleAlpha(draft || value)
423
+ ? "solid"
424
+ : "none";
425
+
426
+ const handlePaintTypeChange = (type: FigmaPaintType) => {
427
+ const selectedLayer = fillLayerIndex(selectedFillId);
428
+ if (type === "solid") {
429
+ if (selectedLayer !== null) removeBackgroundLayer(selectedLayer);
430
+ setSelectedFillId(SOLID_FILL_ID);
431
+ setNext(cssColorOrFallback(draft || value, "#000000"));
432
+ return;
433
+ }
434
+ if (type === "none") {
435
+ if (selectedLayer !== null) {
436
+ removeBackgroundLayer(selectedLayer);
437
+ return;
438
+ }
439
+ setNext("transparent");
440
+ return;
441
+ }
442
+ if (!onBackgroundImageChange) return;
443
+
444
+ if (
445
+ type !== "linear" &&
446
+ type !== "radial" &&
447
+ type !== "angular" &&
448
+ type !== "diamond"
449
+ ) {
450
+ return;
451
+ }
452
+ const nextType: FigmaGradientType = type;
453
+ const layerIndex = selectedLayer ?? activeGradientIndex;
454
+ if (layerIndex !== null) {
455
+ const currentGradient = parseGradientLayer(
456
+ backgroundLayers[layerIndex] || "",
457
+ );
458
+ const stops =
459
+ currentGradient?.stops ?? defaultGradientStops(draft || value);
460
+ replaceBackgroundLayer(layerIndex, buildGradientLayer(nextType, stops));
461
+ setSelectedFillId(fillLayerId(layerIndex));
462
+ setSelectedStopId(stops[0]?.id);
463
+ return;
464
+ }
465
+
466
+ onBackgroundImageChange(
467
+ joinCssLayers([
468
+ defaultGradientLayer(nextType, draft || value || "#000000"),
469
+ ...backgroundLayers,
470
+ ]),
471
+ );
472
+ setSelectedFillId(fillLayerId(0));
473
+ setSelectedStopId("stop-0");
474
+ };
475
+
129
476
  return (
130
- <div className="flex items-center gap-2">
131
- <Label className="text-xs text-muted-foreground w-20 shrink-0">
132
- {label}
133
- </Label>
134
- <div className="flex items-center gap-1.5 flex-1">
135
- <input
136
- type="color"
137
- aria-label={`${label} ${t("editPanel.colorInputLabel")}`}
138
- value={toColorInputValue(draft)}
139
- onChange={(e) => setNext(e.target.value)}
140
- className="h-6 w-6 shrink-0 cursor-pointer rounded border border-border bg-transparent p-0"
141
- />
142
- <Input
143
- value={draft}
144
- onChange={(e) => setNext(e.target.value)}
145
- placeholder="#000000"
146
- className="h-7 text-xs"
147
- />
148
- </div>
149
- </div>
477
+ <FigmaColorPicker
478
+ label={label}
479
+ value={draft || "#000000"}
480
+ onChange={setNext}
481
+ blendMode={blendMode}
482
+ onBlendModeChange={onBlendModeChange}
483
+ showBlendMode={supportsLayeredFills}
484
+ fillRows={fillRows}
485
+ selectedFillId={selectedFillId}
486
+ onFillSelect={supportsLayeredFills ? setSelectedFillId : undefined}
487
+ onFillChange={supportsLayeredFills ? handleFillChange : undefined}
488
+ onAddFill={supportsLayeredFills ? handleAddFill : undefined}
489
+ onRemoveFill={supportsLayeredFills ? handleRemoveFill : undefined}
490
+ paintType={selectedPaintType}
491
+ onPaintTypeChange={handlePaintTypeChange}
492
+ gradientType={activeGradient?.type}
493
+ onGradientTypeChange={handleGradientTypeChange}
494
+ gradientStops={activeGradient?.stops}
495
+ selectedStopId={selectedStopId}
496
+ onGradientStopSelect={setSelectedStopId}
497
+ onGradientStopChange={handleGradientStopChange}
498
+ onAddGradientStop={
499
+ supportsLayeredFills ? handleAddGradientStop : undefined
500
+ }
501
+ onRemoveGradientStop={handleRemoveGradientStop}
502
+ />
150
503
  );
151
504
  }
152
505
 
153
- function toColorInputValue(value: string): string {
506
+ const SOLID_FILL_ID = "solid";
507
+ const FILL_LAYER_PREFIX = "layer:";
508
+
509
+ interface ParsedGradientLayer {
510
+ type: FigmaGradientType;
511
+ stops: FigmaGradientStop[];
512
+ }
513
+
514
+ function fillLayerId(index: number): string {
515
+ return `${FILL_LAYER_PREFIX}${index}`;
516
+ }
517
+
518
+ function fillLayerIndex(id: string): number | null {
519
+ if (!id.startsWith(FILL_LAYER_PREFIX)) return null;
520
+ const index = Number(id.slice(FILL_LAYER_PREFIX.length));
521
+ return Number.isInteger(index) && index >= 0 ? index : null;
522
+ }
523
+
524
+ function buildFillRows(
525
+ colorValue: string,
526
+ backgroundLayers: string[],
527
+ selectedFillId: string,
528
+ ): FigmaFillRow[] {
529
+ const solid = parseCssColor(colorValue);
530
+ const rows: FigmaFillRow[] = [
531
+ {
532
+ id: SOLID_FILL_ID,
533
+ label: "Solid", // i18n-ignore inspector fallback label
534
+ type: "solid",
535
+ value: colorValue,
536
+ swatch: colorValue,
537
+ opacity: solid ? alphaToOpacity(solid.a) : 100,
538
+ selected: selectedFillId === SOLID_FILL_ID,
539
+ },
540
+ ];
541
+
542
+ backgroundLayers.forEach((layer, index) => {
543
+ const gradient = parseGradientLayer(layer);
544
+ rows.push({
545
+ id: fillLayerId(index),
546
+ label: gradient
547
+ ? `Gradient ${index + 1}` // i18n-ignore inspector fallback label
548
+ : `Image ${index + 1}`, // i18n-ignore inspector fallback label
549
+ type: gradient ? "gradient" : "image",
550
+ value: layer,
551
+ swatch: layer,
552
+ opacity: gradient ? averageGradientOpacity(gradient.stops) : 100,
553
+ selected: selectedFillId === fillLayerId(index),
554
+ });
555
+ });
556
+
557
+ return rows;
558
+ }
559
+
560
+ function averageGradientOpacity(stops: FigmaGradientStop[]): number {
561
+ if (!stops.length) return 100;
562
+ const total = stops.reduce((sum, stop) => {
563
+ const parsed = parseCssColor(stop.color);
564
+ return sum + (stop.opacity ?? (parsed ? alphaToOpacity(parsed.a) : 100));
565
+ }, 0);
566
+ return Math.round(total / stops.length);
567
+ }
568
+
569
+ function splitCssLayers(value: string): string[] {
154
570
  const trimmed = value.trim();
155
- if (/^#[0-9a-f]{6}$/i.test(trimmed)) return trimmed;
156
- if (/^#[0-9a-f]{3}$/i.test(trimmed)) {
157
- return `#${trimmed
158
- .slice(1)
159
- .split("")
160
- .map((char) => char + char)
161
- .join("")}`;
571
+ if (!trimmed || trimmed === "none") return [];
572
+ const layers: string[] = [];
573
+ let depth = 0;
574
+ let start = 0;
575
+
576
+ for (let index = 0; index < trimmed.length; index += 1) {
577
+ const char = trimmed[index];
578
+ if (char === "(") depth += 1;
579
+ if (char === ")") depth = Math.max(0, depth - 1);
580
+ if (char === "," && depth === 0) {
581
+ const layer = trimmed.slice(start, index).trim();
582
+ if (layer) layers.push(layer);
583
+ start = index + 1;
584
+ }
162
585
  }
163
- const rgb = trimmed.match(
164
- /^rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})/i,
165
- );
166
- if (rgb) {
167
- return `#${rgb
168
- .slice(1, 4)
169
- .map((part) =>
170
- Math.max(0, Math.min(255, Number(part)))
171
- .toString(16)
172
- .padStart(2, "0"),
173
- )
174
- .join("")}`;
586
+
587
+ const finalLayer = trimmed.slice(start).trim();
588
+ if (finalLayer) layers.push(finalLayer);
589
+ return layers;
590
+ }
591
+
592
+ function joinCssLayers(layers: string[]): string {
593
+ const cleaned = layers.map((layer) => layer.trim()).filter(Boolean);
594
+ return cleaned.length ? cleaned.join(", ") : "none";
595
+ }
596
+
597
+ function parseGradientLayer(layer: string): ParsedGradientLayer | null {
598
+ const match = layer.trim().match(/^(linear|radial|conic)-gradient\((.*)\)$/i);
599
+ if (!match) return null;
600
+
601
+ const parts = splitCssLayers(match[2] || "");
602
+ const type = gradientTypeFromCss(match[1] || "", layer);
603
+ const firstStop = parseGradientStop(parts[0] || "", 0, parts.length);
604
+ const stopParts = firstStop ? parts : parts.slice(1);
605
+ const stops = stopParts
606
+ .map((part, index) => parseGradientStop(part, index, stopParts.length))
607
+ .filter((stop): stop is FigmaGradientStop => Boolean(stop));
608
+
609
+ if (!stops.length) return null;
610
+ return { type, stops };
611
+ }
612
+
613
+ function parseGradientStop(
614
+ part: string,
615
+ index: number,
616
+ total: number,
617
+ ): FigmaGradientStop | null {
618
+ const color = readLeadingColor(part);
619
+ if (!color) return null;
620
+ const parsed = parseCssColor(color.value);
621
+ const remaining = part.slice(color.raw.length);
622
+ const positionMatch = remaining.match(/(-?\d+(?:\.\d+)?)%/);
623
+ const position = positionMatch
624
+ ? clampNumber(Number(positionMatch[1]), 0, 100)
625
+ : total <= 1
626
+ ? 0
627
+ : Math.round((index / (total - 1)) * 100);
628
+
629
+ return {
630
+ id: `stop-${index}`,
631
+ color: parsed ? rgbaToCss(parsed) : color.value,
632
+ position,
633
+ opacity: parsed ? alphaToOpacity(parsed.a) : 100,
634
+ };
635
+ }
636
+
637
+ function readLeadingColor(part: string): { raw: string; value: string } | null {
638
+ const trimmed = part.trim();
639
+ const hex = trimmed.match(/^#[0-9a-f]{3,8}\b/i);
640
+ if (hex) return { raw: hex[0], value: hex[0] };
641
+ const transparent = trimmed.match(/^transparent\b/i);
642
+ if (transparent) {
643
+ return { raw: transparent[0], value: "rgba(0, 0, 0, 0)" };
644
+ }
645
+ const functionName = trimmed.match(/^(rgb|rgba|hsl|hsla)\(/i);
646
+ if (!functionName) return null;
647
+ let depth = 0;
648
+ for (let index = 0; index < trimmed.length; index += 1) {
649
+ const char = trimmed[index];
650
+ if (char === "(") depth += 1;
651
+ if (char === ")") {
652
+ depth -= 1;
653
+ if (depth === 0) {
654
+ const raw = trimmed.slice(0, index + 1);
655
+ return { raw, value: raw };
656
+ }
657
+ }
658
+ }
659
+ return null;
660
+ }
661
+
662
+ function gradientTypeFromCss(
663
+ functionName: string,
664
+ layer: string,
665
+ ): FigmaGradientType {
666
+ if (functionName.toLowerCase() === "conic") return "angular";
667
+ if (/closest-corner/i.test(layer)) return "diamond";
668
+ if (functionName.toLowerCase() === "radial") return "radial";
669
+ return "linear";
670
+ }
671
+
672
+ function gradientLabel(type: FigmaGradientType): string {
673
+ if (type === "radial") {
674
+ return "Radial gradient"; // i18n-ignore Figma inspector paint row
675
+ }
676
+ if (type === "angular") {
677
+ return "Angular gradient"; // i18n-ignore Figma inspector paint row
175
678
  }
176
- return "#000000";
679
+ if (type === "diamond") {
680
+ return "Diamond gradient"; // i18n-ignore Figma inspector paint row
681
+ }
682
+ return "Linear gradient"; // i18n-ignore Figma inspector paint row
683
+ }
684
+
685
+ function buildGradientLayer(
686
+ type: FigmaGradientType,
687
+ stops: FigmaGradientStop[],
688
+ ): string {
689
+ const stopList = [...stops]
690
+ .sort((a, b) => a.position - b.position)
691
+ .map((stop) => {
692
+ const parsed = parseCssColor(stop.color);
693
+ const opacity = stop.opacity ?? (parsed ? alphaToOpacity(parsed.a) : 100);
694
+ const color = parsed
695
+ ? rgbaToCss(withColorOpacity(parsed, opacity))
696
+ : stop.color;
697
+ return `${color} ${clampNumber(stop.position, 0, 100)}%`;
698
+ })
699
+ .join(", ");
700
+
701
+ if (type === "radial") {
702
+ return `radial-gradient(circle at 50% 50%, ${stopList})`;
703
+ }
704
+ if (type === "angular") {
705
+ return `conic-gradient(from 0deg at 50% 50%, ${stopList})`;
706
+ }
707
+ if (type === "diamond") {
708
+ return `radial-gradient(closest-corner at 50% 50%, ${stopList})`;
709
+ }
710
+ return `linear-gradient(90deg, ${stopList})`;
711
+ }
712
+
713
+ function defaultGradientStops(colorValue: string): FigmaGradientStop[] {
714
+ const parsed =
715
+ parseCssColor(cssColorOrFallback(colorValue, "#000000")) ??
716
+ parseCssColor("#000000");
717
+ const start = parsed ? rgbaToCss(withColorOpacity(parsed, 100)) : "#000000";
718
+ const end = parsed
719
+ ? rgbaToCss(withColorOpacity(parsed, 0))
720
+ : "rgba(0, 0, 0, 0)";
721
+
722
+ return [
723
+ { id: "stop-0", color: start, position: 0, opacity: 100 },
724
+ { id: "stop-1", color: end, position: 100, opacity: 0 },
725
+ ];
726
+ }
727
+
728
+ function defaultGradientLayer(type: FigmaGradientType, colorValue: string) {
729
+ return buildGradientLayer(type, defaultGradientStops(colorValue));
730
+ }
731
+
732
+ function clampNumber(value: number, min: number, max: number): number {
733
+ if (!Number.isFinite(value)) return min;
734
+ return Math.max(min, Math.min(max, Math.round(value)));
177
735
  }
178
736
 
179
737
  /** Select dropdown */
@@ -189,17 +747,19 @@ function PropSelect({
189
747
  options: { value: string; label: string }[];
190
748
  }) {
191
749
  return (
192
- <div className="flex items-center gap-2">
193
- <Label className="text-xs text-muted-foreground w-20 shrink-0">
194
- {label}
195
- </Label>
750
+ <div className="flex items-center gap-1.5">
751
+ <FieldLabel>{label}</FieldLabel>
196
752
  <Select value={value} onValueChange={onChange}>
197
- <SelectTrigger className="h-7 text-xs">
753
+ <SelectTrigger className="h-6 min-w-0 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-1.5 text-[11px] shadow-none focus:ring-1 focus:ring-[var(--design-editor-accent-color)]">
198
754
  <SelectValue />
199
755
  </SelectTrigger>
200
756
  <SelectContent>
201
757
  {options.map((opt) => (
202
- <SelectItem key={opt.value} value={opt.value} className="text-xs">
758
+ <SelectItem
759
+ key={opt.value}
760
+ value={opt.value}
761
+ className="text-[11px]"
762
+ >
203
763
  {opt.label}
204
764
  </SelectItem>
205
765
  ))}
@@ -228,10 +788,8 @@ function PropSlider({
228
788
  unit?: string;
229
789
  }) {
230
790
  return (
231
- <div className="flex items-center gap-2">
232
- <Label className="text-xs text-muted-foreground w-20 shrink-0">
233
- {label}
234
- </Label>
791
+ <div className="flex items-center gap-1.5">
792
+ <FieldLabel>{label}</FieldLabel>
235
793
  <Slider
236
794
  value={[value]}
237
795
  onValueChange={([v]) => onChange(v)}
@@ -240,7 +798,7 @@ function PropSlider({
240
798
  step={step}
241
799
  className="flex-1"
242
800
  />
243
- <span className="text-xs text-muted-foreground w-12 text-right tabular-nums">
801
+ <span className="w-12 text-right text-[11px] tabular-nums text-muted-foreground">
244
802
  {value}
245
803
  {unit}
246
804
  </span>
@@ -248,55 +806,65 @@ function PropSlider({
248
806
  );
249
807
  }
250
808
 
251
- function SectionTitle({ children }: { children: React.ReactNode }) {
252
- return (
253
- <h3 className="text-[11px] font-semibold uppercase tracking-wider text-muted-foreground mb-2">
254
- {children}
255
- </h3>
256
- );
257
- }
809
+ const EmptyScrubIcon = () => null;
258
810
 
259
- function FourSideCell({
260
- side,
261
- placeholder,
262
- value,
263
- onChange,
811
+ function PanelSection({
812
+ title,
813
+ actions,
814
+ children,
264
815
  }: {
265
- side: string;
266
- placeholder: string;
267
- value: string;
268
- onChange: (side: string, value: string) => void;
816
+ title: string;
817
+ actions?: ReactNode;
818
+ children?: ReactNode;
269
819
  }) {
270
- const [draft, setDraft] = useState(value);
271
- useEffect(() => {
272
- setDraft(value);
273
- }, [value]);
820
+ const [collapsed, setCollapsed] = useState(false);
274
821
 
275
- const commit = () => {
276
- const next = normalizeLengthValue(draft, "px");
277
- if (next !== draft) setDraft(next);
278
- if (next !== value) onChange(side, next);
279
- };
822
+ return (
823
+ <section className="shrink-0 border-b border-border/90">
824
+ <div className="flex min-h-8 items-center gap-2 px-3 pt-1.5">
825
+ <button
826
+ type="button"
827
+ className="flex min-w-0 flex-1 cursor-pointer items-center gap-1 truncate bg-transparent text-left"
828
+ onClick={() => setCollapsed((c) => !c)}
829
+ aria-expanded={!collapsed}
830
+ >
831
+ {collapsed ? (
832
+ <IconChevronRight className="size-3 shrink-0 text-muted-foreground" />
833
+ ) : (
834
+ <IconChevronDown className="size-3 shrink-0 text-muted-foreground" />
835
+ )}
836
+ <h3 className="min-w-0 flex-1 truncate text-xs font-semibold text-foreground">
837
+ {title}
838
+ </h3>
839
+ </button>
840
+ {actions ? (
841
+ <div className="flex items-center gap-0.5">{actions}</div>
842
+ ) : null}
843
+ </div>
844
+ {!collapsed && children ? (
845
+ <div className="space-y-1.5 px-3 pb-2 pt-1.5 text-[11px]">
846
+ {children}
847
+ </div>
848
+ ) : null}
849
+ </section>
850
+ );
851
+ }
280
852
 
853
+ function FieldLabel({ children }: { children: ReactNode }) {
281
854
  return (
282
- <Input
283
- value={draft}
284
- onChange={(e) => setDraft(e.target.value)}
285
- onBlur={commit}
286
- onKeyDown={(e) => {
287
- if (e.key === "Enter") {
288
- e.preventDefault();
289
- commit();
290
- (e.currentTarget as HTMLInputElement).blur();
291
- }
292
- }}
293
- placeholder={placeholder}
294
- className="h-7 text-xs text-center"
295
- />
855
+ <Label className="w-[64px] shrink-0 text-[11px] font-medium text-muted-foreground">
856
+ {children}
857
+ </Label>
858
+ );
859
+ }
860
+
861
+ function SubsectionLabel({ children }: { children: ReactNode }) {
862
+ return (
863
+ <p className="text-[11px] font-medium text-muted-foreground">{children}</p>
296
864
  );
297
865
  }
298
866
 
299
- function FourSideInput({
867
+ function FigmaSpacingControl({
300
868
  label,
301
869
  values,
302
870
  onChange,
@@ -306,39 +874,128 @@ function FourSideInput({
306
874
  onChange: (side: string, value: string) => void;
307
875
  }) {
308
876
  const t = useT();
877
+ const [linked, setLinked] = useState(() => sidesAreLinked(values));
878
+ const numeric = {
879
+ top: parseNumericValue(values.top || "0"),
880
+ right: parseNumericValue(values.right || "0"),
881
+ bottom: parseNumericValue(values.bottom || "0"),
882
+ left: parseNumericValue(values.left || "0"),
883
+ };
884
+ const linkedValue = Math.round(
885
+ (numeric.top + numeric.right + numeric.bottom + numeric.left) / 4,
886
+ );
887
+ const setSide = (
888
+ side: "Top" | "Right" | "Bottom" | "Left",
889
+ value: number,
890
+ ) => {
891
+ onChange(side, `${Math.round(value)}px`);
892
+ };
893
+ const setAll = (value: number) => {
894
+ (["Top", "Right", "Bottom", "Left"] as const).forEach((side) =>
895
+ setSide(side, value),
896
+ );
897
+ };
898
+ const linkedLabel = linked
899
+ ? t("editPanel.labels.unlinkSides")
900
+ : t("editPanel.labels.linkSides");
901
+
309
902
  return (
310
903
  <div className="space-y-1.5">
311
- <Label className="text-xs text-muted-foreground">{label}</Label>
312
- <div className="grid grid-cols-4 gap-1">
313
- <FourSideCell
314
- side="Top"
315
- placeholder={t("editPanel.sidePlaceholders.top")}
316
- value={values.top}
317
- onChange={onChange}
318
- />
319
- <FourSideCell
320
- side="Right"
321
- placeholder={t("editPanel.sidePlaceholders.right")}
322
- value={values.right}
323
- onChange={onChange}
324
- />
325
- <FourSideCell
326
- side="Bottom"
327
- placeholder={t("editPanel.sidePlaceholders.bottom")}
328
- value={values.bottom}
329
- onChange={onChange}
330
- />
331
- <FourSideCell
332
- side="Left"
333
- placeholder={t("editPanel.sidePlaceholders.left")}
334
- value={values.left}
335
- onChange={onChange}
336
- />
904
+ <div className="flex items-center justify-between gap-1.5">
905
+ <Label className="text-[11px] font-medium text-muted-foreground">
906
+ {label}
907
+ </Label>
908
+ <Tooltip>
909
+ <TooltipTrigger asChild>
910
+ <Button
911
+ type="button"
912
+ variant="ghost"
913
+ size="icon"
914
+ className="size-6 rounded-md text-muted-foreground hover:text-foreground"
915
+ onClick={() => setLinked((current) => !current)}
916
+ aria-label={linkedLabel}
917
+ >
918
+ {linked ? (
919
+ <IconLink className="size-3.5" />
920
+ ) : (
921
+ <IconUnlink className="size-3.5" />
922
+ )}
923
+ </Button>
924
+ </TooltipTrigger>
925
+ <TooltipContent>{linkedLabel}</TooltipContent>
926
+ </Tooltip>
337
927
  </div>
928
+ {linked ? (
929
+ <ScrubInput
930
+ label={t("editPanel.labels.allSides")}
931
+ value={linkedValue}
932
+ onChange={setAll}
933
+ unit="px"
934
+ min={0}
935
+ precision={1}
936
+ labelClassName="w-16"
937
+ inputClassName="h-6"
938
+ />
939
+ ) : (
940
+ <div className="grid grid-cols-2 gap-1.5">
941
+ <ScrubInput
942
+ label={t("editPanel.sidePlaceholders.top")}
943
+ value={numeric.top}
944
+ onChange={(value) => setSide("Top", value)}
945
+ unit="px"
946
+ min={0}
947
+ precision={1}
948
+ inputClassName="h-6"
949
+ />
950
+ <ScrubInput
951
+ label={t("editPanel.sidePlaceholders.right")}
952
+ value={numeric.right}
953
+ onChange={(value) => setSide("Right", value)}
954
+ unit="px"
955
+ min={0}
956
+ precision={1}
957
+ inputClassName="h-6"
958
+ />
959
+ <ScrubInput
960
+ label={t("editPanel.sidePlaceholders.bottom")}
961
+ value={numeric.bottom}
962
+ onChange={(value) => setSide("Bottom", value)}
963
+ unit="px"
964
+ min={0}
965
+ precision={1}
966
+ inputClassName="h-6"
967
+ />
968
+ <ScrubInput
969
+ label={t("editPanel.sidePlaceholders.left")}
970
+ value={numeric.left}
971
+ onChange={(value) => setSide("Left", value)}
972
+ unit="px"
973
+ min={0}
974
+ precision={1}
975
+ inputClassName="h-6"
976
+ />
977
+ </div>
978
+ )}
338
979
  </div>
339
980
  );
340
981
  }
341
982
 
983
+ function sidesAreLinked(values: {
984
+ top: string;
985
+ right: string;
986
+ bottom: string;
987
+ left: string;
988
+ }) {
989
+ return (
990
+ parseNumericValue(values.top || "0") ===
991
+ parseNumericValue(values.right || "0") &&
992
+ parseNumericValue(values.top || "0") ===
993
+ parseNumericValue(values.bottom || "0") &&
994
+ parseNumericValue(values.top || "0") ===
995
+ parseNumericValue(values.left || "0")
996
+ );
997
+ }
998
+
342
999
  const FONT_FAMILY_OPTIONS = [
343
1000
  { value: "inherit", key: "inherit" },
344
1001
  { value: "sans-serif", key: "sansSerif" },
@@ -362,224 +1019,1041 @@ const FONT_WEIGHT_OPTIONS = [
362
1019
  { value: "900", key: "black" },
363
1020
  ] as const;
364
1021
 
365
- const TEXT_ALIGN_OPTIONS = [
366
- { value: "left", key: "left" },
367
- { value: "center", key: "center" },
368
- { value: "right", key: "right" },
369
- { value: "justify", key: "justify" },
370
- ] as const;
371
- const FLEX_DIRECTION_OPTIONS = [
372
- { value: "row", key: "row" },
373
- { value: "column", key: "column" },
374
- { value: "row-reverse", key: "rowReverse" },
375
- { value: "column-reverse", key: "columnReverse" },
376
- ] as const;
377
- const JUSTIFY_OPTIONS = [
378
- { value: "flex-start", key: "start" },
379
- { value: "center", key: "center" },
380
- { value: "flex-end", key: "end" },
381
- { value: "space-between", key: "between" },
382
- { value: "space-around", key: "around" },
383
- { value: "space-evenly", key: "evenly" },
384
- ] as const;
385
- const ALIGN_OPTIONS = [
1022
+ const ALIGN_SELF_OPTIONS = [
1023
+ { value: "auto", key: "auto" },
386
1024
  { value: "flex-start", key: "start" },
387
1025
  { value: "center", key: "center" },
388
1026
  { value: "flex-end", key: "end" },
389
1027
  { value: "stretch", key: "stretch" },
390
1028
  { value: "baseline", key: "baseline" },
391
1029
  ] as const;
1030
+ const STROKE_POSITION_OPTIONS = [
1031
+ { value: "inside", key: "inside" },
1032
+ { value: "center", key: "center" },
1033
+ { value: "outside", key: "outside" },
1034
+ ] as const;
1035
+ const BLEND_MODE_OPTIONS = [
1036
+ { value: "normal", label: "Normal" },
1037
+ { value: "multiply", label: "Multiply" },
1038
+ { value: "screen", label: "Screen" },
1039
+ { value: "overlay", label: "Overlay" },
1040
+ { value: "darken", label: "Darken" },
1041
+ { value: "lighten", label: "Lighten" },
1042
+ { value: "color-dodge", label: "Color dodge" }, // i18n-ignore Figma blend mode label
1043
+ { value: "color-burn", label: "Color burn" }, // i18n-ignore Figma blend mode label
1044
+ { value: "hard-light", label: "Hard light" }, // i18n-ignore Figma blend mode label
1045
+ { value: "soft-light", label: "Soft light" }, // i18n-ignore Figma blend mode label
1046
+ { value: "difference", label: "Difference" },
1047
+ { value: "exclusion", label: "Exclusion" },
1048
+ { value: "hue", label: "Hue" },
1049
+ { value: "saturation", label: "Saturation" },
1050
+ { value: "color", label: "Color" },
1051
+ { value: "luminosity", label: "Luminosity" },
1052
+ ] as const;
392
1053
 
393
1054
  function parseNumericValue(value: string): number {
394
1055
  return parseFloat(value) || 0;
395
1056
  }
396
1057
 
397
- /** Page-level properties when nothing is selected */
398
- function PageProperties({
399
- styles,
400
- onStyleChange,
401
- }: {
402
- styles: Record<string, string>;
403
- onStyleChange: (property: string, value: string) => void;
404
- }) {
405
- const t = useT();
406
- const fontFamilyOptions = FONT_FAMILY_OPTIONS.map((option) => ({
407
- value: option.value,
408
- label: t(`editPanel.fontFamilies.${option.key}`),
409
- }));
410
- const fontFamily = FONT_FAMILY_OPTIONS.some(
411
- (option) => option.value === styles.fontFamily,
412
- )
413
- ? styles.fontFamily
414
- : "sans-serif";
415
-
416
- return (
417
- <div className="space-y-4">
418
- {/* Lead with a clear CTA so users discover the much richer per-element
419
- panel. Without this it's easy to mistake the 3 page-level fields for
420
- "the entire editor" — the cause of the "controls too limited"
421
- feedback. */}
422
- <div className="rounded-lg border border-border/70 bg-accent/30 p-3 text-xs text-muted-foreground/90 leading-relaxed">
423
- <p className="font-medium text-foreground/85 mb-1 flex items-center gap-1.5">
424
- <IconPointer className="w-3.5 h-3.5" />
425
- {t("editPanel.pageHelpTitle")}
426
- </p>
427
- <p>{t("editPanel.pageHelpDescription")}</p>
428
- </div>
1058
+ function parseRotationValue(transform: string | undefined): number {
1059
+ const match = transform?.match(/rotate\((-?\d+(?:\.\d+)?)deg\)/);
1060
+ return match ? Number(match[1]) : 0;
1061
+ }
429
1062
 
430
- <SectionTitle>{t("editPanel.sections.page")}</SectionTitle>
431
- <ColorInput
432
- label={t("editPanel.labels.background")}
433
- value={styles.backgroundColor || ""}
434
- onChange={(v) => onStyleChange("backgroundColor", v)}
435
- />
436
- <PropSelect
437
- label={t("editPanel.labels.font")}
438
- value={fontFamily}
439
- onChange={(v) => onStyleChange("fontFamily", v)}
440
- options={fontFamilyOptions}
441
- />
442
- <PropInput
443
- label={t("editPanel.labels.baseSize")}
444
- value={styles.fontSize || "16px"}
445
- onChange={(v) => onStyleChange("fontSize", v)}
446
- placeholder="16px"
447
- defaultUnit="px"
448
- />
449
- </div>
450
- );
1063
+ function mergeRotationValue(transform: string | undefined, degrees: number) {
1064
+ const nextRotate = `rotate(${Math.round(degrees * 10) / 10}deg)`;
1065
+ if (!transform || transform === "none") return nextRotate;
1066
+ if (/rotate\((-?\d+(?:\.\d+)?)deg\)/.test(transform)) {
1067
+ return transform.replace(/rotate\((-?\d+(?:\.\d+)?)deg\)/, nextRotate);
1068
+ }
1069
+ return `${transform} ${nextRotate}`;
451
1070
  }
452
1071
 
453
- /** Text element properties */
454
- function TextProperties({
455
- element,
456
- onStyleChange,
1072
+ function ScrubStyleInput({
1073
+ label,
1074
+ value,
1075
+ placeholder,
1076
+ onChange,
1077
+ unit = "px",
1078
+ min,
1079
+ max,
1080
+ step = 1,
1081
+ labelClassName,
1082
+ inputClassName,
1083
+ hideIcon = true,
457
1084
  }: {
458
- element: ElementInfo;
459
- onStyleChange: (property: string, value: string) => void;
1085
+ label: string;
1086
+ value: string;
1087
+ placeholder?: number;
1088
+ onChange: (value: number) => void;
1089
+ unit?: string;
1090
+ min?: number;
1091
+ max?: number;
1092
+ step?: number;
1093
+ labelClassName?: string;
1094
+ inputClassName?: string;
1095
+ hideIcon?: boolean;
460
1096
  }) {
461
- const t = useT();
462
- const styles = element.computedStyles;
463
- const fontFamilyOptions = FONT_FAMILY_OPTIONS.map((option) => ({
464
- value: option.value,
465
- label: t(`editPanel.fontFamilies.${option.key}`),
466
- }));
467
- const fontWeightOptions = FONT_WEIGHT_OPTIONS.map((option) => ({
468
- value: option.value,
469
- label: t(`editPanel.fontWeights.${option.key}`),
470
- }));
471
- const textAlignOptions = TEXT_ALIGN_OPTIONS.map((option) => ({
472
- value: option.value,
473
- label: t(`editPanel.textAligns.${option.key}`),
474
- }));
475
-
476
1097
  return (
477
- <div className="space-y-4">
478
- <SectionTitle>{t("editPanel.sections.typography")}</SectionTitle>
479
- <PropSelect
480
- label={t("editPanel.labels.font")}
481
- value={styles.fontFamily || "sans-serif"}
482
- onChange={(v) => onStyleChange("fontFamily", v)}
483
- options={fontFamilyOptions}
484
- />
485
- <PropInput
486
- label={t("editPanel.labels.size")}
487
- value={styles.fontSize || ""}
488
- onChange={(v) => onStyleChange("fontSize", v)}
489
- placeholder="16px"
490
- defaultUnit="px"
491
- />
492
- <PropSelect
493
- label={t("editPanel.labels.weight")}
494
- value={styles.fontWeight || "400"}
495
- onChange={(v) => onStyleChange("fontWeight", v)}
496
- options={fontWeightOptions}
497
- />
498
- <ColorInput
499
- label={t("editPanel.labels.color")}
500
- value={styles.color || ""}
501
- onChange={(v) => onStyleChange("color", v)}
502
- />
503
- <PropSelect
504
- label={t("editPanel.labels.align")}
505
- value={styles.textAlign || "left"}
506
- onChange={(v) => onStyleChange("textAlign", v)}
507
- options={textAlignOptions}
508
- />
509
- <PropInput
510
- label={t("editPanel.labels.lineHeight")}
511
- value={styles.lineHeight || ""}
512
- onChange={(v) => onStyleChange("lineHeight", v)}
513
- placeholder="1.5"
514
- />
515
- <PropInput
516
- label={t("editPanel.labels.tracking")}
517
- value={styles.letterSpacing || ""}
518
- onChange={(v) => onStyleChange("letterSpacing", v)}
519
- placeholder="0px"
520
- defaultUnit="px"
521
- />
522
- </div>
1098
+ <ScrubInput
1099
+ label={label}
1100
+ icon={hideIcon ? EmptyScrubIcon : undefined}
1101
+ value={value ? parseNumericValue(value) : (placeholder ?? 0)}
1102
+ onChange={onChange}
1103
+ unit={unit}
1104
+ min={min}
1105
+ max={max}
1106
+ step={step}
1107
+ precision={1}
1108
+ className="gap-0"
1109
+ labelClassName={cn(
1110
+ "h-6 w-7 justify-center gap-0 rounded-l-md border border-r-0 border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] text-[11px] tabular-nums",
1111
+ labelClassName,
1112
+ )}
1113
+ inputClassName={cn(
1114
+ "h-6 rounded-l-none rounded-r-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] shadow-none focus-visible:ring-1 focus-visible:ring-[var(--design-editor-accent-color)]",
1115
+ inputClassName,
1116
+ )}
1117
+ />
523
1118
  );
524
1119
  }
525
1120
 
526
- /** Flex container/child properties */
527
- function FlexProperties({
528
- element,
529
- onStyleChange,
530
- }: {
531
- element: ElementInfo;
532
- onStyleChange: (property: string, value: string) => void;
533
- }) {
534
- const t = useT();
535
- const styles = element.computedStyles;
536
- const flexDirectionOptions = FLEX_DIRECTION_OPTIONS.map((option) => ({
537
- value: option.value,
538
- label: t(`editPanel.flexDirections.${option.key}`),
539
- }));
540
- const justifyOptions = JUSTIFY_OPTIONS.map((option) => ({
541
- value: option.value,
542
- label: t(`editPanel.justifyOptions.${option.key}`),
543
- }));
544
- const alignOptions = ALIGN_OPTIONS.map((option) => ({
545
- value: option.value,
546
- label: t(`editPanel.alignOptions.${option.key}`),
547
- }));
1121
+ function commitStylePatch(
1122
+ styles: Record<string, string>,
1123
+ onStyleChange: (property: string, value: string) => void,
1124
+ onStylesChange?: (styles: Record<string, string>) => void,
1125
+ ) {
1126
+ if (onStylesChange) {
1127
+ onStylesChange(styles);
1128
+ return;
1129
+ }
1130
+ Object.entries(styles).forEach(([property, value]) => {
1131
+ onStyleChange(property, value);
1132
+ });
1133
+ }
548
1134
 
549
- return (
550
- <div className="space-y-4">
551
- <SectionTitle>{t("editPanel.sections.flexLayout")}</SectionTitle>
552
- <PropSelect
553
- label={t("editPanel.labels.direction")}
554
- value={styles.flexDirection || "row"}
555
- onChange={(v) => onStyleChange("flexDirection", v)}
556
- options={flexDirectionOptions}
557
- />
558
- <PropSelect
559
- label={t("editPanel.labels.justify")}
560
- value={styles.justifyContent || "flex-start"}
561
- onChange={(v) => onStyleChange("justifyContent", v)}
562
- options={justifyOptions}
563
- />
564
- <PropSelect
565
- label={t("editPanel.labels.align")}
566
- value={styles.alignItems || "stretch"}
567
- onChange={(v) => onStyleChange("alignItems", v)}
568
- options={alignOptions}
569
- />
570
- <PropInput
571
- label={t("editPanel.labels.gap")}
572
- value={styles.gap || ""}
573
- onChange={(v) => onStyleChange("gap", v)}
574
- placeholder="0px"
575
- defaultUnit="px"
1135
+ function optionValue<T extends readonly { value: string }[]>(
1136
+ options: T,
1137
+ value: string | undefined,
1138
+ fallback: T[number]["value"],
1139
+ ) {
1140
+ return options.some((option) => option.value === value) ? value! : fallback;
1141
+ }
1142
+
1143
+ function cssLengthNumber(value: string | undefined, fallback = 0): number {
1144
+ const parsed = parseFloat(value || "");
1145
+ return Number.isFinite(parsed) ? parsed : fallback;
1146
+ }
1147
+
1148
+ function cssColorOrFallback(value: string | undefined, fallback: string) {
1149
+ const normalized = value?.trim();
1150
+ if (
1151
+ !normalized ||
1152
+ normalized === "transparent" ||
1153
+ normalized === "rgba(0, 0, 0, 0)"
1154
+ ) {
1155
+ return fallback;
1156
+ }
1157
+ return normalized;
1158
+ }
1159
+
1160
+ function strokeIsVisible(width: string | undefined, style: string | undefined) {
1161
+ return cssLengthNumber(width) > 0 && style !== "none";
1162
+ }
1163
+
1164
+ function swatchStyle(value: string | undefined) {
1165
+ return {
1166
+ background:
1167
+ value && value !== "none"
1168
+ ? value
1169
+ : "linear-gradient(135deg, hsl(var(--muted)) 0 45%, hsl(var(--border)) 45% 55%, hsl(var(--muted)) 55% 100%)",
1170
+ };
1171
+ }
1172
+
1173
+ function compactCssValue(value: string | undefined, fallback: string) {
1174
+ const normalized = value?.trim();
1175
+ if (!normalized || normalized === "none") return fallback;
1176
+ return normalized;
1177
+ }
1178
+
1179
+ function colorHasVisibleAlpha(value: string | undefined): boolean {
1180
+ const parsed = parseCssColor(value || "");
1181
+ if (!parsed) return Boolean(value && value !== "transparent");
1182
+ return parsed.a > 0;
1183
+ }
1184
+
1185
+ function inspectorObjectTitle(element: ElementInfo): string {
1186
+ const tag = element.tagName || "element";
1187
+ if (TEXT_TAGS.has(tag)) return "Text";
1188
+ if (tag === "section") return "Section";
1189
+ if (tag === "img" || tag === "video" || tag === "picture") return "Image";
1190
+ if (tag === "button" || tag === "a") return "Button";
1191
+ if (tag === "svg" || tag === "path") return "Vector";
1192
+ if (element.isFlexContainer || tag === "div" || tag === "main") {
1193
+ return "Frame";
1194
+ }
1195
+ return tag.charAt(0).toUpperCase() + tag.slice(1);
1196
+ }
1197
+
1198
+ function displayLabel(value: string | undefined): string {
1199
+ const normalized = value?.trim();
1200
+ if (!normalized || normalized === "normal") return "flow";
1201
+ return normalized;
1202
+ }
1203
+
1204
+ function justifyToHorizontal(
1205
+ value: string | undefined,
1206
+ ): AlignmentMatrixValue["horizontal"] {
1207
+ if (value === "center") return "center";
1208
+ if (value === "flex-end" || value === "end" || value === "right") {
1209
+ return "right";
1210
+ }
1211
+ return "left";
1212
+ }
1213
+
1214
+ function alignToVertical(
1215
+ value: string | undefined,
1216
+ ): AlignmentMatrixValue["vertical"] {
1217
+ if (value === "center") return "middle";
1218
+ if (value === "flex-end" || value === "end" || value === "bottom") {
1219
+ return "bottom";
1220
+ }
1221
+ return "top";
1222
+ }
1223
+
1224
+ function horizontalToJustify(
1225
+ value: AlignmentMatrixValue["horizontal"],
1226
+ ): string {
1227
+ if (value === "center") return "center";
1228
+ if (value === "right") return "flex-end";
1229
+ return "flex-start";
1230
+ }
1231
+
1232
+ function verticalToAlign(value: AlignmentMatrixValue["vertical"]): string {
1233
+ if (value === "middle") return "center";
1234
+ if (value === "bottom") return "flex-end";
1235
+ return "flex-start";
1236
+ }
1237
+
1238
+ function autoLayoutAlignmentFromStyles(
1239
+ styles: Record<string, string>,
1240
+ direction: AutoLayoutMatrixValue["direction"],
1241
+ ): AlignmentMatrixValue {
1242
+ if (direction === "vertical") {
1243
+ return {
1244
+ horizontal: justifyToHorizontal(styles.alignItems),
1245
+ vertical: alignToVertical(styles.justifyContent),
1246
+ };
1247
+ }
1248
+ return {
1249
+ horizontal: justifyToHorizontal(styles.justifyContent),
1250
+ vertical: alignToVertical(styles.alignItems),
1251
+ };
1252
+ }
1253
+
1254
+ function isParentFlex(element: ElementInfo): boolean {
1255
+ return (
1256
+ element.isFlexChild ||
1257
+ Boolean(element.parentDisplay?.toLowerCase().includes("flex"))
1258
+ );
1259
+ }
1260
+
1261
+ function isParentGrid(element: ElementInfo): boolean {
1262
+ return Boolean(element.parentDisplay?.toLowerCase().includes("grid"));
1263
+ }
1264
+
1265
+ function parentFlexDirection(element: ElementInfo): AutoLayoutSizingAxis {
1266
+ return element.parentLayout?.flexDirection?.includes("column")
1267
+ ? "vertical"
1268
+ : "horizontal";
1269
+ }
1270
+
1271
+ function availableSizingForElement(
1272
+ element: ElementInfo,
1273
+ ): Partial<Record<AutoLayoutSizingAxis, AutoLayoutSizing[]>> {
1274
+ const options: AutoLayoutSizing[] =
1275
+ isParentFlex(element) || isParentGrid(element)
1276
+ ? ["hug", "fill", "fixed"]
1277
+ : ["hug", "fixed"];
1278
+ return {
1279
+ horizontal: options,
1280
+ vertical: options,
1281
+ };
1282
+ }
1283
+
1284
+ function inferElementSizing(
1285
+ element: ElementInfo,
1286
+ axis: AutoLayoutSizingAxis,
1287
+ ): AutoLayoutSizing {
1288
+ const styles = element.computedStyles;
1289
+ const size = axis === "horizontal" ? styles.width : styles.height;
1290
+ const parentDirection = parentFlexDirection(element);
1291
+ const isMainFlexAxis = isParentFlex(element) && parentDirection === axis;
1292
+
1293
+ if (
1294
+ size === "100%" ||
1295
+ (isMainFlexAxis && Number.parseFloat(styles.flexGrow || "0") > 0)
1296
+ ) {
1297
+ return "fill";
1298
+ }
1299
+ if (size === "auto" || size === "fit-content" || size === "max-content") {
1300
+ return "hug";
1301
+ }
1302
+ return "fixed";
1303
+ }
1304
+
1305
+ function commitElementSizing(
1306
+ element: ElementInfo,
1307
+ axis: AutoLayoutSizingAxis,
1308
+ sizing: AutoLayoutSizing,
1309
+ onStyleChange: (property: string, value: string) => void,
1310
+ onStylesChange?: (styles: Record<string, string>) => void,
1311
+ ) {
1312
+ const isHorizontal = axis === "horizontal";
1313
+ const sizeProperty = isHorizontal ? "width" : "height";
1314
+ const resolvedSize = Math.max(
1315
+ 1,
1316
+ Math.round(
1317
+ isHorizontal ? element.boundingRect.width : element.boundingRect.height,
1318
+ ),
1319
+ );
1320
+ const parentDirection = parentFlexDirection(element);
1321
+ const isFlex = isParentFlex(element);
1322
+ const isGrid = isParentGrid(element);
1323
+ const isMainFlexAxis = isFlex && parentDirection === axis;
1324
+ const patch: Record<string, string> = {};
1325
+
1326
+ if (sizing === "fixed") {
1327
+ patch[sizeProperty] = `${resolvedSize}px`;
1328
+ if (isMainFlexAxis) {
1329
+ patch.flexGrow = "0";
1330
+ patch.flexShrink = "0";
1331
+ patch.flexBasis = "auto";
1332
+ }
1333
+ } else if (sizing === "fill") {
1334
+ if (isMainFlexAxis) {
1335
+ patch[sizeProperty] = "auto";
1336
+ patch.flexGrow = "1";
1337
+ patch.flexShrink = "1";
1338
+ patch.flexBasis = "0px";
1339
+ } else {
1340
+ patch[sizeProperty] = "100%";
1341
+ if (isFlex) patch.alignSelf = "stretch";
1342
+ if (isGrid) patch[isHorizontal ? "justifySelf" : "alignSelf"] = "stretch";
1343
+ }
1344
+ } else {
1345
+ patch[sizeProperty] = "auto";
1346
+ if (isMainFlexAxis) {
1347
+ patch.flexGrow = "0";
1348
+ patch.flexShrink = "1";
1349
+ patch.flexBasis = "auto";
1350
+ }
1351
+ }
1352
+
1353
+ commitStylePatch(patch, onStyleChange, onStylesChange);
1354
+ }
1355
+
1356
+ function elementTypeIcon(element: ElementInfo) {
1357
+ const tag = element.tagName || "element";
1358
+ if (TEXT_TAGS.has(tag)) return IconTypography;
1359
+ if (tag === "img" || tag === "video" || tag === "picture") return IconPhoto;
1360
+ if (tag === "svg" || tag === "path") return IconVector;
1361
+ if (tag === "button" || tag === "a") return IconComponents;
1362
+ return IconFrame;
1363
+ }
1364
+
1365
+ function SelectionHeader({ element }: { element: ElementInfo | null }) {
1366
+ if (!element) return null;
1367
+
1368
+ const title = inspectorObjectTitle(element);
1369
+ const TypeIcon = elementTypeIcon(element);
1370
+
1371
+ return (
1372
+ <div className="flex min-h-8 shrink-0 items-center justify-between gap-2 border-b border-border/90 px-3">
1373
+ <div className="flex min-w-0 items-center gap-1.5 text-left text-[13px] font-semibold text-foreground">
1374
+ <TypeIcon className="size-3.5 shrink-0 text-muted-foreground" />
1375
+ <span className="truncate">{title}</span>
1376
+ </div>
1377
+ </div>
1378
+ );
1379
+ }
1380
+
1381
+ function InspectorTabsHeader({
1382
+ activeTab,
1383
+ onActiveTabChange,
1384
+ }: {
1385
+ activeTab: InspectorTab;
1386
+ onActiveTabChange: (tab: InspectorTab) => void;
1387
+ }) {
1388
+ const t = useT();
1389
+
1390
+ return (
1391
+ <div className="flex min-h-8 shrink-0 items-center justify-between border-b border-border/90 px-3">
1392
+ <Tabs
1393
+ value={activeTab}
1394
+ onValueChange={(value) => onActiveTabChange(value as InspectorTab)}
1395
+ >
1396
+ <TabsList className="h-7 justify-start gap-1 rounded-none bg-transparent p-0">
1397
+ <TabsTrigger
1398
+ value="design"
1399
+ className="h-6 rounded-md px-2.5 text-[11px] font-semibold text-muted-foreground shadow-none transition-colors hover:text-foreground data-[state=active]:bg-[var(--design-editor-panel-raised-bg)] data-[state=active]:text-foreground data-[state=active]:shadow-none"
1400
+ >
1401
+ {"Design" /* i18n-ignore Figma inspector tab */}
1402
+ </TabsTrigger>
1403
+ <TabsTrigger
1404
+ value="tweaks"
1405
+ className="h-6 rounded-md px-2.5 text-[11px] font-semibold text-muted-foreground shadow-none transition-colors hover:text-foreground data-[state=active]:bg-[var(--design-editor-panel-raised-bg)] data-[state=active]:text-foreground data-[state=active]:shadow-none"
1406
+ >
1407
+ {t("designEditor.tweaks")}
1408
+ </TabsTrigger>
1409
+ <TabsTrigger
1410
+ value="extensions"
1411
+ className="h-6 rounded-md px-2.5 text-[11px] font-semibold text-muted-foreground shadow-none transition-colors hover:text-foreground data-[state=active]:bg-[var(--design-editor-panel-raised-bg)] data-[state=active]:text-foreground data-[state=active]:shadow-none"
1412
+ >
1413
+ {t("designEditor.extensions")}
1414
+ </TabsTrigger>
1415
+ </TabsList>
1416
+ </Tabs>
1417
+ </div>
1418
+ );
1419
+ }
1420
+
1421
+ function SectionIconButton({
1422
+ label,
1423
+ onClick,
1424
+ children,
1425
+ disabled = false,
1426
+ }: {
1427
+ label: string;
1428
+ onClick?: () => void;
1429
+ children: ReactNode;
1430
+ disabled?: boolean;
1431
+ }) {
1432
+ return (
1433
+ <Tooltip>
1434
+ <TooltipTrigger asChild>
1435
+ <Button
1436
+ type="button"
1437
+ variant="ghost"
1438
+ size="icon"
1439
+ className="size-6 cursor-pointer rounded-md text-muted-foreground hover:text-foreground disabled:cursor-not-allowed"
1440
+ disabled={disabled}
1441
+ onClick={onClick}
1442
+ aria-label={label}
1443
+ >
1444
+ {children}
1445
+ </Button>
1446
+ </TooltipTrigger>
1447
+ <TooltipContent>{label}</TooltipContent>
1448
+ </Tooltip>
1449
+ );
1450
+ }
1451
+
1452
+ function InspectorIconButton({
1453
+ label,
1454
+ active,
1455
+ onClick,
1456
+ children,
1457
+ }: {
1458
+ label: string;
1459
+ active?: boolean;
1460
+ onClick?: () => void;
1461
+ children: ReactNode;
1462
+ }) {
1463
+ return (
1464
+ <Tooltip>
1465
+ <TooltipTrigger asChild>
1466
+ <Button
1467
+ type="button"
1468
+ variant="ghost"
1469
+ size="icon"
1470
+ className={cn(
1471
+ "h-6 min-w-6 cursor-pointer rounded-none border-r border-border/50 text-muted-foreground first:rounded-l-md last:rounded-r-md last:border-r-0 hover:bg-[var(--design-editor-panel-raised-bg)] hover:text-foreground disabled:cursor-not-allowed",
1472
+ active &&
1473
+ "bg-[var(--design-editor-panel-bg)] text-[var(--design-editor-accent-color)] shadow-[inset_0_0_0_1px_var(--design-editor-control-border)]",
1474
+ )}
1475
+ onClick={onClick}
1476
+ aria-label={label}
1477
+ >
1478
+ {children}
1479
+ </Button>
1480
+ </TooltipTrigger>
1481
+ <TooltipContent>{label}</TooltipContent>
1482
+ </Tooltip>
1483
+ );
1484
+ }
1485
+
1486
+ function InspectorSegment({ children }: { children: ReactNode }) {
1487
+ return (
1488
+ <div className="flex min-w-0 overflow-hidden rounded-md bg-[var(--design-editor-control-bg)]">
1489
+ {children}
1490
+ </div>
1491
+ );
1492
+ }
1493
+
1494
+ function sizingModeLabel(mode: AutoLayoutSizing): string {
1495
+ if (mode === "hug") return "Hug"; // i18n-ignore Figma inspector sizing mode
1496
+ if (mode === "fill") return "Fill"; // i18n-ignore Figma inspector sizing mode
1497
+ return "Fixed"; // i18n-ignore Figma inspector sizing mode
1498
+ }
1499
+
1500
+ function SizingModeButton({
1501
+ axis,
1502
+ value,
1503
+ resolvedSize,
1504
+ options,
1505
+ onChange,
1506
+ }: {
1507
+ axis: "W" | "H";
1508
+ value: AutoLayoutSizing;
1509
+ resolvedSize: number;
1510
+ options: AutoLayoutSizing[];
1511
+ onChange: (value: AutoLayoutSizing) => void;
1512
+ }) {
1513
+ const validOptions = options.includes(value) ? options : [...options, value];
1514
+ const currentIndex = validOptions.indexOf(value);
1515
+ const nextValue =
1516
+ validOptions[(currentIndex + 1) % validOptions.length] ?? "fixed";
1517
+ const label = `${axis} ${sizingModeLabel(value)}`;
1518
+
1519
+ return (
1520
+ <Tooltip>
1521
+ <TooltipTrigger asChild>
1522
+ <Button
1523
+ type="button"
1524
+ variant="ghost"
1525
+ aria-label={label}
1526
+ onClick={() => onChange(nextValue)}
1527
+ className="h-6 justify-start rounded-md bg-[var(--design-editor-control-bg)] px-0 text-[11px] font-normal text-foreground hover:bg-[var(--design-editor-panel-raised-bg)]"
1528
+ >
1529
+ <span className="flex h-full w-6 shrink-0 items-center justify-center rounded-l-md border-r border-border/60 text-muted-foreground">
1530
+ {axis}
1531
+ </span>
1532
+ <span className="min-w-0 flex-1 truncate px-1 text-left tabular-nums text-muted-foreground">
1533
+ {Math.round(resolvedSize)}
1534
+ </span>
1535
+ <span className="flex h-full min-w-8 items-center justify-center border-l border-border/60 px-1.5 font-medium text-foreground">
1536
+ {sizingModeLabel(value)}
1537
+ </span>
1538
+ </Button>
1539
+ </TooltipTrigger>
1540
+ <TooltipContent>{label}</TooltipContent>
1541
+ </Tooltip>
1542
+ );
1543
+ }
1544
+
1545
+ function CornerRadiusControl({
1546
+ styles,
1547
+ onStyleChange,
1548
+ }: {
1549
+ styles: Record<string, string>;
1550
+ onStyleChange: (property: string, value: string) => void;
1551
+ }) {
1552
+ const t = useT();
1553
+ const independentCornersLabel = t("editPanel.labels.independentCorners");
1554
+ const radius = cssLengthNumber(styles.borderRadius || "0");
1555
+ const corners = {
1556
+ topLeft: cssLengthNumber(styles.borderTopLeftRadius || styles.borderRadius),
1557
+ topRight: cssLengthNumber(
1558
+ styles.borderTopRightRadius || styles.borderRadius,
1559
+ ),
1560
+ bottomRight: cssLengthNumber(
1561
+ styles.borderBottomRightRadius || styles.borderRadius,
1562
+ ),
1563
+ bottomLeft: cssLengthNumber(
1564
+ styles.borderBottomLeftRadius || styles.borderRadius,
1565
+ ),
1566
+ };
1567
+
1568
+ return (
1569
+ <div className="grid grid-cols-[1fr_auto] items-center gap-1.5">
1570
+ <ScrubInput
1571
+ label={t("editPanel.labels.cornerRadius")}
1572
+ value={radius}
1573
+ onChange={(value) =>
1574
+ onStyleChange("borderRadius", `${Math.max(0, Math.round(value))}px`)
1575
+ }
1576
+ unit="px"
1577
+ min={0}
1578
+ precision={1}
1579
+ labelClassName="w-24"
1580
+ inputClassName="h-6"
576
1581
  />
1582
+ <Popover>
1583
+ <Tooltip>
1584
+ <TooltipTrigger asChild>
1585
+ <PopoverTrigger asChild>
1586
+ <Button
1587
+ type="button"
1588
+ variant="outline"
1589
+ size="icon"
1590
+ className="size-6 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)]"
1591
+ aria-label={independentCornersLabel}
1592
+ >
1593
+ <IconMaximize className="size-3.5" />
1594
+ </Button>
1595
+ </PopoverTrigger>
1596
+ </TooltipTrigger>
1597
+ <TooltipContent>{independentCornersLabel}</TooltipContent>
1598
+ </Tooltip>
1599
+ <PopoverContent
1600
+ side="left"
1601
+ align="start"
1602
+ sideOffset={8}
1603
+ className="w-64 p-3"
1604
+ >
1605
+ <div className="space-y-2">
1606
+ <p className="text-xs font-semibold text-foreground">
1607
+ {independentCornersLabel}
1608
+ </p>
1609
+ <div className="grid grid-cols-2 gap-2">
1610
+ <ScrubInput
1611
+ label={t("editPanel.labels.topLeft")}
1612
+ value={corners.topLeft}
1613
+ onChange={(value) =>
1614
+ onStyleChange(
1615
+ "borderTopLeftRadius",
1616
+ `${Math.max(0, Math.round(value))}px`,
1617
+ )
1618
+ }
1619
+ unit="px"
1620
+ min={0}
1621
+ precision={1}
1622
+ inputClassName="h-6"
1623
+ />
1624
+ <ScrubInput
1625
+ label={t("editPanel.labels.topRight")}
1626
+ value={corners.topRight}
1627
+ onChange={(value) =>
1628
+ onStyleChange(
1629
+ "borderTopRightRadius",
1630
+ `${Math.max(0, Math.round(value))}px`,
1631
+ )
1632
+ }
1633
+ unit="px"
1634
+ min={0}
1635
+ precision={1}
1636
+ inputClassName="h-6"
1637
+ />
1638
+ <ScrubInput
1639
+ label={t("editPanel.labels.bottomLeft")}
1640
+ value={corners.bottomLeft}
1641
+ onChange={(value) =>
1642
+ onStyleChange(
1643
+ "borderBottomLeftRadius",
1644
+ `${Math.max(0, Math.round(value))}px`,
1645
+ )
1646
+ }
1647
+ unit="px"
1648
+ min={0}
1649
+ precision={1}
1650
+ inputClassName="h-6"
1651
+ />
1652
+ <ScrubInput
1653
+ label={t("editPanel.labels.bottomRight")}
1654
+ value={corners.bottomRight}
1655
+ onChange={(value) =>
1656
+ onStyleChange(
1657
+ "borderBottomRightRadius",
1658
+ `${Math.max(0, Math.round(value))}px`,
1659
+ )
1660
+ }
1661
+ unit="px"
1662
+ min={0}
1663
+ precision={1}
1664
+ inputClassName="h-6"
1665
+ />
1666
+ </div>
1667
+ </div>
1668
+ </PopoverContent>
1669
+ </Popover>
1670
+ </div>
1671
+ );
1672
+ }
1673
+
1674
+ type StrokeLayerKind = "border" | "outline";
1675
+
1676
+ function StrokeLayerControl({
1677
+ kind,
1678
+ visible,
1679
+ color,
1680
+ width,
1681
+ styleValue,
1682
+ onStyleChange,
1683
+ onRemove,
1684
+ }: {
1685
+ kind: StrokeLayerKind;
1686
+ visible: boolean;
1687
+ color: string;
1688
+ width: string;
1689
+ styleValue: string;
1690
+ onStyleChange: (property: string, value: string) => void;
1691
+ onRemove: () => void;
1692
+ }) {
1693
+ const t = useT();
1694
+ const strokePositionOptions = STROKE_POSITION_OPTIONS.map((option) => ({
1695
+ value: option.value,
1696
+ label:
1697
+ option.key === "center"
1698
+ ? t("editPanel.textAligns.center")
1699
+ : t(`editPanel.labels.${option.key}`),
1700
+ }));
1701
+ const prefix = kind === "border" ? "border" : "outline";
1702
+ const position = kind === "border" ? "inside" : "outside";
1703
+
1704
+ const movePosition = (next: string) => {
1705
+ if (next === position) return;
1706
+ const nextPrefix = next === "outside" ? "outline" : "border";
1707
+ onStyleChange(`${nextPrefix}Color`, color);
1708
+ onStyleChange(`${nextPrefix}Width`, width || "1px");
1709
+ onStyleChange(
1710
+ `${nextPrefix}Style`,
1711
+ styleValue === "none" ? "solid" : styleValue,
1712
+ );
1713
+ onRemove();
1714
+ };
1715
+
1716
+ return (
1717
+ <div className="space-y-1.5">
1718
+ {/* Figma stroke row: [swatch+hex trigger (flex-1)] [eye] [remove] */}
1719
+ <div className="flex items-center gap-1.5">
1720
+ <div className="min-w-0 flex-1">
1721
+ <ColorInput
1722
+ label=""
1723
+ value={cssColorOrFallback(color, "#000000")}
1724
+ onChange={(value) => onStyleChange(`${prefix}Color`, value)}
1725
+ />
1726
+ </div>
1727
+ <SectionIconButton
1728
+ label={
1729
+ visible
1730
+ ? t("editPanel.labels.hideLayer")
1731
+ : t("editPanel.labels.showLayer")
1732
+ }
1733
+ onClick={() => {
1734
+ if (visible) {
1735
+ onStyleChange(`${prefix}Style`, "none");
1736
+ return;
1737
+ }
1738
+ onStyleChange(`${prefix}Style`, "solid");
1739
+ onStyleChange(
1740
+ `${prefix}Width`,
1741
+ width === "0px" ? "1px" : width || "1px",
1742
+ );
1743
+ }}
1744
+ >
1745
+ {visible ? (
1746
+ <IconEye className="size-3.5" />
1747
+ ) : (
1748
+ <IconEyeOff className="size-3.5" />
1749
+ )}
1750
+ </SectionIconButton>
1751
+ <SectionIconButton
1752
+ label={t("editPanel.labels.removeLayer")}
1753
+ onClick={onRemove}
1754
+ >
1755
+ <IconMinus className="size-3.5" />
1756
+ </SectionIconButton>
1757
+ </div>
1758
+ {/* Figma stroke geometry: position + weight side by side */}
1759
+ <div className="grid grid-cols-2 gap-1.5">
1760
+ <Select value={position} onValueChange={movePosition}>
1761
+ <SelectTrigger className="h-6 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-1.5 text-[11px] shadow-none focus:ring-1 focus:ring-[var(--design-editor-accent-color)]">
1762
+ <SelectValue />
1763
+ </SelectTrigger>
1764
+ <SelectContent>
1765
+ {strokePositionOptions.map((option) => (
1766
+ <SelectItem
1767
+ key={option.value}
1768
+ value={option.value}
1769
+ className="text-[11px]"
1770
+ >
1771
+ {option.label}
1772
+ </SelectItem>
1773
+ ))}
1774
+ </SelectContent>
1775
+ </Select>
1776
+ <ScrubInput
1777
+ label={t("editPanel.labels.weight")}
1778
+ ariaLabel={t("editPanel.labels.weight")}
1779
+ icon={IconBorderStyle}
1780
+ value={cssLengthNumber(width)}
1781
+ onChange={(value) =>
1782
+ onStyleChange(
1783
+ `${prefix}Width`,
1784
+ `${Math.max(0, Math.round(value))}px`,
1785
+ )
1786
+ }
1787
+ unit="px"
1788
+ min={0}
1789
+ precision={1}
1790
+ className="gap-0"
1791
+ labelClassName="h-6 w-6 justify-center gap-0 rounded-l-md border border-r-0 border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] text-[11px] [&>span]:hidden"
1792
+ inputClassName="h-6 rounded-l-none rounded-r-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] shadow-none focus-visible:ring-1 focus-visible:ring-[var(--design-editor-accent-color)]"
1793
+ />
1794
+ </div>
1795
+ </div>
1796
+ );
1797
+ }
1798
+
1799
+ interface ShadowLayer {
1800
+ id: string;
1801
+ x: number;
1802
+ y: number;
1803
+ blur: number;
1804
+ spread: number;
1805
+ color: string;
1806
+ inset: boolean;
1807
+ }
1808
+
1809
+ function defaultDropShadowLayer(index: number): ShadowLayer {
1810
+ return {
1811
+ id: `shadow-${index}`,
1812
+ x: 0,
1813
+ y: 4,
1814
+ blur: 12,
1815
+ spread: 0,
1816
+ color: "rgba(0, 0, 0, 0.25)",
1817
+ inset: false,
1818
+ };
1819
+ }
1820
+
1821
+ function parseShadowLayers(value: string | undefined): ShadowLayer[] {
1822
+ return splitCssLayers(value || "")
1823
+ .filter((layer) => layer && layer !== "none")
1824
+ .map((layer, index) => parseShadowLayer(layer, index));
1825
+ }
1826
+
1827
+ function parseShadowLayer(layer: string, index: number): ShadowLayer {
1828
+ const tokens = splitCssTokens(layer);
1829
+ const inset = tokens.includes("inset");
1830
+ const colorToken =
1831
+ tokens.find((token) => parseCssColor(token) || token === "transparent") ||
1832
+ "rgba(0, 0, 0, 0.25)";
1833
+ const numericTokens = tokens
1834
+ .filter((token) => token !== "inset" && token !== colorToken)
1835
+ .map((token) => parseFloat(token))
1836
+ .filter((value) => Number.isFinite(value));
1837
+
1838
+ return {
1839
+ id: `shadow-${index}`,
1840
+ x: numericTokens[0] ?? 0,
1841
+ y: numericTokens[1] ?? 4,
1842
+ blur: numericTokens[2] ?? 12,
1843
+ spread: numericTokens[3] ?? 0,
1844
+ color: colorToken,
1845
+ inset,
1846
+ };
1847
+ }
1848
+
1849
+ function splitCssTokens(value: string): string[] {
1850
+ const tokens: string[] = [];
1851
+ let start = 0;
1852
+ let depth = 0;
1853
+ for (let index = 0; index < value.length; index += 1) {
1854
+ const char = value[index];
1855
+ if (char === "(") depth += 1;
1856
+ if (char === ")") depth = Math.max(0, depth - 1);
1857
+ if (/\s/.test(char) && depth === 0) {
1858
+ const token = value.slice(start, index).trim();
1859
+ if (token) tokens.push(token);
1860
+ start = index + 1;
1861
+ }
1862
+ }
1863
+ const finalToken = value.slice(start).trim();
1864
+ if (finalToken) tokens.push(finalToken);
1865
+ return tokens;
1866
+ }
1867
+
1868
+ function serializeShadowLayers(layers: ShadowLayer[]) {
1869
+ if (!layers.length) return "none";
1870
+ return layers
1871
+ .map((layer) =>
1872
+ [
1873
+ layer.inset ? "inset" : "",
1874
+ `${Math.round(layer.x)}px`,
1875
+ `${Math.round(layer.y)}px`,
1876
+ `${Math.max(0, Math.round(layer.blur))}px`,
1877
+ `${Math.max(0, Math.round(layer.spread))}px`,
1878
+ layer.color,
1879
+ ]
1880
+ .filter(Boolean)
1881
+ .join(" "),
1882
+ )
1883
+ .join(", ");
1884
+ }
1885
+
1886
+ function readBlurFilter(value: string | undefined): number {
1887
+ const match = value?.match(/blur\((-?\d+(?:\.\d+)?)px\)/);
1888
+ return match ? Math.max(0, Number(match[1])) : 0;
1889
+ }
1890
+
1891
+ function ShadowEffectRow({
1892
+ layer,
1893
+ index,
1894
+ onChange,
1895
+ onRemove,
1896
+ }: {
1897
+ layer: ShadowLayer;
1898
+ index: number;
1899
+ onChange: (patch: Partial<ShadowLayer>) => void;
1900
+ onRemove: () => void;
1901
+ }) {
1902
+ const t = useT();
1903
+ return (
1904
+ <Popover>
1905
+ {/* Figma effect row: [swatch+label+x,y,blur trigger (flex-1)] [remove] */}
1906
+ <div className="flex items-center gap-1.5">
1907
+ <PopoverTrigger asChild>
1908
+ <button
1909
+ type="button"
1910
+ className="flex h-6 min-w-0 flex-1 items-center gap-1.5 rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-1.5 text-left text-[11px] hover:bg-[var(--design-editor-panel-raised-bg)]"
1911
+ >
1912
+ <span
1913
+ className="size-4 shrink-0 rounded-sm border border-[var(--design-editor-control-border)]"
1914
+ style={swatchStyle(layer.color)}
1915
+ />
1916
+ <span className="min-w-0 flex-1 truncate font-medium text-foreground">
1917
+ {index === 0
1918
+ ? t("editPanel.labels.dropShadow")
1919
+ : `${t("editPanel.labels.dropShadow")} ${index + 1}`}
1920
+ </span>
1921
+ <span className="shrink-0 tabular-nums text-muted-foreground">
1922
+ {Math.round(layer.x)}, {Math.round(layer.y)},{" "}
1923
+ {Math.round(layer.blur)}
1924
+ </span>
1925
+ </button>
1926
+ </PopoverTrigger>
1927
+ <SectionIconButton
1928
+ label={t("editPanel.labels.removeLayer")}
1929
+ onClick={onRemove}
1930
+ >
1931
+ <IconMinus className="size-3.5" />
1932
+ </SectionIconButton>
1933
+ </div>
1934
+ <PopoverContent
1935
+ side="left"
1936
+ align="start"
1937
+ sideOffset={8}
1938
+ className="w-72 p-3"
1939
+ >
1940
+ <div className="space-y-3">
1941
+ <div className="flex items-center justify-between gap-2">
1942
+ <p className="text-xs font-semibold text-foreground">
1943
+ {t("editPanel.labels.dropShadow")}
1944
+ </p>
1945
+ <button
1946
+ type="button"
1947
+ className={cn(
1948
+ "rounded border px-2 py-1 text-[11px]",
1949
+ layer.inset
1950
+ ? "border-[var(--design-editor-accent-color)] bg-[var(--design-editor-selection-color)] text-foreground"
1951
+ : "border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] text-muted-foreground",
1952
+ )}
1953
+ onClick={() => onChange({ inset: !layer.inset })}
1954
+ >
1955
+ {t("editPanel.labels.innerShadow")}
1956
+ </button>
1957
+ </div>
1958
+ <div className="grid grid-cols-2 gap-2">
1959
+ <ScrubInput
1960
+ label="X"
1961
+ value={layer.x}
1962
+ onChange={(value) => onChange({ x: value })}
1963
+ unit="px"
1964
+ precision={1}
1965
+ inputClassName="h-6"
1966
+ />
1967
+ <ScrubInput
1968
+ label="Y"
1969
+ value={layer.y}
1970
+ onChange={(value) => onChange({ y: value })}
1971
+ unit="px"
1972
+ precision={1}
1973
+ inputClassName="h-6"
1974
+ />
1975
+ <ScrubInput
1976
+ label={t("editPanel.labels.blur")}
1977
+ value={layer.blur}
1978
+ onChange={(value) => onChange({ blur: Math.max(0, value) })}
1979
+ unit="px"
1980
+ min={0}
1981
+ precision={1}
1982
+ inputClassName="h-6"
1983
+ />
1984
+ <ScrubInput
1985
+ label={t("editPanel.labels.spread")}
1986
+ value={layer.spread}
1987
+ onChange={(value) => onChange({ spread: Math.max(0, value) })}
1988
+ unit="px"
1989
+ min={0}
1990
+ precision={1}
1991
+ inputClassName="h-6"
1992
+ />
1993
+ </div>
1994
+ <ColorInput
1995
+ label={t("editPanel.labels.color")}
1996
+ value={cssColorOrFallback(layer.color, "rgba(0, 0, 0, 0.25)")}
1997
+ onChange={(value) => onChange({ color: value })}
1998
+ />
1999
+ </div>
2000
+ </PopoverContent>
2001
+ </Popover>
2002
+ );
2003
+ }
2004
+
2005
+ /** Page-level properties when nothing is selected */
2006
+ function PageProperties({
2007
+ styles,
2008
+ onStyleChange,
2009
+ }: {
2010
+ styles: Record<string, string>;
2011
+ onStyleChange: (property: string, value: string) => void;
2012
+ }) {
2013
+ const t = useT();
2014
+ const fontFamilyOptions = FONT_FAMILY_OPTIONS.map((option) => ({
2015
+ value: option.value,
2016
+ label: t(`editPanel.fontFamilies.${option.key}`),
2017
+ }));
2018
+ const fontFamily = FONT_FAMILY_OPTIONS.some(
2019
+ (option) => option.value === styles.fontFamily,
2020
+ )
2021
+ ? styles.fontFamily
2022
+ : "sans-serif";
2023
+
2024
+ return (
2025
+ <div>
2026
+ <PanelSection title={t("editPanel.sections.page")}>
2027
+ <ColorInput
2028
+ label={t("editPanel.labels.background")}
2029
+ value={styles.backgroundColor || ""}
2030
+ onChange={(v) => onStyleChange("backgroundColor", v)}
2031
+ backgroundImage={styles.backgroundImage || ""}
2032
+ onBackgroundImageChange={(v) => onStyleChange("backgroundImage", v)}
2033
+ blendMode={styles.backgroundBlendMode || "normal"}
2034
+ onBlendModeChange={(v) => onStyleChange("backgroundBlendMode", v)}
2035
+ supportsLayeredFills
2036
+ />
2037
+ <PropSelect
2038
+ label={t("editPanel.labels.font")}
2039
+ value={fontFamily}
2040
+ onChange={(v) => onStyleChange("fontFamily", v)}
2041
+ options={fontFamilyOptions}
2042
+ />
2043
+ <PropInput
2044
+ label={t("editPanel.labels.baseSize")}
2045
+ value={styles.fontSize || "16px"}
2046
+ onChange={(v) => onStyleChange("fontSize", v)}
2047
+ placeholder="16px"
2048
+ defaultUnit="px"
2049
+ />
2050
+ </PanelSection>
577
2051
  </div>
578
2052
  );
579
2053
  }
580
2054
 
581
- /** Universal element properties (size, opacity, spacing, border, background) */
582
- function ElementProperties({
2055
+ /** Text element properties */
2056
+ function TypographyProperties({
583
2057
  element,
584
2058
  onStyleChange,
585
2059
  }: {
@@ -588,104 +2062,1284 @@ function ElementProperties({
588
2062
  }) {
589
2063
  const t = useT();
590
2064
  const styles = element.computedStyles;
2065
+ const fontFamilyOptions = FONT_FAMILY_OPTIONS.map((option) => ({
2066
+ value: option.value,
2067
+ label: t(`editPanel.fontFamilies.${option.key}`),
2068
+ }));
2069
+ const fontWeightOptions = FONT_WEIGHT_OPTIONS.map((option) => ({
2070
+ value: option.value,
2071
+ label: t(`editPanel.fontWeights.${option.key}`),
2072
+ }));
2073
+ const textAlign = styles.textAlign || "left";
591
2074
 
592
- const handlePaddingChange = useCallback(
593
- (side: string, value: string) => {
594
- onStyleChange(`padding${side}`, value);
595
- },
596
- [onStyleChange],
2075
+ return (
2076
+ <PanelSection title={t("editPanel.sections.typography")}>
2077
+ {/* Row 1: font family full-width */}
2078
+ <Select
2079
+ value={styles.fontFamily || "sans-serif"}
2080
+ onValueChange={(v) => onStyleChange("fontFamily", v)}
2081
+ >
2082
+ <SelectTrigger className="h-6 w-full rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-1.5 text-[11px] shadow-none focus:ring-1 focus:ring-[var(--design-editor-accent-color)]">
2083
+ <SelectValue />
2084
+ </SelectTrigger>
2085
+ <SelectContent>
2086
+ {fontFamilyOptions.map((opt) => (
2087
+ <SelectItem
2088
+ key={opt.value}
2089
+ value={opt.value}
2090
+ className="text-[11px]"
2091
+ >
2092
+ {opt.label}
2093
+ </SelectItem>
2094
+ ))}
2095
+ </SelectContent>
2096
+ </Select>
2097
+
2098
+ {/* Row 2: weight + size side by side */}
2099
+ <div className="grid grid-cols-2 gap-1.5">
2100
+ <Select
2101
+ value={styles.fontWeight || "400"}
2102
+ onValueChange={(v) => onStyleChange("fontWeight", v)}
2103
+ >
2104
+ <SelectTrigger className="h-6 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-1.5 text-[11px] shadow-none focus:ring-1 focus:ring-[var(--design-editor-accent-color)]">
2105
+ <SelectValue />
2106
+ </SelectTrigger>
2107
+ <SelectContent>
2108
+ {fontWeightOptions.map((opt) => (
2109
+ <SelectItem
2110
+ key={opt.value}
2111
+ value={opt.value}
2112
+ className="text-[11px]"
2113
+ >
2114
+ {opt.label}
2115
+ </SelectItem>
2116
+ ))}
2117
+ </SelectContent>
2118
+ </Select>
2119
+ <ScrubInput
2120
+ label={t("editPanel.labels.size")}
2121
+ ariaLabel={t("editPanel.labels.size")}
2122
+ icon={IconLetterCase}
2123
+ value={styles.fontSize ? parseNumericValue(styles.fontSize) : 16}
2124
+ onChange={(value) =>
2125
+ onStyleChange("fontSize", `${Math.max(1, Math.round(value))}px`)
2126
+ }
2127
+ unit="px"
2128
+ min={1}
2129
+ precision={1}
2130
+ className="gap-0"
2131
+ labelClassName="h-6 w-6 justify-center gap-0 rounded-l-md border border-r-0 border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] text-[11px] [&>span]:hidden"
2132
+ inputClassName="h-6 rounded-l-none rounded-r-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] shadow-none focus-visible:ring-1 focus-visible:ring-[var(--design-editor-accent-color)]"
2133
+ />
2134
+ </div>
2135
+
2136
+ {/* Row 3: line-height + letter-spacing with Figma-style leading icons */}
2137
+ <div className="grid grid-cols-2 gap-1.5">
2138
+ <ScrubInput
2139
+ label={t("editPanel.labels.lineHeight")}
2140
+ ariaLabel={t("editPanel.labels.lineHeight")}
2141
+ icon={IconLineHeight}
2142
+ value={parseNumericValue(styles.lineHeight || "1.2")}
2143
+ onChange={(value) =>
2144
+ onStyleChange("lineHeight", String(Math.max(0.1, value)))
2145
+ }
2146
+ min={0.1}
2147
+ step={0.1}
2148
+ precision={2}
2149
+ className="gap-0"
2150
+ labelClassName="h-6 w-6 justify-center gap-0 rounded-l-md border border-r-0 border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] text-[11px] [&>span]:hidden"
2151
+ inputClassName="h-6 rounded-l-none rounded-r-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] shadow-none focus-visible:ring-1 focus-visible:ring-[var(--design-editor-accent-color)]"
2152
+ />
2153
+ <ScrubInput
2154
+ label={t("editPanel.labels.tracking")}
2155
+ ariaLabel={t("editPanel.labels.tracking")}
2156
+ icon={IconLetterSpacing}
2157
+ value={
2158
+ styles.letterSpacing ? parseNumericValue(styles.letterSpacing) : 0
2159
+ }
2160
+ onChange={(value) => onStyleChange("letterSpacing", `${value}px`)}
2161
+ unit="px"
2162
+ precision={1}
2163
+ className="gap-0"
2164
+ labelClassName="h-6 w-6 justify-center gap-0 rounded-l-md border border-r-0 border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] text-[11px] [&>span]:hidden"
2165
+ inputClassName="h-6 rounded-l-none rounded-r-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] shadow-none focus-visible:ring-1 focus-visible:ring-[var(--design-editor-accent-color)]"
2166
+ />
2167
+ </div>
2168
+
2169
+ {/* Row 4: text alignment */}
2170
+ <InspectorSegment>
2171
+ <InspectorIconButton
2172
+ label={t("editPanel.textAligns.left")}
2173
+ active={textAlign === "left" || textAlign === "start"}
2174
+ onClick={() => onStyleChange("textAlign", "left")}
2175
+ >
2176
+ <IconAlignLeft className="size-3.5" />
2177
+ </InspectorIconButton>
2178
+ <InspectorIconButton
2179
+ label={t("editPanel.textAligns.center")}
2180
+ active={textAlign === "center"}
2181
+ onClick={() => onStyleChange("textAlign", "center")}
2182
+ >
2183
+ <IconAlignCenter className="size-3.5" />
2184
+ </InspectorIconButton>
2185
+ <InspectorIconButton
2186
+ label={t("editPanel.textAligns.right")}
2187
+ active={textAlign === "right" || textAlign === "end"}
2188
+ onClick={() => onStyleChange("textAlign", "right")}
2189
+ >
2190
+ <IconAlignRight className="size-3.5" />
2191
+ </InspectorIconButton>
2192
+ <InspectorIconButton
2193
+ label={t("editPanel.textAligns.justify")}
2194
+ active={textAlign === "justify"}
2195
+ onClick={() => onStyleChange("textAlign", "justify")}
2196
+ >
2197
+ <IconAlignJustified className="size-3.5" />
2198
+ </InspectorIconButton>
2199
+ </InspectorSegment>
2200
+ </PanelSection>
597
2201
  );
2202
+ }
598
2203
 
599
- const handleMarginChange = useCallback(
600
- (side: string, value: string) => {
601
- onStyleChange(`margin${side}`, value);
2204
+ /** Flex container properties */
2205
+ function FlexContainerControls({
2206
+ element,
2207
+ onStyleChange,
2208
+ onStylesChange,
2209
+ }: {
2210
+ element: ElementInfo;
2211
+ onStyleChange: (property: string, value: string) => void;
2212
+ onStylesChange?: (styles: Record<string, string>) => void;
2213
+ }) {
2214
+ const t = useT();
2215
+ const styles = element.computedStyles;
2216
+ const flexDirection: AutoLayoutMatrixValue["direction"] =
2217
+ styles.flexDirection?.includes("column") ? "vertical" : "horizontal";
2218
+ const padding = {
2219
+ top: parseNumericValue(styles.paddingTop || "0"),
2220
+ right: parseNumericValue(styles.paddingRight || "0"),
2221
+ bottom: parseNumericValue(styles.paddingBottom || "0"),
2222
+ left: parseNumericValue(styles.paddingLeft || "0"),
2223
+ };
2224
+ const allPaddingEqual =
2225
+ padding.top === padding.right &&
2226
+ padding.top === padding.bottom &&
2227
+ padding.top === padding.left;
2228
+ const [paddingLinked, setPaddingLinked] = useState(allPaddingEqual);
2229
+
2230
+ useEffect(() => {
2231
+ if (!allPaddingEqual && paddingLinked) setPaddingLinked(false);
2232
+ }, [allPaddingEqual, paddingLinked]);
2233
+
2234
+ const autoLayoutValue: AutoLayoutMatrixValue = {
2235
+ direction: flexDirection,
2236
+ wrap: styles.flexWrap === "wrap" ? "wrap" : "nowrap",
2237
+ alignment: autoLayoutAlignmentFromStyles(styles, flexDirection),
2238
+ gap: parseNumericValue(styles.gap || "0"),
2239
+ padding,
2240
+ paddingLinked,
2241
+ childSizing: {
2242
+ horizontal: inferElementSizing(element, "horizontal"),
2243
+ vertical: inferElementSizing(element, "vertical"),
602
2244
  },
603
- [onStyleChange],
2245
+ clipContent: styles.overflow === "hidden",
2246
+ resolvedSize: {
2247
+ horizontal: element.boundingRect.width,
2248
+ vertical: element.boundingRect.height,
2249
+ },
2250
+ };
2251
+
2252
+ return (
2253
+ <div className="space-y-2">
2254
+ <AutoLayoutMatrix
2255
+ value={autoLayoutValue}
2256
+ onDirectionChange={(direction) =>
2257
+ onStyleChange(
2258
+ "flexDirection",
2259
+ direction === "vertical" ? "column" : "row",
2260
+ )
2261
+ }
2262
+ onWrapChange={(wrap) => onStyleChange("flexWrap", wrap)}
2263
+ onAlignmentChange={(alignment) => {
2264
+ if (autoLayoutValue.direction === "vertical") {
2265
+ onStyleChange(
2266
+ "alignItems",
2267
+ horizontalToJustify(alignment.horizontal),
2268
+ );
2269
+ onStyleChange(
2270
+ "justifyContent",
2271
+ verticalToAlign(alignment.vertical),
2272
+ );
2273
+ return;
2274
+ }
2275
+ onStyleChange(
2276
+ "justifyContent",
2277
+ horizontalToJustify(alignment.horizontal),
2278
+ );
2279
+ onStyleChange("alignItems", verticalToAlign(alignment.vertical));
2280
+ }}
2281
+ onGapChange={(gap) => onStyleChange("gap", `${gap}px`)}
2282
+ onPaddingChange={(nextPadding) => {
2283
+ onStyleChange("paddingTop", `${nextPadding.top}px`);
2284
+ onStyleChange("paddingRight", `${nextPadding.right}px`);
2285
+ onStyleChange("paddingBottom", `${nextPadding.bottom}px`);
2286
+ onStyleChange("paddingLeft", `${nextPadding.left}px`);
2287
+ }}
2288
+ onPaddingLinkedChange={(linked) => {
2289
+ setPaddingLinked(linked);
2290
+ if (!linked) return;
2291
+ onStyleChange("paddingTop", `${padding.top}px`);
2292
+ onStyleChange("paddingRight", `${padding.top}px`);
2293
+ onStyleChange("paddingBottom", `${padding.top}px`);
2294
+ onStyleChange("paddingLeft", `${padding.top}px`);
2295
+ }}
2296
+ onClipContentChange={(clipContent) =>
2297
+ onStyleChange("overflow", clipContent ? "hidden" : "visible")
2298
+ }
2299
+ onDistribute={(axis) => {
2300
+ const mainAxis =
2301
+ autoLayoutValue.direction === "horizontal"
2302
+ ? "horizontal"
2303
+ : "vertical";
2304
+ if (axis === mainAxis) {
2305
+ onStyleChange("justifyContent", "space-between");
2306
+ } else if (autoLayoutValue.wrap === "wrap") {
2307
+ onStyleChange("alignContent", "space-between");
2308
+ }
2309
+ }}
2310
+ availableChildSizing={availableSizingForElement(element)}
2311
+ onChildSizingChange={(axis, sizing) => {
2312
+ commitElementSizing(
2313
+ element,
2314
+ axis,
2315
+ sizing,
2316
+ onStyleChange,
2317
+ onStylesChange,
2318
+ );
2319
+ }}
2320
+ />
2321
+ </div>
604
2322
  );
2323
+ }
2324
+
2325
+ function FlexChildControls({
2326
+ element,
2327
+ onStyleChange,
2328
+ }: {
2329
+ element: ElementInfo;
2330
+ onStyleChange: (property: string, value: string) => void;
2331
+ }) {
2332
+ const t = useT();
2333
+ const styles = element.computedStyles;
2334
+ const alignSelfOptions = ALIGN_SELF_OPTIONS.map((option) => ({
2335
+ value: option.value,
2336
+ label: t(`editPanel.alignSelfOptions.${option.key}`),
2337
+ }));
605
2338
 
606
2339
  return (
607
- <div className="space-y-4">
608
- <SectionTitle>{t("editPanel.sections.layout")}</SectionTitle>
2340
+ <div className="space-y-2">
2341
+ <SubsectionLabel>{t("editPanel.layoutContext.child")}</SubsectionLabel>
609
2342
  <PropInput
610
- label={t("editPanel.labels.width")}
611
- value={styles.width || ""}
612
- onChange={(v) => onStyleChange("width", v)}
613
- placeholder="auto"
614
- defaultUnit="px"
2343
+ label={t("editPanel.labels.flexGrow")}
2344
+ value={styles.flexGrow || ""}
2345
+ onChange={(v) => onStyleChange("flexGrow", v)}
2346
+ placeholder="0"
615
2347
  />
616
2348
  <PropInput
617
- label={t("editPanel.labels.height")}
618
- value={styles.height || ""}
619
- onChange={(v) => onStyleChange("height", v)}
2349
+ label={t("editPanel.labels.flexShrink")}
2350
+ value={styles.flexShrink || ""}
2351
+ onChange={(v) => onStyleChange("flexShrink", v)}
2352
+ placeholder="1"
2353
+ />
2354
+ <PropInput
2355
+ label={t("editPanel.labels.flexBasis")}
2356
+ value={styles.flexBasis || ""}
2357
+ onChange={(v) => onStyleChange("flexBasis", v)}
620
2358
  placeholder="auto"
621
2359
  defaultUnit="px"
622
2360
  />
623
- <PropSlider
624
- label={t("editPanel.labels.opacity")}
625
- value={parseNumericValue(styles.opacity || "1") * 100}
626
- onChange={(v) => onStyleChange("opacity", String(v / 100))}
627
- min={0}
628
- max={100}
629
- step={1}
630
- unit="%"
631
- />
632
-
633
- <Separator />
634
-
635
- <SectionTitle>{t("editPanel.sections.spacing")}</SectionTitle>
636
- <FourSideInput
637
- label={t("editPanel.labels.padding")}
638
- values={{
639
- top: styles.paddingTop || "0",
640
- right: styles.paddingRight || "0",
641
- bottom: styles.paddingBottom || "0",
642
- left: styles.paddingLeft || "0",
643
- }}
644
- onChange={handlePaddingChange}
2361
+ <PropInput
2362
+ label={t("editPanel.labels.order")}
2363
+ value={styles.order || ""}
2364
+ onChange={(v) => onStyleChange("order", v)}
2365
+ placeholder="0"
645
2366
  />
646
- <FourSideInput
647
- label={t("editPanel.labels.margin")}
648
- values={{
649
- top: styles.marginTop || "0",
650
- right: styles.marginRight || "0",
651
- bottom: styles.marginBottom || "0",
652
- left: styles.marginLeft || "0",
653
- }}
654
- onChange={handleMarginChange}
2367
+ <PropSelect
2368
+ label={t("editPanel.labels.alignSelf")}
2369
+ value={optionValue(ALIGN_SELF_OPTIONS, styles.alignSelf, "auto")}
2370
+ onChange={(v) => onStyleChange("alignSelf", v)}
2371
+ options={alignSelfOptions}
655
2372
  />
2373
+ </div>
2374
+ );
2375
+ }
656
2376
 
657
- <Separator />
2377
+ function GridChildControls({
2378
+ element,
2379
+ onStyleChange,
2380
+ }: {
2381
+ element: ElementInfo;
2382
+ onStyleChange: (property: string, value: string) => void;
2383
+ }) {
2384
+ const t = useT();
2385
+ const styles = element.computedStyles;
2386
+ const alignSelfOptions = ALIGN_SELF_OPTIONS.map((option) => ({
2387
+ value: option.value,
2388
+ label: t(`editPanel.alignSelfOptions.${option.key}`),
2389
+ }));
658
2390
 
659
- <SectionTitle>{t("editPanel.sections.border")}</SectionTitle>
2391
+ return (
2392
+ <div className="space-y-2">
2393
+ <SubsectionLabel>
2394
+ {t("editPanel.layoutContext.gridChild")}
2395
+ </SubsectionLabel>
660
2396
  <PropInput
661
- label={t("editPanel.labels.width")}
662
- value={styles.borderWidth || "0"}
663
- onChange={(v) => onStyleChange("borderWidth", v)}
664
- placeholder="0px"
665
- defaultUnit="px"
666
- />
667
- <ColorInput
668
- label={t("editPanel.labels.color")}
669
- value={styles.borderColor || ""}
670
- onChange={(v) => onStyleChange("borderColor", v)}
2397
+ label={t("editPanel.labels.gridColumn")}
2398
+ value={styles.gridColumn || ""}
2399
+ onChange={(v) => onStyleChange("gridColumn", v)}
2400
+ placeholder="auto"
671
2401
  />
672
2402
  <PropInput
673
- label={t("editPanel.labels.radius")}
674
- value={styles.borderRadius || "0"}
675
- onChange={(v) => onStyleChange("borderRadius", v)}
676
- placeholder="0px"
677
- defaultUnit="px"
2403
+ label={t("editPanel.labels.gridRow")}
2404
+ value={styles.gridRow || ""}
2405
+ onChange={(v) => onStyleChange("gridRow", v)}
2406
+ placeholder="auto"
678
2407
  />
2408
+ <PropSelect
2409
+ label={t("editPanel.labels.alignSelf")}
2410
+ value={optionValue(ALIGN_SELF_OPTIONS, styles.alignSelf, "auto")}
2411
+ onChange={(v) => onStyleChange("alignSelf", v)}
2412
+ options={alignSelfOptions}
2413
+ />
2414
+ </div>
2415
+ );
2416
+ }
2417
+
2418
+ function LayoutContextProperties({
2419
+ element,
2420
+ onStyleChange,
2421
+ onStylesChange,
2422
+ }: {
2423
+ element: ElementInfo;
2424
+ onStyleChange: (property: string, value: string) => void;
2425
+ onStylesChange?: (styles: Record<string, string>) => void;
2426
+ }) {
2427
+ const t = useT();
2428
+ const flexChild = isParentFlex(element);
2429
+ const gridChild = isParentGrid(element);
2430
+ const availableSizing = availableSizingForElement(element);
679
2431
 
680
- <Separator />
2432
+ if (!element.isFlexContainer) {
2433
+ return (
2434
+ <PanelSection title={t("editPanel.sections.layout")}>
2435
+ {/* Figma-style single-row-per-axis: [W | value | Fixed/Hug ▾] */}
2436
+ <div className="grid grid-cols-2 gap-1.5">
2437
+ <SizingModeButton
2438
+ axis="W"
2439
+ value={inferElementSizing(element, "horizontal")}
2440
+ resolvedSize={element.boundingRect.width}
2441
+ options={availableSizing.horizontal ?? ["hug", "fixed"]}
2442
+ onChange={(mode) =>
2443
+ commitElementSizing(
2444
+ element,
2445
+ "horizontal",
2446
+ mode,
2447
+ onStyleChange,
2448
+ onStylesChange,
2449
+ )
2450
+ }
2451
+ />
2452
+ <SizingModeButton
2453
+ axis="H"
2454
+ value={inferElementSizing(element, "vertical")}
2455
+ resolvedSize={element.boundingRect.height}
2456
+ options={availableSizing.vertical ?? ["hug", "fixed"]}
2457
+ onChange={(mode) =>
2458
+ commitElementSizing(
2459
+ element,
2460
+ "vertical",
2461
+ mode,
2462
+ onStyleChange,
2463
+ onStylesChange,
2464
+ )
2465
+ }
2466
+ />
2467
+ </div>
2468
+ {flexChild ? (
2469
+ <FlexChildControls element={element} onStyleChange={onStyleChange} />
2470
+ ) : null}
2471
+ {gridChild ? (
2472
+ <GridChildControls element={element} onStyleChange={onStyleChange} />
2473
+ ) : null}
2474
+ </PanelSection>
2475
+ );
2476
+ }
681
2477
 
682
- <SectionTitle>{t("editPanel.sections.fill")}</SectionTitle>
683
- <ColorInput
684
- label={t("editPanel.labels.background")}
685
- value={styles.backgroundColor || ""}
686
- onChange={(v) => onStyleChange("backgroundColor", v)}
2478
+ return (
2479
+ <PanelSection
2480
+ title={t("editPanel.sections.autoLayout")}
2481
+ actions={
2482
+ <span className="flex size-7 items-center justify-center rounded-md bg-[var(--design-editor-accent-color)]/15 text-[var(--design-editor-accent-color)]">
2483
+ <IconLayoutGrid className="size-4" />
2484
+ </span>
2485
+ }
2486
+ >
2487
+ <FlexContainerControls
2488
+ element={element}
2489
+ onStyleChange={onStyleChange}
2490
+ onStylesChange={onStylesChange}
687
2491
  />
688
- </div>
2492
+
2493
+ {flexChild ? (
2494
+ <div className="border-t border-border/70 pt-2">
2495
+ <FlexChildControls element={element} onStyleChange={onStyleChange} />
2496
+ </div>
2497
+ ) : null}
2498
+
2499
+ {gridChild ? (
2500
+ <div className="border-t border-border/70 pt-2">
2501
+ <GridChildControls element={element} onStyleChange={onStyleChange} />
2502
+ </div>
2503
+ ) : null}
2504
+ </PanelSection>
2505
+ );
2506
+ }
2507
+
2508
+ /** Position, size, and spacing properties */
2509
+ function PositionLayoutProperties({
2510
+ element,
2511
+ onStyleChange,
2512
+ }: {
2513
+ element: ElementInfo;
2514
+ onStyleChange: (property: string, value: string) => void;
2515
+ }) {
2516
+ const t = useT();
2517
+ const styles = element.computedStyles;
2518
+ const constrainedPosition =
2519
+ styles.position === "absolute" || styles.position === "fixed";
2520
+ const constraintsValue: ConstraintsValue = {
2521
+ horizontal:
2522
+ styles.left && styles.right
2523
+ ? "left-right"
2524
+ : styles.right
2525
+ ? "right"
2526
+ : styles.transform?.includes("translateX(-50%)")
2527
+ ? "center"
2528
+ : styles.width === "100%"
2529
+ ? "scale"
2530
+ : "left",
2531
+ vertical:
2532
+ styles.top && styles.bottom
2533
+ ? "top-bottom"
2534
+ : styles.bottom
2535
+ ? "bottom"
2536
+ : styles.transform?.includes("translateY(-50%)")
2537
+ ? "center"
2538
+ : styles.height === "100%"
2539
+ ? "scale"
2540
+ : "top",
2541
+ };
2542
+
2543
+ const handleConstraintsChange = useCallback(
2544
+ (value: ConstraintsValue) => {
2545
+ onStyleChange("position", "absolute");
2546
+ if (value.horizontal === "left") {
2547
+ onStyleChange(
2548
+ "left",
2549
+ styles.left || `${Math.round(element.boundingRect.x)}px`,
2550
+ );
2551
+ onStyleChange("right", "auto");
2552
+ } else if (value.horizontal === "right") {
2553
+ onStyleChange("right", "0px");
2554
+ onStyleChange("left", "auto");
2555
+ } else if (value.horizontal === "left-right") {
2556
+ onStyleChange(
2557
+ "left",
2558
+ styles.left || `${Math.round(element.boundingRect.x)}px`,
2559
+ );
2560
+ onStyleChange("right", "0px");
2561
+ } else if (value.horizontal === "center") {
2562
+ onStyleChange("left", "50%");
2563
+ onStyleChange("right", "auto");
2564
+ onStyleChange("transform", "translateX(-50%)");
2565
+ } else {
2566
+ onStyleChange("left", "0px");
2567
+ onStyleChange("right", "0px");
2568
+ onStyleChange("width", "100%");
2569
+ }
2570
+
2571
+ if (value.vertical === "top") {
2572
+ onStyleChange(
2573
+ "top",
2574
+ styles.top || `${Math.round(element.boundingRect.y)}px`,
2575
+ );
2576
+ onStyleChange("bottom", "auto");
2577
+ } else if (value.vertical === "bottom") {
2578
+ onStyleChange("bottom", "0px");
2579
+ onStyleChange("top", "auto");
2580
+ } else if (value.vertical === "top-bottom") {
2581
+ onStyleChange(
2582
+ "top",
2583
+ styles.top || `${Math.round(element.boundingRect.y)}px`,
2584
+ );
2585
+ onStyleChange("bottom", "0px");
2586
+ } else if (value.vertical === "center") {
2587
+ onStyleChange("top", "50%");
2588
+ onStyleChange("bottom", "auto");
2589
+ onStyleChange("transform", "translateY(-50%)");
2590
+ } else {
2591
+ onStyleChange("top", "0px");
2592
+ onStyleChange("bottom", "0px");
2593
+ onStyleChange("height", "100%");
2594
+ }
2595
+ },
2596
+ [
2597
+ element.boundingRect.x,
2598
+ element.boundingRect.y,
2599
+ onStyleChange,
2600
+ styles.left,
2601
+ styles.top,
2602
+ ],
2603
+ );
2604
+
2605
+ return (
2606
+ <PanelSection title={t("editPanel.sections.positionLayout")}>
2607
+ <div className="space-y-1.5">
2608
+ <SubsectionLabel>
2609
+ {"Alignment" /* i18n-ignore Figma inspector label */}
2610
+ </SubsectionLabel>
2611
+ <div className="flex items-center gap-3">
2612
+ <InspectorSegment>
2613
+ <InspectorIconButton
2614
+ label={t("editPanel.textAligns.left")}
2615
+ onClick={() => onStyleChange("justifyContent", "flex-start")}
2616
+ >
2617
+ <IconLayoutAlignLeft className="size-4" />
2618
+ </InspectorIconButton>
2619
+ <InspectorIconButton
2620
+ label={t("editPanel.textAligns.center")}
2621
+ onClick={() => onStyleChange("justifyContent", "center")}
2622
+ >
2623
+ <IconLayoutAlignCenter className="size-4" />
2624
+ </InspectorIconButton>
2625
+ <InspectorIconButton
2626
+ label={t("editPanel.textAligns.right")}
2627
+ onClick={() => onStyleChange("justifyContent", "flex-end")}
2628
+ >
2629
+ <IconLayoutAlignRight className="size-4" />
2630
+ </InspectorIconButton>
2631
+ </InspectorSegment>
2632
+ <InspectorSegment>
2633
+ <InspectorIconButton
2634
+ label={t("editPanel.alignSelfOptions.start")}
2635
+ onClick={() => onStyleChange("alignItems", "flex-start")}
2636
+ >
2637
+ <IconLayoutAlignTop className="size-4" />
2638
+ </InspectorIconButton>
2639
+ <InspectorIconButton
2640
+ label={t("editPanel.alignSelfOptions.center")}
2641
+ onClick={() => onStyleChange("alignItems", "center")}
2642
+ >
2643
+ <IconLayoutAlignMiddle className="size-4" />
2644
+ </InspectorIconButton>
2645
+ <InspectorIconButton
2646
+ label={t("editPanel.alignSelfOptions.end")}
2647
+ onClick={() => onStyleChange("alignItems", "flex-end")}
2648
+ >
2649
+ <IconLayoutAlignBottom className="size-4" />
2650
+ </InspectorIconButton>
2651
+ </InspectorSegment>
2652
+ </div>
2653
+ </div>
2654
+
2655
+ <div className="space-y-1.5">
2656
+ <SubsectionLabel>{t("editPanel.labels.position")}</SubsectionLabel>
2657
+ <div className="grid grid-cols-2 gap-2">
2658
+ <ScrubStyleInput
2659
+ label="X"
2660
+ value={styles.left || ""}
2661
+ placeholder={element.boundingRect.x}
2662
+ inputClassName="h-6"
2663
+ onChange={(v) => onStyleChange("left", `${Math.round(v)}px`)}
2664
+ />
2665
+ <ScrubStyleInput
2666
+ label="Y"
2667
+ value={styles.top || ""}
2668
+ placeholder={element.boundingRect.y}
2669
+ inputClassName="h-6"
2670
+ onChange={(v) => onStyleChange("top", `${Math.round(v)}px`)}
2671
+ />
2672
+ </div>
2673
+ </div>
2674
+
2675
+ <div className="space-y-1.5">
2676
+ <SubsectionLabel>{t("editPanel.labels.rotation")}</SubsectionLabel>
2677
+ <div className="flex items-center gap-2">
2678
+ <div className="min-w-0 flex-1">
2679
+ <ScrubStyleInput
2680
+ label="R"
2681
+ value={`${parseRotationValue(styles.transform)}deg`}
2682
+ unit="deg"
2683
+ inputClassName="h-6"
2684
+ onChange={(v) =>
2685
+ onStyleChange(
2686
+ "transform",
2687
+ mergeRotationValue(styles.transform, v),
2688
+ )
2689
+ }
2690
+ />
2691
+ </div>
2692
+ <InspectorSegment>
2693
+ <InspectorIconButton
2694
+ label={t("editPanel.labels.flipHorizontal")}
2695
+ onClick={() => onStyleChange("scale", "-1 1")}
2696
+ >
2697
+ <IconFlipHorizontal className="size-4" />
2698
+ </InspectorIconButton>
2699
+ <InspectorIconButton
2700
+ label={t("editPanel.labels.flipVertical")}
2701
+ onClick={() => onStyleChange("scale", "1 -1")}
2702
+ >
2703
+ <IconFlipVertical className="size-4" />
2704
+ </InspectorIconButton>
2705
+ </InspectorSegment>
2706
+ </div>
2707
+ </div>
2708
+
2709
+ {constrainedPosition ? (
2710
+ <ConstraintsWidget
2711
+ value={constraintsValue}
2712
+ onChange={handleConstraintsChange}
2713
+ />
2714
+ ) : null}
2715
+ </PanelSection>
2716
+ );
2717
+ }
2718
+
2719
+ function FillProperties({
2720
+ element,
2721
+ onStyleChange,
2722
+ onStylesChange,
2723
+ }: {
2724
+ element: ElementInfo;
2725
+ onStyleChange: (property: string, value: string) => void;
2726
+ onStylesChange?: (styles: Record<string, string>) => void;
2727
+ }) {
2728
+ const t = useT();
2729
+ const styles = element.computedStyles;
2730
+ const isTextElement = TEXT_TAGS.has(element.tagName);
2731
+ const fillProperty = isTextElement ? "color" : "backgroundColor";
2732
+ const fillValue = isTextElement
2733
+ ? styles.color || ""
2734
+ : styles.backgroundColor || "";
2735
+ const backgroundLayers = isTextElement
2736
+ ? []
2737
+ : splitCssLayers(styles.backgroundImage || "");
2738
+ const hasBackgroundLayer = !isTextElement && backgroundLayers.length > 0;
2739
+ const hasVisibleFill =
2740
+ isTextElement || colorHasVisibleAlpha(fillValue) || hasBackgroundLayer;
2741
+ const fallbackValue = isTextElement
2742
+ ? cssColorOrFallback(styles.color, "#000000")
2743
+ : cssColorOrFallback(styles.backgroundColor, "#ffffff");
2744
+
2745
+ return (
2746
+ <PanelSection
2747
+ title={t("editPanel.sections.fill")}
2748
+ actions={
2749
+ <SectionIconButton
2750
+ label={t("editPanel.labels.addLayer")}
2751
+ onClick={() => {
2752
+ if (isTextElement) {
2753
+ onStyleChange(
2754
+ "color",
2755
+ cssColorOrFallback(styles.color, "#000000"),
2756
+ );
2757
+ return;
2758
+ }
2759
+ if (!colorHasVisibleAlpha(styles.backgroundColor)) {
2760
+ onStyleChange(
2761
+ "backgroundColor",
2762
+ cssColorOrFallback(styles.backgroundColor, "#ffffff"),
2763
+ );
2764
+ return;
2765
+ }
2766
+ const current = compactCssValue(styles.backgroundImage, "");
2767
+ const nextLayer = defaultGradientLayer(
2768
+ "linear",
2769
+ styles.backgroundColor || "#ffffff",
2770
+ );
2771
+ onStyleChange(
2772
+ "backgroundImage",
2773
+ current ? `${nextLayer}, ${current}` : nextLayer,
2774
+ );
2775
+ }}
2776
+ >
2777
+ <IconPlus className="size-3.5" />
2778
+ </SectionIconButton>
2779
+ }
2780
+ >
2781
+ {hasVisibleFill ? (
2782
+ <div className="space-y-1.5">
2783
+ {isTextElement || colorHasVisibleAlpha(fillValue) ? (
2784
+ /* Figma row: [swatch+hex trigger (flex-1)] [eye] [remove] */
2785
+ <div className="flex items-center gap-1.5">
2786
+ <div className="min-w-0 flex-1">
2787
+ <ColorInput
2788
+ label=""
2789
+ value={fillValue}
2790
+ onChange={(v) => onStyleChange(fillProperty, v)}
2791
+ backgroundImage=""
2792
+ blendMode={
2793
+ isTextElement
2794
+ ? undefined
2795
+ : styles.backgroundBlendMode || "normal"
2796
+ }
2797
+ onBlendModeChange={
2798
+ isTextElement
2799
+ ? undefined
2800
+ : (v) => onStyleChange("backgroundBlendMode", v)
2801
+ }
2802
+ />
2803
+ </div>
2804
+ <SectionIconButton
2805
+ label={
2806
+ fillValue === "transparent"
2807
+ ? t("editPanel.labels.showLayer")
2808
+ : t("editPanel.labels.hideLayer")
2809
+ }
2810
+ onClick={() =>
2811
+ onStyleChange(
2812
+ fillProperty,
2813
+ fillValue === "transparent" ? fallbackValue : "transparent",
2814
+ )
2815
+ }
2816
+ >
2817
+ {fillValue === "transparent" ? (
2818
+ <IconEyeOff className="size-3.5" />
2819
+ ) : (
2820
+ <IconEye className="size-3.5" />
2821
+ )}
2822
+ </SectionIconButton>
2823
+ <SectionIconButton
2824
+ label={t("editPanel.labels.removeLayer")}
2825
+ onClick={() => {
2826
+ if (isTextElement) {
2827
+ onStyleChange(fillProperty, "transparent");
2828
+ return;
2829
+ }
2830
+ if (onStylesChange) {
2831
+ onStylesChange({
2832
+ backgroundColor: "transparent",
2833
+ backgroundImage: "none",
2834
+ });
2835
+ } else {
2836
+ onStyleChange(fillProperty, "transparent");
2837
+ }
2838
+ }}
2839
+ >
2840
+ <IconMinus className="size-3.5" />
2841
+ </SectionIconButton>
2842
+ </div>
2843
+ ) : null}
2844
+ {!isTextElement
2845
+ ? backgroundLayers.map((layer, index) => {
2846
+ const gradient = parseGradientLayer(layer);
2847
+ const opacity = gradient
2848
+ ? averageGradientOpacity(gradient.stops)
2849
+ : 100;
2850
+ const label = gradient
2851
+ ? `${gradientLabel(gradient.type)} ${index + 1}`
2852
+ : `${"Image" /* i18n-ignore Figma inspector paint row */} ${
2853
+ index + 1
2854
+ }`;
2855
+ const replaceLayer = (nextLayer: string) => {
2856
+ const nextLayers = [...backgroundLayers];
2857
+ nextLayers[index] = nextLayer;
2858
+ onStyleChange("backgroundImage", joinCssLayers(nextLayers));
2859
+ };
2860
+ const removeLayer = () => {
2861
+ onStyleChange(
2862
+ "backgroundImage",
2863
+ joinCssLayers(
2864
+ backgroundLayers.filter(
2865
+ (_, layerIndex) => layerIndex !== index,
2866
+ ),
2867
+ ),
2868
+ );
2869
+ };
2870
+
2871
+ return (
2872
+ /* Figma row: [swatch+label+opacity% trigger (flex-1)] [eye] [remove] */
2873
+ <div
2874
+ key={`${layer}-${index}`}
2875
+ className="flex items-center gap-1.5"
2876
+ >
2877
+ <Popover>
2878
+ <PopoverTrigger asChild>
2879
+ <button
2880
+ type="button"
2881
+ className="flex h-6 min-w-0 flex-1 items-center gap-1.5 rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-1.5 text-left text-[11px] hover:bg-[var(--design-editor-panel-raised-bg)]"
2882
+ >
2883
+ <span
2884
+ className="size-4 shrink-0 rounded-sm border border-[var(--design-editor-control-border)]"
2885
+ style={swatchStyle(layer)}
2886
+ />
2887
+ <span className="min-w-0 flex-1 truncate font-medium text-foreground">
2888
+ {label}
2889
+ </span>
2890
+ <span className="shrink-0 tabular-nums text-muted-foreground">
2891
+ {opacity}%
2892
+ </span>
2893
+ </button>
2894
+ </PopoverTrigger>
2895
+ <PopoverContent
2896
+ side="left"
2897
+ align="start"
2898
+ sideOffset={8}
2899
+ className="w-80 p-0"
2900
+ >
2901
+ <FigmaColorPicker
2902
+ value={gradient?.stops[0]?.color ?? "#000000"}
2903
+ onChange={(nextColor) => {
2904
+ if (!gradient) return;
2905
+ const firstStop = gradient.stops[0];
2906
+ if (!firstStop) return;
2907
+ replaceLayer(
2908
+ buildGradientLayer(gradient.type, [
2909
+ { ...firstStop, color: nextColor },
2910
+ ...gradient.stops.slice(1),
2911
+ ]),
2912
+ );
2913
+ }}
2914
+ paintType={gradient?.type ?? "image"}
2915
+ gradientType={gradient?.type}
2916
+ onGradientTypeChange={(type) => {
2917
+ if (!gradient) return;
2918
+ replaceLayer(
2919
+ buildGradientLayer(type, gradient.stops),
2920
+ );
2921
+ }}
2922
+ fillRows={[
2923
+ {
2924
+ id: `layer-${index}`,
2925
+ label,
2926
+ value: layer,
2927
+ type: gradient ? "gradient" : "image",
2928
+ selected: true,
2929
+ swatch: layer,
2930
+ },
2931
+ ]}
2932
+ selectedFillId={`layer-${index}`}
2933
+ />
2934
+ </PopoverContent>
2935
+ </Popover>
2936
+ <SectionIconButton
2937
+ label={
2938
+ opacity <= 0
2939
+ ? t("editPanel.labels.showLayer")
2940
+ : t("editPanel.labels.hideLayer")
2941
+ }
2942
+ onClick={() => {
2943
+ if (!gradient) return;
2944
+ replaceLayer(
2945
+ buildGradientLayer(
2946
+ gradient.type,
2947
+ gradient.stops.map((stop) => ({
2948
+ ...stop,
2949
+ opacity: opacity <= 0 ? 100 : 0,
2950
+ })),
2951
+ ),
2952
+ );
2953
+ }}
2954
+ >
2955
+ {opacity <= 0 ? (
2956
+ <IconEyeOff className="size-3.5" />
2957
+ ) : (
2958
+ <IconEye className="size-3.5" />
2959
+ )}
2960
+ </SectionIconButton>
2961
+ <SectionIconButton
2962
+ label={t("editPanel.labels.removeLayer")}
2963
+ onClick={removeLayer}
2964
+ >
2965
+ <IconMinus className="size-3.5" />
2966
+ </SectionIconButton>
2967
+ </div>
2968
+ );
2969
+ })
2970
+ : null}
2971
+ </div>
2972
+ ) : null}
2973
+ </PanelSection>
2974
+ );
2975
+ }
2976
+
2977
+ function StrokeProperties({
2978
+ element,
2979
+ onStyleChange,
2980
+ onStylesChange,
2981
+ }: {
2982
+ element: ElementInfo;
2983
+ onStyleChange: (property: string, value: string) => void;
2984
+ onStylesChange?: (styles: Record<string, string>) => void;
2985
+ }) {
2986
+ const t = useT();
2987
+ const styles = element.computedStyles;
2988
+ const borderVisible = strokeIsVisible(styles.borderWidth, styles.borderStyle);
2989
+ const outlineVisible = strokeIsVisible(
2990
+ styles.outlineWidth,
2991
+ styles.outlineStyle,
2992
+ );
2993
+
2994
+ return (
2995
+ <PanelSection
2996
+ title={t("editPanel.sections.stroke")}
2997
+ actions={
2998
+ <SectionIconButton
2999
+ label={t("editPanel.labels.addLayer")}
3000
+ onClick={() => {
3001
+ if (!borderVisible) {
3002
+ const borderColor = cssColorOrFallback(
3003
+ styles.borderColor || styles.color,
3004
+ "#000000",
3005
+ );
3006
+ commitStylePatch(
3007
+ {
3008
+ borderWidth: "1px",
3009
+ borderStyle: "solid",
3010
+ borderColor,
3011
+ },
3012
+ onStyleChange,
3013
+ onStylesChange,
3014
+ );
3015
+ return;
3016
+ }
3017
+ if (outlineVisible) {
3018
+ const outlineWidth = `${
3019
+ Math.max(1, cssLengthNumber(styles.outlineWidth, 1)) + 1
3020
+ }px`;
3021
+ const outlineStyle =
3022
+ styles.outlineStyle === "none"
3023
+ ? "solid"
3024
+ : styles.outlineStyle || "solid";
3025
+ const outlineColor = cssColorOrFallback(
3026
+ styles.outlineColor || styles.borderColor,
3027
+ "#000000",
3028
+ );
3029
+ commitStylePatch(
3030
+ {
3031
+ outlineWidth,
3032
+ outlineStyle,
3033
+ outlineColor,
3034
+ outlineOffset: styles.outlineOffset || "0px",
3035
+ },
3036
+ onStyleChange,
3037
+ onStylesChange,
3038
+ );
3039
+ return;
3040
+ }
3041
+ commitStylePatch(
3042
+ {
3043
+ outlineWidth: "1px",
3044
+ outlineStyle: "solid",
3045
+ outlineColor: cssColorOrFallback(styles.borderColor, "#000000"),
3046
+ outlineOffset: "0px",
3047
+ },
3048
+ onStyleChange,
3049
+ onStylesChange,
3050
+ );
3051
+ }}
3052
+ >
3053
+ <IconPlus className="size-3.5" />
3054
+ </SectionIconButton>
3055
+ }
3056
+ >
3057
+ {borderVisible ? (
3058
+ <StrokeLayerControl
3059
+ kind="border"
3060
+ visible={borderVisible}
3061
+ color={styles.borderColor || "#000000"}
3062
+ width={styles.borderWidth || "0px"}
3063
+ styleValue={styles.borderStyle || "none"}
3064
+ onStyleChange={onStyleChange}
3065
+ onRemove={() => {
3066
+ if (onStylesChange) {
3067
+ onStylesChange({ borderWidth: "0px", borderStyle: "none" });
3068
+ } else {
3069
+ onStyleChange("borderWidth", "0px");
3070
+ }
3071
+ }}
3072
+ />
3073
+ ) : null}
3074
+ {outlineVisible ? (
3075
+ <StrokeLayerControl
3076
+ kind="outline"
3077
+ visible={outlineVisible}
3078
+ color={styles.outlineColor || styles.borderColor || "#000000"}
3079
+ width={styles.outlineWidth || "0px"}
3080
+ styleValue={styles.outlineStyle || "solid"}
3081
+ onStyleChange={onStyleChange}
3082
+ onRemove={() => {
3083
+ if (onStylesChange) {
3084
+ onStylesChange({ outlineWidth: "0px", outlineStyle: "none" });
3085
+ } else {
3086
+ onStyleChange("outlineWidth", "0px");
3087
+ }
3088
+ }}
3089
+ />
3090
+ ) : null}
3091
+ </PanelSection>
3092
+ );
3093
+ }
3094
+
3095
+ function AppearanceProperties({
3096
+ element,
3097
+ onStyleChange,
3098
+ }: {
3099
+ element: ElementInfo;
3100
+ onStyleChange: (property: string, value: string) => void;
3101
+ }) {
3102
+ const t = useT();
3103
+ const styles = element.computedStyles;
3104
+ return (
3105
+ <PanelSection title={t("root.commandAppearance")}>
3106
+ <div className="grid grid-cols-2 gap-2">
3107
+ <ScrubInput
3108
+ label={t("editPanel.labels.opacity")}
3109
+ value={parseNumericValue(styles.opacity || "1") * 100}
3110
+ onChange={(v) => onStyleChange("opacity", String(v / 100))}
3111
+ min={0}
3112
+ max={100}
3113
+ step={1}
3114
+ unit="%"
3115
+ precision={1}
3116
+ labelClassName="w-0 overflow-hidden"
3117
+ inputClassName="h-6 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] shadow-none"
3118
+ />
3119
+ {/* M9: blend mode compact — inline select next to opacity, no separate labeled row */}
3120
+ <Select
3121
+ value={optionValue(
3122
+ BLEND_MODE_OPTIONS,
3123
+ styles.mixBlendMode || "normal",
3124
+ "normal",
3125
+ )}
3126
+ onValueChange={(value) => onStyleChange("mixBlendMode", value)}
3127
+ >
3128
+ <SelectTrigger className="h-6 min-w-0 rounded-md border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-1.5 text-[11px] shadow-none focus:ring-1 focus:ring-[var(--design-editor-accent-color)]">
3129
+ <SelectValue />
3130
+ </SelectTrigger>
3131
+ <SelectContent>
3132
+ {BLEND_MODE_OPTIONS.map((opt) => (
3133
+ <SelectItem
3134
+ key={opt.value}
3135
+ value={opt.value}
3136
+ className="text-[11px]"
3137
+ >
3138
+ {opt.label}
3139
+ </SelectItem>
3140
+ ))}
3141
+ </SelectContent>
3142
+ </Select>
3143
+ </div>
3144
+ {/* M7: use CornerRadiusControl (with independent-corners toggle) instead of bare ScrubInput */}
3145
+ <CornerRadiusControl styles={styles} onStyleChange={onStyleChange} />
3146
+ </PanelSection>
3147
+ );
3148
+ }
3149
+
3150
+ function EffectsProperties({
3151
+ element,
3152
+ onStyleChange,
3153
+ onStylesChange,
3154
+ }: {
3155
+ element: ElementInfo;
3156
+ onStyleChange: (property: string, value: string) => void;
3157
+ onStylesChange?: (styles: Record<string, string>) => void;
3158
+ }) {
3159
+ const t = useT();
3160
+ const styles = element.computedStyles;
3161
+ const blurValue = readBlurFilter(styles.filter);
3162
+ const shadowLayers = parseShadowLayers(styles.boxShadow);
3163
+ const setShadowLayers = (layers: ShadowLayer[]) => {
3164
+ const boxShadow = serializeShadowLayers(layers);
3165
+ if (onStylesChange) onStylesChange({ boxShadow });
3166
+ else onStyleChange("boxShadow", boxShadow);
3167
+ };
3168
+
3169
+ return (
3170
+ <PanelSection
3171
+ title={t("editPanel.sections.effects")}
3172
+ actions={
3173
+ <SectionIconButton
3174
+ label={t("editPanel.labels.addLayer")}
3175
+ onClick={() =>
3176
+ setShadowLayers([
3177
+ ...shadowLayers,
3178
+ defaultDropShadowLayer(shadowLayers.length),
3179
+ ])
3180
+ }
3181
+ >
3182
+ <IconPlus className="size-3.5" />
3183
+ </SectionIconButton>
3184
+ }
3185
+ >
3186
+ {shadowLayers.length ? (
3187
+ <div className="space-y-1.5">
3188
+ {shadowLayers.map((layer, index) => (
3189
+ <ShadowEffectRow
3190
+ key={layer.id}
3191
+ layer={layer}
3192
+ index={index}
3193
+ onChange={(patch) => {
3194
+ const next = shadowLayers.map((candidate) =>
3195
+ candidate.id === layer.id
3196
+ ? { ...candidate, ...patch }
3197
+ : candidate,
3198
+ );
3199
+ setShadowLayers(next);
3200
+ }}
3201
+ onRemove={() =>
3202
+ setShadowLayers(
3203
+ shadowLayers.filter((candidate) => candidate.id !== layer.id),
3204
+ )
3205
+ }
3206
+ />
3207
+ ))}
3208
+ </div>
3209
+ ) : null}
3210
+ {blurValue > 0 ? (
3211
+ /* Figma effect row for layer blur: flat row matching shadow rows */
3212
+ <Popover>
3213
+ <div className="flex items-center gap-1.5">
3214
+ <PopoverTrigger asChild>
3215
+ <button
3216
+ type="button"
3217
+ className="flex h-6 min-w-0 flex-1 items-center gap-1.5 rounded-md border border-[var(--design-editor-control-border)] bg-[var(--design-editor-control-bg)] px-1.5 text-left text-[11px] hover:bg-[var(--design-editor-panel-raised-bg)]"
3218
+ >
3219
+ <span className="min-w-0 flex-1 truncate font-medium text-foreground">
3220
+ {t("editPanel.labels.layerBlur")}
3221
+ </span>
3222
+ <span className="shrink-0 tabular-nums text-muted-foreground">
3223
+ {Math.round(blurValue)}px
3224
+ </span>
3225
+ </button>
3226
+ </PopoverTrigger>
3227
+ <SectionIconButton
3228
+ label={t("editPanel.labels.removeLayer")}
3229
+ onClick={() => onStyleChange("filter", "none")}
3230
+ disabled={!styles.filter || styles.filter === "none"}
3231
+ >
3232
+ <IconMinus className="size-3.5" />
3233
+ </SectionIconButton>
3234
+ </div>
3235
+ <PopoverContent
3236
+ side="left"
3237
+ align="start"
3238
+ sideOffset={8}
3239
+ className="w-56 p-3"
3240
+ >
3241
+ <ScrubInput
3242
+ label={t("editPanel.labels.blur")}
3243
+ value={blurValue}
3244
+ onChange={(value) =>
3245
+ onStyleChange(
3246
+ "filter",
3247
+ `blur(${Math.max(0, Math.round(value))}px)`,
3248
+ )
3249
+ }
3250
+ unit="px"
3251
+ min={0}
3252
+ precision={1}
3253
+ labelClassName="w-16"
3254
+ inputClassName="h-6"
3255
+ />
3256
+ </PopoverContent>
3257
+ </Popover>
3258
+ ) : null}
3259
+ </PanelSection>
3260
+ );
3261
+ }
3262
+
3263
+ interface SelectionColorValue {
3264
+ property: string;
3265
+ value: string;
3266
+ }
3267
+
3268
+ function selectionColorValues(element: ElementInfo): SelectionColorValue[] {
3269
+ const styles = element.computedStyles;
3270
+ const rawValues: SelectionColorValue[] = [
3271
+ { property: "color", value: styles.color },
3272
+ { property: "backgroundColor", value: styles.backgroundColor },
3273
+ { property: "borderColor", value: styles.borderColor },
3274
+ { property: "outlineColor", value: styles.outlineColor },
3275
+ ];
3276
+ const seen = new Set<string>();
3277
+ return rawValues
3278
+ .map((color) => ({ ...color, value: color.value?.trim() }))
3279
+ .filter((color): color is SelectionColorValue => Boolean(color.value))
3280
+ .filter(
3281
+ (color) =>
3282
+ color.value !== "transparent" && color.value !== "rgba(0, 0, 0, 0)",
3283
+ )
3284
+ .filter((color) => {
3285
+ const key = color.value.toLowerCase();
3286
+ if (seen.has(key)) return false;
3287
+ seen.add(key);
3288
+ return true;
3289
+ });
3290
+ }
3291
+
3292
+ function SelectionColorsProperties({
3293
+ element,
3294
+ onStyleChange,
3295
+ }: {
3296
+ element: ElementInfo;
3297
+ onStyleChange: (property: string, value: string) => void;
3298
+ }) {
3299
+ const colors = selectionColorValues(element);
3300
+ const overflowCount = Math.max(0, colors.length - 3);
3301
+ if (!colors.length) return null;
3302
+
3303
+ return (
3304
+ <PanelSection
3305
+ title={"Selection colors" /* i18n-ignore Figma inspector label */}
3306
+ >
3307
+ <div className="flex min-w-0 items-center gap-1.5">
3308
+ {colors.slice(0, 3).map((color, index) => (
3309
+ <Popover key={`${color.value}-${index}`}>
3310
+ <Tooltip>
3311
+ <TooltipTrigger asChild>
3312
+ <PopoverTrigger asChild>
3313
+ <button
3314
+ type="button"
3315
+ className="size-5 rounded-sm border border-[var(--design-editor-control-border)] transition-transform hover:scale-110 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--design-editor-accent-color)]"
3316
+ style={swatchStyle(color.value)}
3317
+ aria-label={color.value}
3318
+ />
3319
+ </PopoverTrigger>
3320
+ </TooltipTrigger>
3321
+ <TooltipContent>{color.value}</TooltipContent>
3322
+ </Tooltip>
3323
+ <PopoverContent
3324
+ side="left"
3325
+ align="start"
3326
+ sideOffset={8}
3327
+ className="w-80 p-0"
3328
+ >
3329
+ <FigmaColorPicker
3330
+ value={cssColorOrFallback(color.value, "#000000")}
3331
+ onChange={(value) => onStyleChange(color.property, value)}
3332
+ />
3333
+ </PopoverContent>
3334
+ </Popover>
3335
+ ))}
3336
+ {overflowCount > 0 ? (
3337
+ <span className="pl-0.5 text-[11px] font-medium text-muted-foreground">
3338
+ +{overflowCount}
3339
+ </span>
3340
+ ) : null}
3341
+ </div>
3342
+ </PanelSection>
689
3343
  );
690
3344
  }
691
3345
 
@@ -708,66 +3362,158 @@ const TEXT_TAGS = new Set([
708
3362
  export function EditPanel({
709
3363
  selectedElement,
710
3364
  pageStyles = {},
3365
+ width = 256,
3366
+ activeTab = "design",
3367
+ onActiveTabChange,
3368
+ tweaks = [],
3369
+ tweakValues = {},
3370
+ extensionContext,
3371
+ onTweakChange,
3372
+ onRequestTweaks,
711
3373
  onStyleChange,
3374
+ onStylesChange,
3375
+ onExport,
3376
+ exporting = false,
712
3377
  }: EditPanelProps) {
713
3378
  const t = useT();
3379
+ const [exportSettings, setExportSettings] = useState<ExportSettingsValue>({
3380
+ scale: 1,
3381
+ format: "png",
3382
+ suffix: "",
3383
+ });
714
3384
  const isTextElement = selectedElement
715
3385
  ? TEXT_TAGS.has(selectedElement.tagName)
716
3386
  : false;
717
- const isFlexContainer = selectedElement?.isFlexContainer ?? false;
3387
+ const handleActiveTabChange = useCallback(
3388
+ (tab: InspectorTab) => onActiveTabChange?.(tab),
3389
+ [onActiveTabChange],
3390
+ );
3391
+ const handleTweakChange = useCallback(
3392
+ (tweakId: string, value: string | number | boolean) => {
3393
+ onTweakChange?.(tweakId, value);
3394
+ },
3395
+ [onTweakChange],
3396
+ );
718
3397
 
719
3398
  return (
720
3399
  <div
721
3400
  className={cn(
722
- "w-64 border-l border-border bg-background overflow-y-auto",
723
- "flex flex-col",
3401
+ "shrink-0 bg-[var(--design-editor-panel-bg)]",
3402
+ "flex h-full min-h-0 flex-col overflow-hidden",
724
3403
  )}
3404
+ style={{ width }}
725
3405
  >
726
- <div className="p-3 border-b border-border">
727
- <h2 className="text-xs font-semibold text-foreground">
728
- {selectedElement
729
- ? `<${selectedElement.tagName}>${selectedElement.id ? ` #${selectedElement.id}` : ""}`
730
- : t("editPanel.properties")}
731
- </h2>
732
- {selectedElement?.classes.length ? (
733
- <p className="text-[10px] text-muted-foreground mt-0.5 truncate">
734
- .{selectedElement.classes.join(".")}
735
- </p>
736
- ) : null}
737
- </div>
3406
+ <InspectorTabsHeader
3407
+ activeTab={activeTab}
3408
+ onActiveTabChange={handleActiveTabChange}
3409
+ />
738
3410
 
739
- <div className="flex-1 p-3 space-y-4 overflow-y-auto">
740
- {!selectedElement && (
741
- <PageProperties styles={pageStyles} onStyleChange={onStyleChange} />
742
- )}
3411
+ {activeTab === "design" ? (
3412
+ <>
3413
+ <SelectionHeader element={selectedElement} />
743
3414
 
744
- {selectedElement && isTextElement && (
745
- <>
746
- <TextProperties
747
- element={selectedElement}
748
- onStyleChange={onStyleChange}
749
- />
750
- <Separator />
751
- </>
752
- )}
753
-
754
- {selectedElement && isFlexContainer && (
755
- <>
756
- <FlexProperties
757
- element={selectedElement}
758
- onStyleChange={onStyleChange}
3415
+ <div className="design-inspector-scroll min-h-0 flex-1 overflow-y-auto overscroll-contain">
3416
+ {!selectedElement && (
3417
+ <PageProperties
3418
+ styles={pageStyles}
3419
+ onStyleChange={onStyleChange}
3420
+ />
3421
+ )}
3422
+
3423
+ {selectedElement && (
3424
+ <>
3425
+ <PositionLayoutProperties
3426
+ element={selectedElement}
3427
+ onStyleChange={onStyleChange}
3428
+ />
3429
+ <LayoutContextProperties
3430
+ element={selectedElement}
3431
+ onStyleChange={onStyleChange}
3432
+ onStylesChange={onStylesChange}
3433
+ />
3434
+ <AppearanceProperties
3435
+ element={selectedElement}
3436
+ onStyleChange={onStyleChange}
3437
+ />
3438
+ {isTextElement ? (
3439
+ <TypographyProperties
3440
+ element={selectedElement}
3441
+ onStyleChange={onStyleChange}
3442
+ />
3443
+ ) : null}
3444
+ <FillProperties
3445
+ element={selectedElement}
3446
+ onStyleChange={onStyleChange}
3447
+ onStylesChange={onStylesChange}
3448
+ />
3449
+ <StrokeProperties
3450
+ element={selectedElement}
3451
+ onStyleChange={onStyleChange}
3452
+ onStylesChange={onStylesChange}
3453
+ />
3454
+ <EffectsProperties
3455
+ element={selectedElement}
3456
+ onStyleChange={onStyleChange}
3457
+ onStylesChange={onStylesChange}
3458
+ />
3459
+ <SelectionColorsProperties
3460
+ element={selectedElement}
3461
+ onStyleChange={onStyleChange}
3462
+ />
3463
+ </>
3464
+ )}
3465
+ {onExport ? (
3466
+ <PanelSection title={t("editPanel.sections.export")}>
3467
+ <ExportSettingsPanel
3468
+ value={exportSettings}
3469
+ formats={["png", "svg"]}
3470
+ exporting={exporting}
3471
+ onChange={(patch) =>
3472
+ setExportSettings((current) => ({ ...current, ...patch }))
3473
+ }
3474
+ onExport={onExport}
3475
+ />
3476
+ </PanelSection>
3477
+ ) : null}
3478
+ </div>
3479
+ </>
3480
+ ) : activeTab === "tweaks" ? (
3481
+ <div className="flex min-h-0 flex-1 flex-col overflow-hidden">
3482
+ <div className="flex h-10 shrink-0 items-center justify-between gap-2 border-b border-border/90 px-3">
3483
+ <h3 className="min-w-0 flex-1 truncate text-[13px] font-semibold text-foreground">
3484
+ {t("designEditor.tweaks")}
3485
+ </h3>
3486
+ {onRequestTweaks ? (
3487
+ <Tooltip>
3488
+ <TooltipTrigger asChild>
3489
+ <Button
3490
+ type="button"
3491
+ variant="ghost"
3492
+ size="icon"
3493
+ className="size-7 rounded-sm text-muted-foreground hover:bg-accent hover:text-foreground"
3494
+ aria-label={t("designEditor.addTweaks")}
3495
+ onClick={(event) => onRequestTweaks(event.currentTarget)}
3496
+ >
3497
+ <IconPlus className="size-3.5" />
3498
+ </Button>
3499
+ </TooltipTrigger>
3500
+ <TooltipContent>{t("designEditor.addTweaks")}</TooltipContent>
3501
+ </Tooltip>
3502
+ ) : null}
3503
+ </div>
3504
+ <div className="design-inspector-scroll min-h-0 flex-1 overflow-y-auto overscroll-contain">
3505
+ <TweaksPanelContent
3506
+ tweaks={tweaks}
3507
+ values={tweakValues}
3508
+ onChange={handleTweakChange}
3509
+ onRequestTweaks={onRequestTweaks}
3510
+ className="px-3 py-3"
759
3511
  />
760
- <Separator />
761
- </>
762
- )}
763
-
764
- {selectedElement && (
765
- <ElementProperties
766
- element={selectedElement}
767
- onStyleChange={onStyleChange}
768
- />
769
- )}
770
- </div>
3512
+ </div>
3513
+ </div>
3514
+ ) : extensionContext ? (
3515
+ <DesignExtensionsPanel context={extensionContext} />
3516
+ ) : null}
771
3517
  </div>
772
3518
  );
773
3519
  }