@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,782 @@
1
+ /**
2
+ * Single source of truth for the 8 curated GPU shader presets.
3
+ *
4
+ * This file intentionally does NOT import from @paper-design/shaders-react
5
+ * so it remains SSR-safe and can be imported in Vitest without a DOM.
6
+ * All param metadata is inlined from the package defaults (v0.0.76).
7
+ */
8
+
9
+ // ---------------------------------------------------------------------------
10
+ // Core types
11
+ // ---------------------------------------------------------------------------
12
+
13
+ export type ParamKind = "number" | "color" | "enum" | "bool" | "colors";
14
+
15
+ export interface ParamDef {
16
+ key: string;
17
+ kind: ParamKind;
18
+ label: string;
19
+ default: number | boolean | string | string[];
20
+ /** Inclusive minimum — only for kind "number" */
21
+ min?: number;
22
+ /** Inclusive maximum — only for kind "number" */
23
+ max?: number;
24
+ /** Slider step — only for kind "number" */
25
+ step?: number;
26
+ /** Allowed values — only for kind "enum" */
27
+ options?: string[];
28
+ /** Maximum array length — only for kind "colors" */
29
+ maxCount?: number;
30
+ /**
31
+ * True when updating this param triggers a full shader recompile.
32
+ * Show a warning in the UI for grainMixer / grainOverlay.
33
+ */
34
+ isExpensive?: boolean;
35
+ }
36
+
37
+ export type ShaderPresetName =
38
+ | "MeshGradient"
39
+ | "GrainGradient"
40
+ | "Voronoi"
41
+ | "Metaballs"
42
+ | "Warp"
43
+ | "GodRays"
44
+ | "Dithering"
45
+ | "PaperTexture";
46
+
47
+ /**
48
+ * The serialisable descriptor stored on a layer / design token.
49
+ * Universal sizing params (fit, scale, rotation, offsetX, offsetY) live here
50
+ * at the top level; shader-specific params live in `params`.
51
+ */
52
+ export interface ShaderDescriptor {
53
+ preset: ShaderPresetName;
54
+ /** Shader-specific numeric / enum / bool params (not colors, not universal sizing). */
55
+ params: Record<string, number | boolean | string>;
56
+ /** Color array for shaders that accept a variable-length palette. */
57
+ colors?: string[];
58
+ speed?: number;
59
+ frame?: number;
60
+ fit?: "none" | "contain" | "cover";
61
+ scale?: number;
62
+ rotation?: number;
63
+ offsetX?: number;
64
+ offsetY?: number;
65
+ }
66
+
67
+ export interface ShaderPresetDef {
68
+ name: ShaderPresetName;
69
+ label: string;
70
+ description: string;
71
+ /** Default value for the `colors[]` array, if the shader accepts one. */
72
+ defaultColors?: string[];
73
+ /** Default value for the `colorBack` single-color param. */
74
+ defaultColorBack?: string;
75
+ /** Default value for the `colorFront` single-color param. */
76
+ defaultColorFront?: string;
77
+ /** Default value for the `colorBloom` single-color param (GodRays). */
78
+ defaultColorBloom?: string;
79
+ /** Default value for the `colorGlow` single-color param (Voronoi). */
80
+ defaultColorGlow?: string;
81
+ /** Default value for the `colorGap` single-color param (Voronoi). */
82
+ defaultColorGap?: string;
83
+ /**
84
+ * Shader-specific param definitions.
85
+ * Does NOT include the universal sizing/animation params
86
+ * (fit, scale, rotation, offsetX, offsetY, originX, originY, speed, frame).
87
+ */
88
+ params: ParamDef[];
89
+ /** Maximum number of entries in the colors[] array. */
90
+ maxColorCount?: number;
91
+ /**
92
+ * True when the shader is intended as a composited overlay effect
93
+ * rather than a standalone background (e.g. Dithering).
94
+ */
95
+ isEffect?: boolean;
96
+ }
97
+
98
+ // ---------------------------------------------------------------------------
99
+ // Universal params — shared by every shader
100
+ // These are surfaced at the ShaderDescriptor top level, not in params{}.
101
+ // ---------------------------------------------------------------------------
102
+
103
+ export const UNIVERSAL_PARAMS: ParamDef[] = [
104
+ {
105
+ key: "fit",
106
+ kind: "enum",
107
+ label: "Fit",
108
+ default: "contain",
109
+ options: ["none", "contain", "cover"],
110
+ },
111
+ {
112
+ key: "scale",
113
+ kind: "number",
114
+ label: "Scale",
115
+ default: 1,
116
+ min: 0.01,
117
+ max: 10,
118
+ step: 0.01,
119
+ },
120
+ {
121
+ key: "rotation",
122
+ kind: "number",
123
+ label: "Rotation (rad)",
124
+ default: 0,
125
+ min: -3.14159,
126
+ max: 3.14159,
127
+ step: 0.01,
128
+ },
129
+ {
130
+ key: "offsetX",
131
+ kind: "number",
132
+ label: "Offset X",
133
+ default: 0,
134
+ min: -1,
135
+ max: 1,
136
+ step: 0.01,
137
+ },
138
+ {
139
+ key: "offsetY",
140
+ kind: "number",
141
+ label: "Offset Y",
142
+ default: 0,
143
+ min: -1,
144
+ max: 1,
145
+ step: 0.01,
146
+ },
147
+ {
148
+ key: "speed",
149
+ kind: "number",
150
+ label: "Speed",
151
+ default: 1,
152
+ min: -5,
153
+ max: 5,
154
+ step: 0.1,
155
+ },
156
+ {
157
+ key: "frame",
158
+ kind: "number",
159
+ label: "Frame",
160
+ default: 0,
161
+ min: 0,
162
+ max: 10000,
163
+ step: 1,
164
+ },
165
+ ];
166
+
167
+ // ---------------------------------------------------------------------------
168
+ // Preset definitions
169
+ // ---------------------------------------------------------------------------
170
+
171
+ export const SHADER_PRESETS: readonly ShaderPresetDef[] = [
172
+ // -------------------------------------------------------------------------
173
+ // MeshGradient
174
+ // -------------------------------------------------------------------------
175
+ {
176
+ name: "MeshGradient",
177
+ label: "Mesh Gradient",
178
+ description:
179
+ "Smooth flowing gradient mesh with optional film grain overlay.",
180
+ defaultColors: ["#e0eaff", "#241d9a", "#f75092", "#9f50d3"],
181
+ maxColorCount: 10,
182
+ params: [
183
+ {
184
+ key: "distortion",
185
+ kind: "number",
186
+ label: "Distortion",
187
+ default: 0.8,
188
+ min: 0,
189
+ max: 1,
190
+ step: 0.01,
191
+ },
192
+ {
193
+ key: "swirl",
194
+ kind: "number",
195
+ label: "Swirl",
196
+ default: 0.1,
197
+ min: 0,
198
+ max: 1,
199
+ step: 0.01,
200
+ },
201
+ {
202
+ key: "grainMixer",
203
+ kind: "number",
204
+ label: "Grain Mixer",
205
+ default: 0,
206
+ min: 0,
207
+ max: 1,
208
+ step: 0.01,
209
+ isExpensive: true,
210
+ },
211
+ {
212
+ key: "grainOverlay",
213
+ kind: "number",
214
+ label: "Grain Overlay",
215
+ default: 0,
216
+ min: 0,
217
+ max: 1,
218
+ step: 0.01,
219
+ isExpensive: true,
220
+ },
221
+ ],
222
+ },
223
+
224
+ // -------------------------------------------------------------------------
225
+ // GrainGradient
226
+ // -------------------------------------------------------------------------
227
+ {
228
+ name: "GrainGradient",
229
+ label: "Grain Gradient",
230
+ description: "Noisy gradient with configurable shape and grain intensity.",
231
+ defaultColorBack: "#000000",
232
+ defaultColors: ["#7300ff", "#eba8ff", "#00bfff", "#2a00ff"],
233
+ maxColorCount: 7,
234
+ params: [
235
+ {
236
+ key: "softness",
237
+ kind: "number",
238
+ label: "Softness",
239
+ default: 0.5,
240
+ min: 0,
241
+ max: 1,
242
+ step: 0.01,
243
+ },
244
+ {
245
+ key: "intensity",
246
+ kind: "number",
247
+ label: "Intensity",
248
+ default: 0.5,
249
+ min: 0,
250
+ max: 1,
251
+ step: 0.01,
252
+ },
253
+ {
254
+ key: "noise",
255
+ kind: "number",
256
+ label: "Noise",
257
+ default: 0.25,
258
+ min: 0,
259
+ max: 1,
260
+ step: 0.01,
261
+ },
262
+ {
263
+ key: "shape",
264
+ kind: "enum",
265
+ label: "Shape",
266
+ default: "corners",
267
+ options: [
268
+ "corners",
269
+ "radial",
270
+ "wave",
271
+ "dots",
272
+ "truchet",
273
+ "ripple",
274
+ "blob",
275
+ ],
276
+ },
277
+ ],
278
+ },
279
+
280
+ // -------------------------------------------------------------------------
281
+ // Voronoi
282
+ // -------------------------------------------------------------------------
283
+ {
284
+ name: "Voronoi",
285
+ label: "Voronoi",
286
+ description: "Animated Voronoi cell diagram with glow and gap controls.",
287
+ defaultColors: ["#ff8247", "#ffe53d"],
288
+ defaultColorGlow: "#ffffff",
289
+ defaultColorGap: "#2e0000",
290
+ maxColorCount: 5,
291
+ params: [
292
+ {
293
+ key: "stepsPerColor",
294
+ kind: "number",
295
+ label: "Steps Per Color",
296
+ default: 3,
297
+ min: 1,
298
+ max: 10,
299
+ step: 1,
300
+ },
301
+ {
302
+ key: "colorGlow",
303
+ kind: "color",
304
+ label: "Glow Color",
305
+ default: "#ffffff",
306
+ },
307
+ {
308
+ key: "colorGap",
309
+ kind: "color",
310
+ label: "Gap Color",
311
+ default: "#2e0000",
312
+ },
313
+ {
314
+ key: "distortion",
315
+ kind: "number",
316
+ label: "Distortion",
317
+ default: 0.4,
318
+ min: 0,
319
+ max: 2,
320
+ step: 0.01,
321
+ },
322
+ {
323
+ key: "gap",
324
+ kind: "number",
325
+ label: "Gap",
326
+ default: 0.04,
327
+ min: 0,
328
+ max: 0.2,
329
+ step: 0.001,
330
+ },
331
+ {
332
+ key: "glow",
333
+ kind: "number",
334
+ label: "Glow",
335
+ default: 0,
336
+ min: 0,
337
+ max: 1,
338
+ step: 0.01,
339
+ },
340
+ ],
341
+ },
342
+
343
+ // -------------------------------------------------------------------------
344
+ // Metaballs
345
+ // -------------------------------------------------------------------------
346
+ {
347
+ name: "Metaballs",
348
+ label: "Metaballs",
349
+ description: "Organic blobs that merge and separate over time.",
350
+ defaultColorBack: "#000000",
351
+ defaultColors: ["#6e33cc", "#ff5500", "#ffc105", "#ffc800", "#f585ff"],
352
+ maxColorCount: 8,
353
+ params: [
354
+ {
355
+ key: "count",
356
+ kind: "number",
357
+ label: "Count",
358
+ default: 10,
359
+ min: 1,
360
+ max: 20,
361
+ step: 1,
362
+ },
363
+ {
364
+ key: "size",
365
+ kind: "number",
366
+ label: "Size",
367
+ default: 0.83,
368
+ min: 0.01,
369
+ max: 2,
370
+ step: 0.01,
371
+ },
372
+ ],
373
+ },
374
+
375
+ // -------------------------------------------------------------------------
376
+ // Warp
377
+ // -------------------------------------------------------------------------
378
+ {
379
+ name: "Warp",
380
+ label: "Warp",
381
+ description: "Domain-warped gradient with shape-based tiling.",
382
+ defaultColors: ["#121212", "#9470ff", "#121212", "#8838ff"],
383
+ maxColorCount: 10,
384
+ params: [
385
+ {
386
+ key: "proportion",
387
+ kind: "number",
388
+ label: "Proportion",
389
+ default: 0.45,
390
+ min: 0,
391
+ max: 1,
392
+ step: 0.01,
393
+ },
394
+ {
395
+ key: "softness",
396
+ kind: "number",
397
+ label: "Softness",
398
+ default: 1,
399
+ min: 0,
400
+ max: 2,
401
+ step: 0.01,
402
+ },
403
+ {
404
+ key: "distortion",
405
+ kind: "number",
406
+ label: "Distortion",
407
+ default: 0.25,
408
+ min: 0,
409
+ max: 1,
410
+ step: 0.01,
411
+ },
412
+ {
413
+ key: "swirl",
414
+ kind: "number",
415
+ label: "Swirl",
416
+ default: 0.8,
417
+ min: 0,
418
+ max: 5,
419
+ step: 0.01,
420
+ },
421
+ {
422
+ key: "swirlIterations",
423
+ kind: "number",
424
+ label: "Swirl Iterations",
425
+ default: 10,
426
+ min: 1,
427
+ max: 20,
428
+ step: 1,
429
+ },
430
+ {
431
+ key: "shapeScale",
432
+ kind: "number",
433
+ label: "Shape Scale",
434
+ default: 0.1,
435
+ min: 0,
436
+ max: 1,
437
+ step: 0.01,
438
+ },
439
+ {
440
+ key: "shape",
441
+ kind: "enum",
442
+ label: "Shape",
443
+ default: "checks",
444
+ options: ["checks", "cross", "circle", "star", "waves", "spiral"],
445
+ },
446
+ ],
447
+ },
448
+
449
+ // -------------------------------------------------------------------------
450
+ // GodRays
451
+ // -------------------------------------------------------------------------
452
+ {
453
+ name: "GodRays",
454
+ label: "God Rays",
455
+ description: "Volumetric light rays emanating from a configurable source.",
456
+ defaultColorBack: "#000000",
457
+ defaultColorBloom: "#0000ff",
458
+ defaultColors: ["#a600ff6e", "#6200fff0", "#ffffff", "#33fff5"],
459
+ maxColorCount: 5,
460
+ params: [
461
+ {
462
+ key: "colorBloom",
463
+ kind: "color",
464
+ label: "Bloom Color",
465
+ default: "#0000ff",
466
+ },
467
+ {
468
+ key: "density",
469
+ kind: "number",
470
+ label: "Density",
471
+ default: 0.3,
472
+ min: 0,
473
+ max: 1,
474
+ step: 0.01,
475
+ },
476
+ {
477
+ key: "spotty",
478
+ kind: "number",
479
+ label: "Spotty",
480
+ default: 0.3,
481
+ min: 0,
482
+ max: 1,
483
+ step: 0.01,
484
+ },
485
+ {
486
+ key: "midIntensity",
487
+ kind: "number",
488
+ label: "Mid Intensity",
489
+ default: 0.4,
490
+ min: 0,
491
+ max: 1,
492
+ step: 0.01,
493
+ },
494
+ {
495
+ key: "midSize",
496
+ kind: "number",
497
+ label: "Mid Size",
498
+ default: 0.2,
499
+ min: 0,
500
+ max: 1,
501
+ step: 0.01,
502
+ },
503
+ {
504
+ key: "intensity",
505
+ kind: "number",
506
+ label: "Intensity",
507
+ default: 0.8,
508
+ min: 0,
509
+ max: 1,
510
+ step: 0.01,
511
+ },
512
+ {
513
+ key: "bloom",
514
+ kind: "number",
515
+ label: "Bloom",
516
+ default: 0.4,
517
+ min: 0,
518
+ max: 1,
519
+ step: 0.01,
520
+ },
521
+ ],
522
+ },
523
+
524
+ // -------------------------------------------------------------------------
525
+ // Dithering
526
+ // -------------------------------------------------------------------------
527
+ {
528
+ name: "Dithering",
529
+ label: "Dithering",
530
+ description:
531
+ "Ordered dithering overlay effect. Composites over the layer beneath it.",
532
+ defaultColorBack: "#000000",
533
+ defaultColorFront: "#00b2ff",
534
+ isEffect: true,
535
+ params: [
536
+ {
537
+ key: "colorBack",
538
+ kind: "color",
539
+ label: "Background Color",
540
+ default: "#000000",
541
+ },
542
+ {
543
+ key: "colorFront",
544
+ kind: "color",
545
+ label: "Foreground Color",
546
+ default: "#00b2ff",
547
+ },
548
+ {
549
+ key: "shape",
550
+ kind: "enum",
551
+ label: "Shape",
552
+ default: "sphere",
553
+ options: ["sphere", "ring", "pill", "linear", "diamond"],
554
+ },
555
+ {
556
+ key: "type",
557
+ kind: "enum",
558
+ label: "Dither Type",
559
+ default: "4x4",
560
+ options: [
561
+ "4x4",
562
+ "8x8",
563
+ "2x2",
564
+ "ordered",
565
+ "checker",
566
+ "bluenoise",
567
+ "random",
568
+ ],
569
+ },
570
+ {
571
+ key: "size",
572
+ kind: "number",
573
+ label: "Size",
574
+ default: 2,
575
+ min: 1,
576
+ max: 20,
577
+ step: 1,
578
+ },
579
+ ],
580
+ },
581
+
582
+ // -------------------------------------------------------------------------
583
+ // PaperTexture
584
+ // -------------------------------------------------------------------------
585
+ {
586
+ name: "PaperTexture",
587
+ label: "Paper Texture",
588
+ description:
589
+ "Procedural paper surface with grain, fiber, crumples, and folds.",
590
+ defaultColorFront: "#9fadbc",
591
+ defaultColorBack: "#ffffff",
592
+ params: [
593
+ {
594
+ key: "colorFront",
595
+ kind: "color",
596
+ label: "Front Color",
597
+ default: "#9fadbc",
598
+ },
599
+ {
600
+ key: "colorBack",
601
+ kind: "color",
602
+ label: "Back Color",
603
+ default: "#ffffff",
604
+ },
605
+ {
606
+ key: "contrast",
607
+ kind: "number",
608
+ label: "Contrast",
609
+ default: 0.3,
610
+ min: 0,
611
+ max: 1,
612
+ step: 0.01,
613
+ },
614
+ {
615
+ key: "roughness",
616
+ kind: "number",
617
+ label: "Roughness",
618
+ default: 0.4,
619
+ min: 0,
620
+ max: 1,
621
+ step: 0.01,
622
+ },
623
+ {
624
+ key: "fiber",
625
+ kind: "number",
626
+ label: "Fiber",
627
+ default: 0.3,
628
+ min: 0,
629
+ max: 1,
630
+ step: 0.01,
631
+ },
632
+ {
633
+ key: "fiberSize",
634
+ kind: "number",
635
+ label: "Fiber Size",
636
+ default: 0.2,
637
+ min: 0,
638
+ max: 1,
639
+ step: 0.01,
640
+ },
641
+ {
642
+ key: "crumples",
643
+ kind: "number",
644
+ label: "Crumples",
645
+ default: 0.3,
646
+ min: 0,
647
+ max: 1,
648
+ step: 0.01,
649
+ },
650
+ {
651
+ key: "crumpleSize",
652
+ kind: "number",
653
+ label: "Crumple Size",
654
+ default: 0.35,
655
+ min: 0,
656
+ max: 1,
657
+ step: 0.01,
658
+ },
659
+ {
660
+ key: "folds",
661
+ kind: "number",
662
+ label: "Folds",
663
+ default: 0.65,
664
+ min: 0,
665
+ max: 1,
666
+ step: 0.01,
667
+ },
668
+ {
669
+ key: "foldCount",
670
+ kind: "number",
671
+ label: "Fold Count",
672
+ default: 5,
673
+ min: 1,
674
+ max: 20,
675
+ step: 1,
676
+ },
677
+ {
678
+ key: "fade",
679
+ kind: "number",
680
+ label: "Fade",
681
+ default: 0,
682
+ min: 0,
683
+ max: 1,
684
+ step: 0.01,
685
+ },
686
+ {
687
+ key: "drops",
688
+ kind: "number",
689
+ label: "Drops",
690
+ default: 0.2,
691
+ min: 0,
692
+ max: 1,
693
+ step: 0.01,
694
+ },
695
+ {
696
+ key: "seed",
697
+ kind: "number",
698
+ label: "Seed",
699
+ default: 5.8,
700
+ min: 0,
701
+ max: 100,
702
+ step: 0.1,
703
+ },
704
+ ],
705
+ },
706
+ ] as const;
707
+
708
+ // ---------------------------------------------------------------------------
709
+ // Derived lookups
710
+ // ---------------------------------------------------------------------------
711
+
712
+ export const SHADER_PRESET_MAP: Record<ShaderPresetName, ShaderPresetDef> =
713
+ Object.fromEntries(SHADER_PRESETS.map((p) => [p.name, p])) as Record<
714
+ ShaderPresetName,
715
+ ShaderPresetDef
716
+ >;
717
+
718
+ // ---------------------------------------------------------------------------
719
+ // Helper functions
720
+ // ---------------------------------------------------------------------------
721
+
722
+ /** Return a preset by name, or undefined if not found. */
723
+ export function getPreset(name: string): ShaderPresetDef | undefined {
724
+ return SHADER_PRESET_MAP[name as ShaderPresetName];
725
+ }
726
+
727
+ /**
728
+ * Validate a ShaderDescriptor against the manifest.
729
+ * Returns { valid: true } or { valid: false, errors: string[] }.
730
+ */
731
+ export function validateDescriptor(descriptor: ShaderDescriptor): {
732
+ valid: boolean;
733
+ errors: string[];
734
+ } {
735
+ const errors: string[] = [];
736
+
737
+ const presetDef = getPreset(descriptor.preset);
738
+ if (!presetDef) {
739
+ errors.push(`Unknown preset: "${descriptor.preset}"`);
740
+ return { valid: false, errors };
741
+ }
742
+
743
+ const paramMap = new Map<string, ParamDef>(
744
+ presetDef.params.map((p) => [p.key, p]),
745
+ );
746
+
747
+ for (const [key, value] of Object.entries(descriptor.params)) {
748
+ const def = paramMap.get(key);
749
+ if (!def) {
750
+ errors.push(
751
+ `Unknown param key "${key}" for preset "${descriptor.preset}"`,
752
+ );
753
+ continue;
754
+ }
755
+
756
+ if (def.kind === "number") {
757
+ const num = value as number;
758
+ if (typeof num !== "number" || !isFinite(num)) {
759
+ errors.push(`Param "${key}" must be a finite number`);
760
+ continue;
761
+ }
762
+ if (def.min !== undefined && num < def.min) {
763
+ errors.push(`Param "${key}" value ${num} is below minimum ${def.min}`);
764
+ }
765
+ if (def.max !== undefined && num > def.max) {
766
+ errors.push(`Param "${key}" value ${num} is above maximum ${def.max}`);
767
+ }
768
+ }
769
+ }
770
+
771
+ if (descriptor.colors !== undefined) {
772
+ if (presetDef.maxColorCount !== undefined) {
773
+ if (descriptor.colors.length > presetDef.maxColorCount) {
774
+ errors.push(
775
+ `colors array length ${descriptor.colors.length} exceeds maxColorCount ${presetDef.maxColorCount}`,
776
+ );
777
+ }
778
+ }
779
+ }
780
+
781
+ return { valid: errors.length === 0, errors };
782
+ }