@agent-native/core 0.79.27 → 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 (346) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +26 -0
  3. package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +41 -0
  4. package/corpus/core/docs/content/locales/de-DE/template-design.mdx +51 -0
  5. package/corpus/core/docs/content/locales/es-ES/template-design.mdx +50 -0
  6. package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +49 -0
  7. package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +44 -0
  8. package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +46 -0
  9. package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +44 -0
  10. package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +48 -0
  11. package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +36 -0
  12. package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +38 -0
  13. package/corpus/core/docs/content/template-design.mdx +45 -0
  14. package/corpus/core/package.json +2 -1
  15. package/corpus/core/src/agent/engine/index.ts +1 -0
  16. package/corpus/core/src/agent/engine/registry.ts +40 -0
  17. package/corpus/core/src/agent/production-agent.ts +6 -2
  18. package/corpus/core/src/cli/design-connect.ts +490 -0
  19. package/corpus/core/src/cli/index.ts +16 -0
  20. package/corpus/core/src/cli/skills.ts +126 -3
  21. package/corpus/core/src/client/AssistantChat.tsx +43 -7
  22. package/corpus/core/src/client/agent-chat.ts +27 -3
  23. package/corpus/core/src/client/blocks/library/MermaidBlock.tsx +1 -1
  24. package/corpus/core/src/client/blocks/library/diagram.tsx +2 -2
  25. package/corpus/core/src/client/blocks/library/wireframe.tsx +1 -1
  26. package/corpus/core/src/client/chat/message-components.tsx +1 -1
  27. package/corpus/core/src/client/chat-model-groups.ts +1 -2
  28. package/corpus/core/src/client/components/LiveCursorOverlay.tsx +33 -66
  29. package/corpus/core/src/client/composer/TiptapComposer.tsx +99 -24
  30. package/corpus/core/src/client/composer/useVoiceDictation.ts +429 -260
  31. package/corpus/core/src/client/frame-protocol.ts +17 -2
  32. package/corpus/core/src/client/rich-markdown-editor/RegistryBlockNode.tsx +2 -2
  33. package/corpus/core/src/client/sharing/ShareButton.tsx +20 -15
  34. package/corpus/core/src/client/use-agent-engine-configured.ts +80 -28
  35. package/corpus/core/src/server/transcribe-voice.ts +57 -22
  36. package/corpus/core/src/shared/mcp-embed-headers.ts +23 -1
  37. package/corpus/core/src/styles/agent-native.css +56 -7
  38. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  39. package/corpus/core/src/vite/client.ts +2 -0
  40. package/corpus/core/src/voice/index.ts +18 -0
  41. package/corpus/core/src/voice/voice-cleanup-prompt.ts +38 -0
  42. package/corpus/core/src/voice/voice-context.ts +217 -0
  43. package/corpus/core/src/voice/voice-replacements.ts +75 -0
  44. package/corpus/templates/analytics/AGENTS.md +4 -3
  45. package/corpus/templates/analytics/actions/list-session-recordings.ts +6 -1
  46. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +557 -400
  47. package/corpus/templates/analytics/app/global.css +0 -4
  48. package/corpus/templates/analytics/app/i18n/zh-TW.ts +2 -0
  49. package/corpus/templates/analytics/app/i18n-data.ts +20 -0
  50. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +33 -8
  51. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +7 -0
  52. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +7 -0
  53. package/corpus/templates/analytics/changelog/2026-06-28-ask-tab-now-matches-the-darker-app-background.md +6 -0
  54. package/corpus/templates/analytics/changelog/2026-06-28-dashboard-email-reports-now-use-cleaner-light-mode-snapshots.md +6 -0
  55. package/corpus/templates/analytics/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  56. package/corpus/templates/analytics/changelog/2026-06-28-sessions-now-show-only-signed-in-recordings-with-playable-re.md +6 -0
  57. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +3 -3
  58. package/corpus/templates/analytics/server/lib/dashboard-report.ts +29 -7
  59. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +5 -2
  60. package/corpus/templates/analytics/server/lib/session-replay.ts +24 -4
  61. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +4 -4
  62. package/corpus/templates/assets/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  63. package/corpus/templates/brain/app/components/layout/Layout.tsx +29 -2
  64. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +131 -42
  65. package/corpus/templates/brain/app/i18n/zh-TW.ts +2 -0
  66. package/corpus/templates/brain/app/i18n-data.ts +20 -0
  67. package/corpus/templates/brain/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  68. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +29 -1
  69. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +417 -299
  70. package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
  71. package/corpus/templates/calendar/app/i18n-data.ts +20 -0
  72. package/corpus/templates/calendar/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  73. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +6 -19
  74. package/corpus/templates/chat/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  75. package/corpus/templates/clips/AGENTS.md +4 -0
  76. package/corpus/templates/clips/actions/cleanup-transcript.ts +39 -9
  77. package/corpus/templates/clips/actions/finalize-meeting.ts +81 -12
  78. package/corpus/templates/clips/actions/lib/agents-md-context.ts +4 -1
  79. package/corpus/templates/clips/app/components/library/library-layout.tsx +3 -3
  80. package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +1 -1
  81. package/corpus/templates/clips/app/components/player/share-dialog.tsx +2 -2
  82. package/corpus/templates/clips/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
  83. package/corpus/templates/clips/desktop/src/lib/personal-vocabulary.ts +13 -8
  84. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +60 -1
  85. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +1 -1
  86. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +1 -1
  87. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +5 -5
  88. package/corpus/templates/content/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  89. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +137 -0
  90. package/corpus/templates/design/AGENTS.md +95 -5
  91. package/corpus/templates/design/DESIGN.md +82 -0
  92. package/corpus/templates/design/DEVELOPING.md +43 -0
  93. package/corpus/templates/design/actions/add-localhost-screens.ts +426 -0
  94. package/corpus/templates/design/actions/apply-shader.ts +277 -0
  95. package/corpus/templates/design/actions/apply-visual-edit.ts +303 -0
  96. package/corpus/templates/design/actions/connect-localhost.ts +183 -0
  97. package/corpus/templates/design/actions/edit-design.ts +195 -42
  98. package/corpus/templates/design/actions/generate-design.ts +71 -1
  99. package/corpus/templates/design/actions/generate-screens.ts +193 -0
  100. package/corpus/templates/design/actions/get-code-layer-projection.ts +191 -0
  101. package/corpus/templates/design/actions/get-shader.ts +119 -0
  102. package/corpus/templates/design/actions/list-localhost-connections.ts +95 -0
  103. package/corpus/templates/design/actions/navigate.ts +55 -2
  104. package/corpus/templates/design/actions/view-screen.ts +68 -1
  105. package/corpus/templates/design/agent-native.app-skill.json +10 -0
  106. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +761 -0
  107. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +2057 -103
  108. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +74 -38
  109. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +399 -0
  110. package/corpus/templates/design/app/components/design/EditPanel.tsx +3185 -439
  111. package/corpus/templates/design/app/components/design/LayersPanel.tsx +1124 -0
  112. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +3116 -147
  113. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +700 -13
  114. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +107 -63
  115. package/corpus/templates/design/app/components/design/index.ts +0 -5
  116. package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +286 -0
  117. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +699 -0
  118. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +461 -0
  119. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +166 -0
  120. package/corpus/templates/design/app/components/design/inspector/FigmaColorPicker.tsx +1420 -0
  121. package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +420 -0
  122. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +215 -0
  123. package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +71 -0
  124. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +518 -0
  125. package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +106 -0
  126. package/corpus/templates/design/app/components/design/inspector/figma-icons.tsx +361 -0
  127. package/corpus/templates/design/app/components/design/inspector/index.ts +60 -0
  128. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +201 -0
  129. package/corpus/templates/design/app/components/design/types.ts +23 -0
  130. package/corpus/templates/design/app/components/layout/Layout.tsx +24 -13
  131. package/corpus/templates/design/app/components/layout/Sidebar.tsx +4 -4
  132. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +474 -36
  133. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +22 -5
  134. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +24 -11
  135. package/corpus/templates/design/app/global.css +121 -3
  136. package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -0
  137. package/corpus/templates/design/app/hooks/use-navigation-state.ts +130 -8
  138. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +329 -0
  139. package/corpus/templates/design/app/i18n/zh-TW.ts +264 -0
  140. package/corpus/templates/design/app/i18n-data.ts +2790 -1
  141. package/corpus/templates/design/app/pages/DesignEditor.tsx +5108 -851
  142. package/corpus/templates/design/changelog/2026-06-28-annotate-mode-now-combines-drawing-and-comment-pins-in-one-c.md +6 -0
  143. package/corpus/templates/design/changelog/2026-06-28-design-editor-panel-borders-are-cleaner-so-the-canvas-edge-s.md +6 -0
  144. package/corpus/templates/design/changelog/2026-06-28-drawing-prompts-now-reliably-open-and-submit-to-the-design-a.md +6 -0
  145. package/corpus/templates/design/changelog/2026-06-28-editor-app-menus-now-use-an-outline-agent-native-mark-with-b.md +6 -0
  146. package/corpus/templates/design/changelog/2026-06-28-figma-style-code-design-mode.md +6 -0
  147. package/corpus/templates/design/changelog/2026-06-28-layer-selection-now-updates-chat-context-without-opening-the.md +6 -0
  148. package/corpus/templates/design/changelog/2026-06-28-layer-selections-now-preserve-hidden-and-locked-canvas-state.md +6 -0
  149. package/corpus/templates/design/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  150. package/corpus/templates/design/changelog/2026-06-28-live-cursors-now-keep-names-beside-a-cleaner-pointer-marker.md +6 -0
  151. package/corpus/templates/design/changelog/2026-06-28-mode-switching-now-lives-in-a-compact-bottom-right-icon-dock.md +6 -0
  152. package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-handles-zooming-drawing-opening-and-dele.md +6 -0
  153. package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-selects-screens-on-click-and-opens-them-.md +6 -0
  154. package/corpus/templates/design/changelog/2026-06-28-screen-overview-zooms-into-the-active-screen-with-smoother-e.md +6 -0
  155. package/corpus/templates/design/changelog/2026-06-28-selected-element-chips-in-chat-are-shorter-and-easier-to-sca.md +6 -0
  156. package/corpus/templates/design/changelog/2026-06-28-the-design-editor-toolbar-is-more-compact-and-the-app-menu-m.md +6 -0
  157. package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-at-the-top-of-the-design-sidebar-instead-of-.md +6 -0
  158. package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-in-the-right-inspector-beside-the-design-tab.md +6 -0
  159. package/corpus/templates/design/changelog/2026-06-29-active-sidebar-rows-use-soft-highlights.md +6 -0
  160. package/corpus/templates/design/changelog/2026-06-29-agents-can-now-open-screen-overview-focus-screens-and-add.md +6 -0
  161. package/corpus/templates/design/changelog/2026-06-29-design-agents-now-edit-broad-copy-changes-more-reliably.md +6 -0
  162. package/corpus/templates/design/changelog/2026-06-29-design-editor-extensions-now-run-inline-beside-the-artboard.md +6 -0
  163. package/corpus/templates/design/changelog/2026-06-29-sidebars-use-darker-chrome-and-chat-warns-immediately.md +6 -0
  164. package/corpus/templates/design/changelog/2026-06-29-visual-edit-can-open-localhost-routes-as-url-backed-screens.md +6 -0
  165. package/corpus/templates/design/package.json +1 -0
  166. package/corpus/templates/design/server/db/schema.ts +26 -0
  167. package/corpus/templates/design/server/lib/design-snapshot.ts +1 -1
  168. package/corpus/templates/design/server/plugins/agent-chat.ts +3 -0
  169. package/corpus/templates/design/shared/api.ts +27 -0
  170. package/corpus/templates/design/shared/canvas-frames.ts +103 -0
  171. package/corpus/templates/design/shared/canvas-math.ts +1058 -0
  172. package/corpus/templates/design/shared/code-layer.ts +2212 -0
  173. package/corpus/templates/design/shared/color-utils.ts +180 -0
  174. package/corpus/templates/design/shared/generation-session.ts +61 -0
  175. package/corpus/templates/design/shared/shader-presets.ts +782 -0
  176. package/corpus/templates/design/shared/shader-safety.ts +137 -0
  177. package/corpus/templates/design/shared/source-mode.ts +237 -0
  178. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +149 -6
  179. package/corpus/templates/forms/app/i18n/ar-SA.ts +2 -0
  180. package/corpus/templates/forms/app/i18n/de-DE.ts +2 -0
  181. package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
  182. package/corpus/templates/forms/app/i18n/es-ES.ts +2 -0
  183. package/corpus/templates/forms/app/i18n/fr-FR.ts +2 -0
  184. package/corpus/templates/forms/app/i18n/hi-IN.ts +2 -0
  185. package/corpus/templates/forms/app/i18n/ja-JP.ts +2 -0
  186. package/corpus/templates/forms/app/i18n/ko-KR.ts +2 -0
  187. package/corpus/templates/forms/app/i18n/pt-BR.ts +2 -0
  188. package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
  189. package/corpus/templates/forms/app/i18n/zh-TW.ts +2 -0
  190. package/corpus/templates/forms/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  191. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
  192. package/corpus/templates/macros/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
  193. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +408 -247
  194. package/corpus/templates/mail/app/i18n/ar-SA.ts +4 -0
  195. package/corpus/templates/mail/app/i18n/de-DE.ts +4 -0
  196. package/corpus/templates/mail/app/i18n/en-US.ts +4 -0
  197. package/corpus/templates/mail/app/i18n/es-ES.ts +4 -0
  198. package/corpus/templates/mail/app/i18n/fr-FR.ts +4 -0
  199. package/corpus/templates/mail/app/i18n/hi-IN.ts +4 -0
  200. package/corpus/templates/mail/app/i18n/ja-JP.ts +4 -0
  201. package/corpus/templates/mail/app/i18n/ko-KR.ts +4 -0
  202. package/corpus/templates/mail/app/i18n/pt-BR.ts +4 -0
  203. package/corpus/templates/mail/app/i18n/zh-CN.ts +4 -0
  204. package/corpus/templates/mail/app/i18n/zh-TW.ts +4 -0
  205. package/corpus/templates/mail/changelog/2026-06-28-pinned-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  206. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +6 -8
  207. package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +1 -1
  208. package/corpus/templates/plan/app/global.css +61 -78
  209. package/corpus/templates/plan/app/pages/PlansPage.tsx +8 -0
  210. package/corpus/templates/plan/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  211. package/corpus/templates/plan/changelog/2026-06-28-plans-use-the-shared-neutral-light-and-dark-theme.md +6 -0
  212. package/corpus/templates/plan/changelog/2026-06-28-sending-open-feedback-from-a-plan-now-opens-the-inline-plan-.md +6 -0
  213. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +5 -5
  214. package/corpus/templates/slides/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  215. package/corpus/templates/videos/app/components/Sidebar.tsx +2 -2
  216. package/corpus/templates/videos/app/components/layout/Layout.tsx +29 -2
  217. package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +113 -30
  218. package/corpus/templates/videos/app/i18n/ar-SA.ts +2 -0
  219. package/corpus/templates/videos/app/i18n/de-DE.ts +2 -0
  220. package/corpus/templates/videos/app/i18n/en-US.ts +2 -0
  221. package/corpus/templates/videos/app/i18n/es-ES.ts +2 -0
  222. package/corpus/templates/videos/app/i18n/fr-FR.ts +2 -0
  223. package/corpus/templates/videos/app/i18n/hi-IN.ts +2 -0
  224. package/corpus/templates/videos/app/i18n/ja-JP.ts +2 -0
  225. package/corpus/templates/videos/app/i18n/ko-KR.ts +2 -0
  226. package/corpus/templates/videos/app/i18n/pt-BR.ts +2 -0
  227. package/corpus/templates/videos/app/i18n/zh-CN.ts +2 -0
  228. package/corpus/templates/videos/app/i18n/zh-TW.ts +2 -0
  229. package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
  230. package/dist/agent/engine/index.d.ts +1 -1
  231. package/dist/agent/engine/index.d.ts.map +1 -1
  232. package/dist/agent/engine/index.js +1 -1
  233. package/dist/agent/engine/index.js.map +1 -1
  234. package/dist/agent/engine/registry.d.ts +9 -0
  235. package/dist/agent/engine/registry.d.ts.map +1 -1
  236. package/dist/agent/engine/registry.js +37 -0
  237. package/dist/agent/engine/registry.js.map +1 -1
  238. package/dist/agent/production-agent.d.ts.map +1 -1
  239. package/dist/agent/production-agent.js +4 -3
  240. package/dist/agent/production-agent.js.map +1 -1
  241. package/dist/cli/design-connect.d.ts +52 -0
  242. package/dist/cli/design-connect.d.ts.map +1 -0
  243. package/dist/cli/design-connect.js +409 -0
  244. package/dist/cli/design-connect.js.map +1 -0
  245. package/dist/cli/index.js +15 -0
  246. package/dist/cli/index.js.map +1 -1
  247. package/dist/cli/skills.d.ts +3 -0
  248. package/dist/cli/skills.d.ts.map +1 -1
  249. package/dist/cli/skills.js +121 -3
  250. package/dist/cli/skills.js.map +1 -1
  251. package/dist/client/AssistantChat.d.ts.map +1 -1
  252. package/dist/client/AssistantChat.js +38 -8
  253. package/dist/client/AssistantChat.js.map +1 -1
  254. package/dist/client/agent-chat.d.ts +6 -0
  255. package/dist/client/agent-chat.d.ts.map +1 -1
  256. package/dist/client/agent-chat.js +17 -3
  257. package/dist/client/agent-chat.js.map +1 -1
  258. package/dist/client/blocks/library/MermaidBlock.js +1 -1
  259. package/dist/client/blocks/library/MermaidBlock.js.map +1 -1
  260. package/dist/client/blocks/library/diagram.js +1 -1
  261. package/dist/client/blocks/library/diagram.js.map +1 -1
  262. package/dist/client/blocks/library/wireframe.js +1 -1
  263. package/dist/client/blocks/library/wireframe.js.map +1 -1
  264. package/dist/client/chat/message-components.js +1 -1
  265. package/dist/client/chat/message-components.js.map +1 -1
  266. package/dist/client/chat-model-groups.d.ts.map +1 -1
  267. package/dist/client/chat-model-groups.js +1 -2
  268. package/dist/client/chat-model-groups.js.map +1 -1
  269. package/dist/client/components/LiveCursorOverlay.d.ts +1 -2
  270. package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
  271. package/dist/client/components/LiveCursorOverlay.js +19 -40
  272. package/dist/client/components/LiveCursorOverlay.js.map +1 -1
  273. package/dist/client/composer/TiptapComposer.d.ts +3 -1
  274. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  275. package/dist/client/composer/TiptapComposer.js +86 -24
  276. package/dist/client/composer/TiptapComposer.js.map +1 -1
  277. package/dist/client/composer/useVoiceDictation.d.ts +9 -0
  278. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  279. package/dist/client/composer/useVoiceDictation.js +154 -32
  280. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  281. package/dist/client/frame-protocol.d.ts +17 -2
  282. package/dist/client/frame-protocol.d.ts.map +1 -1
  283. package/dist/client/frame-protocol.js.map +1 -1
  284. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +2 -2
  285. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
  286. package/dist/client/sharing/ShareButton.d.ts +2 -0
  287. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  288. package/dist/client/sharing/ShareButton.js +7 -6
  289. package/dist/client/sharing/ShareButton.js.map +1 -1
  290. package/dist/client/use-agent-engine-configured.d.ts +5 -0
  291. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  292. package/dist/client/use-agent-engine-configured.js +51 -25
  293. package/dist/client/use-agent-engine-configured.js.map +1 -1
  294. package/dist/collab/awareness.d.ts +2 -2
  295. package/dist/collab/awareness.d.ts.map +1 -1
  296. package/dist/collab/routes.d.ts +1 -1
  297. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  298. package/dist/notifications/routes.d.ts +3 -3
  299. package/dist/observability/routes.d.ts +8 -8
  300. package/dist/progress/routes.d.ts +1 -1
  301. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  302. package/dist/server/transcribe-voice.d.ts.map +1 -1
  303. package/dist/server/transcribe-voice.js +40 -24
  304. package/dist/server/transcribe-voice.js.map +1 -1
  305. package/dist/shared/mcp-embed-headers.d.ts +1 -0
  306. package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
  307. package/dist/shared/mcp-embed-headers.js +20 -1
  308. package/dist/shared/mcp-embed-headers.js.map +1 -1
  309. package/dist/styles/agent-native.css +56 -7
  310. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  311. package/dist/vite/client.d.ts.map +1 -1
  312. package/dist/vite/client.js +2 -0
  313. package/dist/vite/client.js.map +1 -1
  314. package/dist/voice/index.d.ts +5 -0
  315. package/dist/voice/index.d.ts.map +1 -0
  316. package/dist/voice/index.js +4 -0
  317. package/dist/voice/index.js.map +1 -0
  318. package/dist/voice/voice-cleanup-prompt.d.ts +6 -0
  319. package/dist/voice/voice-cleanup-prompt.d.ts.map +1 -0
  320. package/dist/voice/voice-cleanup-prompt.js +26 -0
  321. package/dist/voice/voice-cleanup-prompt.js.map +1 -0
  322. package/dist/voice/voice-context.d.ts +25 -0
  323. package/dist/voice/voice-context.d.ts.map +1 -0
  324. package/dist/voice/voice-context.js +156 -0
  325. package/dist/voice/voice-context.js.map +1 -0
  326. package/dist/voice/voice-replacements.d.ts +4 -0
  327. package/dist/voice/voice-replacements.d.ts.map +1 -0
  328. package/dist/voice/voice-replacements.js +52 -0
  329. package/dist/voice/voice-replacements.js.map +1 -0
  330. package/docs/content/locales/ar-SA/template-design.mdx +41 -0
  331. package/docs/content/locales/de-DE/template-design.mdx +51 -0
  332. package/docs/content/locales/es-ES/template-design.mdx +50 -0
  333. package/docs/content/locales/fr-FR/template-design.mdx +49 -0
  334. package/docs/content/locales/hi-IN/template-design.mdx +44 -0
  335. package/docs/content/locales/ja-JP/template-design.mdx +46 -0
  336. package/docs/content/locales/ko-KR/template-design.mdx +44 -0
  337. package/docs/content/locales/pt-BR/template-design.mdx +48 -0
  338. package/docs/content/locales/zh-CN/template-design.mdx +36 -0
  339. package/docs/content/locales/zh-TW/template-design.mdx +38 -0
  340. package/docs/content/template-design.mdx +45 -0
  341. package/package.json +2 -1
  342. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
  343. package/corpus/templates/design/app/components/design/DesignToolbar.tsx +0 -339
  344. package/corpus/templates/design/app/components/design/PresentMode.tsx +0 -68
  345. package/corpus/templates/design/app/components/design/ViewportTabs.tsx +0 -149
  346. package/corpus/templates/design/app/components/design/ZoomControls.tsx +0 -157
@@ -0,0 +1,361 @@
1
+ import { cn } from "@/lib/utils";
2
+
3
+ interface IconProps {
4
+ className?: string;
5
+ }
6
+
7
+ export function IconGap({ className }: IconProps) {
8
+ return (
9
+ <svg
10
+ viewBox="0 0 24 24"
11
+ fill="none"
12
+ stroke="currentColor"
13
+ strokeWidth={2}
14
+ strokeLinecap="round"
15
+ strokeLinejoin="round"
16
+ className={cn("size-4", className)}
17
+ aria-hidden="true"
18
+ >
19
+ {/* Left bracket ] */}
20
+ <line x1="8" y1="6" x2="4" y2="6" />
21
+ <line x1="4" y1="6" x2="4" y2="18" />
22
+ <line x1="4" y1="18" x2="8" y2="18" />
23
+ {/* Center dot */}
24
+ <circle cx="12" cy="12" r="1.5" fill="currentColor" stroke="none" />
25
+ {/* Right bracket [ */}
26
+ <line x1="16" y1="6" x2="20" y2="6" />
27
+ <line x1="20" y1="6" x2="20" y2="18" />
28
+ <line x1="20" y1="18" x2="16" y2="18" />
29
+ </svg>
30
+ );
31
+ }
32
+
33
+ export function IconPaddingHorizontal({ className }: IconProps) {
34
+ return (
35
+ <svg
36
+ viewBox="0 0 24 24"
37
+ fill="none"
38
+ stroke="currentColor"
39
+ strokeWidth={2}
40
+ strokeLinecap="round"
41
+ strokeLinejoin="round"
42
+ className={cn("size-4", className)}
43
+ aria-hidden="true"
44
+ >
45
+ {/* Outer frame */}
46
+ <rect x="3" y="3" width="18" height="18" rx="2" strokeWidth="1.5" />
47
+ {/* Thick left side */}
48
+ <line
49
+ x1="3"
50
+ y1="3"
51
+ x2="3"
52
+ y2="21"
53
+ strokeWidth="4"
54
+ strokeLinecap="square"
55
+ />
56
+ {/* Thick right side */}
57
+ <line
58
+ x1="21"
59
+ y1="3"
60
+ x2="21"
61
+ y2="21"
62
+ strokeWidth="4"
63
+ strokeLinecap="square"
64
+ />
65
+ </svg>
66
+ );
67
+ }
68
+
69
+ export function IconPaddingVertical({ className }: IconProps) {
70
+ return (
71
+ <svg
72
+ viewBox="0 0 24 24"
73
+ fill="none"
74
+ stroke="currentColor"
75
+ strokeWidth={2}
76
+ strokeLinecap="round"
77
+ strokeLinejoin="round"
78
+ className={cn("size-4", className)}
79
+ aria-hidden="true"
80
+ >
81
+ {/* Outer frame */}
82
+ <rect x="3" y="3" width="18" height="18" rx="2" strokeWidth="1.5" />
83
+ {/* Thick top side */}
84
+ <line
85
+ x1="3"
86
+ y1="3"
87
+ x2="21"
88
+ y2="3"
89
+ strokeWidth="4"
90
+ strokeLinecap="square"
91
+ />
92
+ {/* Thick bottom side */}
93
+ <line
94
+ x1="3"
95
+ y1="21"
96
+ x2="21"
97
+ y2="21"
98
+ strokeWidth="4"
99
+ strokeLinecap="square"
100
+ />
101
+ </svg>
102
+ );
103
+ }
104
+
105
+ export function IconFlowHorizontal({ className }: IconProps) {
106
+ return (
107
+ <svg
108
+ viewBox="0 0 24 24"
109
+ fill="none"
110
+ stroke="currentColor"
111
+ strokeWidth={2}
112
+ strokeLinecap="round"
113
+ strokeLinejoin="round"
114
+ className={cn("size-4", className)}
115
+ aria-hidden="true"
116
+ >
117
+ {/* Container frame */}
118
+ <rect x="2" y="7" width="20" height="10" rx="2" strokeWidth="1.5" />
119
+ {/* Left item */}
120
+ <rect
121
+ x="5"
122
+ y="10"
123
+ width="5"
124
+ height="4"
125
+ rx="1"
126
+ fill="currentColor"
127
+ stroke="none"
128
+ />
129
+ {/* Right item */}
130
+ <rect
131
+ x="14"
132
+ y="10"
133
+ width="5"
134
+ height="4"
135
+ rx="1"
136
+ fill="currentColor"
137
+ stroke="none"
138
+ />
139
+ </svg>
140
+ );
141
+ }
142
+
143
+ export function IconFlowVertical({ className }: IconProps) {
144
+ return (
145
+ <svg
146
+ viewBox="0 0 24 24"
147
+ fill="none"
148
+ stroke="currentColor"
149
+ strokeWidth={2}
150
+ strokeLinecap="round"
151
+ strokeLinejoin="round"
152
+ className={cn("size-4", className)}
153
+ aria-hidden="true"
154
+ >
155
+ {/* Container frame */}
156
+ <rect x="7" y="2" width="10" height="20" rx="2" strokeWidth="1.5" />
157
+ {/* Top item */}
158
+ <rect
159
+ x="10"
160
+ y="5"
161
+ width="4"
162
+ height="5"
163
+ rx="1"
164
+ fill="currentColor"
165
+ stroke="none"
166
+ />
167
+ {/* Bottom item */}
168
+ <rect
169
+ x="10"
170
+ y="14"
171
+ width="4"
172
+ height="5"
173
+ rx="1"
174
+ fill="currentColor"
175
+ stroke="none"
176
+ />
177
+ </svg>
178
+ );
179
+ }
180
+
181
+ export function IconFlowWrap({ className }: IconProps) {
182
+ return (
183
+ <svg
184
+ viewBox="0 0 24 24"
185
+ fill="none"
186
+ stroke="currentColor"
187
+ strokeWidth={2}
188
+ strokeLinecap="round"
189
+ strokeLinejoin="round"
190
+ className={cn("size-4", className)}
191
+ aria-hidden="true"
192
+ >
193
+ {/* First row: two items */}
194
+ <rect x="2" y="4" width="8" height="7" rx="1.5" strokeWidth="1.5" />
195
+ <rect x="12" y="4" width="8" height="7" rx="1.5" strokeWidth="1.5" />
196
+ {/* Second row: one item (wrap) */}
197
+ <rect x="2" y="13" width="8" height="7" rx="1.5" strokeWidth="1.5" />
198
+ {/* Wrap arrow */}
199
+ <polyline points="20,16 20,19 17,19" strokeWidth="1.5" />
200
+ </svg>
201
+ );
202
+ }
203
+
204
+ export function IconFlowGrid({ className }: IconProps) {
205
+ return (
206
+ <svg
207
+ viewBox="0 0 24 24"
208
+ fill="none"
209
+ stroke="currentColor"
210
+ strokeWidth={2}
211
+ strokeLinecap="round"
212
+ strokeLinejoin="round"
213
+ className={cn("size-4", className)}
214
+ aria-hidden="true"
215
+ >
216
+ {/* Top-left */}
217
+ <rect x="2" y="2" width="9" height="9" rx="1.5" strokeWidth="1.5" />
218
+ {/* Top-right */}
219
+ <rect x="13" y="2" width="9" height="9" rx="1.5" strokeWidth="1.5" />
220
+ {/* Bottom-left */}
221
+ <rect x="2" y="13" width="9" height="9" rx="1.5" strokeWidth="1.5" />
222
+ {/* Bottom-right */}
223
+ <rect x="13" y="13" width="9" height="9" rx="1.5" strokeWidth="1.5" />
224
+ </svg>
225
+ );
226
+ }
227
+
228
+ export function IconDistributeHorizontal({ className }: IconProps) {
229
+ return (
230
+ <svg
231
+ viewBox="0 0 24 24"
232
+ fill="none"
233
+ stroke="currentColor"
234
+ strokeWidth={2}
235
+ strokeLinecap="round"
236
+ strokeLinejoin="round"
237
+ className={cn("size-4", className)}
238
+ aria-hidden="true"
239
+ >
240
+ {/* Left rail */}
241
+ <line x1="3" y1="5" x2="3" y2="19" />
242
+ {/* Right rail */}
243
+ <line x1="21" y1="5" x2="21" y2="19" />
244
+ {/* Center item */}
245
+ <rect
246
+ x="9"
247
+ y="9"
248
+ width="6"
249
+ height="6"
250
+ rx="1"
251
+ fill="currentColor"
252
+ stroke="none"
253
+ />
254
+ {/* Spacing tick marks */}
255
+ <line x1="6" y1="10" x2="6" y2="14" strokeWidth="1.5" />
256
+ <line x1="18" y1="10" x2="18" y2="14" strokeWidth="1.5" />
257
+ </svg>
258
+ );
259
+ }
260
+
261
+ export function IconDistributeVertical({ className }: IconProps) {
262
+ return (
263
+ <svg
264
+ viewBox="0 0 24 24"
265
+ fill="none"
266
+ stroke="currentColor"
267
+ strokeWidth={2}
268
+ strokeLinecap="round"
269
+ strokeLinejoin="round"
270
+ className={cn("size-4", className)}
271
+ aria-hidden="true"
272
+ >
273
+ {/* Top rail */}
274
+ <line x1="5" y1="3" x2="19" y2="3" />
275
+ {/* Bottom rail */}
276
+ <line x1="5" y1="21" x2="19" y2="21" />
277
+ {/* Center item */}
278
+ <rect
279
+ x="9"
280
+ y="9"
281
+ width="6"
282
+ height="6"
283
+ rx="1"
284
+ fill="currentColor"
285
+ stroke="none"
286
+ />
287
+ {/* Spacing tick marks */}
288
+ <line x1="10" y1="6" x2="14" y2="6" strokeWidth="1.5" />
289
+ <line x1="10" y1="18" x2="14" y2="18" strokeWidth="1.5" />
290
+ </svg>
291
+ );
292
+ }
293
+
294
+ export function IconLayoutSettings({ className }: IconProps) {
295
+ return (
296
+ <svg
297
+ viewBox="0 0 24 24"
298
+ fill="none"
299
+ stroke="currentColor"
300
+ strokeWidth={2}
301
+ strokeLinecap="round"
302
+ strokeLinejoin="round"
303
+ className={cn("size-4", className)}
304
+ aria-hidden="true"
305
+ >
306
+ {/* Line 1 with handle at x=8 */}
307
+ <line x1="3" y1="7" x2="21" y2="7" />
308
+ <circle
309
+ cx="8"
310
+ cy="7"
311
+ r="2"
312
+ fill="var(--background, white)"
313
+ strokeWidth="2"
314
+ />
315
+ {/* Line 2 with handle at x=15 */}
316
+ <line x1="3" y1="12" x2="21" y2="12" />
317
+ <circle
318
+ cx="15"
319
+ cy="12"
320
+ r="2"
321
+ fill="var(--background, white)"
322
+ strokeWidth="2"
323
+ />
324
+ {/* Line 3 with handle at x=10 */}
325
+ <line x1="3" y1="17" x2="21" y2="17" />
326
+ <circle
327
+ cx="10"
328
+ cy="17"
329
+ r="2"
330
+ fill="var(--background, white)"
331
+ strokeWidth="2"
332
+ />
333
+ </svg>
334
+ );
335
+ }
336
+
337
+ export function IconResizeToFit({ className }: IconProps) {
338
+ return (
339
+ <svg
340
+ viewBox="0 0 24 24"
341
+ fill="none"
342
+ stroke="currentColor"
343
+ strokeWidth={2}
344
+ strokeLinecap="round"
345
+ strokeLinejoin="round"
346
+ className={cn("size-4", className)}
347
+ aria-hidden="true"
348
+ >
349
+ {/* Inner content box */}
350
+ <rect x="8" y="8" width="8" height="8" rx="1" strokeWidth="1.5" />
351
+ {/* Top-left corner arrows */}
352
+ <polyline points="4,8 4,4 8,4" />
353
+ {/* Top-right corner arrows */}
354
+ <polyline points="16,4 20,4 20,8" />
355
+ {/* Bottom-left corner arrows */}
356
+ <polyline points="8,20 4,20 4,16" />
357
+ {/* Bottom-right corner arrows */}
358
+ <polyline points="20,16 20,20 16,20" />
359
+ </svg>
360
+ );
361
+ }
@@ -0,0 +1,60 @@
1
+ export {
2
+ AlignmentMatrix,
3
+ type AlignmentHorizontal,
4
+ type AlignmentMatrixLabels,
5
+ type AlignmentMatrixProps,
6
+ type AlignmentMatrixValue,
7
+ type AlignmentVertical,
8
+ type DistributionAxis,
9
+ } from "./AlignmentMatrix";
10
+ export {
11
+ AutoLayoutMatrix,
12
+ type AutoLayoutDirection,
13
+ type AutoLayoutMatrixLabels,
14
+ type AutoLayoutMatrixProps,
15
+ type AutoLayoutMatrixValue,
16
+ type AutoLayoutPadding,
17
+ type AutoLayoutSizing,
18
+ type AutoLayoutSizingAxis,
19
+ type AutoLayoutWrap,
20
+ } from "./AutoLayoutMatrix";
21
+ export {
22
+ ConstraintsWidget,
23
+ type ConstraintsValue,
24
+ type ConstraintsWidgetLabels,
25
+ type ConstraintsWidgetProps,
26
+ type HorizontalConstraint,
27
+ type VerticalConstraint,
28
+ } from "./ConstraintsWidget";
29
+ export {
30
+ ExportSettingsPanel,
31
+ type ExportFormat,
32
+ type ExportSettingsPanelLabels,
33
+ type ExportSettingsPanelProps,
34
+ type ExportSettingsValue,
35
+ } from "./ExportSettingsPanel";
36
+ export {
37
+ FigmaColorPicker,
38
+ type FigmaColorMode,
39
+ type FigmaColorPickerLabels,
40
+ type FigmaColorPickerProps,
41
+ type FigmaFillRow,
42
+ type FigmaFillRowPatch,
43
+ type FigmaFillType,
44
+ type FigmaGradientStop,
45
+ type FigmaGradientStopPatch,
46
+ type FigmaGradientType,
47
+ } from "./FigmaColorPicker";
48
+ export {
49
+ ScrubInput,
50
+ type ScrubInputChangeMeta,
51
+ type ScrubInputProps,
52
+ } from "./ScrubInput";
53
+ export {
54
+ formatScrubValue,
55
+ getScrubStepFromEvent,
56
+ normalizeScrubNumber,
57
+ parseScrubExpression,
58
+ type ParsedScrubExpression,
59
+ type ScrubExpressionOptions,
60
+ } from "./scrub-input-utils";
@@ -0,0 +1,201 @@
1
+ export interface ScrubExpressionOptions {
2
+ unit?: string;
3
+ min?: number;
4
+ max?: number;
5
+ precision?: number;
6
+ }
7
+
8
+ export interface ParsedScrubExpression {
9
+ value: number;
10
+ normalized: string;
11
+ }
12
+
13
+ type MathOperator = "+" | "-" | "*" | "/";
14
+
15
+ type Token =
16
+ | { type: "number"; value: number }
17
+ | { type: "operator"; value: MathOperator };
18
+
19
+ const NUMBER_CHAR_PATTERN = /[0-9.]/;
20
+
21
+ export function parseScrubExpression(
22
+ input: string,
23
+ currentValue: number,
24
+ options: ScrubExpressionOptions = {},
25
+ ): ParsedScrubExpression | null {
26
+ const raw = input.trim();
27
+ if (!raw) return null;
28
+
29
+ const expression = toNumericExpression(raw, currentValue, options.unit);
30
+ const value = evaluateNumericExpression(expression);
31
+ if (value === null) return null;
32
+
33
+ const normalizedValue = normalizeScrubNumber(value, options);
34
+ return {
35
+ value: normalizedValue,
36
+ normalized: formatScrubValue(normalizedValue, options),
37
+ };
38
+ }
39
+
40
+ export function normalizeScrubNumber(
41
+ value: number,
42
+ options: ScrubExpressionOptions = {},
43
+ ): number {
44
+ if (!Number.isFinite(value)) return 0;
45
+
46
+ let next = value;
47
+ if (Number.isFinite(options.min)) next = Math.max(options.min!, next);
48
+ if (Number.isFinite(options.max)) next = Math.min(options.max!, next);
49
+ if (Number.isFinite(options.precision)) {
50
+ const scale = 10 ** Math.max(0, options.precision!);
51
+ next = Math.round(next * scale) / scale;
52
+ }
53
+ return Object.is(next, -0) ? 0 : next;
54
+ }
55
+
56
+ export function formatScrubValue(
57
+ value: number,
58
+ options: Pick<ScrubExpressionOptions, "precision" | "unit"> = {},
59
+ ): string {
60
+ const normalized = normalizeScrubNumber(value, options);
61
+ const numeric =
62
+ Number.isFinite(options.precision) && options.precision! >= 0
63
+ ? normalized.toFixed(options.precision).replace(/\.?0+$/, "")
64
+ : String(normalized);
65
+ return `${numeric}${options.unit ?? ""}`;
66
+ }
67
+
68
+ export function getScrubStepFromEvent(
69
+ event: Pick<KeyboardEvent | PointerEvent, "altKey" | "shiftKey">,
70
+ step: number,
71
+ ): number {
72
+ let multiplier = 1;
73
+ if (event.shiftKey) multiplier *= 10;
74
+ if (event.altKey) multiplier *= 0.1;
75
+ return step * multiplier;
76
+ }
77
+
78
+ function toNumericExpression(
79
+ raw: string,
80
+ currentValue: number,
81
+ unit?: string,
82
+ ): string {
83
+ let expression = raw.trim();
84
+
85
+ if (unit) {
86
+ expression = expression.replace(new RegExp(escapeRegExp(unit), "gi"), "");
87
+ }
88
+
89
+ if (expression.startsWith("=")) return expression.slice(1).trim();
90
+ if (/^[+\-*/]/.test(expression)) return `${currentValue}${expression}`;
91
+ return expression;
92
+ }
93
+
94
+ function evaluateNumericExpression(expression: string): number | null {
95
+ const tokens = tokenizeExpression(expression);
96
+ if (!tokens.length) return null;
97
+
98
+ const values: number[] = [];
99
+ const operators: MathOperator[] = [];
100
+
101
+ for (const token of tokens) {
102
+ if (token.type === "number") {
103
+ values.push(token.value);
104
+ continue;
105
+ }
106
+
107
+ while (
108
+ operators.length &&
109
+ precedence(operators[operators.length - 1]) >= precedence(token.value)
110
+ ) {
111
+ if (!applyTopOperator(values, operators)) return null;
112
+ }
113
+ operators.push(token.value);
114
+ }
115
+
116
+ while (operators.length) {
117
+ if (!applyTopOperator(values, operators)) return null;
118
+ }
119
+
120
+ if (values.length !== 1 || !Number.isFinite(values[0])) return null;
121
+ return values[0];
122
+ }
123
+
124
+ function tokenizeExpression(expression: string): Token[] {
125
+ const tokens: Token[] = [];
126
+ let index = 0;
127
+ let previousWasOperator = true;
128
+
129
+ while (index < expression.length) {
130
+ const char = expression[index];
131
+ if (/\s/.test(char)) {
132
+ index += 1;
133
+ continue;
134
+ }
135
+
136
+ const signedNumber =
137
+ (char === "+" || char === "-") &&
138
+ previousWasOperator &&
139
+ NUMBER_CHAR_PATTERN.test(expression[index + 1] ?? "");
140
+
141
+ if (NUMBER_CHAR_PATTERN.test(char) || signedNumber) {
142
+ const start = index;
143
+ index += 1;
144
+ while (NUMBER_CHAR_PATTERN.test(expression[index] ?? "")) index += 1;
145
+ const value = Number(expression.slice(start, index));
146
+ if (!Number.isFinite(value)) return [];
147
+ tokens.push({ type: "number", value });
148
+ previousWasOperator = false;
149
+ continue;
150
+ }
151
+
152
+ if (isOperator(char)) {
153
+ tokens.push({ type: "operator", value: char });
154
+ previousWasOperator = true;
155
+ index += 1;
156
+ continue;
157
+ }
158
+
159
+ return [];
160
+ }
161
+
162
+ return tokens;
163
+ }
164
+
165
+ function applyTopOperator(
166
+ values: number[],
167
+ operators: MathOperator[],
168
+ ): boolean {
169
+ const operator = operators.pop();
170
+ const right = values.pop();
171
+ const left = values.pop();
172
+ if (!operator || right === undefined || left === undefined) return false;
173
+
174
+ switch (operator) {
175
+ case "+":
176
+ values.push(left + right);
177
+ return true;
178
+ case "-":
179
+ values.push(left - right);
180
+ return true;
181
+ case "*":
182
+ values.push(left * right);
183
+ return true;
184
+ case "/":
185
+ if (right === 0) return false;
186
+ values.push(left / right);
187
+ return true;
188
+ }
189
+ }
190
+
191
+ function precedence(operator: MathOperator): number {
192
+ return operator === "*" || operator === "/" ? 2 : 1;
193
+ }
194
+
195
+ function isOperator(char: string): char is MathOperator {
196
+ return char === "+" || char === "-" || char === "*" || char === "/";
197
+ }
198
+
199
+ function escapeRegExp(value: string): string {
200
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
201
+ }
@@ -1,14 +1,37 @@
1
1
  export interface ElementInfo {
2
2
  tagName: string;
3
3
  id?: string;
4
+ sourceId?: string;
4
5
  selector?: string;
5
6
  classes: string[];
6
7
  computedStyles: Record<string, string>;
7
8
  boundingRect: { x: number; y: number; width: number; height: number };
8
9
  textContent?: string;
10
+ htmlContent?: string;
9
11
  isFlexChild: boolean;
10
12
  isFlexContainer: boolean;
11
13
  parentDisplay?: string;
14
+ parentLayout?: {
15
+ display?: string;
16
+ flexDirection?: string;
17
+ alignItems?: string;
18
+ justifyContent?: string;
19
+ gap?: string;
20
+ gridTemplateColumns?: string;
21
+ gridTemplateRows?: string;
22
+ position?: string;
23
+ };
24
+ editCapabilities?: Array<{
25
+ kind:
26
+ | "deterministic-style-edit"
27
+ | "deterministic-class-edit"
28
+ | "agent-structural-edit"
29
+ | "unsupported";
30
+ label: string;
31
+ confidence: number;
32
+ reason?: string;
33
+ }>;
34
+ confidence?: number;
12
35
  }
13
36
 
14
37
  export type DeviceFrameType = "none" | "desktop" | "tablet" | "mobile";