@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
@@ -29,12 +29,25 @@ import {
29
29
  setNativeCaptureRoi,
30
30
  type NativeCaptureRoi,
31
31
  } from "./native-capture-roi";
32
+ import {
33
+ isNativeElement,
34
+ isNativeHtmlElement,
35
+ isNativeHtmlTag,
36
+ isNativeNode,
37
+ isNativeSvgElement,
38
+ isNativeSvgRoot,
39
+ } from "./native-dom";
32
40
  import { supportsNativeOutput2D } from "./native-effect-output-geometry";
33
41
  import {
34
42
  classifyNativeImageReplaySafety,
35
43
  type NativeReplaySafety,
36
44
  } from "./native-image-replay-safety";
45
+ import {
46
+ resolveOpaquePublicAsset,
47
+ resolveOpaquePublicImage,
48
+ } from "./native-opaque-public-asset";
37
49
  import { fitNativeRasterDensity } from "./native-preview-geometry";
50
+ import { trustedOpaquePreviewParentOrigin } from "./native-preview-viewport-transport";
38
51
  import {
39
52
  composeNativeSourceAffine,
40
53
  invertNativeSourceAffine,
@@ -357,24 +370,47 @@ function authoredOpacity(
357
370
 
358
371
  export function nativeDocumentOrigin(): string {
359
372
  if (location.origin !== "null") return location.origin;
373
+ const parentOrigin =
374
+ window.frameElement?.ownerDocument.defaultView?.location.origin;
375
+ if (
376
+ parentOrigin &&
377
+ parentOrigin !== "null" &&
378
+ /^https?:$/.test(new URL(parentOrigin).protocol)
379
+ )
380
+ return parentOrigin;
360
381
  try {
361
- const origin = window.parent.location.origin;
362
- if (origin && origin !== "null") return origin;
382
+ return trustedOpaquePreviewParentOrigin(document.referrer);
363
383
  } catch {
364
384
  throw new NativeSourceError(
365
385
  "source-origin-unavailable",
366
386
  "The parent source origin could not be verified.",
367
387
  );
368
388
  }
369
- throw new NativeSourceError(
370
- "source-origin-unavailable",
371
- "The source document has no trusted inherited origin.",
372
- );
389
+ }
390
+
391
+ function nativeAssetUrl(raw: string): URL {
392
+ try {
393
+ return new URL(raw);
394
+ } catch {
395
+ const base = document.baseURI;
396
+ let resolvedBase: string;
397
+ try {
398
+ resolvedBase = /^https?:$/.test(new URL(base).protocol)
399
+ ? base
400
+ : document.referrer;
401
+ return new URL(raw, resolvedBase);
402
+ } catch {
403
+ throw new NativeSourceError(
404
+ "source-asset-url-unreadable",
405
+ "The source asset URL could not be resolved.",
406
+ );
407
+ }
408
+ }
373
409
  }
374
410
 
375
411
  function assertLocalAsset(raw: string): void {
376
412
  if (!raw || raw.startsWith("data:") || raw.startsWith("blob:")) return;
377
- const url = new URL(raw, document.baseURI);
413
+ const url = nativeAssetUrl(raw);
378
414
  if (url.origin !== nativeDocumentOrigin()) {
379
415
  throw new NativeSourceError(
380
416
  "source-cross-origin",
@@ -394,7 +430,7 @@ function assertLeafSupported(
394
430
  "Shadow DOM source content is unsupported.",
395
431
  );
396
432
  }
397
- if (element instanceof HTMLIFrameElement) {
433
+ if (isNativeHtmlTag(element, "iframe")) {
398
434
  throw new NativeSourceError(
399
435
  "source-iframe",
400
436
  "Iframe source content is unsupported.",
@@ -417,15 +453,31 @@ function assertLeafSupported(
417
453
  "source-transform",
418
454
  "The selected source target has a 3D or perspective transform.",
419
455
  );
420
- } else if (element instanceof HTMLElement) {
456
+ } else if (isNativeHtmlElement(element)) {
421
457
  nodeGlobalTransform(element, readStyle);
422
458
  }
423
459
  for (const animation of element.getAnimations({ subtree: false })) {
424
460
  if (animation.playState !== "running") continue;
425
- const keyframes =
426
- animation.effect instanceof KeyframeEffect
427
- ? animation.effect.getKeyframes()
428
- : [];
461
+ const effect = animation.effect;
462
+ if (effect === null) continue;
463
+ if (
464
+ !("getKeyframes" in effect) ||
465
+ typeof effect.getKeyframes !== "function"
466
+ ) {
467
+ throw new NativeSourceError(
468
+ "source-animation",
469
+ "The running source animation's keyframes are unreadable.",
470
+ );
471
+ }
472
+ let keyframes: ComputedKeyframe[];
473
+ try {
474
+ keyframes = effect.getKeyframes();
475
+ } catch {
476
+ throw new NativeSourceError(
477
+ "source-animation",
478
+ "The running source animation's keyframes are unreadable.",
479
+ );
480
+ }
429
481
  const keys = new Set(keyframes.flatMap((frame) => Object.keys(frame)));
430
482
  for (const key of keys) {
431
483
  if (
@@ -468,7 +520,7 @@ function hasDirectText(element: Element): boolean {
468
520
  }
469
521
 
470
522
  function isInlineFlowChild(element: Element): boolean {
471
- if (element instanceof HTMLBRElement) return true;
523
+ if (isNativeHtmlTag(element, "br")) return true;
472
524
  const display = getComputedStyle(element).display;
473
525
  return display === "contents" || display.startsWith("inline");
474
526
  }
@@ -500,18 +552,18 @@ function isPureTextFlow(element: HTMLElement): boolean {
500
552
  )
501
553
  return false;
502
554
  if (
503
- !(child instanceof HTMLElement) ||
504
- child instanceof HTMLImageElement ||
505
- child instanceof HTMLVideoElement ||
506
- child instanceof HTMLCanvasElement ||
507
- child instanceof HTMLIFrameElement ||
555
+ !isNativeHtmlElement(child) ||
556
+ isNativeHtmlTag(child, "img") ||
557
+ isNativeHtmlTag(child, "video") ||
558
+ isNativeHtmlTag(child, "canvas") ||
559
+ isNativeHtmlTag(child, "iframe") ||
508
560
  ["SCRIPT", "STYLE"].includes(child.tagName)
509
561
  )
510
562
  return false;
511
563
  const style = getComputedStyle(child);
512
564
  if (style.position === "absolute" || style.position === "fixed")
513
565
  return false;
514
- if (child instanceof HTMLBRElement) continue;
566
+ if (isNativeHtmlTag(child, "br")) continue;
515
567
  if (child.textContent?.trim() && !isPureTextFlow(child)) return false;
516
568
  }
517
569
  return true;
@@ -720,7 +772,7 @@ function preserveTextFlowStyles(
720
772
  }
721
773
  assertLeafSupported(child);
722
774
  copyComputedCss(child, copy);
723
- if (child instanceof HTMLElement) preserveTextFlowStyles(child, copy);
775
+ if (isNativeHtmlElement(child)) preserveTextFlowStyles(child, copy);
724
776
  }
725
777
  }
726
778
 
@@ -882,12 +934,12 @@ function sizeOf(element: HTMLElement | SVGSVGElement): {
882
934
  } {
883
935
  const rect = element.getBoundingClientRect();
884
936
  const width = Math.ceil(
885
- element instanceof HTMLElement
937
+ isNativeHtmlElement(element)
886
938
  ? element.offsetWidth || rect.width
887
939
  : rect.width,
888
940
  );
889
941
  const height = Math.ceil(
890
- element instanceof HTMLElement
942
+ isNativeHtmlElement(element)
891
943
  ? element.offsetHeight || rect.height
892
944
  : rect.height,
893
945
  );
@@ -909,7 +961,7 @@ function contentBoxOf(element: HTMLElement | SVGSVGElement): {
909
961
  width: number;
910
962
  height: number;
911
963
  } {
912
- if (element instanceof SVGSVGElement) {
964
+ if (isNativeSvgRoot(element)) {
913
965
  let box: DOMRect;
914
966
  try {
915
967
  box = element.getBBox();
@@ -1257,7 +1309,7 @@ function sourceLayoutSize(
1257
1309
  const cache = memo?.matches(target, space) ? memo.sizes : undefined;
1258
1310
  const cached = cache?.get(element);
1259
1311
  if (cached) return cached;
1260
- if (element instanceof SVGSVGElement) return nativeSvgViewportSize(element);
1312
+ if (isNativeSvgRoot(element)) return nativeSvgViewportSize(element);
1261
1313
  if (
1262
1314
  element === document.documentElement &&
1263
1315
  Number.isFinite(element.offsetWidth) &&
@@ -1341,7 +1393,7 @@ function viewportToTargetAffine(
1341
1393
  memo?: SourceGeometryMemo,
1342
1394
  ): NativeAffine2D {
1343
1395
  const inverted = invertNativeSourceAffine(
1344
- target instanceof SVGSVGElement
1396
+ isNativeSvgRoot(target)
1345
1397
  ? nativeSvgViewportToClient(target)
1346
1398
  : viewportSourceAffine(target, readStyle, memo),
1347
1399
  );
@@ -1370,19 +1422,18 @@ function relativeAffine(
1370
1422
  rect: NativeAffineBox;
1371
1423
  } {
1372
1424
  if (
1373
- (element instanceof SVGSVGElement || target instanceof SVGSVGElement) &&
1374
- (element instanceof HTMLElement || element instanceof SVGSVGElement) &&
1375
- (target instanceof HTMLElement || target instanceof SVGSVGElement)
1425
+ (isNativeSvgRoot(element) || isNativeSvgRoot(target)) &&
1426
+ (isNativeHtmlElement(element) || isNativeSvgRoot(element)) &&
1427
+ (isNativeHtmlElement(target) || isNativeSvgRoot(target))
1376
1428
  ) {
1377
1429
  const box = localBox ?? {
1378
1430
  x: 0,
1379
1431
  y: 0,
1380
1432
  ...(measuredSize ?? sourceLayoutSize(element, target, space, memo)),
1381
1433
  };
1382
- const elementToClient =
1383
- element instanceof SVGSVGElement
1384
- ? nativeSvgViewportToClient(element)
1385
- : viewportSourceAffine(element, readStyle);
1434
+ const elementToClient = isNativeSvgRoot(element)
1435
+ ? nativeSvgViewportToClient(element)
1436
+ : viewportSourceAffine(element, readStyle);
1386
1437
  const matrix =
1387
1438
  space === "target-viewport-axis-aligned"
1388
1439
  ? composeAffine(
@@ -1412,7 +1463,7 @@ function relativeAffine(
1412
1463
  rect: geometry.physicalBounds,
1413
1464
  };
1414
1465
  }
1415
- if (!(element instanceof HTMLElement) || !(target instanceof HTMLElement))
1466
+ if (!isNativeHtmlElement(element) || !isNativeHtmlElement(target))
1416
1467
  throw new NativeSourceError(
1417
1468
  "source-transform",
1418
1469
  "A source has no HTML layout box.",
@@ -1566,7 +1617,7 @@ export function sourceClipPlan(
1566
1617
  space === "target-local" ? target : undefined,
1567
1618
  readStyle,
1568
1619
  );
1569
- if (!(node instanceof HTMLElement) && !(node instanceof SVGSVGElement))
1620
+ if (!isNativeHtmlElement(node) && !isNativeSvgRoot(node))
1570
1621
  throw new NativeSourceError(
1571
1622
  "source-clip-unreadable",
1572
1623
  "A source clip has no HTML border box.",
@@ -1736,12 +1787,12 @@ function nativeBackdropReceiver(
1736
1787
  ] as const) {
1737
1788
  let sibling = canvas[direction];
1738
1789
  while (
1739
- sibling instanceof HTMLCanvasElement &&
1790
+ isNativeHtmlTag(sibling, "canvas") &&
1740
1791
  sibling.hasAttribute("data-an-native-backdrop-presentation")
1741
1792
  )
1742
1793
  sibling = sibling[direction];
1743
1794
  if (
1744
- (sibling instanceof HTMLElement || sibling instanceof SVGSVGElement) &&
1795
+ (isNativeHtmlElement(sibling) || isNativeSvgRoot(sibling)) &&
1745
1796
  sibling.getAttribute("data-agent-native-node-id") === receiverNodeId
1746
1797
  )
1747
1798
  return sibling;
@@ -1765,7 +1816,7 @@ export function nativeTargetOverflowInsets(
1765
1816
  const overflow = classifyNativeComputedOverflowClip(style);
1766
1817
  if (!overflow.ok)
1767
1818
  throw new NativeSourceError(`source-${overflow.reason}`, overflow.detail);
1768
- if (target instanceof SVGSVGElement) {
1819
+ if (isNativeSvgRoot(target)) {
1769
1820
  if (overflow.edge === "none")
1770
1821
  throw new NativeSourceError(
1771
1822
  "source-svg-overflow-unsupported",
@@ -2237,12 +2288,12 @@ function laterPaintMayPrecedeReceiver(
2237
2288
  order.phase === "flow");
2238
2289
  if (
2239
2290
  precedes &&
2240
- ((element instanceof HTMLElement &&
2291
+ ((isNativeHtmlElement(element) &&
2241
2292
  (hasOwnPaint(element) ||
2242
- element instanceof HTMLImageElement ||
2243
- element instanceof HTMLVideoElement ||
2244
- element instanceof HTMLCanvasElement)) ||
2245
- element instanceof SVGElement)
2293
+ isNativeHtmlTag(element, "img") ||
2294
+ isNativeHtmlTag(element, "video") ||
2295
+ isNativeHtmlTag(element, "canvas"))) ||
2296
+ isNativeSvgElement(element))
2246
2297
  ) {
2247
2298
  const rect = element.getBoundingClientRect();
2248
2299
  if (
@@ -2286,7 +2337,7 @@ function rasterOwnedStyleNodes(
2286
2337
  element: HTMLElement | SVGSVGElement,
2287
2338
  phase: NativeOwnPaintPhase,
2288
2339
  ): Element[] {
2289
- if (element instanceof SVGSVGElement)
2340
+ if (isNativeSvgRoot(element))
2290
2341
  return [element, ...element.querySelectorAll("*")];
2291
2342
  if (
2292
2343
  phase === "background" ||
@@ -2538,10 +2589,10 @@ function cloneOwnPaint(
2538
2589
  }
2539
2590
  if (ownText && isInlineFlowChild(child)) {
2540
2591
  if (
2541
- !(child instanceof HTMLElement) ||
2542
- child instanceof HTMLImageElement ||
2543
- child instanceof HTMLCanvasElement ||
2544
- child instanceof HTMLVideoElement
2592
+ !isNativeHtmlElement(child) ||
2593
+ isNativeHtmlTag(child, "img") ||
2594
+ isNativeHtmlTag(child, "canvas") ||
2595
+ isNativeHtmlTag(child, "video")
2545
2596
  ) {
2546
2597
  throw new NativeSourceError(
2547
2598
  "source-inline-media",
@@ -2674,7 +2725,7 @@ function cloneOwnPaint(
2674
2725
  node.style.outlineColor = "transparent";
2675
2726
  for (const child of node.children)
2676
2727
  if (
2677
- child instanceof HTMLElement &&
2728
+ isNativeHtmlElement(child) &&
2678
2729
  !child.hasAttribute("data-an-native-canvas")
2679
2730
  )
2680
2731
  clearBox(child);
@@ -2717,7 +2768,7 @@ export function cloneNativeTextFlow(element: HTMLElement): HTMLElement {
2717
2768
  node.style.boxShadow = "none";
2718
2769
  node.style.opacity = "1";
2719
2770
  for (const child of node.children)
2720
- if (child instanceof HTMLElement) whiten(child);
2771
+ if (isNativeHtmlElement(child)) whiten(child);
2721
2772
  };
2722
2773
  whiten(clone);
2723
2774
  return clone;
@@ -2897,15 +2948,13 @@ function nativeLeafCaptureDensity(
2897
2948
  requested: number,
2898
2949
  phase: NativeOwnPaintPhase = "all",
2899
2950
  ): number {
2900
- const size =
2901
- element instanceof SVGSVGElement
2902
- ? nativeSvgViewportSize(element)
2903
- : sizeOf(element);
2951
+ const size = isNativeSvgRoot(element)
2952
+ ? nativeSvgViewportSize(element)
2953
+ : sizeOf(element);
2904
2954
  const style = getComputedStyle(element);
2905
- const paint =
2906
- element instanceof SVGSVGElement
2907
- ? { x: 0, y: 0, ...size }
2908
- : nativeOwnPaintCaptureBox(style, phase, size);
2955
+ const paint = isNativeSvgRoot(element)
2956
+ ? { x: 0, y: 0, ...size }
2957
+ : nativeOwnPaintCaptureBox(style, phase, size);
2909
2958
  const overflow = classifyNativeComputedOverflowClip(style);
2910
2959
  if (!overflow.ok)
2911
2960
  throw new NativeSourceError(`source-${overflow.reason}`, overflow.detail);
@@ -2962,7 +3011,7 @@ async function inlineMediaPaintImages(
2962
3011
  let sourceUrl: URL;
2963
3012
  try {
2964
3013
  assertLocalAsset(raw);
2965
- sourceUrl = new URL(raw, document.baseURI);
3014
+ sourceUrl = nativeAssetUrl(raw);
2966
3015
  } catch (error) {
2967
3016
  if (error instanceof NativeSourceError) throw error;
2968
3017
  throw new NativeSourceError(
@@ -2971,7 +3020,7 @@ async function inlineMediaPaintImages(
2971
3020
  );
2972
3021
  }
2973
3022
  const image = new Image();
2974
- image.src = sourceUrl.href;
3023
+ image.src = await resolveOpaquePublicAsset(sourceUrl.href);
2975
3024
  try {
2976
3025
  await image.decode();
2977
3026
  } catch {
@@ -3195,7 +3244,7 @@ async function rasterOwnPaint(
3195
3244
  node.style.setProperty("-webkit-text-fill-color", "transparent");
3196
3245
  node.style.textShadow = "none";
3197
3246
  for (const child of node.children)
3198
- if (child instanceof HTMLElement) clearText(child);
3247
+ if (isNativeHtmlElement(child)) clearText(child);
3199
3248
  };
3200
3249
  clearText(clone);
3201
3250
  }
@@ -3334,7 +3383,7 @@ function motionOnlyStyleChange(before: string, after: string): boolean {
3334
3383
  function unchangedAttributeMutation(record: MutationRecord): boolean {
3335
3384
  return (
3336
3385
  record.type === "attributes" &&
3337
- record.target instanceof Element &&
3386
+ isNativeElement(record.target) &&
3338
3387
  record.attributeName !== null &&
3339
3388
  record.oldValue === record.target.getAttribute(record.attributeName)
3340
3389
  );
@@ -3343,29 +3392,28 @@ function unchangedAttributeMutation(record: MutationRecord): boolean {
3343
3392
  function runtimeCanvasMutation(record: MutationRecord): boolean {
3344
3393
  const runtimeCanvas =
3345
3394
  "canvas[data-an-native-canvas],canvas[data-an-native-presentation]";
3346
- if (record.target instanceof Element && record.target.closest(runtimeCanvas))
3395
+ if (isNativeElement(record.target) && record.target.closest(runtimeCanvas))
3347
3396
  return true;
3348
3397
  if (record.type !== "childList") return false;
3349
3398
  const changed = [...record.addedNodes, ...record.removedNodes];
3350
3399
  return (
3351
3400
  changed.length > 0 &&
3352
3401
  changed.every(
3353
- (node) => node instanceof Element && node.matches(runtimeCanvas),
3402
+ (node) => isNativeElement(node) && node.matches(runtimeCanvas),
3354
3403
  )
3355
3404
  );
3356
3405
  }
3357
3406
 
3358
3407
  function omittedSourceMutation(record: MutationRecord): boolean {
3359
- const target =
3360
- record.target instanceof Element
3361
- ? record.target
3362
- : record.target.parentElement;
3408
+ const target = isNativeElement(record.target)
3409
+ ? record.target
3410
+ : record.target.parentElement;
3363
3411
  if (target?.closest(OMIT)) return true;
3364
3412
  if (record.type !== "childList") return false;
3365
3413
  const changed = [...record.addedNodes, ...record.removedNodes];
3366
3414
  return (
3367
3415
  changed.length > 0 &&
3368
- changed.every((node) => node instanceof Element && node.matches(OMIT))
3416
+ changed.every((node) => isNativeElement(node) && node.matches(OMIT))
3369
3417
  );
3370
3418
  }
3371
3419
 
@@ -3375,7 +3423,7 @@ export function isNativeSourceOmittedMutation(record: MutationRecord): boolean {
3375
3423
 
3376
3424
  function isNativeSvgVectorGroup(element: Element): boolean {
3377
3425
  return (
3378
- element instanceof HTMLElement &&
3426
+ isNativeHtmlElement(element) &&
3379
3427
  element.hasAttribute("data-an-svg-vector-group")
3380
3428
  );
3381
3429
  }
@@ -3421,7 +3469,7 @@ export class CachedLeaf<T extends HTMLElement | SVGSVGElement = HTMLElement> {
3421
3469
  canvas: HTMLCanvasElement,
3422
3470
  density: number,
3423
3471
  ) => Promise<void> = async (element, canvas, density) => {
3424
- if (!(element instanceof HTMLElement))
3472
+ if (!isNativeHtmlElement(element))
3425
3473
  throw new NativeSourceError(
3426
3474
  "source-inline-svg",
3427
3475
  "An SVG source needs its vector raster path.",
@@ -3446,7 +3494,7 @@ export class CachedLeaf<T extends HTMLElement | SVGSVGElement = HTMLElement> {
3446
3494
  document.documentElement.hasAttribute(
3447
3495
  "data-an-native-source-idle-observer",
3448
3496
  ) &&
3449
- record.target instanceof Element &&
3497
+ isNativeElement(record.target) &&
3450
3498
  record.attributeName
3451
3499
  ) {
3452
3500
  const target = record.target;
@@ -3621,10 +3669,10 @@ export class CachedLeaf<T extends HTMLElement | SVGSVGElement = HTMLElement> {
3621
3669
 
3622
3670
  function afterMaybePromise<T>(
3623
3671
  value: T | Promise<T>,
3624
- continuation: (resolved: T) => void,
3672
+ continuation: (resolved: T) => void | Promise<void>,
3625
3673
  ): void | Promise<void> {
3626
3674
  if (value instanceof Promise) return value.then(continuation);
3627
- continuation(value);
3675
+ return continuation(value);
3628
3676
  }
3629
3677
 
3630
3678
  function normalizeCachedLeafError(error: unknown, element?: Element): unknown {
@@ -3662,7 +3710,7 @@ async function readReplayImageSafety(
3662
3710
  ): Promise<NativeReplaySafety> {
3663
3711
  try {
3664
3712
  if (raw.length > MAX_REPLAY_IMAGE_BYTES * 2) return "unknown";
3665
- const url = new URL(raw, document.baseURI);
3713
+ const url = nativeAssetUrl(raw);
3666
3714
  if (
3667
3715
  url.protocol !== "data:" &&
3668
3716
  url.protocol !== "blob:" &&
@@ -3672,7 +3720,8 @@ async function readReplayImageSafety(
3672
3720
  if (!["data:", "blob:", "http:", "https:"].includes(url.protocol))
3673
3721
  return "unknown";
3674
3722
  const network = url.protocol === "http:" || url.protocol === "https:";
3675
- const response = await fetch(url.href, {
3723
+ const readableUrl = await resolveOpaquePublicAsset(url.href);
3724
+ const response = await fetch(readableUrl, {
3676
3725
  signal,
3677
3726
  ...(network
3678
3727
  ? {
@@ -3715,10 +3764,10 @@ async function readReplayImageSafety(
3715
3764
  }
3716
3765
 
3717
3766
  function staticDomRecord(record: NativeSourceRecord): NativeReplaySafety {
3718
- if (record.node instanceof SVGSVGElement) {
3767
+ if (isNativeSvgRoot(record.node)) {
3719
3768
  return validateNativeSvgPrimitiveMarkup(record.node.outerHTML);
3720
3769
  }
3721
- if (!(record.node instanceof HTMLElement)) return "unknown";
3770
+ if (!isNativeHtmlElement(record.node)) return "unknown";
3722
3771
  try {
3723
3772
  for (const pseudo of [undefined, "::before", "::after"]) {
3724
3773
  const style = getComputedStyle(record.node, pseudo);
@@ -3855,7 +3904,7 @@ class SceneProvider implements NativeSceneProvider {
3855
3904
  let moved = false;
3856
3905
  const scope = this.placement === "backdrop" ? document.body : this.target;
3857
3906
  for (const record of records) {
3858
- if (!(record.target instanceof Element)) continue;
3907
+ if (!isNativeElement(record.target)) continue;
3859
3908
  if (unchangedAttributeMutation(record) || runtimeCanvasMutation(record))
3860
3909
  continue;
3861
3910
  if (
@@ -3933,7 +3982,7 @@ class SceneProvider implements NativeSceneProvider {
3933
3982
 
3934
3983
  private omit(element: Element): boolean {
3935
3984
  if (
3936
- !(element instanceof HTMLCanvasElement) ||
3985
+ !isNativeHtmlTag(element, "canvas") ||
3937
3986
  !element.hasAttribute("data-an-native-backdrop-presentation")
3938
3987
  )
3939
3988
  return element.matches(OMIT);
@@ -3966,7 +4015,7 @@ class SceneProvider implements NativeSceneProvider {
3966
4015
  element: HTMLElement | SVGSVGElement,
3967
4016
  ): { color: string; textFillColor: string } | undefined {
3968
4017
  if (
3969
- !(element instanceof HTMLElement) ||
4018
+ !isNativeHtmlElement(element) ||
3970
4019
  this.targetCapture !== "content" ||
3971
4020
  element !== this.target ||
3972
4021
  !element.hasAttribute("data-an-native-text-suppressed")
@@ -4002,12 +4051,12 @@ class SceneProvider implements NativeSceneProvider {
4002
4051
 
4003
4052
  private wakeDynamicSource = (event: Event): void => {
4004
4053
  const scope = this.placement === "backdrop" ? document.body : this.target;
4005
- if (!(event.target instanceof Node)) return;
4054
+ if (!isNativeNode(event.target)) return;
4006
4055
  const withinSource = scope.contains(event.target);
4007
4056
  const ancestorAnimation =
4008
4057
  (event.type.startsWith("animation") ||
4009
4058
  event.type.startsWith("transition")) &&
4010
- event.target instanceof Element &&
4059
+ isNativeElement(event.target) &&
4011
4060
  event.target.contains(scope);
4012
4061
  if (withinSource || ancestorAnimation) this.onDirty();
4013
4062
  };
@@ -4143,11 +4192,11 @@ class SceneProvider implements NativeSceneProvider {
4143
4192
  needsContinuousFrames(): boolean {
4144
4193
  const scope = this.placement === "backdrop" ? document.body : this.target;
4145
4194
  if (
4146
- (scope instanceof HTMLVideoElement && !scope.paused && !scope.ended) ||
4195
+ (isNativeHtmlTag(scope, "video") && !scope.paused && !scope.ended) ||
4147
4196
  [...scope.querySelectorAll<HTMLVideoElement>("video")].some(
4148
4197
  (video) => !video.paused && !video.ended,
4149
4198
  ) ||
4150
- (scope instanceof HTMLCanvasElement &&
4199
+ (isNativeHtmlTag(scope, "canvas") &&
4151
4200
  !scope.hasAttribute("data-an-native-canvas") &&
4152
4201
  !scope.hasAttribute("data-an-native-presentation")) ||
4153
4202
  scope.querySelector(
@@ -4192,7 +4241,7 @@ class SceneProvider implements NativeSceneProvider {
4192
4241
  if (
4193
4242
  (this.placement !== "layer" && this.placement !== "fill") ||
4194
4243
  !this.groupLocalBackdropSource ||
4195
- !(element instanceof HTMLCanvasElement) ||
4244
+ !isNativeHtmlTag(element, "canvas") ||
4196
4245
  !element.hasAttribute("data-an-native-backdrop-presentation") ||
4197
4246
  !element.getAttribute("data-an-native-canvas") ||
4198
4247
  !this.target.contains(element)
@@ -4585,7 +4634,7 @@ class SceneProvider implements NativeSceneProvider {
4585
4634
  readStyle: SourceStyleReader = getComputedStyle,
4586
4635
  ): NativeSourceIsolation[] | null {
4587
4636
  const isBackdropCanvas = (node: Element): node is HTMLCanvasElement =>
4588
- node instanceof HTMLCanvasElement &&
4637
+ isNativeHtmlTag(node, "canvas") &&
4589
4638
  node.hasAttribute("data-an-native-backdrop-presentation") &&
4590
4639
  !!node.getAttribute("data-an-native-canvas");
4591
4640
  const receiverForCanvas = nativeBackdropReceiver;
@@ -4705,7 +4754,7 @@ class SceneProvider implements NativeSceneProvider {
4705
4754
  if (current !== stop && !transformOwner && hasSourceTransform(style))
4706
4755
  transformOwner = current;
4707
4756
  if (
4708
- !(current === record.node && current instanceof SVGSVGElement) &&
4757
+ !(current === record.node && isNativeSvgRoot(current)) &&
4709
4758
  hasUnsupportedSourceMask(style.clipPath, style.maskImage)
4710
4759
  )
4711
4760
  throw new NativeSourceError(
@@ -4807,7 +4856,7 @@ class SceneProvider implements NativeSceneProvider {
4807
4856
  const children = [...element.children].filter((child) => !this.omit(child));
4808
4857
  if (
4809
4858
  hasDirectText(element) ||
4810
- children.some((child) => !(child instanceof SVGSVGElement))
4859
+ children.some((child) => !isNativeSvgRoot(child))
4811
4860
  )
4812
4861
  throw new NativeSourceError(
4813
4862
  "receiver-svg-group-unsupported",
@@ -4859,7 +4908,7 @@ class SceneProvider implements NativeSceneProvider {
4859
4908
  if (metrics) metrics.recordDirectStyleReads += 1;
4860
4909
  const style = getComputedStyle(element);
4861
4910
  if (style.display === "none" || style.visibility === "hidden") return;
4862
- if (element instanceof SVGSVGElement && element.hasAttribute("transform"))
4911
+ if (isNativeSvgRoot(element) && element.hasAttribute("transform"))
4863
4912
  throw new NativeSourceError(
4864
4913
  "source-svg-transform-unsupported",
4865
4914
  "An SVG root transform needs an affine vector source path.",
@@ -4883,10 +4932,9 @@ class SceneProvider implements NativeSceneProvider {
4883
4932
  }
4884
4933
  if (isNativeSvgVectorGroup(element))
4885
4934
  this.assertSvgVectorGroupComposition(element);
4886
- const size =
4887
- element instanceof SVGSVGElement
4888
- ? nativeSvgViewportSize(element)
4889
- : sourceLayoutSize(element, this.target, this.coordinateSpace, memo);
4935
+ const size = isNativeSvgRoot(element)
4936
+ ? nativeSvgViewportSize(element)
4937
+ : sourceLayoutSize(element, this.target, this.coordinateSpace, memo);
4890
4938
  const geometry = relativeAffine(
4891
4939
  element,
4892
4940
  this.target,
@@ -4912,7 +4960,7 @@ class SceneProvider implements NativeSceneProvider {
4912
4960
  const isolationPath = this.isolationPath(
4913
4961
  element,
4914
4962
  sourceClip.groupClips,
4915
- element instanceof SVGSVGElement,
4963
+ isNativeSvgRoot(element),
4916
4964
  );
4917
4965
  if (
4918
4966
  !isolationPath ||
@@ -4932,10 +4980,10 @@ class SceneProvider implements NativeSceneProvider {
4932
4980
  nativeLeafCaptureDensity(
4933
4981
  element,
4934
4982
  this.density,
4935
- element instanceof SVGSVGElement ? "all" : "coverage",
4983
+ isNativeSvgRoot(element) ? "all" : "coverage",
4936
4984
  ),
4937
4985
  (node, canvas, density) =>
4938
- node instanceof SVGSVGElement
4986
+ isNativeSvgRoot(node)
4939
4987
  ? rasterNativeSvgSource(
4940
4988
  node,
4941
4989
  canvas,
@@ -4977,7 +5025,7 @@ class SceneProvider implements NativeSceneProvider {
4977
5025
  density: nativeLeafCaptureDensity(
4978
5026
  element,
4979
5027
  this.density,
4980
- element instanceof SVGSVGElement ? "all" : "coverage",
5028
+ isNativeSvgRoot(element) ? "all" : "coverage",
4981
5029
  ),
4982
5030
  maxDimension: 4096,
4983
5031
  maxPixels: 8_388_608,
@@ -5036,7 +5084,7 @@ class SceneProvider implements NativeSceneProvider {
5036
5084
  ): void | Promise<void> {
5037
5085
  if (!element.isConnected || this.omit(element)) return;
5038
5086
  if (element.hasAttribute("data-an-native-receiver-suppressed")) return;
5039
- if (element instanceof SVGSVGElement)
5087
+ if (isNativeSvgRoot(element))
5040
5088
  return this.recordSvg(
5041
5089
  element,
5042
5090
  out,
@@ -5044,12 +5092,12 @@ class SceneProvider implements NativeSceneProvider {
5044
5092
  memo,
5045
5093
  allowVisibleTargetOverflow,
5046
5094
  );
5047
- if (element instanceof SVGElement)
5095
+ if (isNativeSvgElement(element))
5048
5096
  throw new NativeSourceError(
5049
5097
  "source-inline-svg",
5050
5098
  "An SVG fragment outside an SVG root cannot be captured.",
5051
5099
  );
5052
- if (!(element instanceof HTMLElement)) return;
5100
+ if (!isNativeHtmlElement(element)) return;
5053
5101
  const recordStyles =
5054
5102
  memo?.styles ?? new Map<Element, CSSStyleDeclaration>();
5055
5103
  const readRecordStyle: SourceStyleReader = (node) => {
@@ -5081,7 +5129,7 @@ class SceneProvider implements NativeSceneProvider {
5081
5129
  )
5082
5130
  return;
5083
5131
  if (
5084
- element instanceof HTMLCanvasElement &&
5132
+ isNativeHtmlTag(element, "canvas") &&
5085
5133
  element.hasAttribute("data-an-shader-canvas")
5086
5134
  ) {
5087
5135
  for (
@@ -5164,14 +5212,13 @@ class SceneProvider implements NativeSceneProvider {
5164
5212
  );
5165
5213
  const box = geometry.rect;
5166
5214
  if (box.width <= 0 || box.height <= 0) return;
5167
- const nativeInstanceId =
5168
- element instanceof HTMLCanvasElement
5169
- ? element.getAttribute("data-an-native-canvas")
5170
- : null;
5215
+ const nativeInstanceId = isNativeHtmlTag(element, "canvas")
5216
+ ? element.getAttribute("data-an-native-canvas")
5217
+ : null;
5171
5218
  const media =
5172
- element instanceof HTMLImageElement ||
5173
- element instanceof HTMLVideoElement ||
5174
- (element instanceof HTMLCanvasElement && !nativeInstanceId);
5219
+ isNativeHtmlTag(element, "img") ||
5220
+ isNativeHtmlTag(element, "video") ||
5221
+ (isNativeHtmlTag(element, "canvas") && !nativeInstanceId);
5175
5222
  const ownOverflow = classifyNativeComputedOverflowClip(style);
5176
5223
  if (!ownOverflow.ok)
5177
5224
  throw new NativeSourceError(
@@ -5302,53 +5349,58 @@ class SceneProvider implements NativeSceneProvider {
5302
5349
  return recordMediaPaint(() => undefined);
5303
5350
  }
5304
5351
  const mediaBox = sourceClip.clips[0]?.localBox ?? geometry.localBox;
5305
- if (element instanceof HTMLImageElement) {
5352
+ if (isNativeHtmlTag(element, "img")) {
5306
5353
  const imageSourceUrl = element.currentSrc || element.src;
5307
5354
  assertLocalAsset(imageSourceUrl);
5308
- const imageWidth = element.naturalWidth;
5309
- const imageHeight = element.naturalHeight;
5310
- const imageRendering = style.imageRendering;
5311
- if (!element.complete || imageWidth <= 0)
5312
- throw new NativeSourceError(
5313
- "source-image-pending",
5314
- "An image source has not finished loading.",
5315
- );
5316
- const image = mediaPlacement(
5317
- element,
5318
- mediaBox,
5319
- imageWidth,
5320
- imageHeight,
5321
- style,
5355
+ return afterMaybePromise(
5356
+ resolveOpaquePublicImage(element, imageSourceUrl),
5357
+ (source) => {
5358
+ const imageWidth = source.naturalWidth;
5359
+ const imageHeight = source.naturalHeight;
5360
+ const imageRendering = style.imageRendering;
5361
+ if (!source.complete || imageWidth <= 0)
5362
+ throw new NativeSourceError(
5363
+ "source-image-pending",
5364
+ "An image source has not finished loading.",
5365
+ );
5366
+ const image = mediaPlacement(
5367
+ element,
5368
+ mediaBox,
5369
+ imageWidth,
5370
+ imageHeight,
5371
+ style,
5372
+ );
5373
+ const imageRect = relativeAffine(
5374
+ element,
5375
+ this.target,
5376
+ this.coordinateSpace,
5377
+ image.rect,
5378
+ readRecordStyle,
5379
+ undefined,
5380
+ memo,
5381
+ ).rect;
5382
+ const appendImage = () => {
5383
+ if (metrics) metrics.recordDirectAffineReads += 1;
5384
+ out.push({
5385
+ ...common,
5386
+ rect: imageRect,
5387
+ localBox: image.rect,
5388
+ uv: image.uv,
5389
+ kind: "image",
5390
+ imageRendering: { value: imageRendering },
5391
+ source,
5392
+ imageSourceUrl,
5393
+ width: imageWidth,
5394
+ height: imageHeight,
5395
+ revision: this.assetRevision,
5396
+ });
5397
+ };
5398
+ recordStyles.clear();
5399
+ return recordMediaPaint(appendImage);
5400
+ },
5322
5401
  );
5323
- const imageRect = relativeAffine(
5324
- element,
5325
- this.target,
5326
- this.coordinateSpace,
5327
- image.rect,
5328
- readRecordStyle,
5329
- undefined,
5330
- memo,
5331
- ).rect;
5332
- const appendImage = () => {
5333
- if (metrics) metrics.recordDirectAffineReads += 1;
5334
- out.push({
5335
- ...common,
5336
- rect: imageRect,
5337
- localBox: image.rect,
5338
- uv: image.uv,
5339
- kind: "image",
5340
- imageRendering: { value: imageRendering },
5341
- source: element,
5342
- imageSourceUrl,
5343
- width: imageWidth,
5344
- height: imageHeight,
5345
- revision: this.assetRevision,
5346
- });
5347
- };
5348
- recordStyles.clear();
5349
- return recordMediaPaint(appendImage);
5350
5402
  }
5351
- if (element instanceof HTMLVideoElement) {
5403
+ if (isNativeHtmlTag(element, "video")) {
5352
5404
  assertLocalAsset(element.currentSrc || element.src);
5353
5405
  if (
5354
5406
  !element.videoWidth ||
@@ -5396,7 +5448,7 @@ class SceneProvider implements NativeSceneProvider {
5396
5448
  recordStyles.clear();
5397
5449
  return recordMediaPaint(appendVideo);
5398
5450
  }
5399
- if (element instanceof HTMLCanvasElement) {
5451
+ if (isNativeHtmlTag(element, "canvas")) {
5400
5452
  if (nativeInstanceId) {
5401
5453
  out.push({
5402
5454
  ...common,
@@ -5607,7 +5659,7 @@ class SceneProvider implements NativeSceneProvider {
5607
5659
  )
5608
5660
  return false;
5609
5661
  if (metrics) metrics.walkNodeVisits += 1;
5610
- if (element instanceof HTMLElement && element !== this.target) {
5662
+ if (isNativeHtmlElement(element) && element !== this.target) {
5611
5663
  if (metrics) metrics.walkDirectLayoutSizeReads += 1;
5612
5664
  initialSize = sourceLayoutSize(
5613
5665
  element,
@@ -5648,7 +5700,7 @@ class SceneProvider implements NativeSceneProvider {
5648
5700
  if (replacementInstance) {
5649
5701
  const presentations = [...(element.parentElement?.children ?? [])].filter(
5650
5702
  (child): child is HTMLCanvasElement =>
5651
- child instanceof HTMLCanvasElement &&
5703
+ isNativeHtmlTag(child, "canvas") &&
5652
5704
  child.hasAttribute("data-an-native-presentation") &&
5653
5705
  child.dataset.anNativeCanvas === replacementInstance,
5654
5706
  );
@@ -5775,7 +5827,7 @@ class SceneProvider implements NativeSceneProvider {
5775
5827
  );
5776
5828
  const boxBeforeNativeFill =
5777
5829
  fillCanvases.length > 0 &&
5778
- element instanceof HTMLElement &&
5830
+ isNativeHtmlElement(element) &&
5779
5831
  !hasDirectText(element);
5780
5832
  if (boxBeforeNativeFill) {
5781
5833
  if (
@@ -5815,8 +5867,8 @@ class SceneProvider implements NativeSceneProvider {
5815
5867
  )
5816
5868
  crossedAsyncBoundary = true;
5817
5869
  }
5818
- if (element instanceof SVGSVGElement) return crossedAsyncBoundary;
5819
- if (element instanceof HTMLElement) {
5870
+ if (isNativeSvgRoot(element)) return crossedAsyncBoundary;
5871
+ if (isNativeHtmlElement(element)) {
5820
5872
  let size = initialSize;
5821
5873
  if (crossedAsyncBoundary || !size) {
5822
5874
  if (metrics) metrics.walkDirectLayoutSizeReads += 1;
@@ -5874,7 +5926,7 @@ class SceneProvider implements NativeSceneProvider {
5874
5926
  side === "before" ? "previousElementSibling" : "nextElementSibling";
5875
5927
  for (
5876
5928
  let sibling = this.target[direction];
5877
- sibling instanceof HTMLCanvasElement &&
5929
+ isNativeHtmlTag(sibling, "canvas") &&
5878
5930
  sibling.hasAttribute("data-an-native-backdrop-presentation");
5879
5931
  sibling = sibling[direction]
5880
5932
  )
@@ -6192,13 +6244,13 @@ class SceneProvider implements NativeSceneProvider {
6192
6244
  x: 0 - insets.left,
6193
6245
  y: 0 - insets.top,
6194
6246
  width:
6195
- (this.target instanceof SVGSVGElement
6247
+ (isNativeSvgRoot(this.target)
6196
6248
  ? nativeSvgViewportSize(this.target).width
6197
6249
  : this.target.offsetWidth) +
6198
6250
  insets.left +
6199
6251
  insets.right,
6200
6252
  height:
6201
- (this.target instanceof SVGSVGElement
6253
+ (isNativeSvgRoot(this.target)
6202
6254
  ? nativeSvgViewportSize(this.target).height
6203
6255
  : this.target.offsetHeight) +
6204
6256
  insets.top +
@@ -6297,10 +6349,9 @@ class SceneProvider implements NativeSceneProvider {
6297
6349
  if (isNativeSvgVectorGroup(target))
6298
6350
  this.assertSvgVectorGroupComposition(target);
6299
6351
  assertLeafSupported(target, target);
6300
- const size =
6301
- target instanceof SVGSVGElement
6302
- ? nativeSvgViewportSize(target)
6303
- : { width: target.offsetWidth, height: target.offsetHeight };
6352
+ const size = isNativeSvgRoot(target)
6353
+ ? nativeSvgViewportSize(target)
6354
+ : { width: target.offsetWidth, height: target.offsetHeight };
6304
6355
  const density = nativeLeafCaptureDensity(
6305
6356
  target,
6306
6357
  Math.max(1, this.density),
@@ -6311,7 +6362,7 @@ class SceneProvider implements NativeSceneProvider {
6311
6362
  this.trackLeaf(
6312
6363
  target,
6313
6364
  key,
6314
- target instanceof SVGSVGElement ? "svg" : "own-paint",
6365
+ isNativeSvgRoot(target) ? "svg" : "own-paint",
6315
6366
  );
6316
6367
  this.receiverLeaf = new CachedLeaf(
6317
6368
  target,
@@ -6323,7 +6374,7 @@ class SceneProvider implements NativeSceneProvider {
6323
6374
  "coverage",
6324
6375
  ),
6325
6376
  async (element, canvas, scale) => {
6326
- if (element instanceof SVGSVGElement) {
6377
+ if (isNativeSvgRoot(element)) {
6327
6378
  await rasterNativeSvgSource(
6328
6379
  element,
6329
6380
  canvas,
@@ -6410,12 +6461,11 @@ class SceneProvider implements NativeSceneProvider {
6410
6461
  cssBox: expected.plan.cssBox,
6411
6462
  ...size,
6412
6463
  revision: this.receiverLeaf.revision,
6413
- geometryKind:
6414
- target instanceof SVGSVGElement
6415
- ? "svg-silhouette"
6416
- : isNativeSvgVectorGroup(target)
6417
- ? "svg-group-silhouette"
6418
- : "box",
6464
+ geometryKind: isNativeSvgRoot(target)
6465
+ ? "svg-silhouette"
6466
+ : isNativeSvgVectorGroup(target)
6467
+ ? "svg-group-silhouette"
6468
+ : "box",
6419
6469
  };
6420
6470
  }
6421
6471
 
@@ -6454,7 +6504,12 @@ class SceneProvider implements NativeSceneProvider {
6454
6504
  this.svgFillLeaves.set(paint, leaf);
6455
6505
  }
6456
6506
  this.readSceneCalls += 1;
6457
- const source = await this.readSceneLeaf(leaf, undefined, phase);
6507
+ // Background and inner coverage share one fill raster and cache snapshot.
6508
+ const source = await this.readSceneLeaf(
6509
+ leaf,
6510
+ undefined,
6511
+ paint === "fill" ? "background" : phase,
6512
+ );
6458
6513
  const capture = nativeCaptureRoi(source);
6459
6514
  const box = { x: 0, y: 0, ...size };
6460
6515
  const expected = planNativeCaptureRoi({
@@ -6507,7 +6562,7 @@ class SceneProvider implements NativeSceneProvider {
6507
6562
  "source-placement-invalid",
6508
6563
  "Only a Fill target has an authored background capture.",
6509
6564
  );
6510
- if (this.target instanceof SVGSVGElement)
6565
+ if (isNativeSvgRoot(this.target))
6511
6566
  return this.readSvgFillPhase(this.target, phase);
6512
6567
  const style = getComputedStyle(this.target);
6513
6568
  if (
@@ -6560,7 +6615,7 @@ class SceneProvider implements NativeSceneProvider {
6560
6615
  );
6561
6616
  if (
6562
6617
  this.placement !== "fill" ||
6563
- !(this.target instanceof HTMLElement) ||
6618
+ !isNativeHtmlElement(this.target) ||
6564
6619
  !isPureTextFlow(this.target)
6565
6620
  )
6566
6621
  throw new NativeSourceError(
@@ -6596,7 +6651,7 @@ class SceneProvider implements NativeSceneProvider {
6596
6651
 
6597
6652
  hasFillGlyph(): boolean {
6598
6653
  return (
6599
- !(this.target instanceof SVGSVGElement) &&
6654
+ !isNativeSvgRoot(this.target) &&
6600
6655
  isPureTextFlow(this.target) &&
6601
6656
  Boolean(this.target.textContent?.trim())
6602
6657
  );
@@ -6613,7 +6668,7 @@ class SceneProvider implements NativeSceneProvider {
6613
6668
  "fill-foreground-unavailable",
6614
6669
  "Only a Fill target has a foreground phase.",
6615
6670
  );
6616
- if (this.target instanceof SVGSVGElement) return this.markReplayRead([]);
6671
+ if (isNativeSvgRoot(this.target)) return this.markReplayRead([]);
6617
6672
  if (isPureTextFlow(this.target)) return this.markReplayRead([]);
6618
6673
  if (hasDirectText(this.target))
6619
6674
  throw new NativeSourceError(
@@ -6796,14 +6851,12 @@ class SceneProvider implements NativeSceneProvider {
6796
6851
  "source-capture-geometry-stale",
6797
6852
  "The Layer records no longer match the current source epoch.",
6798
6853
  );
6799
- const width =
6800
- this.target instanceof SVGSVGElement
6801
- ? nativeSvgViewportSize(this.target).width
6802
- : this.target.offsetWidth;
6803
- const height =
6804
- this.target instanceof SVGSVGElement
6805
- ? nativeSvgViewportSize(this.target).height
6806
- : this.target.offsetHeight;
6854
+ const width = isNativeSvgRoot(this.target)
6855
+ ? nativeSvgViewportSize(this.target).width
6856
+ : this.target.offsetWidth;
6857
+ const height = isNativeSvgRoot(this.target)
6858
+ ? nativeSvgViewportSize(this.target).height
6859
+ : this.target.offsetHeight;
6807
6860
  if (![width, height].every((value) => Number.isFinite(value) && value > 0))
6808
6861
  throw new NativeSourceError(
6809
6862
  "source-capture-geometry-invalid",
@@ -6883,15 +6936,16 @@ class SceneProvider implements NativeSceneProvider {
6883
6936
  if (staticDomRecord(record) === "unknown") safety = "unknown";
6884
6937
  continue;
6885
6938
  }
6886
- if (
6887
- record.kind !== "image" ||
6888
- !(record.source instanceof HTMLImageElement)
6889
- ) {
6939
+ if (record.kind !== "image" || !isNativeHtmlTag(record.source, "img")) {
6890
6940
  safety = "unknown";
6891
6941
  continue;
6892
6942
  }
6893
6943
  const url = record.imageSourceUrl;
6894
- if (!url || (record.source.currentSrc || record.source.src) !== url) {
6944
+ const localUrl = url ? await resolveOpaquePublicAsset(url) : null;
6945
+ if (
6946
+ !url ||
6947
+ (record.source.currentSrc || record.source.src) !== localUrl
6948
+ ) {
6895
6949
  safety = "unknown";
6896
6950
  continue;
6897
6951
  }
@@ -6910,7 +6964,7 @@ class SceneProvider implements NativeSceneProvider {
6910
6964
  }
6911
6965
  const imageSafety = await cached.result;
6912
6966
  if (!unchanged()) return "unknown";
6913
- if ((record.source.currentSrc || record.source.src) !== url)
6967
+ if ((record.source.currentSrc || record.source.src) !== localUrl)
6914
6968
  return "unknown";
6915
6969
  if (imageSafety === "dynamic") return "dynamic";
6916
6970
  if (imageSafety === "unknown") safety = "unknown";