@agent-native/core-corpus 0.214.0 → 0.216.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 (1096) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/.agents/skills/actions/references/action-fields.md +1 -1
  3. package/corpus/templates/analytics/CHANGELOG.md +1 -0
  4. package/corpus/templates/analytics/changelog/2026-10-21-session-replay-quotas-count-the-compressed-size-analytics-st.md +6 -0
  5. package/corpus/templates/analytics/server/lib/session-replay.ts +40 -9
  6. package/corpus/templates/assets/.agents/skills/actions/references/action-fields.md +1 -1
  7. package/corpus/templates/brain/.agents/skills/actions/references/action-fields.md +1 -1
  8. package/corpus/templates/calendar/.agents/skills/actions/references/action-fields.md +1 -1
  9. package/corpus/templates/chat/.agents/skills/actions/references/action-fields.md +1 -1
  10. package/corpus/templates/clips/.agents/skills/actions/references/action-fields.md +1 -1
  11. package/corpus/templates/community/qr/package.json +1 -1
  12. package/corpus/templates/content/.agents/skills/actions/references/action-fields.md +1 -1
  13. package/corpus/templates/content/.agents/skills/content-product-development/references/verification.md +36 -0
  14. package/corpus/templates/content/.agents/skills/document-editing/SKILL.md +10 -0
  15. package/corpus/templates/content/.agents/skills/document-editing/references/databases.md +11 -0
  16. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +4 -2
  17. package/corpus/templates/content/CHANGELOG.md +46 -0
  18. package/corpus/templates/content/acceptance/_writers.ts +604 -0
  19. package/corpus/templates/content/acceptance/generate-action-registry.ts +10 -0
  20. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/create-document.json +75 -0
  21. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/duplicate-page.json +75 -0
  22. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/edit-document-find-and-replace-without-a-revision.json +75 -0
  23. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/edit-document-find-and-replace.json +75 -0
  24. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/edit-document-initializecontent.json +75 -0
  25. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/import-content.json +75 -0
  26. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-import-content-source-existing-page.json +75 -0
  27. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-import-content-source-new-page.json +75 -0
  28. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-sync-local-folder-source-changed-file.json +75 -0
  29. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-sync-local-folder-source-new-file.json +75 -0
  30. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/restore-document-version.json +75 -0
  31. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/set-document-property-primary-blocks-field.json +75 -0
  32. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/set-image-alt-text.json +75 -0
  33. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/undo-content-import.json +75 -0
  34. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/update-document-browser-full-rewrite.json +75 -0
  35. package/corpus/templates/content/acceptance/known-loss.ts +69 -0
  36. package/corpus/templates/content/acceptance/round-trip-corpus.ts +1397 -0
  37. package/corpus/templates/content/actions/_blocks-field-identity.ts +35 -1
  38. package/corpus/templates/content/actions/_content-database-lifecycle.ts +11 -11
  39. package/corpus/templates/content/actions/_content-database-personal-view.ts +2 -0
  40. package/corpus/templates/content/actions/_content-favorites.ts +37 -0
  41. package/corpus/templates/content/actions/_database-membership-lock.ts +39 -8
  42. package/corpus/templates/content/actions/_database-navigation.ts +19 -21
  43. package/corpus/templates/content/actions/_database-row-batch.ts +41 -18
  44. package/corpus/templates/content/actions/_database-row-mutation.ts +17 -28
  45. package/corpus/templates/content/actions/_database-source-utils.ts +18 -1
  46. package/corpus/templates/content/actions/_database-utils.ts +3 -0
  47. package/corpus/templates/content/actions/_database-view-setup.ts +16 -0
  48. package/corpus/templates/content/actions/_document-edit-mutation.ts +33 -32
  49. package/corpus/templates/content/actions/_document-flush.ts +593 -171
  50. package/corpus/templates/content/actions/_document-save-locks.ts +54 -0
  51. package/corpus/templates/content/actions/_document-save-row.ts +133 -0
  52. package/corpus/templates/content/actions/_github-source.ts +18 -8
  53. package/corpus/templates/content/actions/_move-page-to-space.ts +189 -25
  54. package/corpus/templates/content/actions/_nfm-syntax.ts +2 -0
  55. package/corpus/templates/content/actions/_row-lock-order.ts +115 -0
  56. package/corpus/templates/content/actions/create-content-database.ts +11 -0
  57. package/corpus/templates/content/actions/create-document.ts +13 -1
  58. package/corpus/templates/content/actions/delete-content-database.ts +17 -14
  59. package/corpus/templates/content/actions/delete-document-property.ts +5 -0
  60. package/corpus/templates/content/actions/delete-document.ts +270 -97
  61. package/corpus/templates/content/actions/edit-document.ts +18 -5
  62. package/corpus/templates/content/actions/export-document.ts +3 -0
  63. package/corpus/templates/content/actions/get-blocks-field-word-count.ts +22 -5
  64. package/corpus/templates/content/actions/import-content-source.ts +170 -54
  65. package/corpus/templates/content/actions/move-document.ts +191 -73
  66. package/corpus/templates/content/actions/pull-document.ts +8 -2
  67. package/corpus/templates/content/actions/remove-database-items.ts +23 -4
  68. package/corpus/templates/content/actions/restore-content-database.ts +76 -55
  69. package/corpus/templates/content/actions/restore-document-version.ts +19 -35
  70. package/corpus/templates/content/actions/restore-document.ts +65 -53
  71. package/corpus/templates/content/actions/rollback-created-slash-document.ts +11 -16
  72. package/corpus/templates/content/actions/set-document-property.ts +15 -1
  73. package/corpus/templates/content/actions/share-local-file-document.ts +18 -14
  74. package/corpus/templates/content/actions/suggest-document-edit.ts +2 -3
  75. package/corpus/templates/content/actions/sync-local-folder-source.ts +35 -1
  76. package/corpus/templates/content/actions/undo-content-import.ts +16 -12
  77. package/corpus/templates/content/actions/update-content-database-view.ts +2 -0
  78. package/corpus/templates/content/actions/update-document.ts +19 -14
  79. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +1 -6
  80. package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +49 -3
  81. package/corpus/templates/content/app/components/editor/ContentImportDialog.tsx +2 -0
  82. package/corpus/templates/content/app/components/editor/DocumentBlockFields.tsx +53 -11
  83. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +608 -353
  84. package/corpus/templates/content/app/components/editor/StaticDocumentBody.tsx +765 -0
  85. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +233 -80
  86. package/corpus/templates/content/app/components/editor/blockFieldSaveController.ts +32 -3
  87. package/corpus/templates/content/app/components/editor/blockFieldSaveRegistry.ts +88 -23
  88. package/corpus/templates/content/app/components/editor/comment-anchors.ts +19 -0
  89. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +205 -71
  90. package/corpus/templates/content/app/components/editor/document-flush-participant.ts +253 -0
  91. package/corpus/templates/content/app/components/editor/editor-transaction-meta.ts +28 -0
  92. package/corpus/templates/content/app/components/editor/extensions/AudioBlock.tsx +2 -1
  93. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +27 -6
  94. package/corpus/templates/content/app/components/editor/extensions/LocalMdxComponentNode.tsx +0 -1
  95. package/corpus/templates/content/app/components/editor/extensions/NotionExtensions.tsx +4 -4
  96. package/corpus/templates/content/app/components/editor/extensions/SuggestionHighlight.ts +24 -2
  97. package/corpus/templates/content/app/components/editor/extensions/VideoBlock.tsx +25 -6
  98. package/corpus/templates/content/app/components/editor/pending-document-persistence.ts +59 -1
  99. package/corpus/templates/content/app/components/editor/stored-body-images.ts +27 -0
  100. package/corpus/templates/content/app/components/editor/suggestions/presentation-rebase.ts +17 -0
  101. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +11 -4
  102. package/corpus/templates/content/app/components/trash/TrashBrowser.tsx +4 -1
  103. package/corpus/templates/content/app/global.css +21 -0
  104. package/corpus/templates/content/app/hooks/use-content-trash.ts +8 -0
  105. package/corpus/templates/content/app/import-messages.ts +25 -0
  106. package/corpus/templates/content/app/trash-messages.ts +16 -0
  107. package/corpus/templates/content/changelog/2026-10-16-a-page-open-in-a-tab-that-shows-it-s-in-the-trash-reopens-wi.md +6 -0
  108. package/corpus/templates/content/changelog/2026-10-16-a-page-restored-from-trash-returns-to-its-place-in-its-colle.md +6 -0
  109. package/corpus/templates/content/changelog/2026-10-16-agent-written-markdown-keeps-nested-lists-indented-with-spac.md +6 -0
  110. package/corpus/templates/content/changelog/2026-10-16-opening-a-page-you-can-edit-no-longer-rebuilds-its-editor-on.md +6 -0
  111. package/corpus/templates/content/changelog/2026-10-16-pages-moved-or-imported-at-the-same-time-can-no-longer-end-u.md +6 -0
  112. package/corpus/templates/content/changelog/2026-10-16-re-importing-a-markdown-export-of-a-page-no-longer-reports-t.md +6 -0
  113. package/corpus/templates/content/changelog/2026-10-16-saving-a-page-or-restoring-one-of-its-versions-no-longer-fai.md +6 -0
  114. package/corpus/templates/content/changelog/2026-10-17-agents-reading-a-page-you-have-open-no-longer-wait-or-fail-w.md +6 -0
  115. package/corpus/templates/content/changelog/2026-10-19-fresh-document-reads-require-confirmation-from-every-open-ed.md +6 -0
  116. package/corpus/templates/content/changelog/2026-10-20-html-table-cells-preserve-a-trailing-backslash-when-opening-.md +6 -0
  117. package/corpus/templates/content/changelog/2026-10-20-preserve-empty-paragraph-colors-and-refuse-unsupported-inlin.md +6 -0
  118. package/corpus/templates/content/changelog/2026-10-20-the-advanced-filter-and-each-filter-group-inside-it-have-the.md +6 -0
  119. package/corpus/templates/content/changelog/2026-10-21-blocks-fields-keep-unconfirmed-saves-visible-and-agent-reads.md +6 -0
  120. package/corpus/templates/content/changelog/2026-10-21-preserve-compact-table-row-groups-and-report-invalid-block-colors.md +6 -0
  121. package/corpus/templates/content/changelog/2026-10-21-suggested-edits-show-an-agent-s-whole-reason-open-a-group-to.md +6 -0
  122. package/corpus/templates/content/changelog/2026-10-21-suggestions-keep-refusing-unmatched-emphasis-in-stored-markd.md +6 -0
  123. package/corpus/templates/content/changelog/2026-10-22-accept-remaining-and-reject-remaining-show-the-result-for-ev.md +6 -0
  124. package/corpus/templates/content/changelog/2026-10-22-accepting-a-group-of-suggested-edits-saves-faster-and-adds-o.md +6 -0
  125. package/corpus/templates/content/changelog/2026-10-22-agents-read-saved-page-text-after-failed-icon-change.md +6 -0
  126. package/corpus/templates/content/changelog/2026-10-22-changes-made-from-a-menu-or-popover-such-as-an-image-s-alt-t.md +6 -0
  127. package/corpus/templates/content/changelog/2026-10-22-text-an-agent-writes-inside-a-callout-column-or-synced-block.md +6 -0
  128. package/corpus/templates/content/e2e/auth-files.ts +28 -0
  129. package/corpus/templates/content/e2e/convergence-summary.ts +84 -29
  130. package/corpus/templates/content/e2e/gate-arm.ts +15 -0
  131. package/corpus/templates/content/e2e/global-setup.ts +43 -75
  132. package/corpus/templates/content/e2e/global-teardown.ts +34 -0
  133. package/corpus/templates/content/e2e/helpers.ts +598 -92
  134. package/corpus/templates/content/e2e/live-body-gate.ts +188 -0
  135. package/corpus/templates/content/e2e/playwright.config.ts +12 -3
  136. package/corpus/templates/content/e2e/server-identity.ts +47 -0
  137. package/corpus/templates/content/e2e/stored-form/collab-blocks.ts +123 -0
  138. package/corpus/templates/content/package.json +1 -1
  139. package/corpus/templates/content/scripts/_stored-form-census-kinds.ts +30 -2
  140. package/corpus/templates/content/scripts/historical-icon-apply.ts +9 -1
  141. package/corpus/templates/content/scripts/trace-startup.mjs +460 -133
  142. package/corpus/templates/content/server/db/exec.ts +58 -0
  143. package/corpus/templates/content/server/db/schema.ts +1 -0
  144. package/corpus/templates/content/server/lib/content-trash-purge.ts +208 -144
  145. package/corpus/templates/content/server/lib/document-metadata-updated-at.ts +43 -1
  146. package/corpus/templates/content/server/lib/document-revision.ts +23 -0
  147. package/corpus/templates/content/server/lib/live-body-writer.ts +199 -0
  148. package/corpus/templates/content/server/lib/notion-sync.ts +63 -29
  149. package/corpus/templates/content/server/lib/notion.ts +5 -5
  150. package/corpus/templates/content/server/lib/suggested-edits.ts +357 -230
  151. package/corpus/templates/content/server/plugins/db.ts +5 -0
  152. package/corpus/templates/content/server/routes/api/documents/[id]/move.patch.ts +50 -168
  153. package/corpus/templates/content/shared/api.ts +2 -0
  154. package/corpus/templates/content/shared/blocks-fields-manifest.ts +106 -0
  155. package/corpus/templates/content/shared/database-query.ts +192 -30
  156. package/corpus/templates/content/shared/document-export.ts +12 -14
  157. package/corpus/templates/content/shared/document-flush-protocol.ts +88 -0
  158. package/corpus/templates/content/shared/editor-save-state.ts +97 -0
  159. package/corpus/templates/content/shared/feature-flags.ts +10 -0
  160. package/corpus/templates/content/shared/import/markdown.ts +91 -7
  161. package/corpus/templates/content/shared/import/types.ts +2 -0
  162. package/corpus/templates/content/shared/inline-math.ts +6 -4
  163. package/corpus/templates/content/shared/nfm-fidelity.ts +247 -0
  164. package/corpus/templates/content/shared/nfm.ts +1933 -340
  165. package/corpus/templates/content/shared/suggestion-diff.ts +13 -0
  166. package/corpus/templates/content/shared/suggestion-formatting.ts +143 -20
  167. package/corpus/templates/content/shared/suggestion-text.ts +39 -0
  168. package/corpus/templates/content/vitest.config.ts +10 -0
  169. package/corpus/templates/crm/.agents/skills/actions/references/action-fields.md +1 -1
  170. package/corpus/templates/design/.agents/skills/actions/references/action-fields.md +1 -1
  171. package/corpus/templates/design/.agents/skills/native-effects/SKILL.md +9 -2
  172. package/corpus/templates/design/.generated/bridge/shader-fill-preview.generated.ts +3 -249
  173. package/corpus/templates/design/.generated/bridge/shader-runtime.generated.ts +5 -88
  174. package/corpus/templates/design/AGENTS.md +1 -3
  175. package/corpus/templates/design/CHANGELOG.md +32 -0
  176. package/corpus/templates/design/CODE_NATIVE_DESIGN_STUDIO_IMPLEMENTATION_PLAN.md +1 -6
  177. package/corpus/templates/design/DESIGN-STUDIO-PLAN.md +5 -7
  178. package/corpus/templates/design/actions/_native-local-export-server.ts +44 -31
  179. package/corpus/templates/design/actions/_native-render-contexts.ts +76 -21
  180. package/corpus/templates/design/actions/claim-native-local-export.ts +5 -0
  181. package/corpus/templates/design/actions/finish-native-local-export.ts +13 -2
  182. package/corpus/templates/design/actions/get-native-shader-approvals.ts +35 -0
  183. package/corpus/templates/design/actions/get-shader.ts +134 -219
  184. package/corpus/templates/design/actions/list-design-extensions.ts +3 -58
  185. package/corpus/templates/design/actions/request-native-local-export.ts +32 -6
  186. package/corpus/templates/design/actions/run-design-extension-action.ts +0 -29
  187. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +131 -108
  188. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +0 -218
  189. package/corpus/templates/design/app/components/design/DesignThumbnail.tsx +59 -3
  190. package/corpus/templates/design/app/components/design/EditPanel.tsx +35 -47
  191. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +242 -62
  192. package/corpus/templates/design/app/components/design/NativePreviewErrorBoundary.tsx +53 -0
  193. package/corpus/templates/design/app/components/design/bridge/codegen.ts +18 -3
  194. package/corpus/templates/design/app/components/design/bridge/native-composition-clock.ts +5 -4
  195. package/corpus/templates/design/app/components/design/bridge/native-dom.ts +37 -0
  196. package/corpus/templates/design/app/components/design/bridge/native-intrinsic-image.ts +2 -1
  197. package/corpus/templates/design/app/components/design/bridge/native-mesh-grid.ts +90 -0
  198. package/corpus/templates/design/app/components/design/bridge/native-opaque-public-asset.ts +363 -0
  199. package/corpus/templates/design/app/components/design/bridge/native-opaque-worker-lease.ts +179 -0
  200. package/corpus/templates/design/app/components/design/bridge/native-preview-geometry.ts +132 -7
  201. package/corpus/templates/design/app/components/design/bridge/native-preview-policy.ts +4 -0
  202. package/corpus/templates/design/app/components/design/bridge/native-preview-viewport-transport.ts +378 -0
  203. package/corpus/templates/design/app/components/design/bridge/native-scene-body-transform.ts +62 -0
  204. package/corpus/templates/design/app/components/design/bridge/native-scene-presentation-element.ts +10 -0
  205. package/corpus/templates/design/app/components/design/bridge/native-shader-runtime.bridge.ts +646 -167
  206. package/corpus/templates/design/app/components/design/bridge/native-source-provider.ts +246 -192
  207. package/corpus/templates/design/app/components/design/bridge/native-stateful-resource.ts +2 -2
  208. package/corpus/templates/design/app/components/design/bridge/native-stateless-compute.ts +5 -2
  209. package/corpus/templates/design/app/components/design/bridge/native-svg-source.ts +11 -1
  210. package/corpus/templates/design/app/components/design/bridge/native-worker-broker.ts +6 -0
  211. package/corpus/templates/design/app/components/design/bridge/native-worker-entry.ts +761 -303
  212. package/corpus/templates/design/app/components/design/bridge/native-worker-fill.ts +16 -6
  213. package/corpus/templates/design/app/components/design/bridge/native-worker-gpu.ts +854 -91
  214. package/corpus/templates/design/app/components/design/bridge/native-worker-host.ts +15 -1
  215. package/corpus/templates/design/app/components/design/bridge/native-worker-input-assets.ts +200 -0
  216. package/corpus/templates/design/app/components/design/bridge/native-worker-protocol.ts +40 -1
  217. package/corpus/templates/design/app/components/design/bridge/native-worker-scene-host.ts +425 -126
  218. package/corpus/templates/design/app/components/design/bridge/native-worker-source-snapshot.ts +21 -0
  219. package/corpus/templates/design/app/components/design/bridge/shader-fill-preview.bridge.ts +5 -371
  220. package/corpus/templates/design/app/components/design/bridge/shader-runtime.bridge.ts +4 -146
  221. package/corpus/templates/design/app/components/design/design-canvas/interact-document.ts +5 -9
  222. package/corpus/templates/design/app/components/design/design-canvas/native-preview-surface.ts +150 -0
  223. package/corpus/templates/design/app/components/design/design-canvas/native-public-asset-preview.ts +409 -0
  224. package/corpus/templates/design/app/components/design/design-canvas/native-public-worker-preview.ts +1086 -0
  225. package/corpus/templates/design/app/components/design/design-canvas/private-replay-screenshot-preview.ts +2 -2
  226. package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +15 -26
  227. package/corpus/templates/design/app/components/design/edit-panel/fill-properties.tsx +74 -67
  228. package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +7 -19
  229. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +39 -30
  230. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +4 -0
  231. package/corpus/templates/design/app/components/design/inspector/NativeShaderColorControls.tsx +3 -7
  232. package/corpus/templates/design/app/components/design/inspector/NativeShaderPaintControls.tsx +12 -5
  233. package/corpus/templates/design/app/components/design/inspector/NativeShaderPanel.tsx +705 -190
  234. package/corpus/templates/design/app/components/design/inspector/fill-field-reading.ts +1 -2
  235. package/corpus/templates/design/app/components/design/inspector/index.ts +0 -6
  236. package/corpus/templates/design/app/components/design/inspector/native-catalog-display.ts +26 -5
  237. package/corpus/templates/design/app/components/design/inspector/native-shader-catalog-fixture.ts +42 -0
  238. package/corpus/templates/design/app/components/design/inspector/native-shader-catalog-preview.ts +51 -33
  239. package/corpus/templates/design/app/components/design/inspector/native-shader-paint.ts +1 -0
  240. package/corpus/templates/design/app/components/design/inspector/native-shader-property-draft.ts +89 -23
  241. package/corpus/templates/design/app/components/design/inspector/saved-glsl-shader.tsx +243 -0
  242. package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +54 -5
  243. package/corpus/templates/design/app/components/design/shader-source-coordination.ts +66 -0
  244. package/corpus/templates/design/app/components/design/use-native-shader-approvals.ts +36 -8
  245. package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +60 -3
  246. package/corpus/templates/design/app/i18n/en-US.ts +78 -2
  247. package/corpus/templates/design/app/pages/Present.tsx +36 -1
  248. package/corpus/templates/design/app/pages/design-editor/commands/apply-file-content-update.ts +1 -1
  249. package/corpus/templates/design/app/pages/design-editor/commands/apply-local-content-update.ts +1 -1
  250. package/corpus/templates/design/app/pages/design-editor/commands/commit-visual-styles.ts +2 -3
  251. package/corpus/templates/design/app/pages/design-editor/commands/cross-screen-element-drop.ts +1 -1
  252. package/corpus/templates/design/app/pages/design-editor/commands/layer-move-to-screen.ts +1 -1
  253. package/corpus/templates/design/app/pages/design-editor/commands/paste-selection.ts +1 -1
  254. package/corpus/templates/design/app/pages/design-editor/commands/paste-svg-layer.ts +1 -1
  255. package/corpus/templates/design/app/pages/design-editor/commands/prepare-content-history-replay.ts +1 -1
  256. package/corpus/templates/design/app/pages/design-editor/commands/redo.ts +1 -1
  257. package/corpus/templates/design/app/pages/design-editor/commands/render-png-blob.ts +84 -41
  258. package/corpus/templates/design/app/pages/design-editor/commands/shader-source-edit.ts +1 -1
  259. package/corpus/templates/design/app/pages/design-editor/commands/undo.ts +1 -1
  260. package/corpus/templates/design/app/pages/design-editor/design-editor-view.tsx +0 -2
  261. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-content-and-components.ts +4 -33
  262. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-export-and-handoff.ts +2 -2
  263. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-history.ts +0 -11
  264. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-layer-models.ts +2 -55
  265. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-screen-rendering.tsx +0 -3
  266. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-selection-and-styles.ts +0 -24
  267. package/corpus/templates/design/app/pages/design-editor/text-edit-utils.ts +0 -16
  268. package/corpus/templates/design/app/pages/design-editor/use-native-local-export-requests.ts +70 -11
  269. package/corpus/templates/design/app/pages/design-editor/view/single-screen-canvas.tsx +0 -2
  270. package/corpus/templates/design/changelog/2026-10-20-folded-mesh-adds-an-animated-sculpted-fill-with-editable-col.md +6 -0
  271. package/corpus/templates/design/changelog/2026-10-20-read-only-design-views-render-native-shader-previews-in-nest.md +6 -0
  272. package/corpus/templates/design/changelog/2026-10-20-selected-screens-with-shader-effects-can-be-exported-togethe.md +6 -0
  273. package/corpus/templates/design/changelog/2026-10-20-shader-previews-reuse-validated-scene-data-while-panning-inc.md +6 -0
  274. package/corpus/templates/design/changelog/2026-10-20-shader-previews-stay-aligned-while-you-zoom.md +6 -0
  275. package/corpus/templates/design/changelog/2026-10-20-signed-out-sessions-no-longer-watch-for-private-png-export-r.md +6 -0
  276. package/corpus/templates/design/changelog/2026-10-21-effect-thumbnails-show-richer-previews.md +6 -0
  277. package/corpus/templates/design/changelog/2026-10-21-native-effects-render-across-previews.md +6 -0
  278. package/corpus/templates/design/changelog/2026-10-21-native-shader-previews-use-less-gpu-memory-when-many-mesh-ef.md +6 -0
  279. package/corpus/templates/design/changelog/2026-10-21-opening-design-no-longer-shows-png-export-errors-when-no-exp.md +6 -0
  280. package/corpus/templates/design/changelog/2026-10-21-pulsing-border-controls-grouped.md +6 -0
  281. package/corpus/templates/design/changelog/2026-10-21-pulsing-border-follows-element-outlines.md +6 -0
  282. package/corpus/templates/design/changelog/2026-10-21-remove-obsolete-shader-fills.md +6 -0
  283. package/corpus/templates/design/changelog/2026-10-21-shader-previews-recover-from-temporary-gpu-and-image-failure.md +6 -0
  284. package/corpus/templates/design/changelog/2026-10-22-shader-fills-and-effects-render-correctly-on-canvas-elements.md +6 -0
  285. package/corpus/templates/design/package.json +0 -1
  286. package/corpus/templates/design/playwright.config.ts +1 -1
  287. package/corpus/templates/design/scripts/runtime-budget-zoom.ts +9 -21
  288. package/corpus/templates/design/scripts/runtime-budget.ts +10 -24
  289. package/corpus/templates/design/server/plugins/agent-chat.ts +0 -2
  290. package/corpus/templates/design/shared/effect-graph.ts +46 -1
  291. package/corpus/templates/design/shared/generation-output-receipt.ts +0 -1
  292. package/corpus/templates/design/shared/native-effect-animation-capability.ts +6 -0
  293. package/corpus/templates/design/shared/native-effect-folded-mesh-v1.ts +268 -0
  294. package/corpus/templates/design/shared/native-effect-folded-mesh-v2.ts +310 -0
  295. package/corpus/templates/design/shared/native-effect-folded-mesh.ts +489 -0
  296. package/corpus/templates/design/shared/native-effect-gallery-additions.ts +2 -2
  297. package/corpus/templates/design/shared/native-effect-paint.ts +8 -0
  298. package/corpus/templates/design/shared/native-effect-parameter-constraints.ts +8 -1
  299. package/corpus/templates/design/shared/native-effect-presets.ts +18 -1
  300. package/corpus/templates/design/shared/native-effect-property-presentation.ts +81 -0
  301. package/corpus/templates/design/shared/native-effect-pulsing-border-v3.ts +281 -0
  302. package/corpus/templates/design/shared/native-effect-pulsing-border-v4.ts +284 -0
  303. package/corpus/templates/design/shared/native-effect-pulsing-border.ts +300 -0
  304. package/corpus/templates/design/shared/native-effect-trust.ts +6 -0
  305. package/corpus/templates/design/shared/native-effect-wgsl.ts +12 -0
  306. package/corpus/templates/design/shared/native-effects.ts +528 -15
  307. package/corpus/templates/design/shared/native-input-resources.ts +36 -0
  308. package/corpus/templates/design/shared/native-local-export.ts +14 -0
  309. package/corpus/templates/design/shared/native-parameter-animation.ts +1 -0
  310. package/corpus/templates/design/shared/native-pointer-input.ts +9 -11
  311. package/corpus/templates/design/shared/shader-fills.ts +0 -513
  312. package/corpus/templates/design/vitest.setup.ts +7 -1
  313. package/corpus/templates/dispatch/.agents/skills/actions/references/action-fields.md +1 -1
  314. package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +20 -18
  315. package/corpus/templates/factory/.agents/skills/actions/references/action-fields.md +1 -1
  316. package/corpus/templates/factory/.agents/skills/review-latest-feedback/SKILL.md +36 -80
  317. package/corpus/templates/factory/.agents/skills/review-latest-feedback/references/channel-inventory.md +54 -16
  318. package/corpus/templates/factory/.agents/skills/review-latest-feedback/references/slack-reaction-replies.md +50 -73
  319. package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +20 -18
  320. package/corpus/templates/forms/.agents/skills/actions/references/action-fields.md +1 -1
  321. package/corpus/templates/mail/.agents/skills/actions/references/action-fields.md +1 -1
  322. package/corpus/templates/plan/.agents/skills/actions/references/action-fields.md +1 -1
  323. package/corpus/templates/slides/.agents/skills/actions/references/action-fields.md +1 -1
  324. package/corpus/templates/slides-2/.agents/skills/actions/SKILL.md +199 -0
  325. package/corpus/templates/slides-2/.agents/skills/actions/references/action-fields.md +145 -0
  326. package/corpus/templates/slides-2/.agents/skills/actions/references/examples.md +96 -0
  327. package/corpus/templates/slides-2/.agents/skills/actions/references/provider-apis.md +95 -0
  328. package/corpus/templates/slides-2/.agents/skills/adding-a-feature/SKILL.md +235 -0
  329. package/corpus/templates/slides-2/.agents/skills/agent-native-docs/SKILL.md +161 -0
  330. package/corpus/templates/slides-2/.agents/skills/agent-native-toolkit/SKILL.md +314 -0
  331. package/corpus/templates/slides-2/.agents/skills/analytics-data-for-decks/SKILL.md +44 -0
  332. package/corpus/templates/slides-2/.agents/skills/apply-slide-comments/SKILL.md +63 -0
  333. package/corpus/templates/slides-2/.agents/skills/client-side-routing/SKILL.md +87 -0
  334. package/corpus/templates/slides-2/.agents/skills/context-awareness/SKILL.md +282 -0
  335. package/corpus/templates/slides-2/.agents/skills/create-deck/SKILL.md +263 -0
  336. package/corpus/templates/slides-2/.agents/skills/create-deck/references/reference-inputs.md +72 -0
  337. package/corpus/templates/slides-2/.agents/skills/create-deck/references/slide-templates.md +93 -0
  338. package/corpus/templates/slides-2/.agents/skills/create-deck/references/source-material.md +16 -0
  339. package/corpus/templates/slides-2/.agents/skills/creative-context/SKILL.md +134 -0
  340. package/corpus/templates/slides-2/.agents/skills/customizing-agent-native/SKILL.md +219 -0
  341. package/corpus/templates/slides-2/.agents/skills/deck-management/SKILL.md +182 -0
  342. package/corpus/templates/slides-2/.agents/skills/delegate-to-agent/SKILL.md +62 -0
  343. package/corpus/templates/slides-2/.agents/skills/design-systems/SKILL.md +233 -0
  344. package/corpus/templates/slides-2/.agents/skills/external-agents/SKILL.md +549 -0
  345. package/corpus/templates/slides-2/.agents/skills/external-agents/references/mcp-apps-embedding.md +169 -0
  346. package/corpus/templates/slides-2/.agents/skills/frontend-design/SKILL.md +102 -0
  347. package/corpus/templates/slides-2/.agents/skills/frontend-design/references/visual-direction.md +102 -0
  348. package/corpus/templates/slides-2/.agents/skills/image-generation-via-a2a/SKILL.md +134 -0
  349. package/corpus/templates/slides-2/.agents/skills/performance/SKILL.md +79 -0
  350. package/corpus/templates/slides-2/.agents/skills/portability/SKILL.md +108 -0
  351. package/corpus/templates/slides-2/.agents/skills/real-time-sync/SKILL.md +146 -0
  352. package/corpus/templates/slides-2/.agents/skills/reliable-mutations/SKILL.md +72 -0
  353. package/corpus/templates/slides-2/.agents/skills/secrets/SKILL.md +82 -0
  354. package/corpus/templates/slides-2/.agents/skills/security/SKILL.md +80 -0
  355. package/corpus/templates/slides-2/.agents/skills/self-modifying-code/SKILL.md +123 -0
  356. package/corpus/templates/slides-2/.agents/skills/shadcn-ui/SKILL.md +71 -0
  357. package/corpus/templates/slides-2/.agents/skills/sharing/SKILL.md +286 -0
  358. package/corpus/templates/slides-2/.agents/skills/slide-design/SKILL.md +144 -0
  359. package/corpus/templates/slides-2/.agents/skills/slide-editing/SKILL.md +284 -0
  360. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/animations.md +33 -0
  361. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/freeform-objects.md +22 -0
  362. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/restyling.md +69 -0
  363. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/transitions.md +26 -0
  364. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/video.md +45 -0
  365. package/corpus/templates/slides-2/.agents/skills/slide-images/SKILL.md +136 -0
  366. package/corpus/templates/slides-2/.agents/skills/storing-data/SKILL.md +234 -0
  367. package/corpus/templates/slides-2/.agents/skills/turn-into-skill/SKILL.md +112 -0
  368. package/corpus/templates/slides-2/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  369. package/corpus/templates/slides-2/.agents/skills/workspace-conventions/SKILL.md +103 -0
  370. package/corpus/templates/slides-2/.builder/rules/deploy-app.mdc +22 -0
  371. package/corpus/templates/slides-2/.builder/rules/organize-ui.mdc +9 -0
  372. package/corpus/templates/slides-2/.dockerignore +61 -0
  373. package/corpus/templates/slides-2/.env.example +23 -0
  374. package/corpus/templates/slides-2/.ignore +3 -0
  375. package/corpus/templates/slides-2/.mcp.json +8 -0
  376. package/corpus/templates/slides-2/.oxfmtrc.json +8 -0
  377. package/corpus/templates/slides-2/AGENTS.md +66 -0
  378. package/corpus/templates/slides-2/CHANGELOG.md +76 -0
  379. package/corpus/templates/slides-2/DEVELOPING.md +157 -0
  380. package/corpus/templates/slides-2/README.md +58 -0
  381. package/corpus/templates/slides-2/THIRD_PARTY_NOTICES.md +33 -0
  382. package/corpus/templates/slides-2/_gitignore +38 -0
  383. package/corpus/templates/slides-2/actions/_agent-presence.ts +29 -0
  384. package/corpus/templates/slides-2/actions/_app-url.ts +37 -0
  385. package/corpus/templates/slides-2/actions/_deck-app-scope.ts +30 -0
  386. package/corpus/templates/slides-2/actions/_deck-tracking.ts +260 -0
  387. package/corpus/templates/slides-2/actions/_deck-write.ts +206 -0
  388. package/corpus/templates/slides-2/actions/_imported-slide-source.ts +162 -0
  389. package/corpus/templates/slides-2/actions/_inline-image-storage.ts +1013 -0
  390. package/corpus/templates/slides-2/actions/_linked-design-system.ts +83 -0
  391. package/corpus/templates/slides-2/actions/_presenter-notes.ts +83 -0
  392. package/corpus/templates/slides-2/actions/_render-artifacts.ts +111 -0
  393. package/corpus/templates/slides-2/actions/_slide-source.ts +344 -0
  394. package/corpus/templates/slides-2/actions/_tab-state.ts +51 -0
  395. package/corpus/templates/slides-2/actions/_test-brandfetch.ts +31 -0
  396. package/corpus/templates/slides-2/actions/_uploaded-files.ts +114 -0
  397. package/corpus/templates/slides-2/actions/add-deck.ts +123 -0
  398. package/corpus/templates/slides-2/actions/add-slide-comment.ts +267 -0
  399. package/corpus/templates/slides-2/actions/add-slide.ts +888 -0
  400. package/corpus/templates/slides-2/actions/analyze-brand-assets.ts +66 -0
  401. package/corpus/templates/slides-2/actions/apply-design-system.ts +111 -0
  402. package/corpus/templates/slides-2/actions/approve-deck-access-request.ts +287 -0
  403. package/corpus/templates/slides-2/actions/audit-contrast.ts +143 -0
  404. package/corpus/templates/slides-2/actions/check-image-gen.ts +17 -0
  405. package/corpus/templates/slides-2/actions/clone-context-slide.ts +340 -0
  406. package/corpus/templates/slides-2/actions/clone-creative-context-deck.ts +143 -0
  407. package/corpus/templates/slides-2/actions/control-deck-history.ts +186 -0
  408. package/corpus/templates/slides-2/actions/control-presenter.ts +117 -0
  409. package/corpus/templates/slides-2/actions/control-slide-editor.ts +267 -0
  410. package/corpus/templates/slides-2/actions/create-deck-from-template.ts +274 -0
  411. package/corpus/templates/slides-2/actions/create-deck.ts +1243 -0
  412. package/corpus/templates/slides-2/actions/create-design-system.ts +131 -0
  413. package/corpus/templates/slides-2/actions/create-share-link.ts +127 -0
  414. package/corpus/templates/slides-2/actions/db-health.ts +22 -0
  415. package/corpus/templates/slides-2/actions/delete-asset.ts +154 -0
  416. package/corpus/templates/slides-2/actions/delete-deck.ts +427 -0
  417. package/corpus/templates/slides-2/actions/delete-design-system.ts +167 -0
  418. package/corpus/templates/slides-2/actions/delete-slide-comment.ts +143 -0
  419. package/corpus/templates/slides-2/actions/delete-staged-dataset.ts +30 -0
  420. package/corpus/templates/slides-2/actions/duplicate-deck.ts +299 -0
  421. package/corpus/templates/slides-2/actions/export-google-slides.ts +41 -0
  422. package/corpus/templates/slides-2/actions/export-html.ts +770 -0
  423. package/corpus/templates/slides-2/actions/export-pptx.ts +2203 -0
  424. package/corpus/templates/slides-2/actions/extract-pdf.ts +49 -0
  425. package/corpus/templates/slides-2/actions/generate-image-api.ts +671 -0
  426. package/corpus/templates/slides-2/actions/generate-image.ts +492 -0
  427. package/corpus/templates/slides-2/actions/get-agent-access-deck.ts +52 -0
  428. package/corpus/templates/slides-2/actions/get-deck-access-status.ts +130 -0
  429. package/corpus/templates/slides-2/actions/get-deck-design-tokens.ts +62 -0
  430. package/corpus/templates/slides-2/actions/get-deck-reference-context.ts +232 -0
  431. package/corpus/templates/slides-2/actions/get-deck-template.ts +38 -0
  432. package/corpus/templates/slides-2/actions/get-deck-version.ts +85 -0
  433. package/corpus/templates/slides-2/actions/get-deck.ts +562 -0
  434. package/corpus/templates/slides-2/actions/get-design-system-decode-job-status.ts +57 -0
  435. package/corpus/templates/slides-2/actions/get-design-system-tier-limit.ts +12 -0
  436. package/corpus/templates/slides-2/actions/get-design-system.ts +453 -0
  437. package/corpus/templates/slides-2/actions/get-google-docs-status.ts +106 -0
  438. package/corpus/templates/slides-2/actions/get-google-picker-token.ts +84 -0
  439. package/corpus/templates/slides-2/actions/get-home-suggestions.ts +52 -0
  440. package/corpus/templates/slides-2/actions/get-layout-overflows.ts +192 -0
  441. package/corpus/templates/slides-2/actions/get-slide-render.ts +125 -0
  442. package/corpus/templates/slides-2/actions/get-slide-source.ts +115 -0
  443. package/corpus/templates/slides-2/actions/get-slide-theme-preview.ts +64 -0
  444. package/corpus/templates/slides-2/actions/get-slide-theme.ts +44 -0
  445. package/corpus/templates/slides-2/actions/get-slides-2-upload-storage-status.ts +17 -0
  446. package/corpus/templates/slides-2/actions/get-slides-notification-prefs.ts +37 -0
  447. package/corpus/templates/slides-2/actions/get-workspace-defaults.ts +51 -0
  448. package/corpus/templates/slides-2/actions/image-gen-status.ts +35 -0
  449. package/corpus/templates/slides-2/actions/import-code.ts +26 -0
  450. package/corpus/templates/slides-2/actions/import-design-project.ts +49 -0
  451. package/corpus/templates/slides-2/actions/import-document.ts +125 -0
  452. package/corpus/templates/slides-2/actions/import-docx.ts +57 -0
  453. package/corpus/templates/slides-2/actions/import-file.ts +1273 -0
  454. package/corpus/templates/slides-2/actions/import-from-url.ts +25 -0
  455. package/corpus/templates/slides-2/actions/import-google-doc.ts +208 -0
  456. package/corpus/templates/slides-2/actions/import-google-font.ts +110 -0
  457. package/corpus/templates/slides-2/actions/import-google-slides-reference.ts +667 -0
  458. package/corpus/templates/slides-2/actions/import-pptx.ts +564 -0
  459. package/corpus/templates/slides-2/actions/import-svgl-logo.ts +115 -0
  460. package/corpus/templates/slides-2/actions/index-design-system-with-builder.ts +181 -0
  461. package/corpus/templates/slides-2/actions/index-uploaded-design-system-files.ts +77 -0
  462. package/corpus/templates/slides-2/actions/list-assets.ts +286 -0
  463. package/corpus/templates/slides-2/actions/list-deck-templates.ts +83 -0
  464. package/corpus/templates/slides-2/actions/list-deck-versions.ts +185 -0
  465. package/corpus/templates/slides-2/actions/list-decks.ts +591 -0
  466. package/corpus/templates/slides-2/actions/list-design-systems.ts +180 -0
  467. package/corpus/templates/slides-2/actions/list-slide-comments.ts +128 -0
  468. package/corpus/templates/slides-2/actions/list-slide-themes.ts +17 -0
  469. package/corpus/templates/slides-2/actions/list-staged-datasets.ts +14 -0
  470. package/corpus/templates/slides-2/actions/logo-config.ts +13 -0
  471. package/corpus/templates/slides-2/actions/navigate.ts +158 -0
  472. package/corpus/templates/slides-2/actions/patch-deck.ts +2378 -0
  473. package/corpus/templates/slides-2/actions/provider-api-catalog.ts +25 -0
  474. package/corpus/templates/slides-2/actions/provider-api-docs.ts +83 -0
  475. package/corpus/templates/slides-2/actions/provider-api-request.ts +222 -0
  476. package/corpus/templates/slides-2/actions/query-staged-dataset.ts +83 -0
  477. package/corpus/templates/slides-2/actions/read-composer-source.ts +108 -0
  478. package/corpus/templates/slides-2/actions/request-deck-access.ts +803 -0
  479. package/corpus/templates/slides-2/actions/restore-deck-version.ts +203 -0
  480. package/corpus/templates/slides-2/actions/run.ts +2 -0
  481. package/corpus/templates/slides-2/actions/save-deck.ts +313 -0
  482. package/corpus/templates/slides-2/actions/search-google-fonts.ts +61 -0
  483. package/corpus/templates/slides-2/actions/search-images.ts +30 -0
  484. package/corpus/templates/slides-2/actions/search-logos.ts +23 -0
  485. package/corpus/templates/slides-2/actions/search-svgl-logos.ts +42 -0
  486. package/corpus/templates/slides-2/actions/set-default-design-system.ts +88 -0
  487. package/corpus/templates/slides-2/actions/set-workspace-defaults.ts +61 -0
  488. package/corpus/templates/slides-2/actions/start-design-system-upload.ts +80 -0
  489. package/corpus/templates/slides-2/actions/sync-design-system-with-builder.ts +84 -0
  490. package/corpus/templates/slides-2/actions/toggle-slide-comment-reaction.ts +150 -0
  491. package/corpus/templates/slides-2/actions/transform-slide-objects.ts +1528 -0
  492. package/corpus/templates/slides-2/actions/update-asset.ts +499 -0
  493. package/corpus/templates/slides-2/actions/update-deck-aspect-ratio.ts +95 -0
  494. package/corpus/templates/slides-2/actions/update-deck-design-tokens.ts +175 -0
  495. package/corpus/templates/slides-2/actions/update-design-system.ts +95 -0
  496. package/corpus/templates/slides-2/actions/update-slide-comment.ts +213 -0
  497. package/corpus/templates/slides-2/actions/update-slide-source.ts +353 -0
  498. package/corpus/templates/slides-2/actions/update-slide.ts +850 -0
  499. package/corpus/templates/slides-2/actions/update-slides-notification-prefs.ts +55 -0
  500. package/corpus/templates/slides-2/actions/view-screen.ts +1098 -0
  501. package/corpus/templates/slides-2/agent-native.app-skill.json +165 -0
  502. package/corpus/templates/slides-2/agent-native.config.ts +20 -0
  503. package/corpus/templates/slides-2/agent-native.json +18 -0
  504. package/corpus/templates/slides-2/app/components/ThemeToggle.tsx +47 -0
  505. package/corpus/templates/slides-2/app/components/comments/SlideCommentPins.tsx +781 -0
  506. package/corpus/templates/slides-2/app/components/comments/SlideCommentsPanel.tsx +1075 -0
  507. package/corpus/templates/slides-2/app/components/deck/DeckCard.tsx +304 -0
  508. package/corpus/templates/slides-2/app/components/deck/DeckFilterMenu.tsx +83 -0
  509. package/corpus/templates/slides-2/app/components/deck/ExcalidrawSlide.tsx +183 -0
  510. package/corpus/templates/slides-2/app/components/deck/MermaidRenderer.tsx +126 -0
  511. package/corpus/templates/slides-2/app/components/deck/SlideRenderer.tsx +1553 -0
  512. package/corpus/templates/slides-2/app/components/design-system/DesignSystemCard.tsx +235 -0
  513. package/corpus/templates/slides-2/app/components/design-system/DesignSystemSetup.tsx +2021 -0
  514. package/corpus/templates/slides-2/app/components/design-system/builder-design-system-upload.ts +200 -0
  515. package/corpus/templates/slides-2/app/components/design-system/builder-index-response.ts +104 -0
  516. package/corpus/templates/slides-2/app/components/editor/AddSlidePopover.tsx +461 -0
  517. package/corpus/templates/slides-2/app/components/editor/AiEditingMarker.tsx +24 -0
  518. package/corpus/templates/slides-2/app/components/editor/AlignmentGuides.tsx +82 -0
  519. package/corpus/templates/slides-2/app/components/editor/AnimationsPanel.tsx +698 -0
  520. package/corpus/templates/slides-2/app/components/editor/AppMenu.tsx +356 -0
  521. package/corpus/templates/slides-2/app/components/editor/AssetLibraryPanel.tsx +508 -0
  522. package/corpus/templates/slides-2/app/components/editor/BlockBubbleMenu.tsx +548 -0
  523. package/corpus/templates/slides-2/app/components/editor/DeckAccessDeniedPage.tsx +173 -0
  524. package/corpus/templates/slides-2/app/components/editor/DeckEditorSkeleton.tsx +35 -0
  525. package/corpus/templates/slides-2/app/components/editor/DeferredPopoverFallback.tsx +148 -0
  526. package/corpus/templates/slides-2/app/components/editor/EditorActionCluster.tsx +217 -0
  527. package/corpus/templates/slides-2/app/components/editor/EditorSidebar.tsx +1047 -0
  528. package/corpus/templates/slides-2/app/components/editor/EditorToolbar.tsx +1285 -0
  529. package/corpus/templates/slides-2/app/components/editor/ExportMenu.tsx +579 -0
  530. package/corpus/templates/slides-2/app/components/editor/GeneratingOverlay.tsx +21 -0
  531. package/corpus/templates/slides-2/app/components/editor/GeneratingSlidePreview.tsx +73 -0
  532. package/corpus/templates/slides-2/app/components/editor/GoogleDocImportHint.tsx +378 -0
  533. package/corpus/templates/slides-2/app/components/editor/GoogleDriveConnectionCta.tsx +154 -0
  534. package/corpus/templates/slides-2/app/components/editor/GoogleSlidesReferenceImport.tsx +299 -0
  535. package/corpus/templates/slides-2/app/components/editor/HistoryPanel.tsx +354 -0
  536. package/corpus/templates/slides-2/app/components/editor/HomeQuickStartDialog.tsx +202 -0
  537. package/corpus/templates/slides-2/app/components/editor/ImageCropOverlay.tsx +820 -0
  538. package/corpus/templates/slides-2/app/components/editor/ImageDropPromptPopover.tsx +280 -0
  539. package/corpus/templates/slides-2/app/components/editor/ImageGenPanel.tsx +244 -0
  540. package/corpus/templates/slides-2/app/components/editor/ImageOverlay.tsx +280 -0
  541. package/corpus/templates/slides-2/app/components/editor/ImageSearchPanel.tsx +183 -0
  542. package/corpus/templates/slides-2/app/components/editor/ImportDeckButton.tsx +247 -0
  543. package/corpus/templates/slides-2/app/components/editor/LogoSearchPanel.tsx +366 -0
  544. package/corpus/templates/slides-2/app/components/editor/MermaidToExcalidrawPanel.tsx +99 -0
  545. package/corpus/templates/slides-2/app/components/editor/MissingDeckAccessPane.tsx +219 -0
  546. package/corpus/templates/slides-2/app/components/editor/NewDeckReferenceStep.tsx +812 -0
  547. package/corpus/templates/slides-2/app/components/editor/PromptDialog.tsx +963 -0
  548. package/corpus/templates/slides-2/app/components/editor/QuestionFlow.tsx +119 -0
  549. package/corpus/templates/slides-2/app/components/editor/RequestDeckAccessDialog.tsx +101 -0
  550. package/corpus/templates/slides-2/app/components/editor/ShareDialog.tsx +126 -0
  551. package/corpus/templates/slides-2/app/components/editor/SlideContextToolbar.tsx +1471 -0
  552. package/corpus/templates/slides-2/app/components/editor/SlideEditor.tsx +11183 -0
  553. package/corpus/templates/slides-2/app/components/editor/SlideOverflowWarning.tsx +82 -0
  554. package/corpus/templates/slides-2/app/components/editor/SlideScrollStack.tsx +307 -0
  555. package/corpus/templates/slides-2/app/components/editor/SlideSlashCommandMenu.tsx +692 -0
  556. package/corpus/templates/slides-2/app/components/editor/SlideThumbnailContextMenu.tsx +52 -0
  557. package/corpus/templates/slides-2/app/components/editor/SlideTransitionControl.tsx +184 -0
  558. package/corpus/templates/slides-2/app/components/editor/SlidesComposerContext.tsx +789 -0
  559. package/corpus/templates/slides-2/app/components/editor/SlidesComposerContextProvider.tsx +74 -0
  560. package/corpus/templates/slides-2/app/components/editor/SlidesLayersPanel.tsx +377 -0
  561. package/corpus/templates/slides-2/app/components/editor/SpeakerNotesPanel.tsx +119 -0
  562. package/corpus/templates/slides-2/app/components/editor/TweaksPanel.tsx +77 -0
  563. package/corpus/templates/slides-2/app/components/editor/UploadStorageGate.tsx +37 -0
  564. package/corpus/templates/slides-2/app/components/editor/bullet-editing.ts +880 -0
  565. package/corpus/templates/slides-2/app/components/editor/canvas-interactions/index.ts +12 -0
  566. package/corpus/templates/slides-2/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +119 -0
  567. package/corpus/templates/slides-2/app/components/editor/commit-active-edit.ts +14 -0
  568. package/corpus/templates/slides-2/app/components/editor/editor-command-model.ts +35 -0
  569. package/corpus/templates/slides-2/app/components/editor/fit-text-object.ts +31 -0
  570. package/corpus/templates/slides-2/app/components/editor/in-place-text-session.browser-cases.json +983 -0
  571. package/corpus/templates/slides-2/app/components/editor/in-place-text-session.browser-host.ts +747 -0
  572. package/corpus/templates/slides-2/app/components/editor/in-place-text-session.ts +6891 -0
  573. package/corpus/templates/slides-2/app/components/editor/inline-edit-session.ts +26 -0
  574. package/corpus/templates/slides-2/app/components/editor/list-editing.ts +501 -0
  575. package/corpus/templates/slides-2/app/components/editor/rich-text-selection.ts +975 -0
  576. package/corpus/templates/slides-2/app/components/editor/rte-test-utils.ts +265 -0
  577. package/corpus/templates/slides-2/app/components/editor/selection-overlay-measurement.ts +191 -0
  578. package/corpus/templates/slides-2/app/components/editor/slide-escape-arbiter.ts +34 -0
  579. package/corpus/templates/slides-2/app/components/editor/slide-object-interactions.ts +6362 -0
  580. package/corpus/templates/slides-2/app/components/editor/slide-object-transform.browser-host.ts +19 -0
  581. package/corpus/templates/slides-2/app/components/editor/slide-pointer-target.ts +432 -0
  582. package/corpus/templates/slides-2/app/components/editor/slide-presence.ts +13 -0
  583. package/corpus/templates/slides-2/app/components/editor/slide-style.ts +243 -0
  584. package/corpus/templates/slides-2/app/components/editor/slide-text-targets.ts +540 -0
  585. package/corpus/templates/slides-2/app/components/editor/style-clipboard.ts +102 -0
  586. package/corpus/templates/slides-2/app/components/editor/use-prompt-import.ts +159 -0
  587. package/corpus/templates/slides-2/app/components/home/SlidesHomeLibrary.tsx +79 -0
  588. package/corpus/templates/slides-2/app/components/layout/AgentWorkIndicator.tsx +193 -0
  589. package/corpus/templates/slides-2/app/components/layout/Header.tsx +110 -0
  590. package/corpus/templates/slides-2/app/components/layout/Layout.tsx +492 -0
  591. package/corpus/templates/slides-2/app/components/layout/Sidebar.tsx +109 -0
  592. package/corpus/templates/slides-2/app/components/layout/layout-route-policy.ts +28 -0
  593. package/corpus/templates/slides-2/app/components/presentation/PresentationView.tsx +1116 -0
  594. package/corpus/templates/slides-2/app/components/presentation/PresenterView.tsx +526 -0
  595. package/corpus/templates/slides-2/app/components/presentation/SlideTransitionStage.tsx +297 -0
  596. package/corpus/templates/slides-2/app/components/presentation/present-channel.ts +31 -0
  597. package/corpus/templates/slides-2/app/components/presentation/slide-build-steps.ts +231 -0
  598. package/corpus/templates/slides-2/app/components/presentation/slide-navigation.ts +273 -0
  599. package/corpus/templates/slides-2/app/components/presentation/slide-transition-motion.ts +258 -0
  600. package/corpus/templates/slides-2/app/components/presentation/voice-navigation.ts +61 -0
  601. package/corpus/templates/slides-2/app/components/settings/notification-settings.tsx +93 -0
  602. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2AssetBrowser.tsx +726 -0
  603. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2CommandMenu.tsx +453 -0
  604. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2Comments.tsx +571 -0
  605. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2DesignTokens.tsx +345 -0
  606. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2Editor.tsx +4804 -0
  607. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2ExportMenu.tsx +671 -0
  608. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2FontBrowser.tsx +342 -0
  609. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2ImageCropControls.tsx +487 -0
  610. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2Inspector.tsx +950 -0
  611. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2SvglLogoSearchDialog.tsx +332 -0
  612. package/corpus/templates/slides-2/app/components/slides-2-editor/cross-slide-edit-history.ts +151 -0
  613. package/corpus/templates/slides-2/app/components/slides-2-editor/design-token-presets.ts +140 -0
  614. package/corpus/templates/slides-2/app/components/slides-2-editor/editor-action-errors.ts +47 -0
  615. package/corpus/templates/slides-2/app/components/slides-2-editor/editor-export-errors.ts +60 -0
  616. package/corpus/templates/slides-2/app/components/slides-2-editor/geometry.ts +275 -0
  617. package/corpus/templates/slides-2/app/components/slides-2-editor/image-crop-style.ts +82 -0
  618. package/corpus/templates/slides-2/app/components/slides-2-editor/inline-text-editor.tsx +631 -0
  619. package/corpus/templates/slides-2/app/components/slides-2-editor/keyboard-shortcuts.ts +104 -0
  620. package/corpus/templates/slides-2/app/components/slides-2-editor/object-insertion.ts +13 -0
  621. package/corpus/templates/slides-2/app/components/slides-2-editor/preview-patches.ts +54 -0
  622. package/corpus/templates/slides-2/app/components/slides-2-editor/sandbox-render-errors.ts +23 -0
  623. package/corpus/templates/slides-2/app/components/slides-2-editor/source-structure.ts +634 -0
  624. package/corpus/templates/slides-2/app/components/slides-2-editor/types.ts +85 -0
  625. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2BlackoutOverlay.tsx +13 -0
  626. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2ControlBar.tsx +285 -0
  627. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2HelpDialog.tsx +72 -0
  628. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2JumpInput.tsx +38 -0
  629. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2LaserPointer.tsx +67 -0
  630. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2Overview.tsx +161 -0
  631. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2Player.tsx +839 -0
  632. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2ProgressBar.tsx +23 -0
  633. package/corpus/templates/slides-2/app/components/slides-2-presenter/keyboard.ts +36 -0
  634. package/corpus/templates/slides-2/app/components/slides-2-presenter/presenter-channel.ts +131 -0
  635. package/corpus/templates/slides-2/app/components/slides-2-presenter/use-presenter-action-bridge.ts +296 -0
  636. package/corpus/templates/slides-2/app/components/slides-2-presenter/useSlides2TouchSwipe.ts +80 -0
  637. package/corpus/templates/slides-2/app/components/slides-2-runtime/SandboxedSlide.tsx +724 -0
  638. package/corpus/templates/slides-2/app/components/slides-2-runtime/SlideContentRenderer.tsx +137 -0
  639. package/corpus/templates/slides-2/app/components/slides-2-runtime/Slides2Canvas.tsx +99 -0
  640. package/corpus/templates/slides-2/app/components/slides-2-runtime/constants.ts +4 -0
  641. package/corpus/templates/slides-2/app/components/slides-2-runtime/protocol.ts +1400 -0
  642. package/corpus/templates/slides-2/app/components/slides-2-runtime/transition-frame.ts +439 -0
  643. package/corpus/templates/slides-2/app/components/templates/DeckTemplateLibrary.tsx +314 -0
  644. package/corpus/templates/slides-2/app/components/templates/DeckTemplatePreview.tsx +60 -0
  645. package/corpus/templates/slides-2/app/components/templates/DeckTemplateStage.tsx +45 -0
  646. package/corpus/templates/slides-2/app/components/ui/alert-dialog.tsx +1 -0
  647. package/corpus/templates/slides-2/app/components/ui/avatar.tsx +1 -0
  648. package/corpus/templates/slides-2/app/components/ui/button-group.tsx +1 -0
  649. package/corpus/templates/slides-2/app/components/ui/button.tsx +1 -0
  650. package/corpus/templates/slides-2/app/components/ui/card.tsx +1 -0
  651. package/corpus/templates/slides-2/app/components/ui/command.tsx +1 -0
  652. package/corpus/templates/slides-2/app/components/ui/context-menu.tsx +32 -0
  653. package/corpus/templates/slides-2/app/components/ui/dialog.tsx +1 -0
  654. package/corpus/templates/slides-2/app/components/ui/dropdown-menu.tsx +1 -0
  655. package/corpus/templates/slides-2/app/components/ui/filter-trigger.tsx +1 -0
  656. package/corpus/templates/slides-2/app/components/ui/input.tsx +1 -0
  657. package/corpus/templates/slides-2/app/components/ui/label.tsx +1 -0
  658. package/corpus/templates/slides-2/app/components/ui/popover.tsx +1 -0
  659. package/corpus/templates/slides-2/app/components/ui/progress.tsx +1 -0
  660. package/corpus/templates/slides-2/app/components/ui/scroll-area.tsx +1 -0
  661. package/corpus/templates/slides-2/app/components/ui/select.tsx +1 -0
  662. package/corpus/templates/slides-2/app/components/ui/separator.tsx +1 -0
  663. package/corpus/templates/slides-2/app/components/ui/sheet.tsx +1 -0
  664. package/corpus/templates/slides-2/app/components/ui/skeleton.tsx +1 -0
  665. package/corpus/templates/slides-2/app/components/ui/slider.tsx +1 -0
  666. package/corpus/templates/slides-2/app/components/ui/spinner.tsx +1 -0
  667. package/corpus/templates/slides-2/app/components/ui/switch.tsx +1 -0
  668. package/corpus/templates/slides-2/app/components/ui/tabs.tsx +59 -0
  669. package/corpus/templates/slides-2/app/components/ui/textarea.tsx +1 -0
  670. package/corpus/templates/slides-2/app/components/ui/toggle-group.tsx +1 -0
  671. package/corpus/templates/slides-2/app/components/ui/toolkit-provider.tsx +17 -0
  672. package/corpus/templates/slides-2/app/components/ui/tooltip.tsx +1 -0
  673. package/corpus/templates/slides-2/app/components/visual-editor/CanvasCommentPins.tsx +46 -0
  674. package/corpus/templates/slides-2/app/components/visual-editor/DrawOverlay.tsx +27 -0
  675. package/corpus/templates/slides-2/app/components/visual-editor/MultiSelectChip.tsx +97 -0
  676. package/corpus/templates/slides-2/app/components/visual-editor/SaveStatusIndicator.tsx +273 -0
  677. package/corpus/templates/slides-2/app/components/visual-editor/index.ts +4 -0
  678. package/corpus/templates/slides-2/app/context/DeckContext.tsx +7486 -0
  679. package/corpus/templates/slides-2/app/design-system.ts +3 -0
  680. package/corpus/templates/slides-2/app/entry.client.tsx +10 -0
  681. package/corpus/templates/slides-2/app/entry.server.tsx +10 -0
  682. package/corpus/templates/slides-2/app/global.css +1626 -0
  683. package/corpus/templates/slides-2/app/hooks/use-agent-generating.ts +517 -0
  684. package/corpus/templates/slides-2/app/hooks/use-compact-editor-layout.ts +26 -0
  685. package/corpus/templates/slides-2/app/hooks/use-contrast-audit-bridge.ts +49 -0
  686. package/corpus/templates/slides-2/app/hooks/use-deck-access-reload.ts +70 -0
  687. package/corpus/templates/slides-2/app/hooks/use-deck-access.ts +50 -0
  688. package/corpus/templates/slides-2/app/hooks/use-deck-design-system.ts +146 -0
  689. package/corpus/templates/slides-2/app/hooks/use-deck-history-action-bridge.ts +266 -0
  690. package/corpus/templates/slides-2/app/hooks/use-deck-presence.ts +89 -0
  691. package/corpus/templates/slides-2/app/hooks/use-deck-role.ts +46 -0
  692. package/corpus/templates/slides-2/app/hooks/use-deck-versions.ts +43 -0
  693. package/corpus/templates/slides-2/app/hooks/use-design-system-workflows.ts +11 -0
  694. package/corpus/templates/slides-2/app/hooks/use-design-systems.ts +31 -0
  695. package/corpus/templates/slides-2/app/hooks/use-generating-slide-preview.ts +115 -0
  696. package/corpus/templates/slides-2/app/hooks/use-navigation-state.ts +229 -0
  697. package/corpus/templates/slides-2/app/hooks/use-new-deck-generation-signal.ts +46 -0
  698. package/corpus/templates/slides-2/app/hooks/use-new-deck-generation.ts +710 -0
  699. package/corpus/templates/slides-2/app/hooks/use-sidebar-collapsed.ts +95 -0
  700. package/corpus/templates/slides-2/app/hooks/use-slide-comments.ts +202 -0
  701. package/corpus/templates/slides-2/app/hooks/use-slide-file-storage-status.ts +55 -0
  702. package/corpus/templates/slides-2/app/hooks/use-undo-selection.ts +66 -0
  703. package/corpus/templates/slides-2/app/hooks/use-workspace-defaults.ts +31 -0
  704. package/corpus/templates/slides-2/app/i18n/en-US.ts +1507 -0
  705. package/corpus/templates/slides-2/app/i18n/index.ts +19 -0
  706. package/corpus/templates/slides-2/app/lib/agent-visible-message.ts +21 -0
  707. package/corpus/templates/slides-2/app/lib/aspect-ratios.ts +7 -0
  708. package/corpus/templates/slides-2/app/lib/asset-error-copy.ts +59 -0
  709. package/corpus/templates/slides-2/app/lib/canvas-zoom.ts +47 -0
  710. package/corpus/templates/slides-2/app/lib/composer-context.ts +152 -0
  711. package/corpus/templates/slides-2/app/lib/composer-draft.ts +34 -0
  712. package/corpus/templates/slides-2/app/lib/contrast-audit.ts +390 -0
  713. package/corpus/templates/slides-2/app/lib/contrast-resolve.ts +240 -0
  714. package/corpus/templates/slides-2/app/lib/create-deck-generation.ts +938 -0
  715. package/corpus/templates/slides-2/app/lib/deck-access-lost.ts +4 -0
  716. package/corpus/templates/slides-2/app/lib/deck-backup.ts +186 -0
  717. package/corpus/templates/slides-2/app/lib/deck-editor-loading.ts +91 -0
  718. package/corpus/templates/slides-2/app/lib/deck-export-file-client.ts +77 -0
  719. package/corpus/templates/slides-2/app/lib/deck-filter.ts +52 -0
  720. package/corpus/templates/slides-2/app/lib/deck-list-loading.ts +16 -0
  721. package/corpus/templates/slides-2/app/lib/deck-preview-frame.ts +15 -0
  722. package/corpus/templates/slides-2/app/lib/deck-share-links.ts +9 -0
  723. package/corpus/templates/slides-2/app/lib/deck-sorting.ts +19 -0
  724. package/corpus/templates/slides-2/app/lib/deferred-editor-surfaces.ts +24 -0
  725. package/corpus/templates/slides-2/app/lib/design-system-selection.ts +11 -0
  726. package/corpus/templates/slides-2/app/lib/design-systems.ts +231 -0
  727. package/corpus/templates/slides-2/app/lib/dynamic-import.ts +50 -0
  728. package/corpus/templates/slides-2/app/lib/editor-agent-handoff.ts +92 -0
  729. package/corpus/templates/slides-2/app/lib/editor-shortcuts.ts +153 -0
  730. package/corpus/templates/slides-2/app/lib/export-google-slides-client.ts +168 -0
  731. package/corpus/templates/slides-2/app/lib/export-pdf-client.ts +684 -0
  732. package/corpus/templates/slides-2/app/lib/export-pptx-client.ts +2420 -0
  733. package/corpus/templates/slides-2/app/lib/generation-lifecycle.ts +24 -0
  734. package/corpus/templates/slides-2/app/lib/generation-state.ts +247 -0
  735. package/corpus/templates/slides-2/app/lib/google-docs-client.ts +110 -0
  736. package/corpus/templates/slides-2/app/lib/google-slides-export-availability-client.ts +53 -0
  737. package/corpus/templates/slides-2/app/lib/google-slides-reference-source.ts +18 -0
  738. package/corpus/templates/slides-2/app/lib/image-download.ts +85 -0
  739. package/corpus/templates/slides-2/app/lib/image-drop-to-agent.ts +210 -0
  740. package/corpus/templates/slides-2/app/lib/import-uploaded-deck.ts +132 -0
  741. package/corpus/templates/slides-2/app/lib/inline-edit-remote.ts +55 -0
  742. package/corpus/templates/slides-2/app/lib/localize-slides-changelog.ts +47 -0
  743. package/corpus/templates/slides-2/app/lib/mermaid-blocks.ts +18 -0
  744. package/corpus/templates/slides-2/app/lib/new-deck-reference-selection.ts +174 -0
  745. package/corpus/templates/slides-2/app/lib/normalize-slide-padding.ts +74 -0
  746. package/corpus/templates/slides-2/app/lib/pending-deck-changes.ts +33 -0
  747. package/corpus/templates/slides-2/app/lib/portaled-layer.ts +7 -0
  748. package/corpus/templates/slides-2/app/lib/pptx-google-slides.ts +204 -0
  749. package/corpus/templates/slides-2/app/lib/prompt-attachment-adapter.ts +37 -0
  750. package/corpus/templates/slides-2/app/lib/prompt-file-uploads.ts +557 -0
  751. package/corpus/templates/slides-2/app/lib/recent-references.ts +106 -0
  752. package/corpus/templates/slides-2/app/lib/reference-document-hydration.ts +406 -0
  753. package/corpus/templates/slides-2/app/lib/register-chat-renderers.tsx +645 -0
  754. package/corpus/templates/slides-2/app/lib/reveal-after-delete.ts +55 -0
  755. package/corpus/templates/slides-2/app/lib/sanitize-slide-html.ts +752 -0
  756. package/corpus/templates/slides-2/app/lib/slide-agent-context.ts +148 -0
  757. package/corpus/templates/slides-2/app/lib/slide-animation-elements.ts +900 -0
  758. package/corpus/templates/slides-2/app/lib/slide-clipboard.ts +534 -0
  759. package/corpus/templates/slides-2/app/lib/slide-comment-anchor.ts +286 -0
  760. package/corpus/templates/slides-2/app/lib/slide-content-merge.ts +295 -0
  761. package/corpus/templates/slides-2/app/lib/slide-image-replacement.ts +1919 -0
  762. package/corpus/templates/slides-2/app/lib/slide-live-remote.ts +215 -0
  763. package/corpus/templates/slides-2/app/lib/slide-scroll.ts +56 -0
  764. package/corpus/templates/slides-2/app/lib/slide-source-map.ts +1099 -0
  765. package/corpus/templates/slides-2/app/lib/slide-video.ts +390 -0
  766. package/corpus/templates/slides-2/app/lib/slides-relay-tracking.ts +114 -0
  767. package/corpus/templates/slides-2/app/lib/streaming-slide-html.ts +77 -0
  768. package/corpus/templates/slides-2/app/lib/tab-id.ts +3 -0
  769. package/corpus/templates/slides-2/app/lib/template-navigation.ts +15 -0
  770. package/corpus/templates/slides-2/app/lib/text-tool-shortcut.ts +75 -0
  771. package/corpus/templates/slides-2/app/lib/undo-reveal.ts +332 -0
  772. package/corpus/templates/slides-2/app/lib/upload-response.ts +107 -0
  773. package/corpus/templates/slides-2/app/lib/utils.ts +38 -0
  774. package/corpus/templates/slides-2/app/lib/validate-native-slide-html.ts +177 -0
  775. package/corpus/templates/slides-2/app/lib/video-upload.ts +354 -0
  776. package/corpus/templates/slides-2/app/pages/DeckEditor.tsx +6158 -0
  777. package/corpus/templates/slides-2/app/pages/DesignSystems.tsx +363 -0
  778. package/corpus/templates/slides-2/app/pages/Index.tsx +3254 -0
  779. package/corpus/templates/slides-2/app/pages/NotFound.tsx +33 -0
  780. package/corpus/templates/slides-2/app/pages/Presentation.tsx +120 -0
  781. package/corpus/templates/slides-2/app/pages/SharedPresentation.tsx +174 -0
  782. package/corpus/templates/slides-2/app/pages/SlideThemeDetail.tsx +227 -0
  783. package/corpus/templates/slides-2/app/pages/SlideThemes.tsx +155 -0
  784. package/corpus/templates/slides-2/app/pages/Slides2EditorPage.tsx +1618 -0
  785. package/corpus/templates/slides-2/app/pages/Slides2PresenterConsolePage.tsx +937 -0
  786. package/corpus/templates/slides-2/app/pages/Slides2PresenterPage.tsx +979 -0
  787. package/corpus/templates/slides-2/app/pages/Templates.tsx +32 -0
  788. package/corpus/templates/slides-2/app/root.tsx +391 -0
  789. package/corpus/templates/slides-2/app/routes/$.tsx +10 -0
  790. package/corpus/templates/slides-2/app/routes/_index.tsx +1 -0
  791. package/corpus/templates/slides-2/app/routes/access-request.approve.tsx +276 -0
  792. package/corpus/templates/slides-2/app/routes/agent.tsx +19 -0
  793. package/corpus/templates/slides-2/app/routes/chat.$threadId.tsx +1 -0
  794. package/corpus/templates/slides-2/app/routes/chat.tsx +190 -0
  795. package/corpus/templates/slides-2/app/routes/deck.$id.tsx +10 -0
  796. package/corpus/templates/slides-2/app/routes/deck.$id_.present.tsx +10 -0
  797. package/corpus/templates/slides-2/app/routes/design-systems.tsx +10 -0
  798. package/corpus/templates/slides-2/app/routes/extensions.$id.$slug.tsx +2 -0
  799. package/corpus/templates/slides-2/app/routes/extensions.$id.tsx +5 -0
  800. package/corpus/templates/slides-2/app/routes/extensions._index.tsx +5 -0
  801. package/corpus/templates/slides-2/app/routes/extensions.tsx +5 -0
  802. package/corpus/templates/slides-2/app/routes/home-layout.tsx +31 -0
  803. package/corpus/templates/slides-2/app/routes/home.tsx +22 -0
  804. package/corpus/templates/slides-2/app/routes/p.$id.tsx +195 -0
  805. package/corpus/templates/slides-2/app/routes/settings.$.tsx +1 -0
  806. package/corpus/templates/slides-2/app/routes/settings.tsx +131 -0
  807. package/corpus/templates/slides-2/app/routes/share.$token.tsx +137 -0
  808. package/corpus/templates/slides-2/app/routes/slide.tsx +209 -0
  809. package/corpus/templates/slides-2/app/routes/team.tsx +11 -0
  810. package/corpus/templates/slides-2/app/routes/templates.tsx +1 -0
  811. package/corpus/templates/slides-2/app/routes/themes.$id.tsx +1 -0
  812. package/corpus/templates/slides-2/app/routes/themes.tsx +1 -0
  813. package/corpus/templates/slides-2/app/routes.ts +24 -0
  814. package/corpus/templates/slides-2/app/vite-env.d.ts +24 -0
  815. package/corpus/templates/slides-2/changelog/2026-10-17-find-and-switch-decks-from-the-presenter-console.md +6 -0
  816. package/corpus/templates/slides-2/changelog/2026-10-17-meet-slides-2-create-and-refine-editable-slide-decks-with-an.md +6 -0
  817. package/corpus/templates/slides-2/changelog/2026-10-17-pptx-image-export.md +6 -0
  818. package/corpus/templates/slides-2/changelog/2026-10-17-visual-editor.md +6 -0
  819. package/corpus/templates/slides-2/changelog/2026-10-18-apply-an-accessible-design-system-to-an-existing-deck-before.md +6 -0
  820. package/corpus/templates/slides-2/changelog/2026-10-18-choose-a-template-or-start-a-new-presentation-from-the-slide.md +6 -0
  821. package/corpus/templates/slides-2/changelog/2026-10-18-generate-decks-from-a-prompt-then-edit-slide-elements-direct.md +6 -0
  822. package/corpus/templates/slides-2/changelog/2026-10-18-generate-presentation-decks-from-a-prompt-and-edit-every-sli.md +6 -0
  823. package/corpus/templates/slides-2/changelog/2026-10-18-new-presentation-drafts-save-before-generation-starts-so-you.md +6 -0
  824. package/corpus/templates/slides-2/changelog/2026-10-18-the-assistant-can-undo-redo-and-save-pending-edits-in-the-vi.md +6 -0
  825. package/corpus/templates/slides-2/changelog/2026-10-19-agents-can-insert-duplicate-and-delete-canvas-objects-in-sou.md +6 -0
  826. package/corpus/templates/slides-2/changelog/2026-10-19-browse-slide-themes.md +6 -0
  827. package/corpus/templates/slides-2/changelog/2026-10-19-clicking-a-slide-preview-in-overview-selects-that-slide.md +6 -0
  828. package/corpus/templates/slides-2/changelog/2026-10-19-create-decks-from-a-prompt-and-edit-slides-directly-on-the-c.md +6 -0
  829. package/corpus/templates/slides-2/changelog/2026-10-19-creating-and-editing-decks-now-starts-with-the-tools-most-re.md +6 -0
  830. package/corpus/templates/slides-2/changelog/2026-10-19-deleting-decks-revokes-public-links.md +7 -0
  831. package/corpus/templates/slides-2/changelog/2026-10-19-escape-cancels-an-in-progress-slide-drag-without-losing-earl.md +6 -0
  832. package/corpus/templates/slides-2/changelog/2026-10-19-import-failures-now-show-clear-localized-descriptions-instea.md +6 -0
  833. package/corpus/templates/slides-2/changelog/2026-10-19-presenter-controls-stay-responsive-when-moving-over-the-slid.md +6 -0
  834. package/corpus/templates/slides-2/changelog/2026-10-19-presenter-notes-stay-private-from-viewers-and-commenters.md +6 -0
  835. package/corpus/templates/slides-2/changelog/2026-10-19-preview-generated-slides-in-chat.md +6 -0
  836. package/corpus/templates/slides-2/changelog/2026-10-19-remote-image-previews-accept-supported-raster-formats.md +6 -0
  837. package/corpus/templates/slides-2/changelog/2026-10-19-search-the-svgl-catalog-and-add-svg-logos-to-a-deck-or-the-g.md +6 -0
  838. package/corpus/templates/slides-2/changelog/2026-10-19-slide-generation-explains-when-react-effect-hooks-cannot-run.md +6 -0
  839. package/corpus/templates/slides-2/changelog/2026-10-19-the-editor-highlights-hovered-objects-and-keeps-image-replac.md +6 -0
  840. package/corpus/templates/slides-2/changelog/2026-10-19-the-slide-editor-uses-the-shared-agent-native-controls.md +6 -0
  841. package/corpus/templates/slides-2/changelog/2026-10-20-deck-editing-controls-match-the-workspace.md +6 -0
  842. package/corpus/templates/slides-2/changelog/2026-10-20-google-slides-imports-now-report-missing-image-data-instead-.md +6 -0
  843. package/corpus/templates/slides-2/changelog/2026-10-20-imports-and-previews-handle-large-content-safely.md +6 -0
  844. package/corpus/templates/slides-2/changelog/2026-10-20-public-deck-pages-can-export-source-backed-slides-to-pdf.md +6 -0
  845. package/corpus/templates/slides-2/changelog/2026-10-20-saved-slide-images-stay-available.md +6 -0
  846. package/corpus/templates/slides-2/changelog/2026-10-20-scope-global-media-picks-to-assets-the-current-deck-can-reso.md +6 -0
  847. package/corpus/templates/slides-2/components.json +20 -0
  848. package/corpus/templates/slides-2/drizzle.config.ts +3 -0
  849. package/corpus/templates/slides-2/learnings.defaults.md +5 -0
  850. package/corpus/templates/slides-2/netlify.toml +24 -0
  851. package/corpus/templates/slides-2/package.json +147 -0
  852. package/corpus/templates/slides-2/public/agent-native-icon-dark.svg +10 -0
  853. package/corpus/templates/slides-2/public/agent-native-icon-light.svg +10 -0
  854. package/corpus/templates/slides-2/public/agent-native-logo-dark.svg +21 -0
  855. package/corpus/templates/slides-2/public/agent-native-logo-light.svg +21 -0
  856. package/corpus/templates/slides-2/public/assets/builder-logo-white.svg +15 -0
  857. package/corpus/templates/slides-2/public/assets/generated/preview.html +61 -0
  858. package/corpus/templates/slides-2/public/assets/intuit-logo-white.svg +6 -0
  859. package/corpus/templates/slides-2/public/assets/walmart-logo-white.svg +6 -0
  860. package/corpus/templates/slides-2/public/chatgpt-plugin-icon.svg +7 -0
  861. package/corpus/templates/slides-2/public/favicon.svg +1 -0
  862. package/corpus/templates/slides-2/public/icon-180.svg +1 -0
  863. package/corpus/templates/slides-2/public/icon-192.svg +1 -0
  864. package/corpus/templates/slides-2/public/icon-512.svg +1 -0
  865. package/corpus/templates/slides-2/public/manifest.json +20 -0
  866. package/corpus/templates/slides-2/public/placeholder.svg +1 -0
  867. package/corpus/templates/slides-2/public/robots.txt +14 -0
  868. package/corpus/templates/slides-2/public/visual-edit-structure-proof.html +99 -0
  869. package/corpus/templates/slides-2/react-router.config.ts +7 -0
  870. package/corpus/templates/slides-2/scripts/edit-fidelity/README.md +499 -0
  871. package/corpus/templates/slides-2/scripts/edit-fidelity/authoring-fuzz.ts +9517 -0
  872. package/corpus/templates/slides-2/scripts/edit-fidelity/baseline.json +16427 -0
  873. package/corpus/templates/slides-2/scripts/edit-fidelity/dev-server-url.ts +10 -0
  874. package/corpus/templates/slides-2/scripts/edit-fidelity/lib/in-page.ts +1975 -0
  875. package/corpus/templates/slides-2/scripts/edit-fidelity/lib/metrics.ts +1401 -0
  876. package/corpus/templates/slides-2/scripts/edit-fidelity/retry-infra.ts +7 -0
  877. package/corpus/templates/slides-2/scripts/edit-fidelity/run-options.ts +21 -0
  878. package/corpus/templates/slides-2/scripts/edit-fidelity/run-outcomes.ts +127 -0
  879. package/corpus/templates/slides-2/scripts/edit-fidelity/run.ts +8451 -0
  880. package/corpus/templates/slides-2/scripts/export-fidelity/README.md +116 -0
  881. package/corpus/templates/slides-2/scripts/export-fidelity/compare-layout-lib.ts +241 -0
  882. package/corpus/templates/slides-2/scripts/export-fidelity/compare-layout.ts +30 -0
  883. package/corpus/templates/slides-2/scripts/export-fidelity/diff.ts +222 -0
  884. package/corpus/templates/slides-2/scripts/export-fidelity/export.ts +765 -0
  885. package/corpus/templates/slides-2/scripts/export-fidelity/fixtures/agent-dark-deck.json +48 -0
  886. package/corpus/templates/slides-2/scripts/export-fidelity/generate-calibration.ts +765 -0
  887. package/corpus/templates/slides-2/scripts/export-fidelity/google-export.ts +137 -0
  888. package/corpus/templates/slides-2/scripts/export-fidelity/google-layout.ts +82 -0
  889. package/corpus/templates/slides-2/scripts/export-fidelity/resolve-pkg.ts +29 -0
  890. package/corpus/templates/slides-2/scripts/migrate-production.ts +22 -0
  891. package/corpus/templates/slides-2/server/db/index.ts +73 -0
  892. package/corpus/templates/slides-2/server/db/schema.ts +189 -0
  893. package/corpus/templates/slides-2/server/handlers/assets-url.ts +13 -0
  894. package/corpus/templates/slides-2/server/handlers/assets.ts +3217 -0
  895. package/corpus/templates/slides-2/server/handlers/decks.ts +185 -0
  896. package/corpus/templates/slides-2/server/handlers/demo.ts +9 -0
  897. package/corpus/templates/slides-2/server/handlers/design-systems.ts +219 -0
  898. package/corpus/templates/slides-2/server/handlers/google-docs-auth.ts +165 -0
  899. package/corpus/templates/slides-2/server/handlers/image-gen.ts +153 -0
  900. package/corpus/templates/slides-2/server/handlers/image-providers/gemini.ts +209 -0
  901. package/corpus/templates/slides-2/server/handlers/image-providers/index.ts +61 -0
  902. package/corpus/templates/slides-2/server/handlers/image-providers/openai.ts +288 -0
  903. package/corpus/templates/slides-2/server/handlers/image-providers/types.ts +35 -0
  904. package/corpus/templates/slides-2/server/handlers/import/docx-parser.ts +31 -0
  905. package/corpus/templates/slides-2/server/handlers/import/html-converter.ts +1534 -0
  906. package/corpus/templates/slides-2/server/handlers/import/pdf-fidelity-parser.ts +1039 -0
  907. package/corpus/templates/slides-2/server/handlers/import/pdf-sidecar-reader.ts +81 -0
  908. package/corpus/templates/slides-2/server/handlers/import/pdf-style-digest.ts +187 -0
  909. package/corpus/templates/slides-2/server/handlers/import/pptx-assets.ts +155 -0
  910. package/corpus/templates/slides-2/server/handlers/import/pptx-parser.ts +57 -0
  911. package/corpus/templates/slides-2/server/handlers/request-auth-context.ts +108 -0
  912. package/corpus/templates/slides-2/server/handlers/share.ts +52 -0
  913. package/corpus/templates/slides-2/server/handlers/uploads-chunked.ts +1066 -0
  914. package/corpus/templates/slides-2/server/handlers/uploads.ts +457 -0
  915. package/corpus/templates/slides-2/server/lib/access-request-email.ts +66 -0
  916. package/corpus/templates/slides-2/server/lib/assets-image-delegation.ts +331 -0
  917. package/corpus/templates/slides-2/server/lib/bounded-multipart.ts +49 -0
  918. package/corpus/templates/slides-2/server/lib/builder-design-system-proxy.ts +122 -0
  919. package/corpus/templates/slides-2/server/lib/chat-attachments.ts +425 -0
  920. package/corpus/templates/slides-2/server/lib/chatgpt-directory-tools.ts +246 -0
  921. package/corpus/templates/slides-2/server/lib/chunked-upload-session.ts +195 -0
  922. package/corpus/templates/slides-2/server/lib/comment-notifications.ts +184 -0
  923. package/corpus/templates/slides-2/server/lib/deck-access-requests.ts +102 -0
  924. package/corpus/templates/slides-2/server/lib/deck-asset-scope.ts +150 -0
  925. package/corpus/templates/slides-2/server/lib/deck-export-tracking.ts +119 -0
  926. package/corpus/templates/slides-2/server/lib/deck-templates/a-case-study.ts +154 -0
  927. package/corpus/templates/slides-2/server/lib/deck-templates/a-company.ts +160 -0
  928. package/corpus/templates/slides-2/server/lib/deck-templates/a-pitch.ts +151 -0
  929. package/corpus/templates/slides-2/server/lib/deck-templates/a-quarterly.ts +264 -0
  930. package/corpus/templates/slides-2/server/lib/deck-templates/a-shared.ts +35 -0
  931. package/corpus/templates/slides-2/server/lib/deck-templates/a-update.ts +188 -0
  932. package/corpus/templates/slides-2/server/lib/deck-templates/a-workshop.ts +196 -0
  933. package/corpus/templates/slides-2/server/lib/deck-templates/b-keynote.ts +131 -0
  934. package/corpus/templates/slides-2/server/lib/deck-templates/b-lesson.ts +209 -0
  935. package/corpus/templates/slides-2/server/lib/deck-templates/b-manifesto.ts +149 -0
  936. package/corpus/templates/slides-2/server/lib/deck-templates/b-portfolio.ts +144 -0
  937. package/corpus/templates/slides-2/server/lib/deck-templates/b-research.ts +221 -0
  938. package/corpus/templates/slides-2/server/lib/deck-templates/b-roadmap.ts +264 -0
  939. package/corpus/templates/slides-2/server/lib/deck-templates/b-shared.ts +44 -0
  940. package/corpus/templates/slides-2/server/lib/deck-templates/group-a.ts +16 -0
  941. package/corpus/templates/slides-2/server/lib/deck-templates/group-b.ts +16 -0
  942. package/corpus/templates/slides-2/server/lib/deck-templates/legacy.ts +567 -0
  943. package/corpus/templates/slides-2/server/lib/deck-templates.ts +60 -0
  944. package/corpus/templates/slides-2/server/lib/deck-versions.ts +233 -0
  945. package/corpus/templates/slides-2/server/lib/design-system-workflows.ts +22 -0
  946. package/corpus/templates/slides-2/server/lib/emails.ts +84 -0
  947. package/corpus/templates/slides-2/server/lib/env-config.ts +15 -0
  948. package/corpus/templates/slides-2/server/lib/fetch-remote-image.ts +245 -0
  949. package/corpus/templates/slides-2/server/lib/generation-completion.ts +278 -0
  950. package/corpus/templates/slides-2/server/lib/google-docs-access.ts +51 -0
  951. package/corpus/templates/slides-2/server/lib/google-docs-error.ts +54 -0
  952. package/corpus/templates/slides-2/server/lib/google-docs-oauth.ts +422 -0
  953. package/corpus/templates/slides-2/server/lib/google-fonts.ts +509 -0
  954. package/corpus/templates/slides-2/server/lib/google-oauth-preflight.ts +119 -0
  955. package/corpus/templates/slides-2/server/lib/google-slides-export-availability.ts +55 -0
  956. package/corpus/templates/slides-2/server/lib/image-proxy-response.ts +16 -0
  957. package/corpus/templates/slides-2/server/lib/image-proxy-url.ts +155 -0
  958. package/corpus/templates/slides-2/server/lib/import-asset-storage.ts +214 -0
  959. package/corpus/templates/slides-2/server/lib/imported-asset-batch.ts +218 -0
  960. package/corpus/templates/slides-2/server/lib/legacy-slide-source.ts +692 -0
  961. package/corpus/templates/slides-2/server/lib/media-search-providers.ts +216 -0
  962. package/corpus/templates/slides-2/server/lib/native-creative-context.ts +295 -0
  963. package/corpus/templates/slides-2/server/lib/pdf-parse-setup.ts +115 -0
  964. package/corpus/templates/slides-2/server/lib/provider-api.ts +57 -0
  965. package/corpus/templates/slides-2/server/lib/request-wait-until.ts +30 -0
  966. package/corpus/templates/slides-2/server/lib/shared-deck.ts +29 -0
  967. package/corpus/templates/slides-2/server/lib/slide-asset-references.ts +309 -0
  968. package/corpus/templates/slides-2/server/lib/slide-content-patch.ts +1004 -0
  969. package/corpus/templates/slides-2/server/lib/slide-hygiene.ts +731 -0
  970. package/corpus/templates/slides-2/server/lib/slide-image-insertion.ts +136 -0
  971. package/corpus/templates/slides-2/server/lib/slide-reveal-issues.ts +41 -0
  972. package/corpus/templates/slides-2/server/lib/slide-source-editing/babel-walk.ts +117 -0
  973. package/corpus/templates/slides-2/server/lib/slide-source-editing/batch-edit.ts +152 -0
  974. package/corpus/templates/slides-2/server/lib/slide-source-editing/edit-ops.ts +1478 -0
  975. package/corpus/templates/slides-2/server/lib/slide-source-editing/image-target.ts +128 -0
  976. package/corpus/templates/slides-2/server/lib/slide-source-editing/text-diff.ts +23 -0
  977. package/corpus/templates/slides-2/server/lib/slide-source-limits.ts +9 -0
  978. package/corpus/templates/slides-2/server/lib/slide-source.ts +1786 -0
  979. package/corpus/templates/slides-2/server/lib/slide-theme-demo-sources.ts +2106 -0
  980. package/corpus/templates/slides-2/server/lib/slide-themes.ts +2174 -0
  981. package/corpus/templates/slides-2/server/lib/slide-worker-runtime.ts +1995 -0
  982. package/corpus/templates/slides-2/server/lib/slides-tracking.ts +73 -0
  983. package/corpus/templates/slides-2/server/lib/source-import.ts +213 -0
  984. package/corpus/templates/slides-2/server/lib/svgl.ts +364 -0
  985. package/corpus/templates/slides-2/server/lib/tenant-files.ts +179 -0
  986. package/corpus/templates/slides-2/server/lib/upload-storage-status.ts +9 -0
  987. package/corpus/templates/slides-2/server/lib/uploaded-asset-cleanup-outbox.ts +521 -0
  988. package/corpus/templates/slides-2/server/lib/uploaded-asset-object-lifecycle.ts +404 -0
  989. package/corpus/templates/slides-2/server/lib/uploaded-fonts.ts +696 -0
  990. package/corpus/templates/slides-2/server/lib/uploaded-reference-storage.ts +77 -0
  991. package/corpus/templates/slides-2/server/lib/validate-slide-animations.ts +341 -0
  992. package/corpus/templates/slides-2/server/middleware/auth.ts +6 -0
  993. package/corpus/templates/slides-2/server/plugins/_dev-upload-stub.ts +6 -0
  994. package/corpus/templates/slides-2/server/plugins/agent-chat.ts +402 -0
  995. package/corpus/templates/slides-2/server/plugins/auth.ts +31 -0
  996. package/corpus/templates/slides-2/server/plugins/collab.ts +30 -0
  997. package/corpus/templates/slides-2/server/plugins/config.ts +6 -0
  998. package/corpus/templates/slides-2/server/plugins/core-routes.ts +30 -0
  999. package/corpus/templates/slides-2/server/plugins/creative-context.ts +187 -0
  1000. package/corpus/templates/slides-2/server/plugins/db.ts +462 -0
  1001. package/corpus/templates/slides-2/server/plugins/feature-flags.ts +5 -0
  1002. package/corpus/templates/slides-2/server/plugins/labs.ts +8 -0
  1003. package/corpus/templates/slides-2/server/plugins/orphaned-asset-cleanup.ts +17 -0
  1004. package/corpus/templates/slides-2/server/plugins/otel.ts +6 -0
  1005. package/corpus/templates/slides-2/server/plugins/transactional-emails.ts +5 -0
  1006. package/corpus/templates/slides-2/server/register-secrets.ts +209 -0
  1007. package/corpus/templates/slides-2/server/routes/[...page].get.ts +5 -0
  1008. package/corpus/templates/slides-2/server/routes/[...page].head.ts +1 -0
  1009. package/corpus/templates/slides-2/server/routes/[base]/_agent-native/google-docs/auth-url.get.ts +1 -0
  1010. package/corpus/templates/slides-2/server/routes/[base]/_agent-native/google-docs/callback.get.ts +1 -0
  1011. package/corpus/templates/slides-2/server/routes/_agent-native/google-docs/auth-url.get.ts +1 -0
  1012. package/corpus/templates/slides-2/server/routes/_agent-native/google-docs/callback.get.ts +1 -0
  1013. package/corpus/templates/slides-2/server/routes/api/assets/upload-video.post.ts +1 -0
  1014. package/corpus/templates/slides-2/server/routes/api/assets/upload.post.ts +1 -0
  1015. package/corpus/templates/slides-2/server/routes/api/assets/video-uploads.delete.ts +1 -0
  1016. package/corpus/templates/slides-2/server/routes/api/deck-agent-context.json.get.ts +105 -0
  1017. package/corpus/templates/slides-2/server/routes/api/decks/events.get.ts +1 -0
  1018. package/corpus/templates/slides-2/server/routes/api/demo.get.ts +1 -0
  1019. package/corpus/templates/slides-2/server/routes/api/exports/[filename].get.ts +221 -0
  1020. package/corpus/templates/slides-2/server/routes/api/exports/google-slides.post.ts +240 -0
  1021. package/corpus/templates/slides-2/server/routes/api/exports/html.post.ts +67 -0
  1022. package/corpus/templates/slides-2/server/routes/api/exports/pptx.post.ts +100 -0
  1023. package/corpus/templates/slides-2/server/routes/api/gen-preview/[...].get.ts +24 -0
  1024. package/corpus/templates/slides-2/server/routes/api/generated/[...].get.ts +24 -0
  1025. package/corpus/templates/slides-2/server/routes/api/image-proxy.get.ts +518 -0
  1026. package/corpus/templates/slides-2/server/routes/api/import-assets/[token].get.ts +70 -0
  1027. package/corpus/templates/slides-2/server/routes/api/preview-images.get.ts +20 -0
  1028. package/corpus/templates/slides-2/server/routes/api/share/[token].get.ts +1 -0
  1029. package/corpus/templates/slides-2/server/routes/api/uploads-chunked/[sessionId]/chunk.post.ts +1 -0
  1030. package/corpus/templates/slides-2/server/routes/api/uploads-chunked/[sessionId]/status.get.ts +1 -0
  1031. package/corpus/templates/slides-2/server/routes/api/uploads-chunked/[sessionId].delete.ts +1 -0
  1032. package/corpus/templates/slides-2/server/routes/api/uploads-chunked/start.post.ts +1 -0
  1033. package/corpus/templates/slides-2/server/routes/api/uploads.delete.ts +1 -0
  1034. package/corpus/templates/slides-2/server/routes/api/uploads.post.ts +1 -0
  1035. package/corpus/templates/slides-2/server/workspace-defaults.ts +196 -0
  1036. package/corpus/templates/slides-2/shared/action-ui.ts +147 -0
  1037. package/corpus/templates/slides-2/shared/agent-readable.ts +2 -0
  1038. package/corpus/templates/slides-2/shared/api.ts +406 -0
  1039. package/corpus/templates/slides-2/shared/app-state-tabs.ts +30 -0
  1040. package/corpus/templates/slides-2/shared/app-storage.ts +9 -0
  1041. package/corpus/templates/slides-2/shared/aspect-ratios.ts +49 -0
  1042. package/corpus/templates/slides-2/shared/blank-slide.ts +179 -0
  1043. package/corpus/templates/slides-2/shared/client-compatibility.ts +2 -0
  1044. package/corpus/templates/slides-2/shared/contrast-audit.ts +255 -0
  1045. package/corpus/templates/slides-2/shared/deck-access.ts +26 -0
  1046. package/corpus/templates/slides-2/shared/deck-app-scope.ts +14 -0
  1047. package/corpus/templates/slides-2/shared/deck-content.ts +37 -0
  1048. package/corpus/templates/slides-2/shared/deck-history-control.ts +79 -0
  1049. package/corpus/templates/slides-2/shared/deck-scope.ts +5 -0
  1050. package/corpus/templates/slides-2/shared/deck-title.ts +199 -0
  1051. package/corpus/templates/slides-2/shared/deck-write.ts +61 -0
  1052. package/corpus/templates/slides-2/shared/design-flags.ts +7 -0
  1053. package/corpus/templates/slides-2/shared/design-system-validation.ts +88 -0
  1054. package/corpus/templates/slides-2/shared/editor-control.ts +120 -0
  1055. package/corpus/templates/slides-2/shared/generation-timing.ts +19 -0
  1056. package/corpus/templates/slides-2/shared/google-docs.ts +69 -0
  1057. package/corpus/templates/slides-2/shared/labs.ts +10 -0
  1058. package/corpus/templates/slides-2/shared/overview-navigation.ts +34 -0
  1059. package/corpus/templates/slides-2/shared/ownership.ts +6 -0
  1060. package/corpus/templates/slides-2/shared/pdf-sidecar.ts +130 -0
  1061. package/corpus/templates/slides-2/shared/presenter-control.ts +111 -0
  1062. package/corpus/templates/slides-2/shared/representative-slide.ts +89 -0
  1063. package/corpus/templates/slides-2/shared/slide-background.ts +30 -0
  1064. package/corpus/templates/slides-2/shared/slide-comment-anchor.ts +117 -0
  1065. package/corpus/templates/slides-2/shared/slide-comment-reactions.ts +47 -0
  1066. package/corpus/templates/slides-2/shared/slide-design-tokens.ts +92 -0
  1067. package/corpus/templates/slides-2/shared/slide-fit.ts +78 -0
  1068. package/corpus/templates/slides-2/shared/slide-ids.ts +133 -0
  1069. package/corpus/templates/slides-2/shared/slide-number.ts +124 -0
  1070. package/corpus/templates/slides-2/shared/slide-object-structure.ts +790 -0
  1071. package/corpus/templates/slides-2/shared/slide-text-range-selection.ts +50 -0
  1072. package/corpus/templates/slides-2/shared/slide-transitions.ts +70 -0
  1073. package/corpus/templates/slides-2/shared/slides-2-transition.ts +194 -0
  1074. package/corpus/templates/slides-2/shared/slides-user-prefs.ts +22 -0
  1075. package/corpus/templates/slides-2/shared/source-import-errors.ts +12 -0
  1076. package/corpus/templates/slides-2/shared/source-runtime-export.ts +76 -0
  1077. package/corpus/templates/slides-2/shared/upload-types.ts +41 -0
  1078. package/corpus/templates/slides-2/ssr-entry.ts +11 -0
  1079. package/corpus/templates/slides-2/tsconfig.json +27 -0
  1080. package/corpus/templates/slides-2/vite.config.ts +77 -0
  1081. package/corpus/templates/slides-2/vitest.config.ts +28 -0
  1082. package/corpus/templates/tasks/.agents/skills/actions/references/action-fields.md +1 -1
  1083. package/package.json +1 -1
  1084. package/corpus/templates/design/.agents/skills/shader-fills/SKILL.md +0 -182
  1085. package/corpus/templates/design/actions/apply-shader-fill.ts +0 -450
  1086. package/corpus/templates/design/actions/apply-shader.ts +0 -257
  1087. package/corpus/templates/design/actions/preview-shader-fill.ts +0 -157
  1088. package/corpus/templates/design/app/components/design/inspector/GlslShaderPanel.tsx +0 -1144
  1089. package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +0 -450
  1090. package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +0 -71
  1091. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +0 -555
  1092. package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +0 -105
  1093. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +0 -433
  1094. package/corpus/templates/design/app/components/design/inspector/color-picker-shader-pane.tsx +0 -648
  1095. package/corpus/templates/design/shared/shader-fill.ts +0 -174
  1096. package/corpus/templates/design/shared/shader-presets.ts +0 -1523
@@ -8,6 +8,7 @@ import {
8
8
  feedbackUniformProperties,
9
9
  planEffectGraph,
10
10
  type EffectPass,
11
+ type EffectMeshSpec,
11
12
  type EffectResourceSpec,
12
13
  } from "../../../../shared/effect-graph";
13
14
  import { resolveNativeClipRadii } from "../../../../shared/native-clip-geometry";
@@ -30,6 +31,7 @@ import {
30
31
  parseNativeEffectApprovalState,
31
32
  } from "../../../../shared/native-effect-trust";
32
33
  import {
34
+ nativeEffectUniformFloats,
33
35
  packNativeProperties,
34
36
  validateEffectDocument,
35
37
  usesRetiredNativeImageAbi,
@@ -53,7 +55,10 @@ import {
53
55
  nativeFeedbackResetValuesChanged,
54
56
  type NativeFeedbackDefinition,
55
57
  } from "../../../../shared/native-feedback-plan";
56
- import { planNativeInputResources } from "../../../../shared/native-input-resources";
58
+ import {
59
+ nativeWorkerSupportsInputResources,
60
+ planNativeInputResources,
61
+ } from "../../../../shared/native-input-resources";
57
62
  import {
58
63
  hashEffectInstance,
59
64
  type NativeInstancePreviewRequest,
@@ -143,6 +148,12 @@ import {
143
148
  NativeDeviceLifecycleError,
144
149
  type NativeDeviceScope,
145
150
  } from "./native-device-lifecycle";
151
+ import {
152
+ isNativeElement,
153
+ isNativeHtmlElement,
154
+ isNativeHtmlTag,
155
+ isNativeSvgRoot,
156
+ } from "./native-dom";
146
157
  import {
147
158
  planNativeChainedEffectExtent,
148
159
  planNativeFillPresentationExtent,
@@ -177,6 +188,11 @@ import {
177
188
  NativeCameraError,
178
189
  NativeLiveCameraSource,
179
190
  } from "./native-live-camera-source";
191
+ import {
192
+ acquireNativeMeshGrid,
193
+ nativeMeshGridBytes,
194
+ type NativeMeshGridLease,
195
+ } from "./native-mesh-grid";
180
196
  import {
181
197
  emptyNativeBenchmarkPhaseValues,
182
198
  emptyNativeBenchmarkFullFrameValues,
@@ -194,6 +210,10 @@ import {
194
210
  planNativeMountedOutputReadback,
195
211
  withNativeMountedTextureReadback,
196
212
  } from "./native-mounted-output-summary";
213
+ import {
214
+ isOpaquePublicAssetPreview,
215
+ resolveOpaquePublicAssetBlob,
216
+ } from "./native-opaque-public-asset";
197
217
  import {
198
218
  NativePackedUniformArena,
199
219
  type NativePackedUniformFrame,
@@ -221,6 +241,8 @@ import {
221
241
  import { planNativePreviewBudget } from "./native-preview-budget";
222
242
  import {
223
243
  fitNativeRasterDensity,
244
+ nativePreviewStableAllocationOrExactViewport,
245
+ nativePreviewStablePhysicalViewport,
224
246
  nativePreviewPhysicalViewport,
225
247
  nativePreviewBoxesOverlap,
226
248
  nativePreviewTargetDensity,
@@ -234,6 +256,12 @@ import {
234
256
  resolveNativePreviewPolicy,
235
257
  type NativePreviewStatus,
236
258
  } from "./native-preview-policy";
259
+ import {
260
+ isTrustedOpaquePreviewViewportPortResponse,
261
+ NATIVE_PREVIEW_VIEWPORT_REQUEST_MESSAGE,
262
+ type NativePreviewViewportRequest,
263
+ type NativePreviewViewportResponse,
264
+ } from "./native-preview-viewport-transport";
237
265
  import { NativeRafIntervalTelemetry } from "./native-raf-interval";
238
266
  import {
239
267
  buildNativeReceiverFields,
@@ -242,6 +270,14 @@ import {
242
270
  import { beginNativeRegionExport } from "./native-region-export";
243
271
  import { nativeRenderPlacementConstants } from "./native-render-placement";
244
272
  import { createNativeRuntimeEpoch } from "./native-runtime-epoch";
273
+ import {
274
+ attachNativeScenePresentationCanvas,
275
+ supportsNativeSceneBodyTransform,
276
+ } from "./native-scene-body-transform";
277
+ import {
278
+ isNativeScenePresentationElement,
279
+ type NativeScenePresentationElement,
280
+ } from "./native-scene-presentation-element";
245
281
  import {
246
282
  NativeSimulationTimelineError,
247
283
  planNativeSimulationSteps,
@@ -955,6 +991,10 @@ const definitionKey = (id: string, version: number): string =>
955
991
  const MAX_DIMENSION = 4096;
956
992
  const MAX_PIXELS = 8_388_608;
957
993
  const MAX_RESOURCE_BYTES = 134_217_728;
994
+ const MAX_LEGACY_PREVIEW_PIXELS = Math.min(
995
+ MAX_PIXELS,
996
+ Math.floor(MAX_RESOURCE_BYTES / 40),
997
+ );
958
998
  const MAX_REALM_TEXTURE_BYTES = 402_653_184;
959
999
  const unavailableFeedbackStateFollowups = {
960
1000
  sourceTransition: {
@@ -1012,19 +1052,11 @@ function awaitInputDecode<T>(
1012
1052
  });
1013
1053
  }
1014
1054
 
1015
- type NativeScenePresentationElement = HTMLElement | SVGSVGElement;
1016
-
1017
- function isNativeScenePresentationElement(
1018
- element: Element,
1019
- ): element is NativeScenePresentationElement {
1020
- return element instanceof HTMLElement || element instanceof SVGSVGElement;
1021
- }
1022
-
1023
1055
  export function nativePresentationTargetLayout(
1024
1056
  target: HTMLElement | SVGSVGElement,
1025
1057
  ) {
1026
1058
  const style = getComputedStyle(target);
1027
- if (target instanceof HTMLElement)
1059
+ if (isNativeHtmlElement(target))
1028
1060
  return {
1029
1061
  width: target.offsetWidth,
1030
1062
  height: target.offsetHeight,
@@ -1037,7 +1069,7 @@ export function nativePresentationTargetLayout(
1037
1069
  scale: style.scale,
1038
1070
  };
1039
1071
  const parent = target.parentElement;
1040
- if (!(parent instanceof HTMLElement))
1072
+ if (!isNativeHtmlElement(parent))
1041
1073
  throw new NativeSourceError(
1042
1074
  "source-inline-svg",
1043
1075
  "A native SVG target needs an HTML parent.",
@@ -1069,28 +1101,43 @@ class NativeShaderRuntime {
1069
1101
  readonly epoch = createNativeRuntimeEpoch();
1070
1102
  private readonly exportInitialPixelRatio: number | null;
1071
1103
  constructor(private readonly runtimeScript: Node | null) {
1072
- const encoded =
1073
- runtimeScript instanceof HTMLScriptElement
1074
- ? runtimeScript.getAttribute(
1075
- "data-agent-native-export-initial-pixel-ratio",
1076
- )
1077
- : null;
1078
- if (encoded === null) {
1079
- this.exportInitialPixelRatio = null;
1080
- return;
1104
+ const encoded = isNativeHtmlTag(runtimeScript, "script")
1105
+ ? runtimeScript.getAttribute(
1106
+ "data-agent-native-export-initial-pixel-ratio",
1107
+ )
1108
+ : null;
1109
+ if (encoded === null) this.exportInitialPixelRatio = null;
1110
+ else {
1111
+ const ratio = Number(encoded);
1112
+ if (
1113
+ !Number.isFinite(ratio) ||
1114
+ ratio <= 0 ||
1115
+ ratio > 4 ||
1116
+ String(ratio) !== encoded
1117
+ )
1118
+ throw new NativeSourceError(
1119
+ "export-initial-density-invalid",
1120
+ "export-initial-density-invalid",
1121
+ );
1122
+ this.exportInitialPixelRatio = ratio;
1123
+ }
1124
+ const encodedEpoch = isNativeHtmlTag(runtimeScript, "script")
1125
+ ? runtimeScript.getAttribute("data-agent-native-animation-epoch-ms")
1126
+ : null;
1127
+ if (encodedEpoch !== null) {
1128
+ const epoch = Number(encodedEpoch);
1129
+ if (
1130
+ !Number.isFinite(epoch) ||
1131
+ epoch <= 0 ||
1132
+ epoch > 8.64e15 ||
1133
+ String(epoch) !== encodedEpoch
1134
+ )
1135
+ throw new NativeSourceError(
1136
+ "preview-animation-epoch-invalid",
1137
+ "The shared preview animation epoch is invalid.",
1138
+ );
1139
+ this.clockOrigin = epoch - performance.timeOrigin;
1081
1140
  }
1082
- const ratio = Number(encoded);
1083
- if (
1084
- !Number.isFinite(ratio) ||
1085
- ratio <= 0 ||
1086
- ratio > 4 ||
1087
- String(ratio) !== encoded
1088
- )
1089
- throw new NativeSourceError(
1090
- "export-initial-density-invalid",
1091
- "export-initial-density-invalid",
1092
- );
1093
- this.exportInitialPixelRatio = ratio;
1094
1141
  }
1095
1142
  private device: GPUDevice | null = null;
1096
1143
  private deviceLifecycle = new NativeDeviceLifecycle<NativeDeviceResources>(
@@ -1123,6 +1170,8 @@ class NativeShaderRuntime {
1123
1170
  private finishPipeline: GPURenderPipeline | null = null;
1124
1171
  private effectPipelineLayouts = new Map<number, GPUPipelineLayout>();
1125
1172
  private pipelines = new NativePipelineCache<GPURenderPipeline>(MAX_PIPELINES);
1173
+ private meshGrids = new Map<string, NativeMeshGridLease>();
1174
+ private allocatedMeshBytes = 0;
1126
1175
  private simulationComputePipelines =
1127
1176
  new NativePipelineCache<GPUComputePipeline>(16);
1128
1177
  private simulationRenderPipelines =
@@ -1361,13 +1410,27 @@ class NativeShaderRuntime {
1361
1410
  } | null = null;
1362
1411
  private previewPolicy = new NativePreviewPolicyController();
1363
1412
  private previewViewport: NativePreviewBox | null = null;
1413
+ private previewAllocationViewport: NativePreviewBox | null = null;
1414
+ private previewMaxViewportWidth: number | null = null;
1415
+ private previewMaxViewportHeight: number | null = null;
1364
1416
  private previewDisplayScale = 1;
1365
1417
  private previewHostObserver: MutationObserver | null = null;
1366
1418
  private previewHostResizeObserver: ResizeObserver | null = null;
1367
1419
  private previewHostParent: Window | null = null;
1368
1420
  private previewHostFrame = 0;
1421
+ private previewHostRafHost: Window | null = null;
1369
1422
  private previewHostFramePending = false;
1370
1423
  private previewHostGeneration = 0;
1424
+ private opaquePreviewViewportNonce: string | null = null;
1425
+ private opaquePreviewViewportRequest: NativePreviewViewportRequest | null =
1426
+ null;
1427
+ private opaquePreviewViewportPort: MessagePort | null = null;
1428
+ private opaquePreviewViewportReceived = false;
1429
+ private opaquePreviewHostPixelRatio: number | null = null;
1430
+ private opaquePreviewViewportRetries = 0;
1431
+ private opaquePreviewViewportExhausted = false;
1432
+ private opaquePreviewViewportTimer: ReturnType<typeof setTimeout> | null =
1433
+ null;
1371
1434
  private previewFrameHostGeneration = 0;
1372
1435
  private previewTargetDensities = new Map<
1373
1436
  NativeScenePresentationElement,
@@ -1533,13 +1596,82 @@ class NativeShaderRuntime {
1533
1596
  if (mount.instance.placement === "backdrop") {
1534
1597
  this.showOriginal(mount);
1535
1598
  } else if (mount.outputTexture && mount.suppressed) {
1536
- this.syncPresentation(mount);
1599
+ if (mount.outputExtent && this.refreshPresentationGeometry(mount))
1600
+ this.syncPresentation(mount);
1601
+ else this.showOriginal(mount);
1537
1602
  } else {
1538
1603
  this.showOriginal(mount);
1539
1604
  }
1540
1605
  }
1541
1606
  }
1542
1607
 
1608
+ private refreshPresentationGeometry(mount: Mount): boolean {
1609
+ const outputExtent = mount.outputExtent;
1610
+ if (!outputExtent) return false;
1611
+ this.reconcilePresentation(mount);
1612
+ const presentationExtent =
1613
+ mount.instance.placement === "fill" && mount.isTopLayer
1614
+ ? (mount.fillPresentationExtent ?? outputExtent)
1615
+ : outputExtent;
1616
+ if (presentationExtent.expanded) {
1617
+ for (
1618
+ let node: Element | null = mount.target;
1619
+ node;
1620
+ node = node.parentElement
1621
+ )
1622
+ if (!supportsNativeOutput2D(getComputedStyle(node))) return false;
1623
+ }
1624
+ return this.projectPresentationGeometry(
1625
+ mount,
1626
+ presentationExtent,
1627
+ outputExtent.pixelRatio,
1628
+ );
1629
+ }
1630
+
1631
+ private projectPresentationGeometry(
1632
+ mount: Mount,
1633
+ presentationExtent: NativeEffectExtentPlan,
1634
+ pixelRatio: number,
1635
+ ): boolean {
1636
+ const targetLayout = nativePresentationTargetLayout(mount.target);
1637
+ const { left, top } = presentationExtent;
1638
+ const style = getComputedStyle(mount.target);
1639
+ const geometry = planNativeOutputGeometry({
1640
+ offsetLeft: targetLayout.offsetLeft,
1641
+ offsetTop: targetLayout.offsetTop,
1642
+ width: targetLayout.width,
1643
+ height: targetLayout.height,
1644
+ extent: presentationExtent,
1645
+ transformOrigin: targetLayout.transformOrigin,
1646
+ });
1647
+ if (presentationExtent.expanded && !geometry) return false;
1648
+ mount.canvas.style.left = `${geometry?.left ?? targetLayout.offsetLeft - left / pixelRatio}px`;
1649
+ mount.canvas.style.top = `${geometry?.top ?? targetLayout.offsetTop - top / pixelRatio}px`;
1650
+ mount.canvas.style.width = `${geometry?.width ?? targetLayout.width + (left + presentationExtent.right) / pixelRatio}px`;
1651
+ mount.canvas.style.height = `${geometry?.height ?? targetLayout.height + (top + presentationExtent.bottom) / pixelRatio}px`;
1652
+ mount.canvas.style.transform = targetLayout.transform;
1653
+ mount.canvas.style.translate = targetLayout.translate;
1654
+ mount.canvas.style.rotate = targetLayout.rotate;
1655
+ mount.canvas.style.scale = targetLayout.scale;
1656
+ mount.canvas.style.transformOrigin =
1657
+ geometry?.transformOrigin ?? targetLayout.transformOrigin;
1658
+ mount.canvas.style.borderRadius =
1659
+ mount.instance.placement === "fill" || presentationExtent.expanded
1660
+ ? "0"
1661
+ : style.borderRadius;
1662
+ if (mount.instance.placement === "fill")
1663
+ mount.canvas.style.opacity =
1664
+ mount.target.getAttribute("data-an-native-authored-opacity") ??
1665
+ style.opacity;
1666
+ else if (mount.instance.placement === "layer")
1667
+ mount.canvas.style.opacity = mount.layerSourceOpacityDeferred
1668
+ ? (mount.target.getAttribute("data-an-native-authored-opacity") ??
1669
+ style.opacity)
1670
+ : "";
1671
+ mount.canvas.style.zIndex = style.zIndex === "auto" ? "auto" : style.zIndex;
1672
+ return true;
1673
+ }
1674
+
1543
1675
  private groupLocalNoncontributing(mount: Mount): boolean {
1544
1676
  if (mount.instance.placement !== "backdrop") return false;
1545
1677
  const owner = this.nestedBackdropOwner(mount.target);
@@ -1615,6 +1747,7 @@ class NativeShaderRuntime {
1615
1747
  height: innerHeight,
1616
1748
  pixelRatio: this.previewStatus().effectivePixelRatio,
1617
1749
  viewport: this.previewViewport,
1750
+ allocationViewport: this.previewAllocationViewport,
1618
1751
  deviceEpoch: this.deviceEpoch,
1619
1752
  media: [...document.querySelectorAll("img,video,source")].map(
1620
1753
  (element) => [
@@ -1712,13 +1845,7 @@ class NativeShaderRuntime {
1712
1845
  "scene-background-unsupported",
1713
1846
  "A translucent or image root background needs a single captured presentation layer.",
1714
1847
  );
1715
- if (
1716
- bodyStyle.transform !== "none" ||
1717
- bodyStyle.translate !== "none" ||
1718
- bodyStyle.rotate !== "none" ||
1719
- bodyStyle.scale !== "none" ||
1720
- bodyStyle.opacity !== "1"
1721
- )
1848
+ if (!supportsNativeSceneBodyTransform(bodyStyle))
1722
1849
  throw new NativeSourceError(
1723
1850
  "scene-presentation-transform-unsupported",
1724
1851
  "A transformed or translucent body needs a viewport presentation transform.",
@@ -1726,8 +1853,9 @@ class NativeShaderRuntime {
1726
1853
  const viewport =
1727
1854
  this.compositionPixelRatio === null &&
1728
1855
  this.exportInitialPixelRatio === null
1729
- ? this.previewViewport
1856
+ ? (this.previewAllocationViewport ?? this.previewViewport)
1730
1857
  : null;
1858
+ const stableAllocation = !!viewport && this.usesStablePreviewAllocation();
1731
1859
  const requestedRatio =
1732
1860
  this.compositionPixelRatio ?? this.scenePreviewPixelRatio();
1733
1861
  const dpr =
@@ -1745,7 +1873,9 @@ class NativeShaderRuntime {
1745
1873
  pixelPadding: 1,
1746
1874
  });
1747
1875
  const physical = viewport
1748
- ? nativePreviewPhysicalViewport(viewport, dpr)
1876
+ ? stableAllocation
1877
+ ? nativePreviewStablePhysicalViewport(viewport, dpr)
1878
+ : nativePreviewPhysicalViewport(viewport, dpr)
1749
1879
  : {
1750
1880
  x: 0,
1751
1881
  y: 0,
@@ -1754,12 +1884,14 @@ class NativeShaderRuntime {
1754
1884
  };
1755
1885
  const { width, height } = physical;
1756
1886
  const sceneViewport = viewport
1757
- ? {
1758
- x: physical.x / dpr,
1759
- y: physical.y / dpr,
1760
- width: width / dpr,
1761
- height: height / dpr,
1762
- }
1887
+ ? stableAllocation
1888
+ ? viewport
1889
+ : {
1890
+ x: physical.x / dpr,
1891
+ y: physical.y / dpr,
1892
+ width: width / dpr,
1893
+ height: height / dpr,
1894
+ }
1763
1895
  : undefined;
1764
1896
  if (
1765
1897
  width <= 0 ||
@@ -1798,7 +1930,7 @@ class NativeShaderRuntime {
1798
1930
  canvas.style.height = `${sceneViewport?.height ?? innerHeight}px`;
1799
1931
  canvas.width = width;
1800
1932
  canvas.height = height;
1801
- body.prepend(canvas);
1933
+ attachNativeScenePresentationCanvas(canvas, body, bodyStyle);
1802
1934
  const context = canvas.getContext("webgpu") as GPUCanvasContext | null;
1803
1935
  if (!context) {
1804
1936
  canvas.remove();
@@ -1895,6 +2027,7 @@ class NativeShaderRuntime {
1895
2027
  window.addEventListener("scroll", scene.onViewportChange, true);
1896
2028
  window.addEventListener("resize", scene.onViewportChange);
1897
2029
  }
2030
+ attachNativeScenePresentationCanvas(scene.canvas, body, bodyStyle);
1898
2031
  const viewportMatches = (): boolean =>
1899
2032
  window.scrollX === 0 &&
1900
2033
  window.scrollY === 0 &&
@@ -2829,6 +2962,180 @@ class NativeShaderRuntime {
2829
2962
  return reservation.sample;
2830
2963
  }
2831
2964
 
2965
+ private requestOpaquePreviewViewport(): void {
2966
+ if (window.parent === window || window.frameElement) return;
2967
+ const origin = nativeDocumentOrigin();
2968
+ const width = window.innerWidth;
2969
+ const height = window.innerHeight;
2970
+ const prior = this.opaquePreviewViewportRequest;
2971
+ if (
2972
+ prior &&
2973
+ prior.width === width &&
2974
+ prior.height === height &&
2975
+ this.opaquePreviewViewportNonce
2976
+ ) {
2977
+ if (!this.opaquePreviewViewportExhausted)
2978
+ this.scheduleOpaquePreviewViewportRetry();
2979
+ return;
2980
+ }
2981
+ const nonce = this.opaquePreviewViewportNonce ?? window.crypto.randomUUID();
2982
+ const request: NativePreviewViewportRequest = {
2983
+ type: NATIVE_PREVIEW_VIEWPORT_REQUEST_MESSAGE,
2984
+ schemaVersion: 1,
2985
+ nonce,
2986
+ width,
2987
+ height,
2988
+ };
2989
+ this.opaquePreviewViewportNonce = nonce;
2990
+ this.opaquePreviewViewportRequest = request;
2991
+ this.opaquePreviewViewportReceived = false;
2992
+ this.opaquePreviewViewportRetries = 0;
2993
+ this.opaquePreviewViewportExhausted = false;
2994
+ if (this.opaquePreviewViewportTimer)
2995
+ clearTimeout(this.opaquePreviewViewportTimer);
2996
+ this.opaquePreviewViewportTimer = null;
2997
+ this.sendOpaquePreviewViewportRequest(request, origin);
2998
+ this.scheduleOpaquePreviewViewportRetry();
2999
+ }
3000
+
3001
+ private sendOpaquePreviewViewportRequest(
3002
+ request: NativePreviewViewportRequest,
3003
+ origin: string,
3004
+ ): void {
3005
+ this.opaquePreviewViewportPort?.close();
3006
+ const channel = new MessageChannel();
3007
+ this.opaquePreviewViewportPort = channel.port1;
3008
+ channel.port1.onmessage = (event: MessageEvent<unknown>) => {
3009
+ const candidate = {
3010
+ nonce: this.opaquePreviewViewportNonce,
3011
+ response: event.data,
3012
+ };
3013
+ if (!isTrustedOpaquePreviewViewportPortResponse(candidate)) return;
3014
+ this.acceptOpaquePreviewViewport(candidate.response);
3015
+ };
3016
+ channel.port1.start();
3017
+ window.parent.postMessage(request, origin, [channel.port2]);
3018
+ }
3019
+
3020
+ private scheduleOpaquePreviewViewportRetry(): void {
3021
+ const request = this.opaquePreviewViewportRequest;
3022
+ if (
3023
+ this.opaquePreviewViewportReceived ||
3024
+ this.opaquePreviewViewportExhausted ||
3025
+ this.opaquePreviewViewportTimer ||
3026
+ !request
3027
+ )
3028
+ return;
3029
+ this.opaquePreviewViewportTimer = setTimeout(() => {
3030
+ this.opaquePreviewViewportTimer = null;
3031
+ if (this.disposed || this.opaquePreviewViewportReceived) return;
3032
+ if (this.opaquePreviewViewportRetries < 3) {
3033
+ this.opaquePreviewViewportRetries += 1;
3034
+ try {
3035
+ this.sendOpaquePreviewViewportRequest(
3036
+ request,
3037
+ nativeDocumentOrigin(),
3038
+ );
3039
+ } catch (error) {
3040
+ this.issue("source-origin-unavailable", String(error));
3041
+ return;
3042
+ }
3043
+ this.scheduleOpaquePreviewViewportRetry();
3044
+ return;
3045
+ }
3046
+ const error = new NativeSourceError(
3047
+ "preview-viewport-unreadable",
3048
+ "The editor preview host did not provide viewport geometry.",
3049
+ );
3050
+ this.opaquePreviewViewportExhausted = true;
3051
+ this.issue(error.code, error.message);
3052
+ document.documentElement.setAttribute(
3053
+ "data-an-native-runtime-error",
3054
+ error.code,
3055
+ );
3056
+ }, 500);
3057
+ }
3058
+
3059
+ private acceptOpaquePreviewViewport(
3060
+ response: NativePreviewViewportResponse,
3061
+ ): void {
3062
+ if (
3063
+ window.frameElement ||
3064
+ window.parent === window ||
3065
+ response.nonce !== this.opaquePreviewViewportNonce ||
3066
+ response.width !== window.innerWidth ||
3067
+ response.height !== window.innerHeight
3068
+ )
3069
+ return;
3070
+ const wasReceived = this.opaquePreviewViewportReceived;
3071
+ this.opaquePreviewViewportReceived = true;
3072
+ if (this.opaquePreviewViewportTimer) {
3073
+ clearTimeout(this.opaquePreviewViewportTimer);
3074
+ this.opaquePreviewViewportTimer = null;
3075
+ }
3076
+ this.opaquePreviewViewportRetries = 0;
3077
+ this.opaquePreviewViewportExhausted = false;
3078
+ if (response.error) {
3079
+ this.issue(response.error.code, response.error.message);
3080
+ document.documentElement.setAttribute(
3081
+ "data-an-native-runtime-error",
3082
+ response.error.code,
3083
+ );
3084
+ return;
3085
+ }
3086
+ const previousViewport = this.previewViewport;
3087
+ const previousAllocationViewport = this.previewAllocationViewport;
3088
+ const previousMaxViewportWidth = this.previewMaxViewportWidth;
3089
+ const previousMaxViewportHeight = this.previewMaxViewportHeight;
3090
+ const previousScale = this.previewDisplayScale;
3091
+ const previousHostPixelRatio = this.opaquePreviewHostPixelRatio;
3092
+ this.opaquePreviewHostPixelRatio = response.hostDevicePixelRatio ?? null;
3093
+ const scale = response.displayScale;
3094
+ if (
3095
+ previousHostPixelRatio !== this.opaquePreviewHostPixelRatio ||
3096
+ Math.abs(scale - this.previewDisplayScale) > 0.0001 * Math.max(1, scale)
3097
+ ) {
3098
+ this.previewPolicy.resetDensityBudget();
3099
+ this.sceneBudgetFault = null;
3100
+ this.previewDisplayScale = scale;
3101
+ }
3102
+ this.previewViewport = response.viewport;
3103
+ this.previewMaxViewportWidth = response.maxViewportWidth;
3104
+ this.previewMaxViewportHeight = response.maxViewportHeight;
3105
+ this.previewAllocationViewport = this.planPreviewAllocationViewport(
3106
+ MAX_LEGACY_PREVIEW_PIXELS,
3107
+ );
3108
+ if (
3109
+ document.documentElement.getAttribute("data-an-native-runtime-error") ===
3110
+ "preview-viewport-unreadable"
3111
+ )
3112
+ document.documentElement.removeAttribute("data-an-native-runtime-error");
3113
+ const sameViewport =
3114
+ previousViewport === response.viewport ||
3115
+ (previousViewport !== null &&
3116
+ response.viewport !== null &&
3117
+ previousViewport.x === response.viewport.x &&
3118
+ previousViewport.y === response.viewport.y &&
3119
+ previousViewport.width === response.viewport.width &&
3120
+ previousViewport.height === response.viewport.height);
3121
+ if (
3122
+ wasReceived &&
3123
+ previousScale === this.previewDisplayScale &&
3124
+ previousHostPixelRatio === this.opaquePreviewHostPixelRatio &&
3125
+ sameViewport &&
3126
+ previousMaxViewportWidth === this.previewMaxViewportWidth &&
3127
+ previousMaxViewportHeight === this.previewMaxViewportHeight &&
3128
+ this.samePreviewBox(
3129
+ previousAllocationViewport,
3130
+ this.previewAllocationViewport,
3131
+ )
3132
+ )
3133
+ return;
3134
+ this.previewHostGeneration += 1;
3135
+ if (this.workerScene) this.onPreviewHostChange();
3136
+ else this.requestSourceFrame();
3137
+ }
3138
+
2832
3139
  private refreshPreviewViewport(): boolean {
2833
3140
  if (
2834
3141
  this.exportInitialPixelRatio !== null ||
@@ -2838,12 +3145,16 @@ class NativeShaderRuntime {
2838
3145
  try {
2839
3146
  const frame = window.frameElement;
2840
3147
  if (!frame) {
2841
- if (window.parent !== window)
2842
- throw new NativeSourceError(
2843
- "preview-viewport-unreadable",
2844
- "The editor preview frame is inaccessible.",
3148
+ if (window.parent !== window) {
3149
+ this.requestOpaquePreviewViewport();
3150
+ return (
3151
+ this.opaquePreviewViewportReceived && this.previewViewport !== null
2845
3152
  );
3153
+ }
2846
3154
  this.previewViewport = null;
3155
+ this.previewAllocationViewport = null;
3156
+ this.previewMaxViewportWidth = null;
3157
+ this.previewMaxViewportHeight = null;
2847
3158
  this.previewDisplayScale = 1;
2848
3159
  return true;
2849
3160
  }
@@ -2909,6 +3220,11 @@ class NativeShaderRuntime {
2909
3220
  this.previewDisplayScale = scale;
2910
3221
  }
2911
3222
  this.previewViewport = planned?.viewport ?? null;
3223
+ this.previewMaxViewportWidth = planned?.maxViewportWidth ?? null;
3224
+ this.previewMaxViewportHeight = planned?.maxViewportHeight ?? null;
3225
+ this.previewAllocationViewport = this.planPreviewAllocationViewport(
3226
+ MAX_LEGACY_PREVIEW_PIXELS,
3227
+ );
2912
3228
  return planned !== null;
2913
3229
  } catch (error) {
2914
3230
  if (error instanceof NativeSourceError) throw error;
@@ -2919,11 +3235,65 @@ class NativeShaderRuntime {
2919
3235
  }
2920
3236
  }
2921
3237
 
3238
+ private samePreviewBox(
3239
+ first: NativePreviewBox | null,
3240
+ second: NativePreviewBox | null,
3241
+ ): boolean {
3242
+ return (
3243
+ first === second ||
3244
+ (first !== null &&
3245
+ second !== null &&
3246
+ first.x === second.x &&
3247
+ first.y === second.y &&
3248
+ first.width === second.width &&
3249
+ first.height === second.height)
3250
+ );
3251
+ }
3252
+
3253
+ private planPreviewAllocationViewport(
3254
+ maxPixels: number,
3255
+ ): NativePreviewBox | null {
3256
+ const viewport = this.previewViewport;
3257
+ if (!viewport) return null;
3258
+ const maxViewportWidth = this.previewMaxViewportWidth;
3259
+ const maxViewportHeight = this.previewMaxViewportHeight;
3260
+ if (maxViewportWidth === null || maxViewportHeight === null)
3261
+ return viewport;
3262
+ return nativePreviewStableAllocationOrExactViewport({
3263
+ viewport,
3264
+ rootWidth: innerWidth,
3265
+ rootHeight: innerHeight,
3266
+ maxViewportWidth,
3267
+ maxViewportHeight,
3268
+ density: this.desiredScenePreviewPixelRatio(),
3269
+ maxDimension: MAX_DIMENSION,
3270
+ maxPixels,
3271
+ pixelPadding: 1,
3272
+ });
3273
+ }
3274
+
3275
+ private usesStablePreviewAllocation(): boolean {
3276
+ const raw = this.previewViewport;
3277
+ const allocation = this.previewAllocationViewport;
3278
+ return (
3279
+ raw !== null &&
3280
+ allocation !== null &&
3281
+ (allocation.width > raw.width + 0.0001 ||
3282
+ allocation.height > raw.height + 0.0001)
3283
+ );
3284
+ }
3285
+
2922
3286
  private observePreviewHost(): void {
2923
3287
  if (this.exportInitialPixelRatio !== null) return;
2924
3288
  document.addEventListener("visibilitychange", this.onPreviewHostChange);
2925
3289
  const frame = window.frameElement;
2926
- if (!frame) return;
3290
+ if (!frame) {
3291
+ if (window.parent !== window) {
3292
+ window.addEventListener("resize", this.onPreviewHostChange);
3293
+ this.requestOpaquePreviewViewport();
3294
+ }
3295
+ return;
3296
+ }
2927
3297
  this.previewHostObserver?.disconnect();
2928
3298
  this.previewHostResizeObserver?.disconnect();
2929
3299
  this.previewHostParent?.removeEventListener(
@@ -2956,6 +3326,15 @@ class NativeShaderRuntime {
2956
3326
 
2957
3327
  private onPreviewHostChange = (): void => {
2958
3328
  if (this.disposed) return;
3329
+ try {
3330
+ this.requestOpaquePreviewViewport();
3331
+ } catch (error) {
3332
+ this.issue(
3333
+ "source-origin-unavailable",
3334
+ error instanceof Error ? error.message : String(error),
3335
+ );
3336
+ return;
3337
+ }
2959
3338
  if (!this.workerScene) {
2960
3339
  this.previewHostGeneration += 1;
2961
3340
  this.requestSourceFrame();
@@ -2967,7 +3346,9 @@ class NativeShaderRuntime {
2967
3346
  }
2968
3347
  if (this.previewHostFramePending) return;
2969
3348
  this.previewHostFramePending = true;
2970
- this.previewHostFrame = window.parent.requestAnimationFrame(() => {
3349
+ const rafHost = window.frameElement ? window.parent : window;
3350
+ this.previewHostRafHost = rafHost;
3351
+ this.previewHostFrame = rafHost.requestAnimationFrame(() => {
2971
3352
  this.previewHostFramePending = false;
2972
3353
  this.previewHostFrame = 0;
2973
3354
  const scene = this.workerScene;
@@ -3001,9 +3382,13 @@ class NativeShaderRuntime {
3001
3382
  });
3002
3383
  };
3003
3384
 
3385
+ private previewDevicePixelRatio(): number {
3386
+ return this.opaquePreviewHostPixelRatio ?? (devicePixelRatio || 1);
3387
+ }
3388
+
3004
3389
  previewStatus = (): NativePreviewStatus => {
3005
3390
  const status = this.previewPolicy.status(
3006
- devicePixelRatio || 1,
3391
+ this.previewDevicePixelRatio(),
3007
3392
  this.renderWallSamples[this.renderWallSamples.length - 1],
3008
3393
  this.rafIntervalSamples[this.rafIntervalSamples.length - 1],
3009
3394
  );
@@ -3472,6 +3857,7 @@ class NativeShaderRuntime {
3472
3857
  }
3473
3858
 
3474
3859
  private clearDeviceResources(code: string, message: string): void {
3860
+ this.releaseMeshGrids();
3475
3861
  this.previewTargetDensities.clear();
3476
3862
  this.previewBudgetDensities.clear();
3477
3863
  this.previewBudgetSignature = "";
@@ -3814,6 +4200,48 @@ class NativeShaderRuntime {
3814
4200
  return texture;
3815
4201
  }
3816
4202
 
4203
+ private meshDepth(
4204
+ mount: Mount,
4205
+ key: string,
4206
+ width: number,
4207
+ height: number,
4208
+ ): GPUTexture {
4209
+ const previous = mount.resourceTextures.get(key);
4210
+ if (previous && previous.width === width && previous.height === height)
4211
+ return previous;
4212
+ mount.resourceTextures.delete(key);
4213
+ this.destroyTexture(previous);
4214
+ const bytes = width * height * 4;
4215
+ this.ensureTextureBudget(bytes);
4216
+ const texture = this.device!.createTexture({
4217
+ size: [width, height],
4218
+ format: "depth24plus",
4219
+ usage: GPUTextureUsage.RENDER_ATTACHMENT,
4220
+ });
4221
+ this.textureBytes.set(texture, bytes);
4222
+ this.allocatedTextureBytes += bytes;
4223
+ mount.resourceTextures.set(key, texture);
4224
+ return texture;
4225
+ }
4226
+
4227
+ private meshGrid(mesh: EffectMeshSpec): NativeMeshGridLease {
4228
+ const key = `${mesh.columns}x${mesh.rows}`;
4229
+ const existing = this.meshGrids.get(key);
4230
+ if (existing) return existing;
4231
+ const bytes = nativeMeshGridBytes(mesh);
4232
+ this.ensureTextureBudget(bytes);
4233
+ const lease = acquireNativeMeshGrid(this.device!, mesh);
4234
+ this.meshGrids.set(key, lease);
4235
+ this.allocatedMeshBytes += bytes;
4236
+ return lease;
4237
+ }
4238
+
4239
+ private releaseMeshGrids(): void {
4240
+ for (const lease of this.meshGrids.values()) lease.release();
4241
+ this.meshGrids.clear();
4242
+ this.allocatedMeshBytes = 0;
4243
+ }
4244
+
3817
4245
  private destroyTexture(texture: GPUTexture | null | undefined): void {
3818
4246
  if (!texture || this.destroyedTextures.has(texture)) return;
3819
4247
  if (this.statelessTextureLeases.has(texture)) {
@@ -4049,7 +4477,7 @@ class NativeShaderRuntime {
4049
4477
 
4050
4478
  private offscreen(mount: Mount): boolean {
4051
4479
  const rect = mount.target.getBoundingClientRect();
4052
- const dpr = mount.pixelRatio || Math.min(devicePixelRatio || 1, 2);
4480
+ const dpr = mount.pixelRatio || Math.min(this.previewDevicePixelRatio(), 2);
4053
4481
  const halo = mount.outputExtent;
4054
4482
  const margins = {
4055
4483
  left: Math.max(
@@ -4194,6 +4622,7 @@ class NativeShaderRuntime {
4194
4622
  canvasBytes += surface.canvas.width * surface.canvas.height * 8;
4195
4623
  return (
4196
4624
  this.allocatedTextureBytes +
4625
+ this.allocatedMeshBytes +
4197
4626
  this.allocatedUniformBytes +
4198
4627
  this.allocatedSimulationBytes +
4199
4628
  this.allocatedStatelessBytes +
@@ -5127,7 +5556,7 @@ class NativeShaderRuntime {
5127
5556
  typeof HTMLCanvasElement.prototype.transferControlToOffscreen ===
5128
5557
  "function" &&
5129
5558
  workerEntries.every(
5130
- ({ definition }) =>
5559
+ ({ definition, instance, target }) =>
5131
5560
  !definition.simulation &&
5132
5561
  !definition.feedback &&
5133
5562
  !definition.statelessCompute &&
@@ -5136,6 +5565,10 @@ class NativeShaderRuntime {
5136
5565
  definition.passes.every(
5137
5566
  (pass) =>
5138
5567
  pass.kind === "render" && !pass.previousFrameReads?.length,
5568
+ ) &&
5569
+ nativeWorkerSupportsInputResources(
5570
+ planNativeInputResources(definition, instance),
5571
+ isNativeSvgRoot(target),
5139
5572
  ),
5140
5573
  );
5141
5574
  if (workerCapable) {
@@ -5153,11 +5586,15 @@ class NativeShaderRuntime {
5153
5586
  this.workerScene ??= new NativeWorkerSceneHost(
5154
5587
  nativeWorkerSource,
5155
5588
  `${this.epoch}:${createNativeRuntimeEpoch()}`,
5156
- () => ({
5157
- playing: this.playing,
5158
- timeSeconds: this.currentTime(),
5159
- speed: 1,
5160
- }),
5589
+ () => {
5590
+ const sampledAtMs = performance.now();
5591
+ return {
5592
+ playing: this.playing,
5593
+ timeSeconds: this.currentTime(sampledAtMs),
5594
+ speed: 1,
5595
+ sampledAtEpochMs: performance.timeOrigin + sampledAtMs,
5596
+ };
5597
+ },
5161
5598
  (_publication, message) => {
5162
5599
  this.workerRecoveryAttempts = 0;
5163
5600
  if (this.retiringWorkerScene) {
@@ -5174,17 +5611,18 @@ class NativeShaderRuntime {
5174
5611
  if (this.scenePresentation) this.releaseScenePresentation();
5175
5612
  this.workerScene?.setEntries(this.workerEntries);
5176
5613
  }
5177
- for (const committed of message.committedInstances) {
5178
- const entry = this.workerEntries.find(
5179
- (candidate) => candidate.instance.id === committed.instanceId,
5180
- );
5181
- if (entry)
5182
- this.postStatus(
5183
- entry.instance.id,
5184
- entry.instance.nodeId,
5185
- "ready",
5614
+ if (message.contentChanged)
5615
+ for (const committed of message.committedInstances) {
5616
+ const entry = this.workerEntries.find(
5617
+ (candidate) => candidate.instance.id === committed.instanceId,
5186
5618
  );
5187
- }
5619
+ if (entry)
5620
+ this.postStatus(
5621
+ entry.instance.id,
5622
+ entry.instance.nodeId,
5623
+ "ready",
5624
+ );
5625
+ }
5188
5626
  },
5189
5627
  (error) => {
5190
5628
  const code =
@@ -5253,15 +5691,21 @@ class NativeShaderRuntime {
5253
5691
  () => {
5254
5692
  this.refreshPreviewViewport();
5255
5693
  return {
5256
- viewport: this.previewViewport ?? {
5257
- x: 0,
5258
- y: 0,
5259
- width: innerWidth,
5260
- height: innerHeight,
5261
- },
5694
+ viewport: this.planPreviewAllocationViewport(MAX_PIXELS) ??
5695
+ this.previewViewport ?? {
5696
+ x: 0,
5697
+ y: 0,
5698
+ width: innerWidth,
5699
+ height: innerHeight,
5700
+ },
5262
5701
  pixelRatio: this.desiredScenePreviewPixelRatio(),
5263
5702
  };
5264
5703
  },
5704
+ () => ({
5705
+ frameRateTarget: this.previewStatus().frameRateTarget,
5706
+ compact: this.previewPolicy.isOverviewCompact(),
5707
+ }),
5708
+ () => this.clockOrigin,
5265
5709
  );
5266
5710
  this.workerScene.setVisible(
5267
5711
  document.visibilityState !== "hidden" &&
@@ -5528,7 +5972,7 @@ class NativeShaderRuntime {
5528
5972
  ): boolean {
5529
5973
  for (
5530
5974
  let sibling = target.nextElementSibling;
5531
- sibling instanceof HTMLCanvasElement;
5975
+ isNativeHtmlTag(sibling, "canvas");
5532
5976
  sibling = sibling.nextElementSibling
5533
5977
  ) {
5534
5978
  if (sibling === canvas) return true;
@@ -5566,7 +6010,7 @@ class NativeShaderRuntime {
5566
6010
  let insertionPoint: Element = target;
5567
6011
  if (instance.placement === "backdrop")
5568
6012
  while (
5569
- insertionPoint.nextElementSibling instanceof HTMLCanvasElement &&
6013
+ isNativeHtmlTag(insertionPoint.nextElementSibling, "canvas") &&
5570
6014
  insertionPoint.nextElementSibling !== canvas &&
5571
6015
  insertionPoint.nextElementSibling.hasAttribute(
5572
6016
  "data-an-native-backdrop-presentation",
@@ -6319,7 +6763,7 @@ class NativeShaderRuntime {
6319
6763
  return false;
6320
6764
  }
6321
6765
  const baseDensity = this.previewPolicy.status(
6322
- devicePixelRatio || 1,
6766
+ this.previewDevicePixelRatio(),
6323
6767
  ).effectivePixelRatio;
6324
6768
  const desiredDensity = this.desiredScenePreviewPixelRatio();
6325
6769
  const groups = new Map<NativeScenePresentationElement, Mount[]>();
@@ -6403,23 +6847,26 @@ class NativeShaderRuntime {
6403
6847
  ),
6404
6848
  };
6405
6849
  });
6406
- const viewport = this.previewViewport ?? {
6407
- x: 0,
6408
- y: 0,
6409
- width: innerWidth,
6410
- height: innerHeight,
6411
- };
6850
+ const allocationViewport = this.previewAllocationViewport ??
6851
+ this.previewViewport ?? {
6852
+ x: 0,
6853
+ y: 0,
6854
+ width: innerWidth,
6855
+ height: innerHeight,
6856
+ };
6412
6857
  const sceneDensity = this.previewViewport
6413
6858
  ? fitNativeRasterDensity({
6414
- width: viewport.width,
6415
- height: viewport.height,
6859
+ width: allocationViewport.width,
6860
+ height: allocationViewport.height,
6416
6861
  density: desiredDensity,
6417
6862
  maxDimension: MAX_DIMENSION,
6418
6863
  maxPixels: Math.min(MAX_PIXELS, Math.floor(MAX_RESOURCE_BYTES / 40)),
6419
6864
  pixelPadding: 1,
6420
6865
  })
6421
6866
  : desiredDensity;
6422
- const visible = nativePreviewPhysicalViewport(viewport, sceneDensity);
6867
+ const sceneAllocation = this.usesStablePreviewAllocation()
6868
+ ? nativePreviewStablePhysicalViewport(allocationViewport, sceneDensity)
6869
+ : nativePreviewPhysicalViewport(allocationViewport, sceneDensity);
6423
6870
  const scene = this.scenePresentation;
6424
6871
  const hasCommittedScene =
6425
6872
  scene !== null &&
@@ -6434,7 +6881,8 @@ class NativeShaderRuntime {
6434
6881
  );
6435
6882
  const sceneBudgetSignature = JSON.stringify({
6436
6883
  requests,
6437
- viewport,
6884
+ viewport: allocationViewport,
6885
+ visibleViewport: this.previewViewport,
6438
6886
  sceneDensity,
6439
6887
  needsScene,
6440
6888
  fixedBytes,
@@ -6454,8 +6902,8 @@ class NativeShaderRuntime {
6454
6902
  const sceneRequest = needsScene
6455
6903
  ? {
6456
6904
  id: sceneRequestId,
6457
- width: viewport.width,
6458
- height: viewport.height,
6905
+ width: allocationViewport.width,
6906
+ height: allocationViewport.height,
6459
6907
  baseDensity: Math.min(desiredSceneDensity, 0.5),
6460
6908
  desiredDensity: desiredSceneDensity,
6461
6909
  bytesPerPixel: 40,
@@ -6475,7 +6923,7 @@ class NativeShaderRuntime {
6475
6923
  for (const entry of scene!.surface.sourceTextures.values())
6476
6924
  retainedSceneTextures.add(entry.texture);
6477
6925
  const replacement = nativePreviewPhysicalViewport(
6478
- viewport,
6926
+ allocationViewport,
6479
6927
  desiredSceneDensity,
6480
6928
  );
6481
6929
  for (const [key, entry] of scene!.surface.isolationTextures)
@@ -6506,7 +6954,7 @@ class NativeShaderRuntime {
6506
6954
  : 0;
6507
6955
  const reservedBytes =
6508
6956
  retainedSceneBytes +
6509
- Math.min(MAX_PIXELS, visible.width * visible.height) * 8 +
6957
+ Math.min(MAX_PIXELS, sceneAllocation.width * sceneAllocation.height) * 8 +
6510
6958
  33_554_432 +
6511
6959
  fixedBytes;
6512
6960
  const availableBytes = MAX_REALM_TEXTURE_BYTES - reservedBytes;
@@ -6630,7 +7078,7 @@ class NativeShaderRuntime {
6630
7078
  ...Object.values(outputInsets),
6631
7079
  ) * localScale;
6632
7080
  requestedRatio = nativePreviewTargetDensity({
6633
- baseDensity: this.previewPolicy.status(devicePixelRatio || 1)
7081
+ baseDensity: this.previewPolicy.status(this.previewDevicePixelRatio())
6634
7082
  .effectivePixelRatio,
6635
7083
  displayScale: this.targetPreviewDisplayScale(targetMembers, localScale),
6636
7084
  viewport: this.previewViewport,
@@ -6695,7 +7143,6 @@ class NativeShaderRuntime {
6695
7143
  mount.instance.placement === "fill" && mount.isTopLayer
6696
7144
  ? (mount.fillPresentationExtent ?? planned.plan)
6697
7145
  : planned.plan;
6698
- const { left, top } = presentationExtent;
6699
7146
  mount.pixelRatio = dpr;
6700
7147
  mount.outputExtent = planned.plan;
6701
7148
  mount.captureInsets = captureInsets;
@@ -6727,44 +7174,11 @@ class NativeShaderRuntime {
6727
7174
  );
6728
7175
  }
6729
7176
  }
6730
- const geometry = planNativeOutputGeometry({
6731
- offsetLeft: targetLayout.offsetLeft,
6732
- offsetTop: targetLayout.offsetTop,
6733
- width: targetLayout.width,
6734
- height: targetLayout.height,
6735
- extent: presentationExtent,
6736
- transformOrigin: targetLayout.transformOrigin,
6737
- });
6738
- if (presentationExtent.expanded && !geometry)
7177
+ if (!this.projectPresentationGeometry(mount, presentationExtent, dpr))
6739
7178
  throw new NativeSourceError(
6740
7179
  "effect-output-transform-unsupported",
6741
7180
  "Expanded output has an unsupported transform origin.",
6742
7181
  );
6743
- mount.canvas.style.left = `${geometry?.left ?? targetLayout.offsetLeft - left / dpr}px`;
6744
- mount.canvas.style.top = `${geometry?.top ?? targetLayout.offsetTop - top / dpr}px`;
6745
- mount.canvas.style.width = `${geometry?.width ?? targetLayout.width + (left + presentationExtent.right) / dpr}px`;
6746
- mount.canvas.style.height = `${geometry?.height ?? targetLayout.height + (top + presentationExtent.bottom) / dpr}px`;
6747
- mount.canvas.style.transform = targetLayout.transform;
6748
- mount.canvas.style.translate = targetLayout.translate;
6749
- mount.canvas.style.rotate = targetLayout.rotate;
6750
- mount.canvas.style.scale = targetLayout.scale;
6751
- mount.canvas.style.transformOrigin =
6752
- geometry?.transformOrigin ?? targetLayout.transformOrigin;
6753
- mount.canvas.style.borderRadius =
6754
- mount.instance.placement === "fill" || presentationExtent.expanded
6755
- ? "0"
6756
- : style.borderRadius;
6757
- if (mount.instance.placement === "fill")
6758
- mount.canvas.style.opacity =
6759
- mount.target.getAttribute("data-an-native-authored-opacity") ??
6760
- style.opacity;
6761
- else if (mount.instance.placement === "layer")
6762
- mount.canvas.style.opacity = mount.layerSourceOpacityDeferred
6763
- ? (mount.target.getAttribute("data-an-native-authored-opacity") ??
6764
- style.opacity)
6765
- : "";
6766
- mount.canvas.style.zIndex =
6767
- style.zIndex === "auto" ? "auto" : style.zIndex;
6768
7182
  }
6769
7183
  this.syncSceneSourceOpacity(mount);
6770
7184
  if (mount.width !== width || mount.height !== height) {
@@ -6837,6 +7251,7 @@ class NativeShaderRuntime {
6837
7251
  effect = false,
6838
7252
  effectTextureCount = 2,
6839
7253
  placement?: EffectInstance["placement"],
7254
+ mesh = false,
6840
7255
  ): Promise<GPURenderPipeline> {
6841
7256
  const device = await this.ensureDevice();
6842
7257
  const deviceEpoch = this.deviceEpoch;
@@ -6855,7 +7270,7 @@ class NativeShaderRuntime {
6855
7270
  );
6856
7271
  }
6857
7272
  const constants = nativeRenderPlacementConstants(wgsl, placement);
6858
- const key = `${deviceEpoch}:${format}:${blend}:${effect}:${textureCount}:${JSON.stringify(constants)}:${wgsl}`;
7273
+ const key = `${deviceEpoch}:${format}:${blend}:${effect}:${textureCount}:${mesh}:${JSON.stringify(constants)}:${wgsl}`;
6859
7274
  if (!this.pipelines.has(key)) this.ensureTextureBudget(524_288);
6860
7275
  return this.pipelines.getOrCreate(key, async () => {
6861
7276
  const module = device.createShaderModule({ code: wgsl });
@@ -6945,6 +7360,15 @@ class NativeShaderRuntime {
6945
7360
  ],
6946
7361
  },
6947
7362
  primitive: { topology: "triangle-list" },
7363
+ ...(mesh
7364
+ ? {
7365
+ depthStencil: {
7366
+ format: "depth24plus" as const,
7367
+ depthWriteEnabled: true,
7368
+ depthCompare: "less" as const,
7369
+ },
7370
+ }
7371
+ : {}),
6948
7372
  });
6949
7373
  if (this.device !== device || this.deviceEpoch !== deviceEpoch)
6950
7374
  throw new NativeSourceError(
@@ -6987,7 +7411,7 @@ class NativeShaderRuntime {
6987
7411
  "uniform-owner-unavailable",
6988
7412
  "The packed draw has no frame-owned render state.",
6989
7413
  );
6990
- const drawKey = `${owner}:${key}`;
7414
+ const drawKey = `${owner}:${key}:uniform${bytes.byteLength}`;
6991
7415
  const occurrence = packed.occurrences.get(drawKey) ?? 0;
6992
7416
  packed.occurrences.set(drawKey, occurrence + 1);
6993
7417
  key = `${key}:${occurrence}`;
@@ -7214,7 +7638,7 @@ class NativeShaderRuntime {
7214
7638
  [uploadWidth, uploadHeight],
7215
7639
  );
7216
7640
  } catch (directError) {
7217
- if (scale >= 1 && !(record.source instanceof HTMLImageElement)) {
7641
+ if (scale >= 1 && !isNativeHtmlTag(record.source, "img")) {
7218
7642
  throw new NativeSourceError(
7219
7643
  "source-gpu-upload",
7220
7644
  `A ${record.kind} source could not be uploaded to WebGPU: ${String(directError)}`,
@@ -7344,6 +7768,15 @@ class NativeShaderRuntime {
7344
7768
  }
7345
7769
 
7346
7770
  private async fetchInputBlob(url: URL, signal: AbortSignal): Promise<Blob> {
7771
+ if (isOpaquePublicAssetPreview()) {
7772
+ const blob = await resolveOpaquePublicAssetBlob(url.href);
7773
+ if (signal.aborted)
7774
+ throw new NativeSourceError(
7775
+ "input-asset-aborted",
7776
+ "The input asset load was cancelled.",
7777
+ );
7778
+ return blob;
7779
+ }
7347
7780
  const response = await fetch(url.href, {
7348
7781
  credentials: "same-origin",
7349
7782
  mode: "same-origin",
@@ -9074,7 +9507,9 @@ class NativeShaderRuntime {
9074
9507
  };
9075
9508
  }
9076
9509
  const uniform = (stepTime: number): GPUBuffer => {
9077
- const values = new Float32Array(136);
9510
+ const values = new Float32Array(
9511
+ 8 + nativeEffectUniformFloats(definition),
9512
+ );
9078
9513
  values.set(
9079
9514
  [mount.width, mount.height, 1 / mount.width, 1 / mount.height],
9080
9515
  0,
@@ -9313,7 +9748,9 @@ class NativeShaderRuntime {
9313
9748
  true,
9314
9749
  );
9315
9750
  assertSimulationDevice();
9316
- const trailData = new Float32Array(136);
9751
+ const trailData = new Float32Array(
9752
+ 8 + nativeEffectUniformFloats(definition),
9753
+ );
9317
9754
  trailData.set(
9318
9755
  [mount.width, mount.height, 1 / mount.width, 1 / mount.height],
9319
9756
  0,
@@ -9689,7 +10126,9 @@ class NativeShaderRuntime {
9689
10126
  return count;
9690
10127
  },
9691
10128
  uniforms: (_pass, _width, _height, stepTime, dt) => {
9692
- const data = new Float32Array(136);
10129
+ const data = new Float32Array(
10130
+ 8 + nativeEffectUniformFloats(definition),
10131
+ );
9693
10132
  data.set(
9694
10133
  [mount.width, mount.height, 1 / mount.width, 1 / mount.height],
9695
10134
  0,
@@ -10047,6 +10486,7 @@ class NativeShaderRuntime {
10047
10486
  device,
10048
10487
  compute.wgsl,
10049
10488
  resolve.wgsl,
10489
+ nativeEffectUniformFloats(definition),
10050
10490
  ),
10051
10491
  );
10052
10492
  if (
@@ -10082,10 +10522,14 @@ class NativeShaderRuntime {
10082
10522
  };
10083
10523
  this.ensureCompositionBudget(
10084
10524
  budgetSurface,
10085
- plan.byteLength + 544 + (replace ? mount.width * mount.height * 8 : 0),
10525
+ plan.byteLength +
10526
+ (8 + nativeEffectUniformFloats(definition)) * 4 +
10527
+ (replace ? mount.width * mount.height * 8 : 0),
10086
10528
  );
10087
10529
  this.ensureTextureBudget(
10088
- plan.byteLength + 544 + (replace ? mount.width * mount.height * 8 : 0),
10530
+ plan.byteLength +
10531
+ (8 + nativeEffectUniformFloats(definition)) * 4 +
10532
+ (replace ? mount.width * mount.height * 8 : 0),
10089
10533
  );
10090
10534
  if (replace) {
10091
10535
  const prior = output;
@@ -10094,7 +10538,7 @@ class NativeShaderRuntime {
10094
10538
  if (prior && prior !== source && prior !== mount.outputTexture)
10095
10539
  this.textureRetirement.push(prior);
10096
10540
  }
10097
- const data = new Float32Array(136);
10541
+ const data = new Float32Array(8 + nativeEffectUniformFloats(definition));
10098
10542
  data.set([mount.width, mount.height, 1 / mount.width, 1 / mount.height]);
10099
10543
  data.set(
10100
10544
  packNativeUniformClock({
@@ -10573,7 +11017,7 @@ class NativeShaderRuntime {
10573
11017
  scene.every(
10574
11018
  (record) =>
10575
11019
  record.kind === "image" &&
10576
- record.source instanceof HTMLImageElement &&
11020
+ isNativeHtmlTag(record.source, "img") &&
10577
11021
  !!record.imageSourceUrl &&
10578
11022
  (record.source.currentSrc || record.source.src) ===
10579
11023
  record.imageSourceUrl,
@@ -11061,7 +11505,9 @@ class NativeShaderRuntime {
11061
11505
  usedTextures.add(texture);
11062
11506
  }
11063
11507
  const pipeline = pipelines.get(pass.id)!;
11064
- const data = new Float32Array(136);
11508
+ const data = new Float32Array(
11509
+ 8 + nativeEffectUniformFloats(definition),
11510
+ );
11065
11511
  data.set([width, height, 1 / width, 1 / height], 0);
11066
11512
  data.set(
11067
11513
  packNativeUniformClock({
@@ -11460,10 +11906,12 @@ class NativeShaderRuntime {
11460
11906
  `The camera input is ${state}.`,
11461
11907
  );
11462
11908
  }
11463
- const width =
11464
- source instanceof HTMLVideoElement ? source.videoWidth : source.width;
11465
- const height =
11466
- source instanceof HTMLVideoElement ? source.videoHeight : source.height;
11909
+ const width = isNativeHtmlTag(source, "video")
11910
+ ? source.videoWidth
11911
+ : source.width;
11912
+ const height = isNativeHtmlTag(source, "video")
11913
+ ? source.videoHeight
11914
+ : source.height;
11467
11915
  if (
11468
11916
  !Number.isSafeInteger(width) ||
11469
11917
  !Number.isSafeInteger(height) ||
@@ -11720,7 +12168,7 @@ class NativeShaderRuntime {
11720
12168
  binding.kind === "builtin" && binding.source === "receiver-interior",
11721
12169
  );
11722
12170
  const svgInterior =
11723
- receiverInteriorRequested && mount.target instanceof SVGSVGElement;
12171
+ receiverInteriorRequested && isNativeSvgRoot(mount.target);
11724
12172
  const receiverGeometry =
11725
12173
  receiverGeometryRequested || svgInterior
11726
12174
  ? await this.receiverGeometryTextures(mount, svgInterior)
@@ -12168,7 +12616,10 @@ class NativeShaderRuntime {
12168
12616
  "resource-size-unsupported",
12169
12617
  `Render output ${pass.output} exceeds the supported texture bounds.`,
12170
12618
  );
12171
- resourceBytes += width * height * (format === "rgba16float" ? 8 : 4);
12619
+ resourceBytes +=
12620
+ width *
12621
+ height *
12622
+ ((format === "rgba16float" ? 8 : 4) + (pass.mesh ? 4 : 0));
12172
12623
  if (resourceBytes > MAX_RESOURCE_BYTES)
12173
12624
  throw new NativeSourceError(
12174
12625
  "resource-budget-exceeded",
@@ -12199,6 +12650,7 @@ class NativeShaderRuntime {
12199
12650
  true,
12200
12651
  pass.reads.length,
12201
12652
  instance.placement,
12653
+ pass.mesh !== undefined,
12202
12654
  );
12203
12655
  } catch (error) {
12204
12656
  if (error instanceof NativeShaderCompilationError)
@@ -12210,7 +12662,7 @@ class NativeShaderRuntime {
12210
12662
  );
12211
12663
  throw error;
12212
12664
  }
12213
- const data = new Float32Array(136);
12665
+ const data = new Float32Array(8 + nativeEffectUniformFloats(definition));
12214
12666
  data.set([width, height, 1 / width, 1 / height], 0);
12215
12667
  data.set(
12216
12668
  packNativeUniformClock({ time, seed: instance.seed, pixelRatio: dpr }),
@@ -12239,6 +12691,10 @@ class NativeShaderRuntime {
12239
12691
  null,
12240
12692
  otherInputs.slice(1),
12241
12693
  );
12694
+ const depth = pass.mesh
12695
+ ? this.meshDepth(mount, `__mesh_depth:${pass.id}`, width, height)
12696
+ : null;
12697
+ const grid = pass.mesh ? this.meshGrid(pass.mesh) : null;
12242
12698
  const render = encoder.beginRenderPass({
12243
12699
  ...this.gpuTimestampWrites(encoder, `effect:${pass.id}`),
12244
12700
  colorAttachments: [
@@ -12249,10 +12705,23 @@ class NativeShaderRuntime {
12249
12705
  clearValue: { r: 0, g: 0, b: 0, a: 0 },
12250
12706
  },
12251
12707
  ],
12708
+ ...(depth
12709
+ ? {
12710
+ depthStencilAttachment: {
12711
+ view: depth.createView(),
12712
+ depthLoadOp: "clear" as const,
12713
+ depthStoreOp: "discard" as const,
12714
+ depthClearValue: 1,
12715
+ },
12716
+ }
12717
+ : {}),
12252
12718
  });
12253
12719
  render.setPipeline(pipeline);
12254
12720
  render.setBindGroup(0, bind);
12255
- render.draw(3);
12721
+ if (grid) {
12722
+ render.setIndexBuffer(grid.buffer, "uint32");
12723
+ render.drawIndexed(grid.indexCount);
12724
+ } else render.draw(3);
12256
12725
  render.end();
12257
12726
  resources.set(pass.output, output);
12258
12727
  }
@@ -12267,7 +12736,7 @@ class NativeShaderRuntime {
12267
12736
 
12268
12737
  private async textMask(mount: Mount): Promise<GPUTexture> {
12269
12738
  if (mount.instance.clip !== "text") return this.white!;
12270
- if (!(mount.target instanceof HTMLElement))
12739
+ if (!isNativeHtmlElement(mount.target))
12271
12740
  throw new NativeSourceError(
12272
12741
  "source-inline-svg",
12273
12742
  "An SVG Fill uses vector paint coverage rather than a text mask.",
@@ -13330,7 +13799,7 @@ class NativeShaderRuntime {
13330
13799
  authoredSourceEpoch: number,
13331
13800
  ): Promise<GPUTexture> {
13332
13801
  const ancestor = parent.target;
13333
- if (!(ancestor instanceof HTMLElement))
13802
+ if (!isNativeHtmlElement(ancestor))
13334
13803
  throw new NativeSourceError(
13335
13804
  "source-inline-svg",
13336
13805
  "An SVG Fill cannot contain a nested HTML Backdrop.",
@@ -15928,8 +16397,8 @@ class NativeShaderRuntime {
15928
16397
  }
15929
16398
  }
15930
16399
 
15931
- private currentTime(): number {
15932
- return this.timeOverride ?? (performance.now() - this.clockOrigin) / 1000;
16400
+ private currentTime(nowMs = performance.now()): number {
16401
+ return this.timeOverride ?? (nowMs - this.clockOrigin) / 1000;
15933
16402
  }
15934
16403
 
15935
16404
  private closeStatelessFrameScope(
@@ -16016,7 +16485,7 @@ class NativeShaderRuntime {
16016
16485
  if (
16017
16486
  mount.instance.placement !== "fill" ||
16018
16487
  mount.instance.clip === "text" ||
16019
- !(mount.target instanceof HTMLElement) ||
16488
+ !isNativeHtmlElement(mount.target) ||
16020
16489
  !mount.provider ||
16021
16490
  !this.hasPresentationGeometry(mount.target) ||
16022
16491
  this.offscreen(mount) ||
@@ -16029,7 +16498,7 @@ class NativeShaderRuntime {
16029
16498
  style.boxShadow === "none" &&
16030
16499
  (style.outlineStyle === "none" || style.outlineWidth === "0px") &&
16031
16500
  [...mount.target.childNodes].every((node) =>
16032
- node instanceof Element
16501
+ isNativeElement(node)
16033
16502
  ? node.hasAttribute("data-an-native-canvas")
16034
16503
  : node.nodeType !== Node.TEXT_NODE || !node.textContent?.trim(),
16035
16504
  )
@@ -16056,8 +16525,8 @@ class NativeShaderRuntime {
16056
16525
  this.colorPresented,
16057
16526
  this.dynamicRangePresented,
16058
16527
  ]) !== family.presentationFormat ||
16059
- this.previewPolicy.status(devicePixelRatio || 1).effectivePixelRatio !==
16060
- family.density ||
16528
+ this.previewPolicy.status(this.previewDevicePixelRatio())
16529
+ .effectivePixelRatio !== family.density ||
16061
16530
  this.compositionPixelRatio !== null ||
16062
16531
  this.exportInitialPixelRatio !== null ||
16063
16532
  this.compositionAbort ||
@@ -16233,7 +16702,7 @@ class NativeShaderRuntime {
16233
16702
  deviceEpoch: epoch,
16234
16703
  hostGeneration: this.previewHostGeneration,
16235
16704
  viewport: JSON.stringify(this.previewViewport),
16236
- density: this.previewPolicy.status(devicePixelRatio || 1)
16705
+ density: this.previewPolicy.status(this.previewDevicePixelRatio())
16237
16706
  .effectivePixelRatio,
16238
16707
  presentationFormat: JSON.stringify([
16239
16708
  this.format,
@@ -21677,6 +22146,7 @@ class NativeShaderRuntime {
21677
22146
 
21678
22147
  private onMessage = (event: MessageEvent): void => {
21679
22148
  if (!event.data || typeof event.data !== "object") return;
22149
+ const data = event.data as Record<string, unknown>;
21680
22150
  if (event.source !== window) {
21681
22151
  if (event.source !== window.parent) return;
21682
22152
  let inheritedOrigin: string;
@@ -21688,7 +22158,6 @@ class NativeShaderRuntime {
21688
22158
  }
21689
22159
  if (event.origin !== inheritedOrigin) return;
21690
22160
  }
21691
- const data = event.data as Record<string, unknown>;
21692
22161
  if (data.type === "native-shader-editor-preview-policy") {
21693
22162
  if (window.parent === window || event.source !== window.parent) return;
21694
22163
  if (
@@ -22219,7 +22688,7 @@ class NativeShaderRuntime {
22219
22688
  return;
22220
22689
  }
22221
22690
  for (const record of authoredRecords) {
22222
- if (record.type !== "attributes" || !(record.target instanceof Element))
22691
+ if (record.type !== "attributes" || !isNativeElement(record.target))
22223
22692
  continue;
22224
22693
  for (const mount of this.mounts.values())
22225
22694
  if (
@@ -22306,7 +22775,7 @@ class NativeShaderRuntime {
22306
22775
  subtree: true,
22307
22776
  });
22308
22777
  const affectsEffects = (node: Node): boolean => {
22309
- if (!(node instanceof Element)) return false;
22778
+ if (!isNativeElement(node)) return false;
22310
22779
  return (
22311
22780
  node.matches(
22312
22781
  `script[type="${SCRIPT_TYPE}"],[data-agent-native-node-id]`,
@@ -22325,12 +22794,12 @@ class NativeShaderRuntime {
22325
22794
  );
22326
22795
  if (record.type === "attributes")
22327
22796
  return (
22328
- record.target instanceof Element &&
22329
- (record.target instanceof HTMLScriptElement ||
22797
+ isNativeElement(record.target) &&
22798
+ (isNativeHtmlTag(record.target, "script") ||
22330
22799
  record.attributeName === "data-agent-native-node-id")
22331
22800
  );
22332
22801
  if (
22333
- record.target instanceof HTMLScriptElement &&
22802
+ isNativeHtmlTag(record.target, "script") &&
22334
22803
  record.target.type === SCRIPT_TYPE
22335
22804
  )
22336
22805
  return true;
@@ -22407,10 +22876,19 @@ class NativeShaderRuntime {
22407
22876
  "visibilitychange",
22408
22877
  this.onPreviewHostChange,
22409
22878
  );
22879
+ window.removeEventListener("resize", this.onPreviewHostChange);
22410
22880
  window.removeEventListener("pagehide", this.onPageHide);
22411
22881
  if (this.previewHostFramePending)
22412
- this.previewHostParent?.cancelAnimationFrame(this.previewHostFrame);
22882
+ (this.previewHostRafHost ?? window).cancelAnimationFrame(
22883
+ this.previewHostFrame,
22884
+ );
22885
+ if (this.opaquePreviewViewportTimer)
22886
+ clearTimeout(this.opaquePreviewViewportTimer);
22887
+ this.opaquePreviewViewportTimer = null;
22888
+ this.opaquePreviewViewportPort?.close();
22889
+ this.opaquePreviewViewportPort = null;
22413
22890
  this.previewHostFrame = 0;
22891
+ this.previewHostRafHost = null;
22414
22892
  this.previewHostFramePending = false;
22415
22893
  this.previewHostParent?.removeEventListener(
22416
22894
  "scroll",
@@ -22447,6 +22925,7 @@ class NativeShaderRuntime {
22447
22925
  }
22448
22926
 
22449
22927
  private releaseDisposedResources(): void {
22928
+ this.releaseMeshGrids();
22450
22929
  this.workerScene?.dispose();
22451
22930
  this.retiringWorkerScene?.dispose();
22452
22931
  this.workerScene = null;