@agent-native/core-corpus 0.214.0 → 0.217.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 (1217) 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/.agents/skills/session-replay/SKILL.md +61 -1
  4. package/corpus/templates/analytics/AGENTS.md +1 -1
  5. package/corpus/templates/analytics/CHANGELOG.md +2 -0
  6. package/corpus/templates/analytics/actions/get-session-replay-summary.ts +9 -65
  7. package/corpus/templates/analytics/actions/list-event-catalog.ts +1 -1
  8. package/corpus/templates/analytics/actions/list-session-outputs.ts +40 -0
  9. package/corpus/templates/analytics/actions/list-session-recordings.ts +17 -4
  10. package/corpus/templates/analytics/actions/view-screen.ts +29 -3
  11. package/corpus/templates/analytics/app/i18n/en-US.ts +27 -0
  12. package/corpus/templates/analytics/app/pages/sessions/EventCatalogPage.tsx +18 -1
  13. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +3 -1
  14. package/corpus/templates/analytics/app/pages/sessions/SessionOutputs.tsx +197 -0
  15. package/corpus/templates/analytics/app/pages/sessions/SessionsTriagePage.tsx +114 -4
  16. package/corpus/templates/analytics/changelog/2026-10-15-sessions-can-find-people-who-made-a-slides-deck-but-didn-t-p.md +6 -0
  17. package/corpus/templates/analytics/changelog/2026-10-16-the-activation-funnel-counts-visitors-who-decline-analytics-.md +6 -0
  18. package/corpus/templates/analytics/changelog/2026-10-21-session-replay-quotas-count-the-compressed-size-analytics-st.md +6 -0
  19. package/corpus/templates/analytics/server/db/schema.ts +67 -0
  20. package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +9 -0
  21. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +28 -22
  22. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +36 -1
  23. package/corpus/templates/analytics/server/lib/output-outcomes.ts +712 -0
  24. package/corpus/templates/analytics/server/lib/replay-origins.ts +33 -0
  25. package/corpus/templates/analytics/server/lib/session-event-index.ts +20 -0
  26. package/corpus/templates/analytics/server/lib/session-performance.ts +6 -40
  27. package/corpus/templates/analytics/server/lib/session-recording-associations.ts +30 -1
  28. package/corpus/templates/analytics/server/lib/session-replay-triage.ts +99 -0
  29. package/corpus/templates/analytics/server/lib/session-replay.ts +85 -40
  30. package/corpus/templates/analytics/server/lib/sessions-triage-lab.ts +8 -2
  31. package/corpus/templates/analytics/server/plugins/db.ts +46 -0
  32. package/corpus/templates/analytics/shared/output-use.ts +205 -0
  33. package/corpus/templates/analytics/shared/session-events.ts +6 -0
  34. package/corpus/templates/assets/.agents/skills/actions/references/action-fields.md +1 -1
  35. package/corpus/templates/brain/.agents/skills/actions/references/action-fields.md +1 -1
  36. package/corpus/templates/calendar/.agents/skills/actions/references/action-fields.md +1 -1
  37. package/corpus/templates/calendar/CHANGELOG.md +6 -0
  38. package/corpus/templates/calendar/actions/create-event.ts +2 -4
  39. package/corpus/templates/calendar/actions/update-event.ts +35 -6
  40. package/corpus/templates/calendar/changelog/2026-10-21-solo-events-avoid-notification-approval.md +6 -0
  41. package/corpus/templates/chat/.agents/skills/actions/references/action-fields.md +1 -1
  42. package/corpus/templates/clips/.agents/skills/actions/references/action-fields.md +1 -1
  43. package/corpus/templates/community/qr/package.json +1 -1
  44. package/corpus/templates/content/.agents/skills/actions/references/action-fields.md +1 -1
  45. package/corpus/templates/content/.agents/skills/content-product-development/references/verification.md +36 -0
  46. package/corpus/templates/content/.agents/skills/document-editing/SKILL.md +10 -0
  47. package/corpus/templates/content/.agents/skills/document-editing/references/databases.md +17 -3
  48. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +4 -2
  49. package/corpus/templates/content/CHANGELOG.md +54 -0
  50. package/corpus/templates/content/acceptance/_writers.ts +604 -0
  51. package/corpus/templates/content/acceptance/generate-action-registry.ts +10 -0
  52. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/create-document.json +75 -0
  53. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/duplicate-page.json +75 -0
  54. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/edit-document-find-and-replace-without-a-revision.json +75 -0
  55. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/edit-document-find-and-replace.json +75 -0
  56. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/edit-document-initializecontent.json +75 -0
  57. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/import-content.json +75 -0
  58. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-import-content-source-existing-page.json +75 -0
  59. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-import-content-source-new-page.json +75 -0
  60. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-sync-local-folder-source-changed-file.json +75 -0
  61. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-sync-local-folder-source-new-file.json +75 -0
  62. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/restore-document-version.json +75 -0
  63. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/set-document-property-primary-blocks-field.json +75 -0
  64. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/set-image-alt-text.json +75 -0
  65. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/undo-content-import.json +75 -0
  66. package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/update-document-browser-full-rewrite.json +75 -0
  67. package/corpus/templates/content/acceptance/known-loss.ts +69 -0
  68. package/corpus/templates/content/acceptance/round-trip-corpus.ts +1397 -0
  69. package/corpus/templates/content/actions/_blocks-field-identity.ts +35 -1
  70. package/corpus/templates/content/actions/_browser-document-save-attempt.ts +23 -1
  71. package/corpus/templates/content/actions/_builder-cms-blob-custody.ts +467 -0
  72. package/corpus/templates/content/actions/_builder-cms-execution-lease.ts +17 -0
  73. package/corpus/templates/content/actions/_builder-cms-intent-lookup.ts +5 -0
  74. package/corpus/templates/content/actions/_builder-cms-read-client.ts +881 -21
  75. package/corpus/templates/content/actions/_builder-cms-write-adapter.ts +28 -2
  76. package/corpus/templates/content/actions/_builder-cms-write-client.ts +109 -11
  77. package/corpus/templates/content/actions/_builder-docs-client.ts +1 -0
  78. package/corpus/templates/content/actions/_builder-private-blob.test-fixture.ts +90 -0
  79. package/corpus/templates/content/actions/_builder-source-execution-guard.ts +48 -0
  80. package/corpus/templates/content/actions/_content-database-lifecycle.ts +11 -11
  81. package/corpus/templates/content/actions/_content-database-personal-view.ts +2 -0
  82. package/corpus/templates/content/actions/_content-favorites.ts +37 -0
  83. package/corpus/templates/content/actions/_content-save-outcomes.ts +5 -0
  84. package/corpus/templates/content/actions/_database-membership-lock.ts +39 -8
  85. package/corpus/templates/content/actions/_database-navigation.ts +19 -21
  86. package/corpus/templates/content/actions/_database-row-batch.ts +41 -18
  87. package/corpus/templates/content/actions/_database-row-mutation.ts +17 -28
  88. package/corpus/templates/content/actions/_database-source-utils.ts +308 -9
  89. package/corpus/templates/content/actions/_database-utils.ts +96 -7
  90. package/corpus/templates/content/actions/_database-view-setup.ts +37 -2
  91. package/corpus/templates/content/actions/_delete-content-space.ts +8 -1
  92. package/corpus/templates/content/actions/_document-edit-mutation.ts +33 -32
  93. package/corpus/templates/content/actions/_document-flush.ts +593 -171
  94. package/corpus/templates/content/actions/_document-save-locks.ts +54 -0
  95. package/corpus/templates/content/actions/_document-save-row.ts +133 -0
  96. package/corpus/templates/content/actions/_github-source-freshness.ts +30 -4
  97. package/corpus/templates/content/actions/_github-source.ts +18 -8
  98. package/corpus/templates/content/actions/_move-page-to-space.ts +189 -25
  99. package/corpus/templates/content/actions/_nfm-syntax.ts +2 -0
  100. package/corpus/templates/content/actions/_row-lock-order.ts +115 -0
  101. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +23 -6
  102. package/corpus/templates/content/actions/cancel-prepared-builder-source-update.ts +110 -26
  103. package/corpus/templates/content/actions/change-content-database-source-role.ts +51 -7
  104. package/corpus/templates/content/actions/create-content-database.ts +11 -0
  105. package/corpus/templates/content/actions/create-document.ts +13 -1
  106. package/corpus/templates/content/actions/delete-content-database.ts +17 -14
  107. package/corpus/templates/content/actions/delete-document-property.ts +5 -0
  108. package/corpus/templates/content/actions/delete-document.ts +311 -100
  109. package/corpus/templates/content/actions/disconnect-content-database-source.ts +68 -2
  110. package/corpus/templates/content/actions/disconnect-local-folder-source.ts +33 -2
  111. package/corpus/templates/content/actions/edit-document.ts +18 -5
  112. package/corpus/templates/content/actions/execute-builder-source-execution.ts +900 -140
  113. package/corpus/templates/content/actions/export-document.ts +3 -0
  114. package/corpus/templates/content/actions/get-blocks-field-word-count.ts +22 -5
  115. package/corpus/templates/content/actions/get-document.ts +2 -0
  116. package/corpus/templates/content/actions/import-content-source.ts +170 -54
  117. package/corpus/templates/content/actions/move-document.ts +191 -73
  118. package/corpus/templates/content/actions/permanently-delete-document.ts +6 -0
  119. package/corpus/templates/content/actions/prepare-builder-source-execution.ts +155 -13
  120. package/corpus/templates/content/actions/prepare-builder-source-review.ts +299 -73
  121. package/corpus/templates/content/actions/pull-document.ts +8 -2
  122. package/corpus/templates/content/actions/remove-database-items.ts +23 -4
  123. package/corpus/templates/content/actions/restore-content-database.ts +76 -55
  124. package/corpus/templates/content/actions/restore-document-version.ts +19 -35
  125. package/corpus/templates/content/actions/restore-document.ts +65 -53
  126. package/corpus/templates/content/actions/rollback-created-slash-document.ts +11 -16
  127. package/corpus/templates/content/actions/set-document-property.ts +15 -1
  128. package/corpus/templates/content/actions/set-live-body-switch.ts +45 -0
  129. package/corpus/templates/content/actions/share-local-file-document.ts +18 -14
  130. package/corpus/templates/content/actions/suggest-document-edit.ts +2 -3
  131. package/corpus/templates/content/actions/sync-local-folder-source.ts +35 -1
  132. package/corpus/templates/content/actions/undo-content-import.ts +16 -12
  133. package/corpus/templates/content/actions/update-content-database-view.ts +2 -0
  134. package/corpus/templates/content/actions/update-document.ts +158 -34
  135. package/corpus/templates/content/actions/validate-builder-source-execution.ts +135 -26
  136. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +1 -6
  137. package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +49 -3
  138. package/corpus/templates/content/app/components/editor/ContentImportDialog.tsx +2 -0
  139. package/corpus/templates/content/app/components/editor/DocumentBlockFields.tsx +53 -11
  140. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +608 -353
  141. package/corpus/templates/content/app/components/editor/StaticDocumentBody.tsx +765 -0
  142. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +233 -80
  143. package/corpus/templates/content/app/components/editor/blockFieldSaveController.ts +32 -3
  144. package/corpus/templates/content/app/components/editor/blockFieldSaveRegistry.ts +88 -23
  145. package/corpus/templates/content/app/components/editor/comment-anchors.ts +19 -0
  146. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +228 -71
  147. package/corpus/templates/content/app/components/editor/database/GitHubSourceStatusLine.tsx +27 -2
  148. package/corpus/templates/content/app/components/editor/database/ListItemLayout.tsx +32 -8
  149. package/corpus/templates/content/app/components/editor/database/ListItemRow.tsx +27 -2
  150. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +1 -0
  151. package/corpus/templates/content/app/components/editor/document-flush-participant.ts +253 -0
  152. package/corpus/templates/content/app/components/editor/editor-transaction-meta.ts +28 -0
  153. package/corpus/templates/content/app/components/editor/extensions/AudioBlock.tsx +2 -1
  154. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +27 -6
  155. package/corpus/templates/content/app/components/editor/extensions/LocalMdxComponentNode.tsx +0 -1
  156. package/corpus/templates/content/app/components/editor/extensions/NotionExtensions.tsx +4 -4
  157. package/corpus/templates/content/app/components/editor/extensions/SuggestionHighlight.ts +24 -2
  158. package/corpus/templates/content/app/components/editor/extensions/VideoBlock.tsx +25 -6
  159. package/corpus/templates/content/app/components/editor/pending-document-persistence.ts +59 -1
  160. package/corpus/templates/content/app/components/editor/stored-body-images.ts +27 -0
  161. package/corpus/templates/content/app/components/editor/suggestions/presentation-rebase.ts +17 -0
  162. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +11 -4
  163. package/corpus/templates/content/app/components/trash/TrashBrowser.tsx +4 -1
  164. package/corpus/templates/content/app/global.css +21 -0
  165. package/corpus/templates/content/app/hooks/use-content-database.ts +40 -2
  166. package/corpus/templates/content/app/hooks/use-content-trash.ts +8 -0
  167. package/corpus/templates/content/app/hooks/use-documents.ts +14 -0
  168. package/corpus/templates/content/app/i18n-data.ts +1 -0
  169. package/corpus/templates/content/app/import-messages.ts +25 -0
  170. package/corpus/templates/content/app/trash-messages.ts +16 -0
  171. 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
  172. package/corpus/templates/content/changelog/2026-10-16-a-page-restored-from-trash-returns-to-its-place-in-its-colle.md +6 -0
  173. package/corpus/templates/content/changelog/2026-10-16-agent-written-markdown-keeps-nested-lists-indented-with-spac.md +6 -0
  174. package/corpus/templates/content/changelog/2026-10-16-opening-a-page-you-can-edit-no-longer-rebuilds-its-editor-on.md +6 -0
  175. package/corpus/templates/content/changelog/2026-10-16-pages-moved-or-imported-at-the-same-time-can-no-longer-end-u.md +6 -0
  176. package/corpus/templates/content/changelog/2026-10-16-re-importing-a-markdown-export-of-a-page-no-longer-reports-t.md +6 -0
  177. package/corpus/templates/content/changelog/2026-10-16-saving-a-page-or-restoring-one-of-its-versions-no-longer-fai.md +6 -0
  178. package/corpus/templates/content/changelog/2026-10-17-agents-reading-a-page-you-have-open-no-longer-wait-or-fail-w.md +6 -0
  179. package/corpus/templates/content/changelog/2026-10-17-builder-content-avoids-retrying-a-write-when-builder-accepte.md +6 -0
  180. package/corpus/templates/content/changelog/2026-10-18-link-a-new-collection-to-a-github-folder-from-its-sources.md +1 -1
  181. package/corpus/templates/content/changelog/2026-10-19-fresh-document-reads-require-confirmation-from-every-open-ed.md +6 -0
  182. package/corpus/templates/content/changelog/2026-10-20-builder-content-sync-keeps-read-and-write-status-accurate-wh.md +6 -0
  183. package/corpus/templates/content/changelog/2026-10-20-html-table-cells-preserve-a-trailing-backslash-when-opening-.md +6 -0
  184. package/corpus/templates/content/changelog/2026-10-20-preserve-empty-paragraph-colors-and-refuse-unsupported-inlin.md +6 -0
  185. package/corpus/templates/content/changelog/2026-10-20-the-advanced-filter-and-each-filter-group-inside-it-have-the.md +6 -0
  186. package/corpus/templates/content/changelog/2026-10-21-blocks-fields-keep-unconfirmed-saves-visible-and-agent-reads.md +6 -0
  187. package/corpus/templates/content/changelog/2026-10-21-list-rows-can-show-each-pages-first-lines.md +6 -0
  188. package/corpus/templates/content/changelog/2026-10-21-preserve-compact-table-row-groups-and-report-invalid-block-colors.md +6 -0
  189. package/corpus/templates/content/changelog/2026-10-21-suggested-edits-show-an-agent-s-whole-reason-open-a-group-to.md +6 -0
  190. package/corpus/templates/content/changelog/2026-10-21-suggestions-keep-refusing-unmatched-emphasis-in-stored-markd.md +6 -0
  191. package/corpus/templates/content/changelog/2026-10-22-a-collection-linked-to-a-big-github-folder-fills-faster-and-p.md +6 -0
  192. package/corpus/templates/content/changelog/2026-10-22-accept-remaining-and-reject-remaining-show-the-result-for-ev.md +6 -0
  193. package/corpus/templates/content/changelog/2026-10-22-accepting-a-group-of-suggested-edits-saves-faster-and-adds-o.md +6 -0
  194. package/corpus/templates/content/changelog/2026-10-22-agents-read-saved-page-text-after-failed-icon-change.md +6 -0
  195. 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
  196. package/corpus/templates/content/changelog/2026-10-22-text-an-agent-writes-inside-a-callout-column-or-synced-block.md +6 -0
  197. package/corpus/templates/content/docs/product/capabilities/content.source.adapters.md +29 -0
  198. package/corpus/templates/content/e2e/auth-files.ts +28 -0
  199. package/corpus/templates/content/e2e/convergence-summary.ts +84 -29
  200. package/corpus/templates/content/e2e/gate-arm.ts +15 -0
  201. package/corpus/templates/content/e2e/global-setup.ts +43 -75
  202. package/corpus/templates/content/e2e/global-teardown.ts +34 -0
  203. package/corpus/templates/content/e2e/helpers.ts +598 -92
  204. package/corpus/templates/content/e2e/live-body-gate.ts +188 -0
  205. package/corpus/templates/content/e2e/playwright.config.ts +12 -3
  206. package/corpus/templates/content/e2e/server-identity.ts +47 -0
  207. package/corpus/templates/content/e2e/stored-form/collab-blocks.ts +123 -0
  208. package/corpus/templates/content/package.json +1 -1
  209. package/corpus/templates/content/parity/matrix.md +42 -42
  210. package/corpus/templates/content/parity/matrix.ts +3 -1
  211. package/corpus/templates/content/scripts/_stored-form-census-kinds.ts +30 -2
  212. package/corpus/templates/content/scripts/historical-icon-apply.ts +9 -1
  213. package/corpus/templates/content/scripts/trace-startup.mjs +460 -133
  214. package/corpus/templates/content/server/db/exec.ts +58 -0
  215. package/corpus/templates/content/server/db/schema.ts +21 -0
  216. package/corpus/templates/content/server/lib/content-trash-purge.ts +222 -144
  217. package/corpus/templates/content/server/lib/document-metadata-updated-at.ts +43 -1
  218. package/corpus/templates/content/server/lib/document-revision.ts +23 -0
  219. package/corpus/templates/content/server/lib/live-body-writer.ts +311 -0
  220. package/corpus/templates/content/server/lib/notion-sync.ts +63 -29
  221. package/corpus/templates/content/server/lib/notion.ts +5 -5
  222. package/corpus/templates/content/server/lib/suggested-edits.ts +357 -230
  223. package/corpus/templates/content/server/live-copy/binding.ts +31 -0
  224. package/corpus/templates/content/server/live-copy/bounded-task.d.ts +6 -0
  225. package/corpus/templates/content/server/live-copy/exec-db.ts +1 -0
  226. package/corpus/templates/content/server/live-copy/holds.ts +59 -0
  227. package/corpus/templates/content/server/live-copy/persist.ts +656 -0
  228. package/corpus/templates/content/server/live-copy/switch.ts +136 -0
  229. package/corpus/templates/content/server/live-copy/task-names.ts +4 -0
  230. package/corpus/templates/content/server/live-copy/tasks.ts +183 -0
  231. package/corpus/templates/content/server/live-copy/write-cause.ts +85 -0
  232. package/corpus/templates/content/server/live-copy/write.ts +85 -0
  233. package/corpus/templates/content/server/plugins/builder-private-payload-cleanup.ts +22 -0
  234. package/corpus/templates/content/server/plugins/collab.ts +3 -0
  235. package/corpus/templates/content/server/plugins/db.ts +33 -0
  236. package/corpus/templates/content/server/routes/api/documents/[id]/move.patch.ts +50 -168
  237. package/corpus/templates/content/shared/api.ts +32 -1
  238. package/corpus/templates/content/shared/blocks-fields-manifest.ts +106 -0
  239. package/corpus/templates/content/shared/database-item-layout.ts +54 -22
  240. package/corpus/templates/content/shared/database-query.ts +192 -30
  241. package/corpus/templates/content/shared/document-export.ts +12 -14
  242. package/corpus/templates/content/shared/document-flush-protocol.ts +88 -0
  243. package/corpus/templates/content/shared/document-intent-merge.ts +16 -9
  244. package/corpus/templates/content/shared/editor-save-state.ts +97 -0
  245. package/corpus/templates/content/shared/feature-flags.ts +10 -0
  246. package/corpus/templates/content/shared/import/markdown.ts +91 -7
  247. package/corpus/templates/content/shared/import/types.ts +2 -0
  248. package/corpus/templates/content/shared/inline-math.ts +6 -4
  249. package/corpus/templates/content/shared/nfm-fidelity.ts +247 -0
  250. package/corpus/templates/content/shared/nfm.ts +1933 -340
  251. package/corpus/templates/content/shared/og-description.ts +258 -36
  252. package/corpus/templates/content/shared/suggestion-diff.ts +13 -0
  253. package/corpus/templates/content/shared/suggestion-formatting.ts +143 -20
  254. package/corpus/templates/content/shared/suggestion-text.ts +39 -0
  255. package/corpus/templates/content/vitest.config.ts +10 -0
  256. package/corpus/templates/crm/.agents/skills/actions/references/action-fields.md +1 -1
  257. package/corpus/templates/design/.agents/skills/actions/references/action-fields.md +1 -1
  258. package/corpus/templates/design/.agents/skills/design-templates/SKILL.md +5 -1
  259. package/corpus/templates/design/.agents/skills/native-effects/SKILL.md +9 -2
  260. package/corpus/templates/design/.generated/bridge/shader-fill-preview.generated.ts +3 -249
  261. package/corpus/templates/design/.generated/bridge/shader-runtime.generated.ts +30 -92
  262. package/corpus/templates/design/AGENTS.md +1 -3
  263. package/corpus/templates/design/CHANGELOG.md +34 -0
  264. package/corpus/templates/design/CODE_NATIVE_DESIGN_STUDIO_IMPLEMENTATION_PLAN.md +1 -6
  265. package/corpus/templates/design/DESIGN-STUDIO-PLAN.md +5 -7
  266. package/corpus/templates/design/actions/_native-local-export-server.ts +44 -31
  267. package/corpus/templates/design/actions/_native-render-contexts.ts +76 -21
  268. package/corpus/templates/design/actions/claim-native-local-export.ts +5 -0
  269. package/corpus/templates/design/actions/finish-native-local-export.ts +13 -2
  270. package/corpus/templates/design/actions/get-getting-started.ts +53 -0
  271. package/corpus/templates/design/actions/get-native-shader-approvals.ts +35 -0
  272. package/corpus/templates/design/actions/get-shader.ts +134 -219
  273. package/corpus/templates/design/actions/list-design-extensions.ts +3 -58
  274. package/corpus/templates/design/actions/request-native-local-export.ts +32 -6
  275. package/corpus/templates/design/actions/run-design-extension-action.ts +0 -29
  276. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +141 -108
  277. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +0 -218
  278. package/corpus/templates/design/app/components/design/DesignThumbnail.tsx +59 -3
  279. package/corpus/templates/design/app/components/design/EditPanel.tsx +35 -47
  280. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +242 -62
  281. package/corpus/templates/design/app/components/design/NativePreviewErrorBoundary.tsx +53 -0
  282. package/corpus/templates/design/app/components/design/bridge/codegen.ts +18 -3
  283. package/corpus/templates/design/app/components/design/bridge/native-composition-clock.ts +5 -4
  284. package/corpus/templates/design/app/components/design/bridge/native-dom.ts +37 -0
  285. package/corpus/templates/design/app/components/design/bridge/native-intrinsic-image.ts +2 -1
  286. package/corpus/templates/design/app/components/design/bridge/native-mesh-grid.ts +90 -0
  287. package/corpus/templates/design/app/components/design/bridge/native-opaque-public-asset.ts +363 -0
  288. package/corpus/templates/design/app/components/design/bridge/native-opaque-worker-lease.ts +179 -0
  289. package/corpus/templates/design/app/components/design/bridge/native-preview-geometry.ts +132 -7
  290. package/corpus/templates/design/app/components/design/bridge/native-preview-policy.ts +4 -0
  291. package/corpus/templates/design/app/components/design/bridge/native-preview-viewport-transport.ts +378 -0
  292. package/corpus/templates/design/app/components/design/bridge/native-scene-body-transform.ts +62 -0
  293. package/corpus/templates/design/app/components/design/bridge/native-scene-presentation-element.ts +10 -0
  294. package/corpus/templates/design/app/components/design/bridge/native-shader-runtime.bridge.ts +778 -246
  295. package/corpus/templates/design/app/components/design/bridge/native-source-provider.ts +512 -320
  296. package/corpus/templates/design/app/components/design/bridge/native-stateful-resource.ts +2 -2
  297. package/corpus/templates/design/app/components/design/bridge/native-stateless-compute.ts +5 -2
  298. package/corpus/templates/design/app/components/design/bridge/native-svg-source.ts +11 -1
  299. package/corpus/templates/design/app/components/design/bridge/native-worker-broker.ts +6 -0
  300. package/corpus/templates/design/app/components/design/bridge/native-worker-entry.ts +761 -303
  301. package/corpus/templates/design/app/components/design/bridge/native-worker-fill.ts +16 -6
  302. package/corpus/templates/design/app/components/design/bridge/native-worker-gpu.ts +854 -91
  303. package/corpus/templates/design/app/components/design/bridge/native-worker-host.ts +15 -1
  304. package/corpus/templates/design/app/components/design/bridge/native-worker-input-assets.ts +200 -0
  305. package/corpus/templates/design/app/components/design/bridge/native-worker-protocol.ts +40 -1
  306. package/corpus/templates/design/app/components/design/bridge/native-worker-scene-host.ts +540 -161
  307. package/corpus/templates/design/app/components/design/bridge/native-worker-source-snapshot.ts +21 -0
  308. package/corpus/templates/design/app/components/design/bridge/shader-fill-preview.bridge.ts +5 -371
  309. package/corpus/templates/design/app/components/design/bridge/shader-runtime.bridge.ts +45 -150
  310. package/corpus/templates/design/app/components/design/design-canvas/interact-document.ts +5 -9
  311. package/corpus/templates/design/app/components/design/design-canvas/native-preview-surface.ts +150 -0
  312. package/corpus/templates/design/app/components/design/design-canvas/native-public-asset-preview.ts +409 -0
  313. package/corpus/templates/design/app/components/design/design-canvas/native-public-worker-preview.ts +1086 -0
  314. package/corpus/templates/design/app/components/design/design-canvas/private-replay-screenshot-preview.ts +2 -2
  315. package/corpus/templates/design/app/components/design/design-canvas/text-content-change-result.ts +46 -12
  316. package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +15 -26
  317. package/corpus/templates/design/app/components/design/edit-panel/fill-properties.tsx +74 -67
  318. package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +7 -19
  319. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +39 -30
  320. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +4 -0
  321. package/corpus/templates/design/app/components/design/inspector/NativeShaderColorControls.tsx +3 -7
  322. package/corpus/templates/design/app/components/design/inspector/NativeShaderPaintControls.tsx +12 -5
  323. package/corpus/templates/design/app/components/design/inspector/NativeShaderPanel.tsx +705 -190
  324. package/corpus/templates/design/app/components/design/inspector/fill-field-reading.ts +1 -2
  325. package/corpus/templates/design/app/components/design/inspector/index.ts +0 -6
  326. package/corpus/templates/design/app/components/design/inspector/native-catalog-display.ts +26 -5
  327. package/corpus/templates/design/app/components/design/inspector/native-shader-catalog-fixture.ts +42 -0
  328. package/corpus/templates/design/app/components/design/inspector/native-shader-catalog-preview.ts +51 -33
  329. package/corpus/templates/design/app/components/design/inspector/native-shader-paint.ts +1 -0
  330. package/corpus/templates/design/app/components/design/inspector/native-shader-property-draft.ts +89 -23
  331. package/corpus/templates/design/app/components/design/inspector/saved-glsl-shader.tsx +243 -0
  332. package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +54 -5
  333. package/corpus/templates/design/app/components/design/shader-source-coordination.ts +66 -0
  334. package/corpus/templates/design/app/components/design/use-native-shader-approvals.ts +36 -8
  335. package/corpus/templates/design/app/components/home/DesignHomeLibrary.tsx +15 -8
  336. package/corpus/templates/design/app/components/layout/GettingStarted.tsx +50 -0
  337. package/corpus/templates/design/app/components/layout/Sidebar.tsx +3 -0
  338. package/corpus/templates/design/app/components/templates/DesignTemplateGrid.tsx +163 -0
  339. package/corpus/templates/design/app/components/templates/DesignTemplateLibrary.tsx +65 -78
  340. package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +66 -5
  341. package/corpus/templates/design/app/global.css +6 -0
  342. package/corpus/templates/design/app/i18n/en-US.ts +95 -2
  343. package/corpus/templates/design/app/lib/canvas-load-outcome.ts +147 -0
  344. package/corpus/templates/design/app/lib/canvas-outcome-tracking.ts +531 -0
  345. package/corpus/templates/design/app/lib/canvas-style-kind.ts +50 -0
  346. package/corpus/templates/design/app/pages/Index.tsx +10 -3
  347. package/corpus/templates/design/app/pages/Present.tsx +36 -1
  348. package/corpus/templates/design/app/pages/design-editor/commands/apply-file-content-update.ts +1 -1
  349. package/corpus/templates/design/app/pages/design-editor/commands/apply-local-content-update.ts +1 -1
  350. package/corpus/templates/design/app/pages/design-editor/commands/commit-visual-styles.ts +88 -32
  351. package/corpus/templates/design/app/pages/design-editor/commands/cross-screen-element-drop.ts +1 -1
  352. package/corpus/templates/design/app/pages/design-editor/commands/layer-move-to-screen.ts +1 -1
  353. package/corpus/templates/design/app/pages/design-editor/commands/paste-selection.ts +1 -1
  354. package/corpus/templates/design/app/pages/design-editor/commands/paste-svg-layer.ts +1 -1
  355. package/corpus/templates/design/app/pages/design-editor/commands/prepare-content-history-replay.ts +1 -1
  356. package/corpus/templates/design/app/pages/design-editor/commands/redo.ts +1 -1
  357. package/corpus/templates/design/app/pages/design-editor/commands/render-png-blob.ts +84 -41
  358. package/corpus/templates/design/app/pages/design-editor/commands/save-file-content.ts +38 -3
  359. package/corpus/templates/design/app/pages/design-editor/commands/shader-source-edit.ts +1 -1
  360. package/corpus/templates/design/app/pages/design-editor/commands/undo.ts +1 -1
  361. package/corpus/templates/design/app/pages/design-editor/design-editor-view.tsx +0 -2
  362. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-content-and-components.ts +4 -33
  363. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-core.ts +9 -0
  364. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-export-and-handoff.ts +2 -2
  365. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-files-and-saving.ts +2 -0
  366. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-history.ts +0 -11
  367. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-layer-models.ts +2 -55
  368. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-screen-rendering.tsx +0 -3
  369. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-selection-and-styles.ts +0 -24
  370. package/corpus/templates/design/app/pages/design-editor/text-edit-utils.ts +0 -16
  371. package/corpus/templates/design/app/pages/design-editor/use-native-local-export-requests.ts +70 -11
  372. package/corpus/templates/design/app/pages/design-editor/view/single-screen-canvas.tsx +0 -2
  373. package/corpus/templates/design/changelog/2026-10-20-folded-mesh-adds-an-animated-sculpted-fill-with-editable-col.md +6 -0
  374. package/corpus/templates/design/changelog/2026-10-20-read-only-design-views-render-native-shader-previews-in-nest.md +6 -0
  375. package/corpus/templates/design/changelog/2026-10-20-selected-screens-with-shader-effects-can-be-exported-togethe.md +6 -0
  376. package/corpus/templates/design/changelog/2026-10-20-shader-previews-reuse-validated-scene-data-while-panning-inc.md +6 -0
  377. package/corpus/templates/design/changelog/2026-10-20-shader-previews-stay-aligned-while-you-zoom.md +6 -0
  378. package/corpus/templates/design/changelog/2026-10-20-signed-out-sessions-no-longer-watch-for-private-png-export-r.md +6 -0
  379. package/corpus/templates/design/changelog/2026-10-21-a-getting-started-checklist-at-the-bottom-of-the-sidebar-tra.md +6 -0
  380. package/corpus/templates/design/changelog/2026-10-21-effect-thumbnails-show-richer-previews.md +6 -0
  381. package/corpus/templates/design/changelog/2026-10-21-native-effects-render-across-previews.md +6 -0
  382. package/corpus/templates/design/changelog/2026-10-21-native-shader-previews-use-less-gpu-memory-when-many-mesh-ef.md +6 -0
  383. package/corpus/templates/design/changelog/2026-10-21-opening-design-no-longer-shows-png-export-errors-when-no-exp.md +6 -0
  384. package/corpus/templates/design/changelog/2026-10-21-pulsing-border-controls-grouped.md +6 -0
  385. package/corpus/templates/design/changelog/2026-10-21-pulsing-border-follows-element-outlines.md +6 -0
  386. package/corpus/templates/design/changelog/2026-10-21-remove-obsolete-shader-fills.md +6 -0
  387. package/corpus/templates/design/changelog/2026-10-21-shader-previews-recover-from-temporary-gpu-and-image-failure.md +6 -0
  388. package/corpus/templates/design/changelog/2026-10-21-templates-now-open-a-read-only-preview-from-the-card-and-the.md +6 -0
  389. package/corpus/templates/design/changelog/2026-10-22-collapsed-shader-layers-no-longer-interrupt-other-shaders-on.md +6 -0
  390. package/corpus/templates/design/changelog/2026-10-22-shader-fills-and-effects-render-correctly-on-canvas-elements.md +6 -0
  391. package/corpus/templates/design/changelog/2026-10-22-shader-fills-keep-rendering-when-other-screen-content-cannot.md +6 -0
  392. package/corpus/templates/design/package.json +0 -1
  393. package/corpus/templates/design/playwright.config.ts +1 -1
  394. package/corpus/templates/design/scripts/design-export-validation/export-baseline.json +24 -0
  395. package/corpus/templates/design/scripts/runtime-budget-zoom.ts +9 -21
  396. package/corpus/templates/design/scripts/runtime-budget.ts +10 -24
  397. package/corpus/templates/design/server/lib/getting-started.ts +267 -0
  398. package/corpus/templates/design/server/plugins/agent-chat.ts +0 -2
  399. package/corpus/templates/design/server/plugins/getting-started.ts +5 -0
  400. package/corpus/templates/design/shared/design-template-presets/analytics-dashboard.ts +127 -0
  401. package/corpus/templates/design/shared/design-template-presets/design-studio.ts +98 -0
  402. package/corpus/templates/design/shared/design-template-presets/messaging-app.ts +101 -0
  403. package/corpus/templates/design/shared/design-template-presets/project-tasks.ts +120 -0
  404. package/corpus/templates/design/shared/design-template-presets.ts +8 -0
  405. package/corpus/templates/design/shared/effect-graph.ts +46 -1
  406. package/corpus/templates/design/shared/generation-output-receipt.ts +0 -1
  407. package/corpus/templates/design/shared/native-effect-animation-capability.ts +6 -0
  408. package/corpus/templates/design/shared/native-effect-folded-mesh-v1.ts +268 -0
  409. package/corpus/templates/design/shared/native-effect-folded-mesh-v2.ts +310 -0
  410. package/corpus/templates/design/shared/native-effect-folded-mesh.ts +489 -0
  411. package/corpus/templates/design/shared/native-effect-gallery-additions.ts +2 -2
  412. package/corpus/templates/design/shared/native-effect-paint.ts +8 -0
  413. package/corpus/templates/design/shared/native-effect-parameter-constraints.ts +8 -1
  414. package/corpus/templates/design/shared/native-effect-presets.ts +18 -1
  415. package/corpus/templates/design/shared/native-effect-property-presentation.ts +81 -0
  416. package/corpus/templates/design/shared/native-effect-pulsing-border-v3.ts +281 -0
  417. package/corpus/templates/design/shared/native-effect-pulsing-border-v4.ts +284 -0
  418. package/corpus/templates/design/shared/native-effect-pulsing-border.ts +300 -0
  419. package/corpus/templates/design/shared/native-effect-trust.ts +6 -0
  420. package/corpus/templates/design/shared/native-effect-wgsl.ts +12 -0
  421. package/corpus/templates/design/shared/native-effects.ts +528 -15
  422. package/corpus/templates/design/shared/native-input-resources.ts +36 -0
  423. package/corpus/templates/design/shared/native-local-export.ts +14 -0
  424. package/corpus/templates/design/shared/native-parameter-animation.ts +1 -0
  425. package/corpus/templates/design/shared/native-pointer-input.ts +9 -11
  426. package/corpus/templates/design/shared/shader-fills.ts +0 -513
  427. package/corpus/templates/design/vitest.setup.ts +7 -1
  428. package/corpus/templates/dispatch/.agents/skills/actions/references/action-fields.md +1 -1
  429. package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +20 -18
  430. package/corpus/templates/factory/.agents/skills/actions/references/action-fields.md +1 -1
  431. package/corpus/templates/factory/.agents/skills/review-latest-feedback/SKILL.md +36 -80
  432. package/corpus/templates/factory/.agents/skills/review-latest-feedback/references/channel-inventory.md +54 -16
  433. package/corpus/templates/factory/.agents/skills/review-latest-feedback/references/slack-reaction-replies.md +50 -73
  434. package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +20 -18
  435. package/corpus/templates/forms/.agents/skills/actions/references/action-fields.md +1 -1
  436. package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -1
  437. package/corpus/templates/mail/.agents/skills/actions/references/action-fields.md +1 -1
  438. package/corpus/templates/plan/.agents/skills/actions/references/action-fields.md +1 -1
  439. package/corpus/templates/slides/.agents/skills/actions/references/action-fields.md +1 -1
  440. package/corpus/templates/slides/CHANGELOG.md +6 -0
  441. package/corpus/templates/slides/actions/delete-deck.ts +7 -0
  442. package/corpus/templates/slides/changelog/2026-10-21-connected-deck-deletion-requires-approval.md +6 -0
  443. package/corpus/templates/slides/scripts/edit-fidelity/client-action.ts +61 -0
  444. package/corpus/templates/slides/scripts/edit-fidelity/run.ts +10 -0
  445. package/corpus/templates/slides-2/.agents/skills/actions/SKILL.md +199 -0
  446. package/corpus/templates/slides-2/.agents/skills/actions/references/action-fields.md +145 -0
  447. package/corpus/templates/slides-2/.agents/skills/actions/references/examples.md +96 -0
  448. package/corpus/templates/slides-2/.agents/skills/actions/references/provider-apis.md +95 -0
  449. package/corpus/templates/slides-2/.agents/skills/adding-a-feature/SKILL.md +235 -0
  450. package/corpus/templates/slides-2/.agents/skills/agent-native-docs/SKILL.md +161 -0
  451. package/corpus/templates/slides-2/.agents/skills/agent-native-toolkit/SKILL.md +314 -0
  452. package/corpus/templates/slides-2/.agents/skills/analytics-data-for-decks/SKILL.md +44 -0
  453. package/corpus/templates/slides-2/.agents/skills/apply-slide-comments/SKILL.md +63 -0
  454. package/corpus/templates/slides-2/.agents/skills/client-side-routing/SKILL.md +87 -0
  455. package/corpus/templates/slides-2/.agents/skills/context-awareness/SKILL.md +282 -0
  456. package/corpus/templates/slides-2/.agents/skills/create-deck/SKILL.md +263 -0
  457. package/corpus/templates/slides-2/.agents/skills/create-deck/references/reference-inputs.md +72 -0
  458. package/corpus/templates/slides-2/.agents/skills/create-deck/references/slide-templates.md +93 -0
  459. package/corpus/templates/slides-2/.agents/skills/create-deck/references/source-material.md +16 -0
  460. package/corpus/templates/slides-2/.agents/skills/creative-context/SKILL.md +134 -0
  461. package/corpus/templates/slides-2/.agents/skills/customizing-agent-native/SKILL.md +219 -0
  462. package/corpus/templates/slides-2/.agents/skills/deck-management/SKILL.md +182 -0
  463. package/corpus/templates/slides-2/.agents/skills/delegate-to-agent/SKILL.md +62 -0
  464. package/corpus/templates/slides-2/.agents/skills/design-systems/SKILL.md +233 -0
  465. package/corpus/templates/slides-2/.agents/skills/external-agents/SKILL.md +549 -0
  466. package/corpus/templates/slides-2/.agents/skills/external-agents/references/mcp-apps-embedding.md +169 -0
  467. package/corpus/templates/slides-2/.agents/skills/frontend-design/SKILL.md +102 -0
  468. package/corpus/templates/slides-2/.agents/skills/frontend-design/references/visual-direction.md +102 -0
  469. package/corpus/templates/slides-2/.agents/skills/image-generation-via-a2a/SKILL.md +134 -0
  470. package/corpus/templates/slides-2/.agents/skills/performance/SKILL.md +79 -0
  471. package/corpus/templates/slides-2/.agents/skills/portability/SKILL.md +108 -0
  472. package/corpus/templates/slides-2/.agents/skills/real-time-sync/SKILL.md +146 -0
  473. package/corpus/templates/slides-2/.agents/skills/reliable-mutations/SKILL.md +72 -0
  474. package/corpus/templates/slides-2/.agents/skills/secrets/SKILL.md +82 -0
  475. package/corpus/templates/slides-2/.agents/skills/security/SKILL.md +80 -0
  476. package/corpus/templates/slides-2/.agents/skills/self-modifying-code/SKILL.md +123 -0
  477. package/corpus/templates/slides-2/.agents/skills/shadcn-ui/SKILL.md +71 -0
  478. package/corpus/templates/slides-2/.agents/skills/sharing/SKILL.md +286 -0
  479. package/corpus/templates/slides-2/.agents/skills/slide-design/SKILL.md +144 -0
  480. package/corpus/templates/slides-2/.agents/skills/slide-editing/SKILL.md +284 -0
  481. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/animations.md +33 -0
  482. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/freeform-objects.md +22 -0
  483. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/restyling.md +69 -0
  484. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/transitions.md +26 -0
  485. package/corpus/templates/slides-2/.agents/skills/slide-editing/references/video.md +45 -0
  486. package/corpus/templates/slides-2/.agents/skills/slide-images/SKILL.md +136 -0
  487. package/corpus/templates/slides-2/.agents/skills/storing-data/SKILL.md +234 -0
  488. package/corpus/templates/slides-2/.agents/skills/turn-into-skill/SKILL.md +112 -0
  489. package/corpus/templates/slides-2/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  490. package/corpus/templates/slides-2/.agents/skills/workspace-conventions/SKILL.md +103 -0
  491. package/corpus/templates/slides-2/.builder/rules/deploy-app.mdc +22 -0
  492. package/corpus/templates/slides-2/.builder/rules/organize-ui.mdc +9 -0
  493. package/corpus/templates/slides-2/.dockerignore +61 -0
  494. package/corpus/templates/slides-2/.env.example +23 -0
  495. package/corpus/templates/slides-2/.ignore +3 -0
  496. package/corpus/templates/slides-2/.mcp.json +8 -0
  497. package/corpus/templates/slides-2/.oxfmtrc.json +8 -0
  498. package/corpus/templates/slides-2/AGENTS.md +66 -0
  499. package/corpus/templates/slides-2/CHANGELOG.md +76 -0
  500. package/corpus/templates/slides-2/DEVELOPING.md +157 -0
  501. package/corpus/templates/slides-2/README.md +58 -0
  502. package/corpus/templates/slides-2/THIRD_PARTY_NOTICES.md +33 -0
  503. package/corpus/templates/slides-2/_gitignore +38 -0
  504. package/corpus/templates/slides-2/actions/_agent-presence.ts +29 -0
  505. package/corpus/templates/slides-2/actions/_app-url.ts +37 -0
  506. package/corpus/templates/slides-2/actions/_deck-app-scope.ts +30 -0
  507. package/corpus/templates/slides-2/actions/_deck-tracking.ts +260 -0
  508. package/corpus/templates/slides-2/actions/_deck-write.ts +206 -0
  509. package/corpus/templates/slides-2/actions/_imported-slide-source.ts +162 -0
  510. package/corpus/templates/slides-2/actions/_inline-image-storage.ts +1013 -0
  511. package/corpus/templates/slides-2/actions/_linked-design-system.ts +83 -0
  512. package/corpus/templates/slides-2/actions/_presenter-notes.ts +83 -0
  513. package/corpus/templates/slides-2/actions/_render-artifacts.ts +111 -0
  514. package/corpus/templates/slides-2/actions/_slide-source.ts +344 -0
  515. package/corpus/templates/slides-2/actions/_tab-state.ts +51 -0
  516. package/corpus/templates/slides-2/actions/_test-brandfetch.ts +31 -0
  517. package/corpus/templates/slides-2/actions/_uploaded-files.ts +114 -0
  518. package/corpus/templates/slides-2/actions/add-deck.ts +123 -0
  519. package/corpus/templates/slides-2/actions/add-slide-comment.ts +267 -0
  520. package/corpus/templates/slides-2/actions/add-slide.ts +888 -0
  521. package/corpus/templates/slides-2/actions/analyze-brand-assets.ts +66 -0
  522. package/corpus/templates/slides-2/actions/apply-design-system.ts +111 -0
  523. package/corpus/templates/slides-2/actions/approve-deck-access-request.ts +287 -0
  524. package/corpus/templates/slides-2/actions/audit-contrast.ts +143 -0
  525. package/corpus/templates/slides-2/actions/check-image-gen.ts +17 -0
  526. package/corpus/templates/slides-2/actions/clone-context-slide.ts +340 -0
  527. package/corpus/templates/slides-2/actions/clone-creative-context-deck.ts +143 -0
  528. package/corpus/templates/slides-2/actions/control-deck-history.ts +186 -0
  529. package/corpus/templates/slides-2/actions/control-presenter.ts +117 -0
  530. package/corpus/templates/slides-2/actions/control-slide-editor.ts +267 -0
  531. package/corpus/templates/slides-2/actions/create-deck-from-template.ts +274 -0
  532. package/corpus/templates/slides-2/actions/create-deck.ts +1243 -0
  533. package/corpus/templates/slides-2/actions/create-design-system.ts +131 -0
  534. package/corpus/templates/slides-2/actions/create-share-link.ts +127 -0
  535. package/corpus/templates/slides-2/actions/db-health.ts +22 -0
  536. package/corpus/templates/slides-2/actions/delete-asset.ts +154 -0
  537. package/corpus/templates/slides-2/actions/delete-deck.ts +427 -0
  538. package/corpus/templates/slides-2/actions/delete-design-system.ts +167 -0
  539. package/corpus/templates/slides-2/actions/delete-slide-comment.ts +143 -0
  540. package/corpus/templates/slides-2/actions/delete-staged-dataset.ts +30 -0
  541. package/corpus/templates/slides-2/actions/duplicate-deck.ts +299 -0
  542. package/corpus/templates/slides-2/actions/export-google-slides.ts +41 -0
  543. package/corpus/templates/slides-2/actions/export-html.ts +770 -0
  544. package/corpus/templates/slides-2/actions/export-pptx.ts +2203 -0
  545. package/corpus/templates/slides-2/actions/extract-pdf.ts +49 -0
  546. package/corpus/templates/slides-2/actions/generate-image-api.ts +671 -0
  547. package/corpus/templates/slides-2/actions/generate-image.ts +492 -0
  548. package/corpus/templates/slides-2/actions/get-agent-access-deck.ts +52 -0
  549. package/corpus/templates/slides-2/actions/get-deck-access-status.ts +130 -0
  550. package/corpus/templates/slides-2/actions/get-deck-design-tokens.ts +62 -0
  551. package/corpus/templates/slides-2/actions/get-deck-reference-context.ts +232 -0
  552. package/corpus/templates/slides-2/actions/get-deck-template.ts +38 -0
  553. package/corpus/templates/slides-2/actions/get-deck-version.ts +85 -0
  554. package/corpus/templates/slides-2/actions/get-deck.ts +562 -0
  555. package/corpus/templates/slides-2/actions/get-design-system-decode-job-status.ts +57 -0
  556. package/corpus/templates/slides-2/actions/get-design-system-tier-limit.ts +12 -0
  557. package/corpus/templates/slides-2/actions/get-design-system.ts +453 -0
  558. package/corpus/templates/slides-2/actions/get-google-docs-status.ts +106 -0
  559. package/corpus/templates/slides-2/actions/get-google-picker-token.ts +84 -0
  560. package/corpus/templates/slides-2/actions/get-home-suggestions.ts +52 -0
  561. package/corpus/templates/slides-2/actions/get-layout-overflows.ts +192 -0
  562. package/corpus/templates/slides-2/actions/get-slide-render.ts +125 -0
  563. package/corpus/templates/slides-2/actions/get-slide-source.ts +115 -0
  564. package/corpus/templates/slides-2/actions/get-slide-theme-preview.ts +64 -0
  565. package/corpus/templates/slides-2/actions/get-slide-theme.ts +44 -0
  566. package/corpus/templates/slides-2/actions/get-slides-2-upload-storage-status.ts +17 -0
  567. package/corpus/templates/slides-2/actions/get-slides-notification-prefs.ts +37 -0
  568. package/corpus/templates/slides-2/actions/get-workspace-defaults.ts +51 -0
  569. package/corpus/templates/slides-2/actions/image-gen-status.ts +35 -0
  570. package/corpus/templates/slides-2/actions/import-code.ts +26 -0
  571. package/corpus/templates/slides-2/actions/import-design-project.ts +49 -0
  572. package/corpus/templates/slides-2/actions/import-document.ts +125 -0
  573. package/corpus/templates/slides-2/actions/import-docx.ts +57 -0
  574. package/corpus/templates/slides-2/actions/import-file.ts +1273 -0
  575. package/corpus/templates/slides-2/actions/import-from-url.ts +25 -0
  576. package/corpus/templates/slides-2/actions/import-google-doc.ts +208 -0
  577. package/corpus/templates/slides-2/actions/import-google-font.ts +110 -0
  578. package/corpus/templates/slides-2/actions/import-google-slides-reference.ts +667 -0
  579. package/corpus/templates/slides-2/actions/import-pptx.ts +564 -0
  580. package/corpus/templates/slides-2/actions/import-svgl-logo.ts +115 -0
  581. package/corpus/templates/slides-2/actions/index-design-system-with-builder.ts +181 -0
  582. package/corpus/templates/slides-2/actions/index-uploaded-design-system-files.ts +77 -0
  583. package/corpus/templates/slides-2/actions/list-assets.ts +286 -0
  584. package/corpus/templates/slides-2/actions/list-deck-templates.ts +83 -0
  585. package/corpus/templates/slides-2/actions/list-deck-versions.ts +185 -0
  586. package/corpus/templates/slides-2/actions/list-decks.ts +591 -0
  587. package/corpus/templates/slides-2/actions/list-design-systems.ts +180 -0
  588. package/corpus/templates/slides-2/actions/list-slide-comments.ts +128 -0
  589. package/corpus/templates/slides-2/actions/list-slide-themes.ts +17 -0
  590. package/corpus/templates/slides-2/actions/list-staged-datasets.ts +14 -0
  591. package/corpus/templates/slides-2/actions/logo-config.ts +13 -0
  592. package/corpus/templates/slides-2/actions/navigate.ts +158 -0
  593. package/corpus/templates/slides-2/actions/patch-deck.ts +2378 -0
  594. package/corpus/templates/slides-2/actions/provider-api-catalog.ts +25 -0
  595. package/corpus/templates/slides-2/actions/provider-api-docs.ts +83 -0
  596. package/corpus/templates/slides-2/actions/provider-api-request.ts +222 -0
  597. package/corpus/templates/slides-2/actions/query-staged-dataset.ts +83 -0
  598. package/corpus/templates/slides-2/actions/read-composer-source.ts +108 -0
  599. package/corpus/templates/slides-2/actions/request-deck-access.ts +803 -0
  600. package/corpus/templates/slides-2/actions/restore-deck-version.ts +203 -0
  601. package/corpus/templates/slides-2/actions/run.ts +2 -0
  602. package/corpus/templates/slides-2/actions/save-deck.ts +313 -0
  603. package/corpus/templates/slides-2/actions/search-google-fonts.ts +61 -0
  604. package/corpus/templates/slides-2/actions/search-images.ts +30 -0
  605. package/corpus/templates/slides-2/actions/search-logos.ts +23 -0
  606. package/corpus/templates/slides-2/actions/search-svgl-logos.ts +42 -0
  607. package/corpus/templates/slides-2/actions/set-default-design-system.ts +88 -0
  608. package/corpus/templates/slides-2/actions/set-workspace-defaults.ts +61 -0
  609. package/corpus/templates/slides-2/actions/start-design-system-upload.ts +80 -0
  610. package/corpus/templates/slides-2/actions/sync-design-system-with-builder.ts +84 -0
  611. package/corpus/templates/slides-2/actions/toggle-slide-comment-reaction.ts +150 -0
  612. package/corpus/templates/slides-2/actions/transform-slide-objects.ts +1528 -0
  613. package/corpus/templates/slides-2/actions/update-asset.ts +499 -0
  614. package/corpus/templates/slides-2/actions/update-deck-aspect-ratio.ts +95 -0
  615. package/corpus/templates/slides-2/actions/update-deck-design-tokens.ts +175 -0
  616. package/corpus/templates/slides-2/actions/update-design-system.ts +95 -0
  617. package/corpus/templates/slides-2/actions/update-slide-comment.ts +213 -0
  618. package/corpus/templates/slides-2/actions/update-slide-source.ts +353 -0
  619. package/corpus/templates/slides-2/actions/update-slide.ts +850 -0
  620. package/corpus/templates/slides-2/actions/update-slides-notification-prefs.ts +55 -0
  621. package/corpus/templates/slides-2/actions/view-screen.ts +1098 -0
  622. package/corpus/templates/slides-2/agent-native.app-skill.json +165 -0
  623. package/corpus/templates/slides-2/agent-native.config.ts +20 -0
  624. package/corpus/templates/slides-2/agent-native.json +18 -0
  625. package/corpus/templates/slides-2/app/components/ThemeToggle.tsx +47 -0
  626. package/corpus/templates/slides-2/app/components/comments/SlideCommentPins.tsx +781 -0
  627. package/corpus/templates/slides-2/app/components/comments/SlideCommentsPanel.tsx +1075 -0
  628. package/corpus/templates/slides-2/app/components/deck/DeckCard.tsx +304 -0
  629. package/corpus/templates/slides-2/app/components/deck/DeckFilterMenu.tsx +83 -0
  630. package/corpus/templates/slides-2/app/components/deck/ExcalidrawSlide.tsx +183 -0
  631. package/corpus/templates/slides-2/app/components/deck/MermaidRenderer.tsx +126 -0
  632. package/corpus/templates/slides-2/app/components/deck/SlideRenderer.tsx +1553 -0
  633. package/corpus/templates/slides-2/app/components/design-system/DesignSystemCard.tsx +235 -0
  634. package/corpus/templates/slides-2/app/components/design-system/DesignSystemSetup.tsx +2021 -0
  635. package/corpus/templates/slides-2/app/components/design-system/builder-design-system-upload.ts +200 -0
  636. package/corpus/templates/slides-2/app/components/design-system/builder-index-response.ts +104 -0
  637. package/corpus/templates/slides-2/app/components/editor/AddSlidePopover.tsx +461 -0
  638. package/corpus/templates/slides-2/app/components/editor/AiEditingMarker.tsx +24 -0
  639. package/corpus/templates/slides-2/app/components/editor/AlignmentGuides.tsx +82 -0
  640. package/corpus/templates/slides-2/app/components/editor/AnimationsPanel.tsx +698 -0
  641. package/corpus/templates/slides-2/app/components/editor/AppMenu.tsx +356 -0
  642. package/corpus/templates/slides-2/app/components/editor/AssetLibraryPanel.tsx +508 -0
  643. package/corpus/templates/slides-2/app/components/editor/BlockBubbleMenu.tsx +548 -0
  644. package/corpus/templates/slides-2/app/components/editor/DeckAccessDeniedPage.tsx +173 -0
  645. package/corpus/templates/slides-2/app/components/editor/DeckEditorSkeleton.tsx +35 -0
  646. package/corpus/templates/slides-2/app/components/editor/DeferredPopoverFallback.tsx +148 -0
  647. package/corpus/templates/slides-2/app/components/editor/EditorActionCluster.tsx +217 -0
  648. package/corpus/templates/slides-2/app/components/editor/EditorSidebar.tsx +1047 -0
  649. package/corpus/templates/slides-2/app/components/editor/EditorToolbar.tsx +1285 -0
  650. package/corpus/templates/slides-2/app/components/editor/ExportMenu.tsx +579 -0
  651. package/corpus/templates/slides-2/app/components/editor/GeneratingOverlay.tsx +21 -0
  652. package/corpus/templates/slides-2/app/components/editor/GeneratingSlidePreview.tsx +73 -0
  653. package/corpus/templates/slides-2/app/components/editor/GoogleDocImportHint.tsx +378 -0
  654. package/corpus/templates/slides-2/app/components/editor/GoogleDriveConnectionCta.tsx +154 -0
  655. package/corpus/templates/slides-2/app/components/editor/GoogleSlidesReferenceImport.tsx +299 -0
  656. package/corpus/templates/slides-2/app/components/editor/HistoryPanel.tsx +354 -0
  657. package/corpus/templates/slides-2/app/components/editor/HomeQuickStartDialog.tsx +202 -0
  658. package/corpus/templates/slides-2/app/components/editor/ImageCropOverlay.tsx +820 -0
  659. package/corpus/templates/slides-2/app/components/editor/ImageDropPromptPopover.tsx +280 -0
  660. package/corpus/templates/slides-2/app/components/editor/ImageGenPanel.tsx +244 -0
  661. package/corpus/templates/slides-2/app/components/editor/ImageOverlay.tsx +280 -0
  662. package/corpus/templates/slides-2/app/components/editor/ImageSearchPanel.tsx +183 -0
  663. package/corpus/templates/slides-2/app/components/editor/ImportDeckButton.tsx +247 -0
  664. package/corpus/templates/slides-2/app/components/editor/LogoSearchPanel.tsx +366 -0
  665. package/corpus/templates/slides-2/app/components/editor/MermaidToExcalidrawPanel.tsx +99 -0
  666. package/corpus/templates/slides-2/app/components/editor/MissingDeckAccessPane.tsx +219 -0
  667. package/corpus/templates/slides-2/app/components/editor/NewDeckReferenceStep.tsx +812 -0
  668. package/corpus/templates/slides-2/app/components/editor/PromptDialog.tsx +963 -0
  669. package/corpus/templates/slides-2/app/components/editor/QuestionFlow.tsx +119 -0
  670. package/corpus/templates/slides-2/app/components/editor/RequestDeckAccessDialog.tsx +101 -0
  671. package/corpus/templates/slides-2/app/components/editor/ShareDialog.tsx +126 -0
  672. package/corpus/templates/slides-2/app/components/editor/SlideContextToolbar.tsx +1471 -0
  673. package/corpus/templates/slides-2/app/components/editor/SlideEditor.tsx +11183 -0
  674. package/corpus/templates/slides-2/app/components/editor/SlideOverflowWarning.tsx +82 -0
  675. package/corpus/templates/slides-2/app/components/editor/SlideScrollStack.tsx +307 -0
  676. package/corpus/templates/slides-2/app/components/editor/SlideSlashCommandMenu.tsx +692 -0
  677. package/corpus/templates/slides-2/app/components/editor/SlideThumbnailContextMenu.tsx +52 -0
  678. package/corpus/templates/slides-2/app/components/editor/SlideTransitionControl.tsx +184 -0
  679. package/corpus/templates/slides-2/app/components/editor/SlidesComposerContext.tsx +789 -0
  680. package/corpus/templates/slides-2/app/components/editor/SlidesComposerContextProvider.tsx +74 -0
  681. package/corpus/templates/slides-2/app/components/editor/SlidesLayersPanel.tsx +377 -0
  682. package/corpus/templates/slides-2/app/components/editor/SpeakerNotesPanel.tsx +119 -0
  683. package/corpus/templates/slides-2/app/components/editor/TweaksPanel.tsx +77 -0
  684. package/corpus/templates/slides-2/app/components/editor/UploadStorageGate.tsx +37 -0
  685. package/corpus/templates/slides-2/app/components/editor/bullet-editing.ts +880 -0
  686. package/corpus/templates/slides-2/app/components/editor/canvas-interactions/index.ts +12 -0
  687. package/corpus/templates/slides-2/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +119 -0
  688. package/corpus/templates/slides-2/app/components/editor/commit-active-edit.ts +14 -0
  689. package/corpus/templates/slides-2/app/components/editor/editor-command-model.ts +35 -0
  690. package/corpus/templates/slides-2/app/components/editor/fit-text-object.ts +31 -0
  691. package/corpus/templates/slides-2/app/components/editor/in-place-text-session.browser-cases.json +983 -0
  692. package/corpus/templates/slides-2/app/components/editor/in-place-text-session.browser-host.ts +747 -0
  693. package/corpus/templates/slides-2/app/components/editor/in-place-text-session.ts +6891 -0
  694. package/corpus/templates/slides-2/app/components/editor/inline-edit-session.ts +26 -0
  695. package/corpus/templates/slides-2/app/components/editor/list-editing.ts +501 -0
  696. package/corpus/templates/slides-2/app/components/editor/rich-text-selection.ts +975 -0
  697. package/corpus/templates/slides-2/app/components/editor/rte-test-utils.ts +265 -0
  698. package/corpus/templates/slides-2/app/components/editor/selection-overlay-measurement.ts +191 -0
  699. package/corpus/templates/slides-2/app/components/editor/slide-escape-arbiter.ts +34 -0
  700. package/corpus/templates/slides-2/app/components/editor/slide-object-interactions.ts +6362 -0
  701. package/corpus/templates/slides-2/app/components/editor/slide-object-transform.browser-host.ts +19 -0
  702. package/corpus/templates/slides-2/app/components/editor/slide-pointer-target.ts +432 -0
  703. package/corpus/templates/slides-2/app/components/editor/slide-presence.ts +13 -0
  704. package/corpus/templates/slides-2/app/components/editor/slide-style.ts +243 -0
  705. package/corpus/templates/slides-2/app/components/editor/slide-text-targets.ts +540 -0
  706. package/corpus/templates/slides-2/app/components/editor/style-clipboard.ts +102 -0
  707. package/corpus/templates/slides-2/app/components/editor/use-prompt-import.ts +159 -0
  708. package/corpus/templates/slides-2/app/components/home/SlidesHomeLibrary.tsx +79 -0
  709. package/corpus/templates/slides-2/app/components/layout/AgentWorkIndicator.tsx +193 -0
  710. package/corpus/templates/slides-2/app/components/layout/Header.tsx +110 -0
  711. package/corpus/templates/slides-2/app/components/layout/Layout.tsx +492 -0
  712. package/corpus/templates/slides-2/app/components/layout/Sidebar.tsx +109 -0
  713. package/corpus/templates/slides-2/app/components/layout/layout-route-policy.ts +28 -0
  714. package/corpus/templates/slides-2/app/components/presentation/PresentationView.tsx +1116 -0
  715. package/corpus/templates/slides-2/app/components/presentation/PresenterView.tsx +526 -0
  716. package/corpus/templates/slides-2/app/components/presentation/SlideTransitionStage.tsx +297 -0
  717. package/corpus/templates/slides-2/app/components/presentation/present-channel.ts +31 -0
  718. package/corpus/templates/slides-2/app/components/presentation/slide-build-steps.ts +231 -0
  719. package/corpus/templates/slides-2/app/components/presentation/slide-navigation.ts +273 -0
  720. package/corpus/templates/slides-2/app/components/presentation/slide-transition-motion.ts +258 -0
  721. package/corpus/templates/slides-2/app/components/presentation/voice-navigation.ts +61 -0
  722. package/corpus/templates/slides-2/app/components/settings/notification-settings.tsx +93 -0
  723. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2AssetBrowser.tsx +726 -0
  724. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2CommandMenu.tsx +453 -0
  725. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2Comments.tsx +571 -0
  726. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2DesignTokens.tsx +345 -0
  727. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2Editor.tsx +4804 -0
  728. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2ExportMenu.tsx +671 -0
  729. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2FontBrowser.tsx +342 -0
  730. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2ImageCropControls.tsx +487 -0
  731. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2Inspector.tsx +950 -0
  732. package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2SvglLogoSearchDialog.tsx +332 -0
  733. package/corpus/templates/slides-2/app/components/slides-2-editor/cross-slide-edit-history.ts +151 -0
  734. package/corpus/templates/slides-2/app/components/slides-2-editor/design-token-presets.ts +140 -0
  735. package/corpus/templates/slides-2/app/components/slides-2-editor/editor-action-errors.ts +47 -0
  736. package/corpus/templates/slides-2/app/components/slides-2-editor/editor-export-errors.ts +60 -0
  737. package/corpus/templates/slides-2/app/components/slides-2-editor/geometry.ts +275 -0
  738. package/corpus/templates/slides-2/app/components/slides-2-editor/image-crop-style.ts +82 -0
  739. package/corpus/templates/slides-2/app/components/slides-2-editor/inline-text-editor.tsx +631 -0
  740. package/corpus/templates/slides-2/app/components/slides-2-editor/keyboard-shortcuts.ts +104 -0
  741. package/corpus/templates/slides-2/app/components/slides-2-editor/object-insertion.ts +13 -0
  742. package/corpus/templates/slides-2/app/components/slides-2-editor/preview-patches.ts +54 -0
  743. package/corpus/templates/slides-2/app/components/slides-2-editor/sandbox-render-errors.ts +23 -0
  744. package/corpus/templates/slides-2/app/components/slides-2-editor/source-structure.ts +634 -0
  745. package/corpus/templates/slides-2/app/components/slides-2-editor/types.ts +85 -0
  746. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2BlackoutOverlay.tsx +13 -0
  747. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2ControlBar.tsx +285 -0
  748. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2HelpDialog.tsx +72 -0
  749. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2JumpInput.tsx +38 -0
  750. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2LaserPointer.tsx +67 -0
  751. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2Overview.tsx +161 -0
  752. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2Player.tsx +839 -0
  753. package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2ProgressBar.tsx +23 -0
  754. package/corpus/templates/slides-2/app/components/slides-2-presenter/keyboard.ts +36 -0
  755. package/corpus/templates/slides-2/app/components/slides-2-presenter/presenter-channel.ts +131 -0
  756. package/corpus/templates/slides-2/app/components/slides-2-presenter/use-presenter-action-bridge.ts +296 -0
  757. package/corpus/templates/slides-2/app/components/slides-2-presenter/useSlides2TouchSwipe.ts +80 -0
  758. package/corpus/templates/slides-2/app/components/slides-2-runtime/SandboxedSlide.tsx +724 -0
  759. package/corpus/templates/slides-2/app/components/slides-2-runtime/SlideContentRenderer.tsx +137 -0
  760. package/corpus/templates/slides-2/app/components/slides-2-runtime/Slides2Canvas.tsx +99 -0
  761. package/corpus/templates/slides-2/app/components/slides-2-runtime/constants.ts +4 -0
  762. package/corpus/templates/slides-2/app/components/slides-2-runtime/protocol.ts +1400 -0
  763. package/corpus/templates/slides-2/app/components/slides-2-runtime/transition-frame.ts +439 -0
  764. package/corpus/templates/slides-2/app/components/templates/DeckTemplateLibrary.tsx +314 -0
  765. package/corpus/templates/slides-2/app/components/templates/DeckTemplatePreview.tsx +60 -0
  766. package/corpus/templates/slides-2/app/components/templates/DeckTemplateStage.tsx +45 -0
  767. package/corpus/templates/slides-2/app/components/ui/alert-dialog.tsx +1 -0
  768. package/corpus/templates/slides-2/app/components/ui/avatar.tsx +1 -0
  769. package/corpus/templates/slides-2/app/components/ui/button-group.tsx +1 -0
  770. package/corpus/templates/slides-2/app/components/ui/button.tsx +1 -0
  771. package/corpus/templates/slides-2/app/components/ui/card.tsx +1 -0
  772. package/corpus/templates/slides-2/app/components/ui/command.tsx +1 -0
  773. package/corpus/templates/slides-2/app/components/ui/context-menu.tsx +32 -0
  774. package/corpus/templates/slides-2/app/components/ui/dialog.tsx +1 -0
  775. package/corpus/templates/slides-2/app/components/ui/dropdown-menu.tsx +1 -0
  776. package/corpus/templates/slides-2/app/components/ui/filter-trigger.tsx +1 -0
  777. package/corpus/templates/slides-2/app/components/ui/input.tsx +1 -0
  778. package/corpus/templates/slides-2/app/components/ui/label.tsx +1 -0
  779. package/corpus/templates/slides-2/app/components/ui/popover.tsx +1 -0
  780. package/corpus/templates/slides-2/app/components/ui/progress.tsx +1 -0
  781. package/corpus/templates/slides-2/app/components/ui/scroll-area.tsx +1 -0
  782. package/corpus/templates/slides-2/app/components/ui/select.tsx +1 -0
  783. package/corpus/templates/slides-2/app/components/ui/separator.tsx +1 -0
  784. package/corpus/templates/slides-2/app/components/ui/sheet.tsx +1 -0
  785. package/corpus/templates/slides-2/app/components/ui/skeleton.tsx +1 -0
  786. package/corpus/templates/slides-2/app/components/ui/slider.tsx +1 -0
  787. package/corpus/templates/slides-2/app/components/ui/spinner.tsx +1 -0
  788. package/corpus/templates/slides-2/app/components/ui/switch.tsx +1 -0
  789. package/corpus/templates/slides-2/app/components/ui/tabs.tsx +59 -0
  790. package/corpus/templates/slides-2/app/components/ui/textarea.tsx +1 -0
  791. package/corpus/templates/slides-2/app/components/ui/toggle-group.tsx +1 -0
  792. package/corpus/templates/slides-2/app/components/ui/toolkit-provider.tsx +17 -0
  793. package/corpus/templates/slides-2/app/components/ui/tooltip.tsx +1 -0
  794. package/corpus/templates/slides-2/app/components/visual-editor/CanvasCommentPins.tsx +46 -0
  795. package/corpus/templates/slides-2/app/components/visual-editor/DrawOverlay.tsx +27 -0
  796. package/corpus/templates/slides-2/app/components/visual-editor/MultiSelectChip.tsx +97 -0
  797. package/corpus/templates/slides-2/app/components/visual-editor/SaveStatusIndicator.tsx +273 -0
  798. package/corpus/templates/slides-2/app/components/visual-editor/index.ts +4 -0
  799. package/corpus/templates/slides-2/app/context/DeckContext.tsx +7486 -0
  800. package/corpus/templates/slides-2/app/design-system.ts +3 -0
  801. package/corpus/templates/slides-2/app/entry.client.tsx +10 -0
  802. package/corpus/templates/slides-2/app/entry.server.tsx +10 -0
  803. package/corpus/templates/slides-2/app/global.css +1626 -0
  804. package/corpus/templates/slides-2/app/hooks/use-agent-generating.ts +517 -0
  805. package/corpus/templates/slides-2/app/hooks/use-compact-editor-layout.ts +26 -0
  806. package/corpus/templates/slides-2/app/hooks/use-contrast-audit-bridge.ts +49 -0
  807. package/corpus/templates/slides-2/app/hooks/use-deck-access-reload.ts +70 -0
  808. package/corpus/templates/slides-2/app/hooks/use-deck-access.ts +50 -0
  809. package/corpus/templates/slides-2/app/hooks/use-deck-design-system.ts +146 -0
  810. package/corpus/templates/slides-2/app/hooks/use-deck-history-action-bridge.ts +266 -0
  811. package/corpus/templates/slides-2/app/hooks/use-deck-presence.ts +89 -0
  812. package/corpus/templates/slides-2/app/hooks/use-deck-role.ts +46 -0
  813. package/corpus/templates/slides-2/app/hooks/use-deck-versions.ts +43 -0
  814. package/corpus/templates/slides-2/app/hooks/use-design-system-workflows.ts +11 -0
  815. package/corpus/templates/slides-2/app/hooks/use-design-systems.ts +31 -0
  816. package/corpus/templates/slides-2/app/hooks/use-generating-slide-preview.ts +115 -0
  817. package/corpus/templates/slides-2/app/hooks/use-navigation-state.ts +229 -0
  818. package/corpus/templates/slides-2/app/hooks/use-new-deck-generation-signal.ts +46 -0
  819. package/corpus/templates/slides-2/app/hooks/use-new-deck-generation.ts +710 -0
  820. package/corpus/templates/slides-2/app/hooks/use-sidebar-collapsed.ts +95 -0
  821. package/corpus/templates/slides-2/app/hooks/use-slide-comments.ts +202 -0
  822. package/corpus/templates/slides-2/app/hooks/use-slide-file-storage-status.ts +55 -0
  823. package/corpus/templates/slides-2/app/hooks/use-undo-selection.ts +66 -0
  824. package/corpus/templates/slides-2/app/hooks/use-workspace-defaults.ts +31 -0
  825. package/corpus/templates/slides-2/app/i18n/en-US.ts +1507 -0
  826. package/corpus/templates/slides-2/app/i18n/index.ts +19 -0
  827. package/corpus/templates/slides-2/app/lib/agent-visible-message.ts +21 -0
  828. package/corpus/templates/slides-2/app/lib/aspect-ratios.ts +7 -0
  829. package/corpus/templates/slides-2/app/lib/asset-error-copy.ts +59 -0
  830. package/corpus/templates/slides-2/app/lib/canvas-zoom.ts +47 -0
  831. package/corpus/templates/slides-2/app/lib/composer-context.ts +152 -0
  832. package/corpus/templates/slides-2/app/lib/composer-draft.ts +34 -0
  833. package/corpus/templates/slides-2/app/lib/contrast-audit.ts +390 -0
  834. package/corpus/templates/slides-2/app/lib/contrast-resolve.ts +240 -0
  835. package/corpus/templates/slides-2/app/lib/create-deck-generation.ts +938 -0
  836. package/corpus/templates/slides-2/app/lib/deck-access-lost.ts +4 -0
  837. package/corpus/templates/slides-2/app/lib/deck-backup.ts +186 -0
  838. package/corpus/templates/slides-2/app/lib/deck-editor-loading.ts +91 -0
  839. package/corpus/templates/slides-2/app/lib/deck-export-file-client.ts +77 -0
  840. package/corpus/templates/slides-2/app/lib/deck-filter.ts +52 -0
  841. package/corpus/templates/slides-2/app/lib/deck-list-loading.ts +16 -0
  842. package/corpus/templates/slides-2/app/lib/deck-preview-frame.ts +15 -0
  843. package/corpus/templates/slides-2/app/lib/deck-share-links.ts +9 -0
  844. package/corpus/templates/slides-2/app/lib/deck-sorting.ts +19 -0
  845. package/corpus/templates/slides-2/app/lib/deferred-editor-surfaces.ts +24 -0
  846. package/corpus/templates/slides-2/app/lib/design-system-selection.ts +11 -0
  847. package/corpus/templates/slides-2/app/lib/design-systems.ts +231 -0
  848. package/corpus/templates/slides-2/app/lib/dynamic-import.ts +50 -0
  849. package/corpus/templates/slides-2/app/lib/editor-agent-handoff.ts +92 -0
  850. package/corpus/templates/slides-2/app/lib/editor-shortcuts.ts +153 -0
  851. package/corpus/templates/slides-2/app/lib/export-google-slides-client.ts +168 -0
  852. package/corpus/templates/slides-2/app/lib/export-pdf-client.ts +684 -0
  853. package/corpus/templates/slides-2/app/lib/export-pptx-client.ts +2420 -0
  854. package/corpus/templates/slides-2/app/lib/generation-lifecycle.ts +24 -0
  855. package/corpus/templates/slides-2/app/lib/generation-state.ts +247 -0
  856. package/corpus/templates/slides-2/app/lib/google-docs-client.ts +110 -0
  857. package/corpus/templates/slides-2/app/lib/google-slides-export-availability-client.ts +53 -0
  858. package/corpus/templates/slides-2/app/lib/google-slides-reference-source.ts +18 -0
  859. package/corpus/templates/slides-2/app/lib/image-download.ts +85 -0
  860. package/corpus/templates/slides-2/app/lib/image-drop-to-agent.ts +210 -0
  861. package/corpus/templates/slides-2/app/lib/import-uploaded-deck.ts +132 -0
  862. package/corpus/templates/slides-2/app/lib/inline-edit-remote.ts +55 -0
  863. package/corpus/templates/slides-2/app/lib/localize-slides-changelog.ts +47 -0
  864. package/corpus/templates/slides-2/app/lib/mermaid-blocks.ts +18 -0
  865. package/corpus/templates/slides-2/app/lib/new-deck-reference-selection.ts +174 -0
  866. package/corpus/templates/slides-2/app/lib/normalize-slide-padding.ts +74 -0
  867. package/corpus/templates/slides-2/app/lib/pending-deck-changes.ts +33 -0
  868. package/corpus/templates/slides-2/app/lib/portaled-layer.ts +7 -0
  869. package/corpus/templates/slides-2/app/lib/pptx-google-slides.ts +204 -0
  870. package/corpus/templates/slides-2/app/lib/prompt-attachment-adapter.ts +37 -0
  871. package/corpus/templates/slides-2/app/lib/prompt-file-uploads.ts +557 -0
  872. package/corpus/templates/slides-2/app/lib/recent-references.ts +106 -0
  873. package/corpus/templates/slides-2/app/lib/reference-document-hydration.ts +406 -0
  874. package/corpus/templates/slides-2/app/lib/register-chat-renderers.tsx +645 -0
  875. package/corpus/templates/slides-2/app/lib/reveal-after-delete.ts +55 -0
  876. package/corpus/templates/slides-2/app/lib/sanitize-slide-html.ts +752 -0
  877. package/corpus/templates/slides-2/app/lib/slide-agent-context.ts +148 -0
  878. package/corpus/templates/slides-2/app/lib/slide-animation-elements.ts +900 -0
  879. package/corpus/templates/slides-2/app/lib/slide-clipboard.ts +534 -0
  880. package/corpus/templates/slides-2/app/lib/slide-comment-anchor.ts +286 -0
  881. package/corpus/templates/slides-2/app/lib/slide-content-merge.ts +295 -0
  882. package/corpus/templates/slides-2/app/lib/slide-image-replacement.ts +1919 -0
  883. package/corpus/templates/slides-2/app/lib/slide-live-remote.ts +215 -0
  884. package/corpus/templates/slides-2/app/lib/slide-scroll.ts +56 -0
  885. package/corpus/templates/slides-2/app/lib/slide-source-map.ts +1099 -0
  886. package/corpus/templates/slides-2/app/lib/slide-video.ts +390 -0
  887. package/corpus/templates/slides-2/app/lib/slides-relay-tracking.ts +114 -0
  888. package/corpus/templates/slides-2/app/lib/streaming-slide-html.ts +77 -0
  889. package/corpus/templates/slides-2/app/lib/tab-id.ts +3 -0
  890. package/corpus/templates/slides-2/app/lib/template-navigation.ts +15 -0
  891. package/corpus/templates/slides-2/app/lib/text-tool-shortcut.ts +75 -0
  892. package/corpus/templates/slides-2/app/lib/undo-reveal.ts +332 -0
  893. package/corpus/templates/slides-2/app/lib/upload-response.ts +107 -0
  894. package/corpus/templates/slides-2/app/lib/utils.ts +38 -0
  895. package/corpus/templates/slides-2/app/lib/validate-native-slide-html.ts +177 -0
  896. package/corpus/templates/slides-2/app/lib/video-upload.ts +354 -0
  897. package/corpus/templates/slides-2/app/pages/DeckEditor.tsx +6158 -0
  898. package/corpus/templates/slides-2/app/pages/DesignSystems.tsx +363 -0
  899. package/corpus/templates/slides-2/app/pages/Index.tsx +3254 -0
  900. package/corpus/templates/slides-2/app/pages/NotFound.tsx +33 -0
  901. package/corpus/templates/slides-2/app/pages/Presentation.tsx +120 -0
  902. package/corpus/templates/slides-2/app/pages/SharedPresentation.tsx +174 -0
  903. package/corpus/templates/slides-2/app/pages/SlideThemeDetail.tsx +227 -0
  904. package/corpus/templates/slides-2/app/pages/SlideThemes.tsx +155 -0
  905. package/corpus/templates/slides-2/app/pages/Slides2EditorPage.tsx +1618 -0
  906. package/corpus/templates/slides-2/app/pages/Slides2PresenterConsolePage.tsx +937 -0
  907. package/corpus/templates/slides-2/app/pages/Slides2PresenterPage.tsx +979 -0
  908. package/corpus/templates/slides-2/app/pages/Templates.tsx +32 -0
  909. package/corpus/templates/slides-2/app/root.tsx +391 -0
  910. package/corpus/templates/slides-2/app/routes/$.tsx +10 -0
  911. package/corpus/templates/slides-2/app/routes/_index.tsx +1 -0
  912. package/corpus/templates/slides-2/app/routes/access-request.approve.tsx +276 -0
  913. package/corpus/templates/slides-2/app/routes/agent.tsx +19 -0
  914. package/corpus/templates/slides-2/app/routes/chat.$threadId.tsx +1 -0
  915. package/corpus/templates/slides-2/app/routes/chat.tsx +190 -0
  916. package/corpus/templates/slides-2/app/routes/deck.$id.tsx +10 -0
  917. package/corpus/templates/slides-2/app/routes/deck.$id_.present.tsx +10 -0
  918. package/corpus/templates/slides-2/app/routes/design-systems.tsx +10 -0
  919. package/corpus/templates/slides-2/app/routes/extensions.$id.$slug.tsx +2 -0
  920. package/corpus/templates/slides-2/app/routes/extensions.$id.tsx +5 -0
  921. package/corpus/templates/slides-2/app/routes/extensions._index.tsx +5 -0
  922. package/corpus/templates/slides-2/app/routes/extensions.tsx +5 -0
  923. package/corpus/templates/slides-2/app/routes/home-layout.tsx +31 -0
  924. package/corpus/templates/slides-2/app/routes/home.tsx +22 -0
  925. package/corpus/templates/slides-2/app/routes/p.$id.tsx +195 -0
  926. package/corpus/templates/slides-2/app/routes/settings.$.tsx +1 -0
  927. package/corpus/templates/slides-2/app/routes/settings.tsx +131 -0
  928. package/corpus/templates/slides-2/app/routes/share.$token.tsx +137 -0
  929. package/corpus/templates/slides-2/app/routes/slide.tsx +209 -0
  930. package/corpus/templates/slides-2/app/routes/team.tsx +11 -0
  931. package/corpus/templates/slides-2/app/routes/templates.tsx +1 -0
  932. package/corpus/templates/slides-2/app/routes/themes.$id.tsx +1 -0
  933. package/corpus/templates/slides-2/app/routes/themes.tsx +1 -0
  934. package/corpus/templates/slides-2/app/routes.ts +24 -0
  935. package/corpus/templates/slides-2/app/vite-env.d.ts +24 -0
  936. package/corpus/templates/slides-2/changelog/2026-10-17-find-and-switch-decks-from-the-presenter-console.md +6 -0
  937. package/corpus/templates/slides-2/changelog/2026-10-17-meet-slides-2-create-and-refine-editable-slide-decks-with-an.md +6 -0
  938. package/corpus/templates/slides-2/changelog/2026-10-17-pptx-image-export.md +6 -0
  939. package/corpus/templates/slides-2/changelog/2026-10-17-visual-editor.md +6 -0
  940. package/corpus/templates/slides-2/changelog/2026-10-18-apply-an-accessible-design-system-to-an-existing-deck-before.md +6 -0
  941. package/corpus/templates/slides-2/changelog/2026-10-18-choose-a-template-or-start-a-new-presentation-from-the-slide.md +6 -0
  942. package/corpus/templates/slides-2/changelog/2026-10-18-generate-decks-from-a-prompt-then-edit-slide-elements-direct.md +6 -0
  943. package/corpus/templates/slides-2/changelog/2026-10-18-generate-presentation-decks-from-a-prompt-and-edit-every-sli.md +6 -0
  944. package/corpus/templates/slides-2/changelog/2026-10-18-new-presentation-drafts-save-before-generation-starts-so-you.md +6 -0
  945. package/corpus/templates/slides-2/changelog/2026-10-18-the-assistant-can-undo-redo-and-save-pending-edits-in-the-vi.md +6 -0
  946. package/corpus/templates/slides-2/changelog/2026-10-19-agents-can-insert-duplicate-and-delete-canvas-objects-in-sou.md +6 -0
  947. package/corpus/templates/slides-2/changelog/2026-10-19-browse-slide-themes.md +6 -0
  948. package/corpus/templates/slides-2/changelog/2026-10-19-clicking-a-slide-preview-in-overview-selects-that-slide.md +6 -0
  949. package/corpus/templates/slides-2/changelog/2026-10-19-create-decks-from-a-prompt-and-edit-slides-directly-on-the-c.md +6 -0
  950. package/corpus/templates/slides-2/changelog/2026-10-19-creating-and-editing-decks-now-starts-with-the-tools-most-re.md +6 -0
  951. package/corpus/templates/slides-2/changelog/2026-10-19-deleting-decks-revokes-public-links.md +7 -0
  952. package/corpus/templates/slides-2/changelog/2026-10-19-escape-cancels-an-in-progress-slide-drag-without-losing-earl.md +6 -0
  953. package/corpus/templates/slides-2/changelog/2026-10-19-import-failures-now-show-clear-localized-descriptions-instea.md +6 -0
  954. package/corpus/templates/slides-2/changelog/2026-10-19-presenter-controls-stay-responsive-when-moving-over-the-slid.md +6 -0
  955. package/corpus/templates/slides-2/changelog/2026-10-19-presenter-notes-stay-private-from-viewers-and-commenters.md +6 -0
  956. package/corpus/templates/slides-2/changelog/2026-10-19-preview-generated-slides-in-chat.md +6 -0
  957. package/corpus/templates/slides-2/changelog/2026-10-19-remote-image-previews-accept-supported-raster-formats.md +6 -0
  958. 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
  959. package/corpus/templates/slides-2/changelog/2026-10-19-slide-generation-explains-when-react-effect-hooks-cannot-run.md +6 -0
  960. package/corpus/templates/slides-2/changelog/2026-10-19-the-editor-highlights-hovered-objects-and-keeps-image-replac.md +6 -0
  961. package/corpus/templates/slides-2/changelog/2026-10-19-the-slide-editor-uses-the-shared-agent-native-controls.md +6 -0
  962. package/corpus/templates/slides-2/changelog/2026-10-20-deck-editing-controls-match-the-workspace.md +6 -0
  963. package/corpus/templates/slides-2/changelog/2026-10-20-google-slides-imports-now-report-missing-image-data-instead-.md +6 -0
  964. package/corpus/templates/slides-2/changelog/2026-10-20-imports-and-previews-handle-large-content-safely.md +6 -0
  965. package/corpus/templates/slides-2/changelog/2026-10-20-public-deck-pages-can-export-source-backed-slides-to-pdf.md +6 -0
  966. package/corpus/templates/slides-2/changelog/2026-10-20-saved-slide-images-stay-available.md +6 -0
  967. package/corpus/templates/slides-2/changelog/2026-10-20-scope-global-media-picks-to-assets-the-current-deck-can-reso.md +6 -0
  968. package/corpus/templates/slides-2/components.json +20 -0
  969. package/corpus/templates/slides-2/drizzle.config.ts +3 -0
  970. package/corpus/templates/slides-2/learnings.defaults.md +5 -0
  971. package/corpus/templates/slides-2/netlify.toml +24 -0
  972. package/corpus/templates/slides-2/package.json +147 -0
  973. package/corpus/templates/slides-2/public/agent-native-icon-dark.svg +10 -0
  974. package/corpus/templates/slides-2/public/agent-native-icon-light.svg +10 -0
  975. package/corpus/templates/slides-2/public/agent-native-logo-dark.svg +21 -0
  976. package/corpus/templates/slides-2/public/agent-native-logo-light.svg +21 -0
  977. package/corpus/templates/slides-2/public/assets/builder-logo-white.svg +15 -0
  978. package/corpus/templates/slides-2/public/assets/generated/preview.html +61 -0
  979. package/corpus/templates/slides-2/public/assets/intuit-logo-white.svg +6 -0
  980. package/corpus/templates/slides-2/public/assets/walmart-logo-white.svg +6 -0
  981. package/corpus/templates/slides-2/public/chatgpt-plugin-icon.svg +7 -0
  982. package/corpus/templates/slides-2/public/favicon.svg +1 -0
  983. package/corpus/templates/slides-2/public/icon-180.svg +1 -0
  984. package/corpus/templates/slides-2/public/icon-192.svg +1 -0
  985. package/corpus/templates/slides-2/public/icon-512.svg +1 -0
  986. package/corpus/templates/slides-2/public/manifest.json +20 -0
  987. package/corpus/templates/slides-2/public/placeholder.svg +1 -0
  988. package/corpus/templates/slides-2/public/robots.txt +14 -0
  989. package/corpus/templates/slides-2/public/visual-edit-structure-proof.html +99 -0
  990. package/corpus/templates/slides-2/react-router.config.ts +7 -0
  991. package/corpus/templates/slides-2/scripts/edit-fidelity/README.md +499 -0
  992. package/corpus/templates/slides-2/scripts/edit-fidelity/authoring-fuzz.ts +9517 -0
  993. package/corpus/templates/slides-2/scripts/edit-fidelity/baseline.json +16427 -0
  994. package/corpus/templates/slides-2/scripts/edit-fidelity/dev-server-url.ts +10 -0
  995. package/corpus/templates/slides-2/scripts/edit-fidelity/lib/in-page.ts +1975 -0
  996. package/corpus/templates/slides-2/scripts/edit-fidelity/lib/metrics.ts +1401 -0
  997. package/corpus/templates/slides-2/scripts/edit-fidelity/retry-infra.ts +7 -0
  998. package/corpus/templates/slides-2/scripts/edit-fidelity/run-options.ts +21 -0
  999. package/corpus/templates/slides-2/scripts/edit-fidelity/run-outcomes.ts +127 -0
  1000. package/corpus/templates/slides-2/scripts/edit-fidelity/run.ts +8451 -0
  1001. package/corpus/templates/slides-2/scripts/export-fidelity/README.md +116 -0
  1002. package/corpus/templates/slides-2/scripts/export-fidelity/compare-layout-lib.ts +241 -0
  1003. package/corpus/templates/slides-2/scripts/export-fidelity/compare-layout.ts +30 -0
  1004. package/corpus/templates/slides-2/scripts/export-fidelity/diff.ts +222 -0
  1005. package/corpus/templates/slides-2/scripts/export-fidelity/export.ts +765 -0
  1006. package/corpus/templates/slides-2/scripts/export-fidelity/fixtures/agent-dark-deck.json +48 -0
  1007. package/corpus/templates/slides-2/scripts/export-fidelity/generate-calibration.ts +765 -0
  1008. package/corpus/templates/slides-2/scripts/export-fidelity/google-export.ts +137 -0
  1009. package/corpus/templates/slides-2/scripts/export-fidelity/google-layout.ts +82 -0
  1010. package/corpus/templates/slides-2/scripts/export-fidelity/resolve-pkg.ts +29 -0
  1011. package/corpus/templates/slides-2/scripts/migrate-production.ts +22 -0
  1012. package/corpus/templates/slides-2/server/db/index.ts +73 -0
  1013. package/corpus/templates/slides-2/server/db/schema.ts +189 -0
  1014. package/corpus/templates/slides-2/server/handlers/assets-url.ts +13 -0
  1015. package/corpus/templates/slides-2/server/handlers/assets.ts +3217 -0
  1016. package/corpus/templates/slides-2/server/handlers/decks.ts +185 -0
  1017. package/corpus/templates/slides-2/server/handlers/demo.ts +9 -0
  1018. package/corpus/templates/slides-2/server/handlers/design-systems.ts +219 -0
  1019. package/corpus/templates/slides-2/server/handlers/google-docs-auth.ts +165 -0
  1020. package/corpus/templates/slides-2/server/handlers/image-gen.ts +153 -0
  1021. package/corpus/templates/slides-2/server/handlers/image-providers/gemini.ts +209 -0
  1022. package/corpus/templates/slides-2/server/handlers/image-providers/index.ts +61 -0
  1023. package/corpus/templates/slides-2/server/handlers/image-providers/openai.ts +288 -0
  1024. package/corpus/templates/slides-2/server/handlers/image-providers/types.ts +35 -0
  1025. package/corpus/templates/slides-2/server/handlers/import/docx-parser.ts +31 -0
  1026. package/corpus/templates/slides-2/server/handlers/import/html-converter.ts +1534 -0
  1027. package/corpus/templates/slides-2/server/handlers/import/pdf-fidelity-parser.ts +1039 -0
  1028. package/corpus/templates/slides-2/server/handlers/import/pdf-sidecar-reader.ts +81 -0
  1029. package/corpus/templates/slides-2/server/handlers/import/pdf-style-digest.ts +187 -0
  1030. package/corpus/templates/slides-2/server/handlers/import/pptx-assets.ts +155 -0
  1031. package/corpus/templates/slides-2/server/handlers/import/pptx-parser.ts +57 -0
  1032. package/corpus/templates/slides-2/server/handlers/request-auth-context.ts +108 -0
  1033. package/corpus/templates/slides-2/server/handlers/share.ts +52 -0
  1034. package/corpus/templates/slides-2/server/handlers/uploads-chunked.ts +1066 -0
  1035. package/corpus/templates/slides-2/server/handlers/uploads.ts +457 -0
  1036. package/corpus/templates/slides-2/server/lib/access-request-email.ts +66 -0
  1037. package/corpus/templates/slides-2/server/lib/assets-image-delegation.ts +331 -0
  1038. package/corpus/templates/slides-2/server/lib/bounded-multipart.ts +49 -0
  1039. package/corpus/templates/slides-2/server/lib/builder-design-system-proxy.ts +122 -0
  1040. package/corpus/templates/slides-2/server/lib/chat-attachments.ts +425 -0
  1041. package/corpus/templates/slides-2/server/lib/chatgpt-directory-tools.ts +246 -0
  1042. package/corpus/templates/slides-2/server/lib/chunked-upload-session.ts +195 -0
  1043. package/corpus/templates/slides-2/server/lib/comment-notifications.ts +184 -0
  1044. package/corpus/templates/slides-2/server/lib/deck-access-requests.ts +102 -0
  1045. package/corpus/templates/slides-2/server/lib/deck-asset-scope.ts +150 -0
  1046. package/corpus/templates/slides-2/server/lib/deck-export-tracking.ts +119 -0
  1047. package/corpus/templates/slides-2/server/lib/deck-templates/a-case-study.ts +154 -0
  1048. package/corpus/templates/slides-2/server/lib/deck-templates/a-company.ts +160 -0
  1049. package/corpus/templates/slides-2/server/lib/deck-templates/a-pitch.ts +151 -0
  1050. package/corpus/templates/slides-2/server/lib/deck-templates/a-quarterly.ts +264 -0
  1051. package/corpus/templates/slides-2/server/lib/deck-templates/a-shared.ts +35 -0
  1052. package/corpus/templates/slides-2/server/lib/deck-templates/a-update.ts +188 -0
  1053. package/corpus/templates/slides-2/server/lib/deck-templates/a-workshop.ts +196 -0
  1054. package/corpus/templates/slides-2/server/lib/deck-templates/b-keynote.ts +131 -0
  1055. package/corpus/templates/slides-2/server/lib/deck-templates/b-lesson.ts +209 -0
  1056. package/corpus/templates/slides-2/server/lib/deck-templates/b-manifesto.ts +149 -0
  1057. package/corpus/templates/slides-2/server/lib/deck-templates/b-portfolio.ts +144 -0
  1058. package/corpus/templates/slides-2/server/lib/deck-templates/b-research.ts +221 -0
  1059. package/corpus/templates/slides-2/server/lib/deck-templates/b-roadmap.ts +264 -0
  1060. package/corpus/templates/slides-2/server/lib/deck-templates/b-shared.ts +44 -0
  1061. package/corpus/templates/slides-2/server/lib/deck-templates/group-a.ts +16 -0
  1062. package/corpus/templates/slides-2/server/lib/deck-templates/group-b.ts +16 -0
  1063. package/corpus/templates/slides-2/server/lib/deck-templates/legacy.ts +567 -0
  1064. package/corpus/templates/slides-2/server/lib/deck-templates.ts +60 -0
  1065. package/corpus/templates/slides-2/server/lib/deck-versions.ts +233 -0
  1066. package/corpus/templates/slides-2/server/lib/design-system-workflows.ts +22 -0
  1067. package/corpus/templates/slides-2/server/lib/emails.ts +84 -0
  1068. package/corpus/templates/slides-2/server/lib/env-config.ts +15 -0
  1069. package/corpus/templates/slides-2/server/lib/fetch-remote-image.ts +245 -0
  1070. package/corpus/templates/slides-2/server/lib/generation-completion.ts +278 -0
  1071. package/corpus/templates/slides-2/server/lib/google-docs-access.ts +51 -0
  1072. package/corpus/templates/slides-2/server/lib/google-docs-error.ts +54 -0
  1073. package/corpus/templates/slides-2/server/lib/google-docs-oauth.ts +422 -0
  1074. package/corpus/templates/slides-2/server/lib/google-fonts.ts +509 -0
  1075. package/corpus/templates/slides-2/server/lib/google-oauth-preflight.ts +119 -0
  1076. package/corpus/templates/slides-2/server/lib/google-slides-export-availability.ts +55 -0
  1077. package/corpus/templates/slides-2/server/lib/image-proxy-response.ts +16 -0
  1078. package/corpus/templates/slides-2/server/lib/image-proxy-url.ts +155 -0
  1079. package/corpus/templates/slides-2/server/lib/import-asset-storage.ts +214 -0
  1080. package/corpus/templates/slides-2/server/lib/imported-asset-batch.ts +218 -0
  1081. package/corpus/templates/slides-2/server/lib/legacy-slide-source.ts +692 -0
  1082. package/corpus/templates/slides-2/server/lib/media-search-providers.ts +216 -0
  1083. package/corpus/templates/slides-2/server/lib/native-creative-context.ts +295 -0
  1084. package/corpus/templates/slides-2/server/lib/pdf-parse-setup.ts +115 -0
  1085. package/corpus/templates/slides-2/server/lib/provider-api.ts +57 -0
  1086. package/corpus/templates/slides-2/server/lib/request-wait-until.ts +30 -0
  1087. package/corpus/templates/slides-2/server/lib/shared-deck.ts +29 -0
  1088. package/corpus/templates/slides-2/server/lib/slide-asset-references.ts +309 -0
  1089. package/corpus/templates/slides-2/server/lib/slide-content-patch.ts +1004 -0
  1090. package/corpus/templates/slides-2/server/lib/slide-hygiene.ts +731 -0
  1091. package/corpus/templates/slides-2/server/lib/slide-image-insertion.ts +136 -0
  1092. package/corpus/templates/slides-2/server/lib/slide-reveal-issues.ts +41 -0
  1093. package/corpus/templates/slides-2/server/lib/slide-source-editing/babel-walk.ts +117 -0
  1094. package/corpus/templates/slides-2/server/lib/slide-source-editing/batch-edit.ts +152 -0
  1095. package/corpus/templates/slides-2/server/lib/slide-source-editing/edit-ops.ts +1478 -0
  1096. package/corpus/templates/slides-2/server/lib/slide-source-editing/image-target.ts +128 -0
  1097. package/corpus/templates/slides-2/server/lib/slide-source-editing/text-diff.ts +23 -0
  1098. package/corpus/templates/slides-2/server/lib/slide-source-limits.ts +9 -0
  1099. package/corpus/templates/slides-2/server/lib/slide-source.ts +1786 -0
  1100. package/corpus/templates/slides-2/server/lib/slide-theme-demo-sources.ts +2106 -0
  1101. package/corpus/templates/slides-2/server/lib/slide-themes.ts +2174 -0
  1102. package/corpus/templates/slides-2/server/lib/slide-worker-runtime.ts +1995 -0
  1103. package/corpus/templates/slides-2/server/lib/slides-tracking.ts +73 -0
  1104. package/corpus/templates/slides-2/server/lib/source-import.ts +213 -0
  1105. package/corpus/templates/slides-2/server/lib/svgl.ts +364 -0
  1106. package/corpus/templates/slides-2/server/lib/tenant-files.ts +179 -0
  1107. package/corpus/templates/slides-2/server/lib/upload-storage-status.ts +9 -0
  1108. package/corpus/templates/slides-2/server/lib/uploaded-asset-cleanup-outbox.ts +521 -0
  1109. package/corpus/templates/slides-2/server/lib/uploaded-asset-object-lifecycle.ts +404 -0
  1110. package/corpus/templates/slides-2/server/lib/uploaded-fonts.ts +696 -0
  1111. package/corpus/templates/slides-2/server/lib/uploaded-reference-storage.ts +77 -0
  1112. package/corpus/templates/slides-2/server/lib/validate-slide-animations.ts +341 -0
  1113. package/corpus/templates/slides-2/server/middleware/auth.ts +6 -0
  1114. package/corpus/templates/slides-2/server/plugins/_dev-upload-stub.ts +6 -0
  1115. package/corpus/templates/slides-2/server/plugins/agent-chat.ts +402 -0
  1116. package/corpus/templates/slides-2/server/plugins/auth.ts +31 -0
  1117. package/corpus/templates/slides-2/server/plugins/collab.ts +30 -0
  1118. package/corpus/templates/slides-2/server/plugins/config.ts +6 -0
  1119. package/corpus/templates/slides-2/server/plugins/core-routes.ts +30 -0
  1120. package/corpus/templates/slides-2/server/plugins/creative-context.ts +187 -0
  1121. package/corpus/templates/slides-2/server/plugins/db.ts +462 -0
  1122. package/corpus/templates/slides-2/server/plugins/feature-flags.ts +5 -0
  1123. package/corpus/templates/slides-2/server/plugins/labs.ts +8 -0
  1124. package/corpus/templates/slides-2/server/plugins/orphaned-asset-cleanup.ts +17 -0
  1125. package/corpus/templates/slides-2/server/plugins/otel.ts +6 -0
  1126. package/corpus/templates/slides-2/server/plugins/transactional-emails.ts +5 -0
  1127. package/corpus/templates/slides-2/server/register-secrets.ts +209 -0
  1128. package/corpus/templates/slides-2/server/routes/[...page].get.ts +5 -0
  1129. package/corpus/templates/slides-2/server/routes/[...page].head.ts +1 -0
  1130. package/corpus/templates/slides-2/server/routes/[base]/_agent-native/google-docs/auth-url.get.ts +1 -0
  1131. package/corpus/templates/slides-2/server/routes/[base]/_agent-native/google-docs/callback.get.ts +1 -0
  1132. package/corpus/templates/slides-2/server/routes/_agent-native/google-docs/auth-url.get.ts +1 -0
  1133. package/corpus/templates/slides-2/server/routes/_agent-native/google-docs/callback.get.ts +1 -0
  1134. package/corpus/templates/slides-2/server/routes/api/assets/upload-video.post.ts +1 -0
  1135. package/corpus/templates/slides-2/server/routes/api/assets/upload.post.ts +1 -0
  1136. package/corpus/templates/slides-2/server/routes/api/assets/video-uploads.delete.ts +1 -0
  1137. package/corpus/templates/slides-2/server/routes/api/deck-agent-context.json.get.ts +105 -0
  1138. package/corpus/templates/slides-2/server/routes/api/decks/events.get.ts +1 -0
  1139. package/corpus/templates/slides-2/server/routes/api/demo.get.ts +1 -0
  1140. package/corpus/templates/slides-2/server/routes/api/exports/[filename].get.ts +221 -0
  1141. package/corpus/templates/slides-2/server/routes/api/exports/google-slides.post.ts +240 -0
  1142. package/corpus/templates/slides-2/server/routes/api/exports/html.post.ts +67 -0
  1143. package/corpus/templates/slides-2/server/routes/api/exports/pptx.post.ts +100 -0
  1144. package/corpus/templates/slides-2/server/routes/api/gen-preview/[...].get.ts +24 -0
  1145. package/corpus/templates/slides-2/server/routes/api/generated/[...].get.ts +24 -0
  1146. package/corpus/templates/slides-2/server/routes/api/image-proxy.get.ts +518 -0
  1147. package/corpus/templates/slides-2/server/routes/api/import-assets/[token].get.ts +70 -0
  1148. package/corpus/templates/slides-2/server/routes/api/preview-images.get.ts +20 -0
  1149. package/corpus/templates/slides-2/server/routes/api/share/[token].get.ts +1 -0
  1150. package/corpus/templates/slides-2/server/routes/api/uploads-chunked/[sessionId]/chunk.post.ts +1 -0
  1151. package/corpus/templates/slides-2/server/routes/api/uploads-chunked/[sessionId]/status.get.ts +1 -0
  1152. package/corpus/templates/slides-2/server/routes/api/uploads-chunked/[sessionId].delete.ts +1 -0
  1153. package/corpus/templates/slides-2/server/routes/api/uploads-chunked/start.post.ts +1 -0
  1154. package/corpus/templates/slides-2/server/routes/api/uploads.delete.ts +1 -0
  1155. package/corpus/templates/slides-2/server/routes/api/uploads.post.ts +1 -0
  1156. package/corpus/templates/slides-2/server/workspace-defaults.ts +196 -0
  1157. package/corpus/templates/slides-2/shared/action-ui.ts +147 -0
  1158. package/corpus/templates/slides-2/shared/agent-readable.ts +2 -0
  1159. package/corpus/templates/slides-2/shared/api.ts +406 -0
  1160. package/corpus/templates/slides-2/shared/app-state-tabs.ts +30 -0
  1161. package/corpus/templates/slides-2/shared/app-storage.ts +9 -0
  1162. package/corpus/templates/slides-2/shared/aspect-ratios.ts +49 -0
  1163. package/corpus/templates/slides-2/shared/blank-slide.ts +179 -0
  1164. package/corpus/templates/slides-2/shared/client-compatibility.ts +2 -0
  1165. package/corpus/templates/slides-2/shared/contrast-audit.ts +255 -0
  1166. package/corpus/templates/slides-2/shared/deck-access.ts +26 -0
  1167. package/corpus/templates/slides-2/shared/deck-app-scope.ts +14 -0
  1168. package/corpus/templates/slides-2/shared/deck-content.ts +37 -0
  1169. package/corpus/templates/slides-2/shared/deck-history-control.ts +79 -0
  1170. package/corpus/templates/slides-2/shared/deck-scope.ts +5 -0
  1171. package/corpus/templates/slides-2/shared/deck-title.ts +199 -0
  1172. package/corpus/templates/slides-2/shared/deck-write.ts +61 -0
  1173. package/corpus/templates/slides-2/shared/design-flags.ts +7 -0
  1174. package/corpus/templates/slides-2/shared/design-system-validation.ts +88 -0
  1175. package/corpus/templates/slides-2/shared/editor-control.ts +120 -0
  1176. package/corpus/templates/slides-2/shared/generation-timing.ts +19 -0
  1177. package/corpus/templates/slides-2/shared/google-docs.ts +69 -0
  1178. package/corpus/templates/slides-2/shared/labs.ts +10 -0
  1179. package/corpus/templates/slides-2/shared/overview-navigation.ts +34 -0
  1180. package/corpus/templates/slides-2/shared/ownership.ts +6 -0
  1181. package/corpus/templates/slides-2/shared/pdf-sidecar.ts +130 -0
  1182. package/corpus/templates/slides-2/shared/presenter-control.ts +111 -0
  1183. package/corpus/templates/slides-2/shared/representative-slide.ts +89 -0
  1184. package/corpus/templates/slides-2/shared/slide-background.ts +30 -0
  1185. package/corpus/templates/slides-2/shared/slide-comment-anchor.ts +117 -0
  1186. package/corpus/templates/slides-2/shared/slide-comment-reactions.ts +47 -0
  1187. package/corpus/templates/slides-2/shared/slide-design-tokens.ts +92 -0
  1188. package/corpus/templates/slides-2/shared/slide-fit.ts +78 -0
  1189. package/corpus/templates/slides-2/shared/slide-ids.ts +133 -0
  1190. package/corpus/templates/slides-2/shared/slide-number.ts +124 -0
  1191. package/corpus/templates/slides-2/shared/slide-object-structure.ts +790 -0
  1192. package/corpus/templates/slides-2/shared/slide-text-range-selection.ts +50 -0
  1193. package/corpus/templates/slides-2/shared/slide-transitions.ts +70 -0
  1194. package/corpus/templates/slides-2/shared/slides-2-transition.ts +194 -0
  1195. package/corpus/templates/slides-2/shared/slides-user-prefs.ts +22 -0
  1196. package/corpus/templates/slides-2/shared/source-import-errors.ts +12 -0
  1197. package/corpus/templates/slides-2/shared/source-runtime-export.ts +76 -0
  1198. package/corpus/templates/slides-2/shared/upload-types.ts +41 -0
  1199. package/corpus/templates/slides-2/ssr-entry.ts +11 -0
  1200. package/corpus/templates/slides-2/tsconfig.json +27 -0
  1201. package/corpus/templates/slides-2/vite.config.ts +77 -0
  1202. package/corpus/templates/slides-2/vitest.config.ts +28 -0
  1203. package/corpus/templates/tasks/.agents/skills/actions/references/action-fields.md +1 -1
  1204. package/package.json +1 -1
  1205. package/corpus/templates/design/.agents/skills/shader-fills/SKILL.md +0 -182
  1206. package/corpus/templates/design/actions/apply-shader-fill.ts +0 -450
  1207. package/corpus/templates/design/actions/apply-shader.ts +0 -257
  1208. package/corpus/templates/design/actions/preview-shader-fill.ts +0 -157
  1209. package/corpus/templates/design/app/components/design/inspector/GlslShaderPanel.tsx +0 -1144
  1210. package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +0 -450
  1211. package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +0 -71
  1212. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +0 -555
  1213. package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +0 -105
  1214. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +0 -433
  1215. package/corpus/templates/design/app/components/design/inspector/color-picker-shader-pane.tsx +0 -648
  1216. package/corpus/templates/design/shared/shader-fill.ts +0 -174
  1217. 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,
@@ -69,6 +82,8 @@ export class NativeSourceError extends Error {
69
82
  }
70
83
  }
71
84
 
85
+ export class NativeSourceCapabilityError extends NativeSourceError {}
86
+
72
87
  export function nativePresentationVisible(
73
88
  canvas: HTMLCanvasElement,
74
89
  viewport: { width: number; height: number },
@@ -357,24 +372,47 @@ function authoredOpacity(
357
372
 
358
373
  export function nativeDocumentOrigin(): string {
359
374
  if (location.origin !== "null") return location.origin;
375
+ const parentOrigin =
376
+ window.frameElement?.ownerDocument.defaultView?.location.origin;
377
+ if (
378
+ parentOrigin &&
379
+ parentOrigin !== "null" &&
380
+ /^https?:$/.test(new URL(parentOrigin).protocol)
381
+ )
382
+ return parentOrigin;
360
383
  try {
361
- const origin = window.parent.location.origin;
362
- if (origin && origin !== "null") return origin;
384
+ return trustedOpaquePreviewParentOrigin(document.referrer);
363
385
  } catch {
364
386
  throw new NativeSourceError(
365
387
  "source-origin-unavailable",
366
388
  "The parent source origin could not be verified.",
367
389
  );
368
390
  }
369
- throw new NativeSourceError(
370
- "source-origin-unavailable",
371
- "The source document has no trusted inherited origin.",
372
- );
391
+ }
392
+
393
+ function nativeAssetUrl(raw: string): URL {
394
+ try {
395
+ return new URL(raw);
396
+ } catch {
397
+ const base = document.baseURI;
398
+ let resolvedBase: string;
399
+ try {
400
+ resolvedBase = /^https?:$/.test(new URL(base).protocol)
401
+ ? base
402
+ : document.referrer;
403
+ return new URL(raw, resolvedBase);
404
+ } catch {
405
+ throw new NativeSourceError(
406
+ "source-asset-url-unreadable",
407
+ "The source asset URL could not be resolved.",
408
+ );
409
+ }
410
+ }
373
411
  }
374
412
 
375
413
  function assertLocalAsset(raw: string): void {
376
414
  if (!raw || raw.startsWith("data:") || raw.startsWith("blob:")) return;
377
- const url = new URL(raw, document.baseURI);
415
+ const url = nativeAssetUrl(raw);
378
416
  if (url.origin !== nativeDocumentOrigin()) {
379
417
  throw new NativeSourceError(
380
418
  "source-cross-origin",
@@ -389,13 +427,13 @@ function assertLeafSupported(
389
427
  readStyle: SourceStyleReader = getComputedStyle,
390
428
  ): void {
391
429
  if (element.shadowRoot) {
392
- throw new NativeSourceError(
430
+ throw new NativeSourceCapabilityError(
393
431
  "source-shadow-dom",
394
432
  "Shadow DOM source content is unsupported.",
395
433
  );
396
434
  }
397
- if (element instanceof HTMLIFrameElement) {
398
- throw new NativeSourceError(
435
+ if (isNativeHtmlTag(element, "iframe")) {
436
+ throw new NativeSourceCapabilityError(
399
437
  "source-iframe",
400
438
  "Iframe source content is unsupported.",
401
439
  );
@@ -406,7 +444,7 @@ function assertLeafSupported(
406
444
  style.filter !== "none" ||
407
445
  style.backdropFilter !== "none"
408
446
  ) {
409
- throw new NativeSourceError(
447
+ throw new NativeSourceCapabilityError(
410
448
  "source-css-composite",
411
449
  "CSS blend modes, filters, and backdrop filters need a separate compositor path.",
412
450
  );
@@ -417,15 +455,31 @@ function assertLeafSupported(
417
455
  "source-transform",
418
456
  "The selected source target has a 3D or perspective transform.",
419
457
  );
420
- } else if (element instanceof HTMLElement) {
458
+ } else if (isNativeHtmlElement(element)) {
421
459
  nodeGlobalTransform(element, readStyle);
422
460
  }
423
461
  for (const animation of element.getAnimations({ subtree: false })) {
424
462
  if (animation.playState !== "running") continue;
425
- const keyframes =
426
- animation.effect instanceof KeyframeEffect
427
- ? animation.effect.getKeyframes()
428
- : [];
463
+ const effect = animation.effect;
464
+ if (effect === null) continue;
465
+ if (
466
+ !("getKeyframes" in effect) ||
467
+ typeof effect.getKeyframes !== "function"
468
+ ) {
469
+ throw new NativeSourceError(
470
+ "source-animation",
471
+ "The running source animation's keyframes are unreadable.",
472
+ );
473
+ }
474
+ let keyframes: ComputedKeyframe[];
475
+ try {
476
+ keyframes = effect.getKeyframes();
477
+ } catch {
478
+ throw new NativeSourceError(
479
+ "source-animation",
480
+ "The running source animation's keyframes are unreadable.",
481
+ );
482
+ }
429
483
  const keys = new Set(keyframes.flatMap((frame) => Object.keys(frame)));
430
484
  for (const key of keys) {
431
485
  if (
@@ -439,7 +493,7 @@ function assertLeafSupported(
439
493
  "scale",
440
494
  ].includes(key)
441
495
  ) {
442
- throw new NativeSourceError(
496
+ throw new NativeSourceCapabilityError(
443
497
  "source-animation",
444
498
  "An animated source changes pixels; cached DOM capture supports transform-only motion.",
445
499
  );
@@ -453,7 +507,7 @@ function assertLeafSupported(
453
507
  for (const pseudo of ["::before", "::after"]) {
454
508
  const content = getComputedStyle(element, pseudo).content;
455
509
  if (content && content !== "none" && content !== "normal") {
456
- throw new NativeSourceError(
510
+ throw new NativeSourceCapabilityError(
457
511
  "source-pseudo",
458
512
  "CSS pseudo-element content is unsupported.",
459
513
  );
@@ -468,7 +522,7 @@ function hasDirectText(element: Element): boolean {
468
522
  }
469
523
 
470
524
  function isInlineFlowChild(element: Element): boolean {
471
- if (element instanceof HTMLBRElement) return true;
525
+ if (isNativeHtmlTag(element, "br")) return true;
472
526
  const display = getComputedStyle(element).display;
473
527
  return display === "contents" || display.startsWith("inline");
474
528
  }
@@ -500,18 +554,18 @@ function isPureTextFlow(element: HTMLElement): boolean {
500
554
  )
501
555
  return false;
502
556
  if (
503
- !(child instanceof HTMLElement) ||
504
- child instanceof HTMLImageElement ||
505
- child instanceof HTMLVideoElement ||
506
- child instanceof HTMLCanvasElement ||
507
- child instanceof HTMLIFrameElement ||
557
+ !isNativeHtmlElement(child) ||
558
+ isNativeHtmlTag(child, "img") ||
559
+ isNativeHtmlTag(child, "video") ||
560
+ isNativeHtmlTag(child, "canvas") ||
561
+ isNativeHtmlTag(child, "iframe") ||
508
562
  ["SCRIPT", "STYLE"].includes(child.tagName)
509
563
  )
510
564
  return false;
511
565
  const style = getComputedStyle(child);
512
566
  if (style.position === "absolute" || style.position === "fixed")
513
567
  return false;
514
- if (child instanceof HTMLBRElement) continue;
568
+ if (isNativeHtmlTag(child, "br")) continue;
515
569
  if (child.textContent?.trim() && !isPureTextFlow(child)) return false;
516
570
  }
517
571
  return true;
@@ -558,6 +612,108 @@ export function nativeTextFlowUsesDocumentFont(element: HTMLElement): boolean {
558
612
  return false;
559
613
  }
560
614
 
615
+ function nativeRenderedTextFlow(element: HTMLElement): {
616
+ read(node: Node, start: number, end: number): string;
617
+ dispose(): void;
618
+ } {
619
+ const clone = element.cloneNode(true) as HTMLElement;
620
+ const originals = [element, ...element.querySelectorAll<HTMLElement>("*")];
621
+ const copies = [clone, ...clone.querySelectorAll<HTMLElement>("*")];
622
+ for (let index = 0; index < originals.length; index++) {
623
+ const copy = copies[index]!;
624
+ copyComputedCss(originals[index]!, copy);
625
+ copy.removeAttribute("id");
626
+ copy.removeAttribute("data-agent-native-node-id");
627
+ for (const attribute of [...copy.attributes])
628
+ if (attribute.name.startsWith("data-an-native-"))
629
+ copy.removeAttribute(attribute.name);
630
+ copy.style.setProperty("animation", "none", "important");
631
+ copy.style.setProperty("transition", "none", "important");
632
+ }
633
+ const language = element.closest("[lang]")?.getAttribute("lang");
634
+ if (language !== undefined && language !== null)
635
+ clone.setAttribute("lang", language);
636
+ clone.setAttribute("data-an-native-presentation", "");
637
+ for (const [name, value] of Object.entries({
638
+ position: "fixed",
639
+ left: "-100000px",
640
+ top: "0px",
641
+ opacity: "0",
642
+ visibility: "visible",
643
+ "pointer-events": "none",
644
+ width: `${element.getBoundingClientRect().width}px`,
645
+ "min-width": "0px",
646
+ "max-width": "none",
647
+ "box-sizing": "border-box",
648
+ transform: "none",
649
+ translate: "none",
650
+ rotate: "none",
651
+ scale: "none",
652
+ }))
653
+ clone.style.setProperty(name, value, "important");
654
+ const nodes = new Map<Node, Text>();
655
+ const sourceWalker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT);
656
+ const cloneWalker = document.createTreeWalker(clone, NodeFilter.SHOW_TEXT);
657
+ for (
658
+ let node = sourceWalker.nextNode();
659
+ node;
660
+ node = sourceWalker.nextNode()
661
+ ) {
662
+ const copy = cloneWalker.nextNode();
663
+ if (!copy)
664
+ throw new NativeSourceCapabilityError(
665
+ "source-webfont-layout",
666
+ "The rendered text clone has a different text structure.",
667
+ );
668
+ nodes.set(node, copy as Text);
669
+ }
670
+ document.body.append(clone);
671
+ const fail = (): never => {
672
+ throw new NativeSourceCapabilityError(
673
+ "source-webfont-style",
674
+ "The browser could not preserve transformed text while measuring its rendered lines.",
675
+ );
676
+ };
677
+ try {
678
+ if (
679
+ typeof element.innerText !== "string" ||
680
+ clone.innerText !== element.innerText
681
+ )
682
+ fail();
683
+ } catch (error) {
684
+ clone.remove();
685
+ throw error;
686
+ }
687
+ return {
688
+ read(node, start, end) {
689
+ const copy = nodes.get(node);
690
+ if (!copy?.parentNode || copy.textContent !== node.textContent)
691
+ return fail();
692
+ const value = copy.textContent ?? "";
693
+ const before = document.createTextNode(value.slice(0, start));
694
+ const after = document.createTextNode(value.slice(end));
695
+ const span = document.createElement("span");
696
+ span.style.cssText =
697
+ "all:inherit!important;display:inline!important;position:static!important;float:none!important;margin:0!important;padding:0!important;border:0!important;contain:none!important";
698
+ span.textContent = value.slice(start, end);
699
+ copy.replaceWith(before, span, after);
700
+ try {
701
+ if (
702
+ clone.innerText !== element.innerText ||
703
+ typeof span.innerText !== "string"
704
+ )
705
+ return fail();
706
+ return span.innerText;
707
+ } finally {
708
+ before.replaceWith(copy);
709
+ span.remove();
710
+ after.remove();
711
+ }
712
+ },
713
+ dispose: () => clone.remove(),
714
+ };
715
+ }
716
+
561
717
  export async function paintNativeTextFlow(
562
718
  element: HTMLElement,
563
719
  canvas: HTMLCanvasElement,
@@ -566,7 +722,7 @@ export async function paintNativeTextFlow(
566
722
  captureRoi?: { density: number; pixelOffset: { x: number; y: number } },
567
723
  ): Promise<void> {
568
724
  if (!isPureTextFlow(element))
569
- throw new NativeSourceError(
725
+ throw new NativeSourceCapabilityError(
570
726
  "source-webfont-layout",
571
727
  "Canvas text capture needs a text-only flow without embedded media.",
572
728
  );
@@ -588,7 +744,7 @@ export async function paintNativeTextFlow(
588
744
  Math.abs(matrix.c) > 1e-5 ||
589
745
  Math.abs(matrix.d - 1) > 1e-5
590
746
  )
591
- throw new NativeSourceError(
747
+ throw new NativeSourceCapabilityError(
592
748
  "source-webfont-transform-unsupported",
593
749
  "Viewport Range measurements cannot capture transformed webfont text in local coordinates.",
594
750
  );
@@ -611,96 +767,102 @@ export async function paintNativeTextFlow(
611
767
  if (captureRoi)
612
768
  context.translate(captureRoi.pixelOffset.x, captureRoi.pixelOffset.y);
613
769
  context.scale(scaleX, scaleY);
614
- for (let node = walker.nextNode(); node; node = walker.nextNode()) {
615
- const value = node.textContent ?? "";
616
- if (!value.trim()) continue;
617
- if (/[\u200d\uFE0F\p{Mark}]/u.test(value))
618
- throw new NativeSourceError(
619
- "source-webfont-grapheme",
620
- "Complex joined glyphs need browser-shaped text capture.",
621
- );
622
- const parent = node.parentElement;
623
- if (!parent || parent.closest("[data-an-native-canvas]")) continue;
624
- const style = getComputedStyle(parent);
625
- if (
626
- style.writingMode !== "horizontal-tb" ||
627
- style.direction !== "ltr" ||
628
- style.textTransform !== "none" ||
629
- style.textDecorationLine !== "none" ||
630
- style.textShadow !== "none" ||
631
- style.fontVariantCaps !== "normal"
632
- )
633
- throw new NativeSourceError(
634
- "source-webfont-style",
635
- "This text style needs browser-shaped glyph capture.",
636
- );
637
- const family = style.fontFamily;
638
- const face = [...document.fonts].find((font) =>
639
- family.split(",").some(
640
- (name) =>
641
- name
642
- .trim()
643
- .replace(/^['"]|['"]$/g, "")
644
- .toLowerCase() ===
645
- font.family.replace(/^['"]|['"]$/g, "").toLowerCase(),
646
- ),
647
- );
648
- if (face && face.status !== "loaded")
649
- throw new NativeSourceError(
650
- "source-webfont-pending",
651
- `Font ${face.family} is not loaded for Canvas2D capture.`,
652
- );
653
- context.font = `${style.fontStyle} ${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;
654
- context.fontKerning = "normal";
655
- context.letterSpacing = style.letterSpacing;
656
- context.textBaseline = "alphabetic";
657
- // guard:allow-raw-color — text masks encode opaque coverage, independent of the editor theme.
658
- context.fillStyle = mask
659
- ? OPAQUE_COVERAGE_COLOR
660
- : (glyphColors?.get(parent) ?? style.color);
661
- const segments: { index: number; segment: string }[] = [];
662
- for (let index = 0; index < value.length; ) {
663
- const segment = String.fromCodePoint(value.codePointAt(index)!);
664
- segments.push({ index, segment });
665
- index += segment.length;
666
- }
667
- let lineStart = 0;
668
- let lineTop = Number.NaN;
669
- let lineRect: DOMRect | null = null;
670
- const drawLine = (end: number): void => {
671
- if (!lineRect || end <= lineStart) return;
672
- const text = value.slice(lineStart, end);
673
- const metric = context.measureText(text);
674
- const ascent =
675
- metric.actualBoundingBoxAscent ||
676
- Number.parseFloat(style.fontSize) * 0.8;
677
- const descent =
678
- metric.actualBoundingBoxDescent ||
679
- Number.parseFloat(style.fontSize) * 0.2;
680
- const baseline =
681
- lineRect.top - bounds.top + (lineRect.height + ascent - descent) / 2;
682
- context.fillText(text, lineRect.left - bounds.left, baseline);
683
- };
684
- for (const segment of segments) {
685
- range.setStart(node, segment.index);
686
- range.setEnd(node, segment.index + segment.segment.length);
687
- const rect = range.getBoundingClientRect();
688
- if (!rect.width && !rect.height) continue;
689
- if (lineRect && Math.abs(rect.top - lineTop) > 1) {
690
- drawLine(segment.index);
691
- lineStart = segment.index;
692
- lineRect = null;
770
+ let rendered: ReturnType<typeof nativeRenderedTextFlow> | undefined;
771
+ try {
772
+ for (let node = walker.nextNode(); node; node = walker.nextNode()) {
773
+ const value = node.textContent ?? "";
774
+ if (!value.trim()) continue;
775
+ if (/[\u200d\uFE0F\p{Mark}]/u.test(value))
776
+ throw new NativeSourceCapabilityError(
777
+ "source-webfont-grapheme",
778
+ "Complex joined glyphs need browser-shaped text capture.",
779
+ );
780
+ const parent = node.parentElement;
781
+ if (!parent || parent.closest("[data-an-native-canvas]")) continue;
782
+ const style = getComputedStyle(parent);
783
+ if (
784
+ style.writingMode !== "horizontal-tb" ||
785
+ style.direction !== "ltr" ||
786
+ style.textDecorationLine !== "none" ||
787
+ style.textShadow !== "none" ||
788
+ style.fontVariantCaps !== "normal"
789
+ )
790
+ throw new NativeSourceCapabilityError(
791
+ "source-webfont-style",
792
+ "This text style needs browser-shaped glyph capture.",
793
+ );
794
+ const renderedText = (start: number, end: number): string =>
795
+ style.textTransform === "none"
796
+ ? value.slice(start, end)
797
+ : (rendered ??= nativeRenderedTextFlow(element)).read(
798
+ node,
799
+ start,
800
+ end,
801
+ );
802
+ const font = `${style.fontStyle} ${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;
803
+ context.font = font;
804
+ if (
805
+ document.fonts &&
806
+ (typeof document.fonts.check !== "function" ||
807
+ !document.fonts.check(font, renderedText(0, value.length)))
808
+ )
809
+ throw new NativeSourceError(
810
+ "source-webfont-pending",
811
+ "The font for the rendered glyphs is not loaded for Canvas2D capture.",
812
+ );
813
+ context.fontKerning = "normal";
814
+ context.letterSpacing = style.letterSpacing;
815
+ context.textBaseline = "alphabetic";
816
+ // guard:allow-raw-color — text masks encode opaque coverage, independent of the editor theme.
817
+ context.fillStyle = mask
818
+ ? OPAQUE_COVERAGE_COLOR
819
+ : (glyphColors?.get(parent) ?? style.color);
820
+ const segments: { index: number; segment: string }[] = [];
821
+ for (let index = 0; index < value.length; ) {
822
+ const segment = String.fromCodePoint(value.codePointAt(index)!);
823
+ segments.push({ index, segment });
824
+ index += segment.length;
693
825
  }
694
- if (!lineRect) {
695
- lineRect = rect;
696
- lineTop = rect.top;
697
- lineStart = segment.index;
826
+ let lineStart = 0;
827
+ let lineTop = Number.NaN;
828
+ let lineRect: DOMRect | null = null;
829
+ const drawLine = (end: number): void => {
830
+ if (!lineRect || end <= lineStart) return;
831
+ const text = renderedText(lineStart, end);
832
+ const metric = context.measureText(text);
833
+ const ascent =
834
+ metric.actualBoundingBoxAscent ||
835
+ Number.parseFloat(style.fontSize) * 0.8;
836
+ const descent =
837
+ metric.actualBoundingBoxDescent ||
838
+ Number.parseFloat(style.fontSize) * 0.2;
839
+ const baseline =
840
+ lineRect.top - bounds.top + (lineRect.height + ascent - descent) / 2;
841
+ context.fillText(text, lineRect.left - bounds.left, baseline);
842
+ };
843
+ for (const segment of segments) {
844
+ range.setStart(node, segment.index);
845
+ range.setEnd(node, segment.index + segment.segment.length);
846
+ const rect = range.getBoundingClientRect();
847
+ if (!rect.width && !rect.height) continue;
848
+ if (lineRect && Math.abs(rect.top - lineTop) > 1) {
849
+ drawLine(segment.index);
850
+ lineStart = segment.index;
851
+ lineRect = null;
852
+ }
853
+ if (!lineRect) {
854
+ lineRect = rect;
855
+ lineTop = rect.top;
856
+ lineStart = segment.index;
857
+ }
698
858
  }
859
+ drawLine(value.length);
699
860
  }
700
- drawLine(value.length);
861
+ } finally {
862
+ rendered?.dispose();
863
+ context.restore();
864
+ range.detach();
701
865
  }
702
- context.restore();
703
- range.detach();
704
866
  }
705
867
 
706
868
  function preserveTextFlowStyles(
@@ -720,7 +882,7 @@ function preserveTextFlowStyles(
720
882
  }
721
883
  assertLeafSupported(child);
722
884
  copyComputedCss(child, copy);
723
- if (child instanceof HTMLElement) preserveTextFlowStyles(child, copy);
885
+ if (isNativeHtmlElement(child)) preserveTextFlowStyles(child, copy);
724
886
  }
725
887
  }
726
888
 
@@ -745,6 +907,12 @@ function hasVisibleBoxPaint(style: CSSStyleDeclaration): boolean {
745
907
  // guard:allow-raw-color — this compares the browser's computed transparent pixel value.
746
908
  (style.backgroundColor !== "rgba(0, 0, 0, 0)" &&
747
909
  style.backgroundColor !== "transparent") ||
910
+ hasVisibleBoxDecoration(style)
911
+ );
912
+ }
913
+
914
+ function hasVisibleBoxDecoration(style: CSSStyleDeclaration): boolean {
915
+ return (
748
916
  style.boxShadow !== "none" ||
749
917
  (style.outlineStyle &&
750
918
  style.outlineStyle !== "none" &&
@@ -882,12 +1050,12 @@ function sizeOf(element: HTMLElement | SVGSVGElement): {
882
1050
  } {
883
1051
  const rect = element.getBoundingClientRect();
884
1052
  const width = Math.ceil(
885
- element instanceof HTMLElement
1053
+ isNativeHtmlElement(element)
886
1054
  ? element.offsetWidth || rect.width
887
1055
  : rect.width,
888
1056
  );
889
1057
  const height = Math.ceil(
890
- element instanceof HTMLElement
1058
+ isNativeHtmlElement(element)
891
1059
  ? element.offsetHeight || rect.height
892
1060
  : rect.height,
893
1061
  );
@@ -909,7 +1077,7 @@ function contentBoxOf(element: HTMLElement | SVGSVGElement): {
909
1077
  width: number;
910
1078
  height: number;
911
1079
  } {
912
- if (element instanceof SVGSVGElement) {
1080
+ if (isNativeSvgRoot(element)) {
913
1081
  let box: DOMRect;
914
1082
  try {
915
1083
  box = element.getBBox();
@@ -1257,7 +1425,7 @@ function sourceLayoutSize(
1257
1425
  const cache = memo?.matches(target, space) ? memo.sizes : undefined;
1258
1426
  const cached = cache?.get(element);
1259
1427
  if (cached) return cached;
1260
- if (element instanceof SVGSVGElement) return nativeSvgViewportSize(element);
1428
+ if (isNativeSvgRoot(element)) return nativeSvgViewportSize(element);
1261
1429
  if (
1262
1430
  element === document.documentElement &&
1263
1431
  Number.isFinite(element.offsetWidth) &&
@@ -1341,7 +1509,7 @@ function viewportToTargetAffine(
1341
1509
  memo?: SourceGeometryMemo,
1342
1510
  ): NativeAffine2D {
1343
1511
  const inverted = invertNativeSourceAffine(
1344
- target instanceof SVGSVGElement
1512
+ isNativeSvgRoot(target)
1345
1513
  ? nativeSvgViewportToClient(target)
1346
1514
  : viewportSourceAffine(target, readStyle, memo),
1347
1515
  );
@@ -1370,19 +1538,18 @@ function relativeAffine(
1370
1538
  rect: NativeAffineBox;
1371
1539
  } {
1372
1540
  if (
1373
- (element instanceof SVGSVGElement || target instanceof SVGSVGElement) &&
1374
- (element instanceof HTMLElement || element instanceof SVGSVGElement) &&
1375
- (target instanceof HTMLElement || target instanceof SVGSVGElement)
1541
+ (isNativeSvgRoot(element) || isNativeSvgRoot(target)) &&
1542
+ (isNativeHtmlElement(element) || isNativeSvgRoot(element)) &&
1543
+ (isNativeHtmlElement(target) || isNativeSvgRoot(target))
1376
1544
  ) {
1377
1545
  const box = localBox ?? {
1378
1546
  x: 0,
1379
1547
  y: 0,
1380
1548
  ...(measuredSize ?? sourceLayoutSize(element, target, space, memo)),
1381
1549
  };
1382
- const elementToClient =
1383
- element instanceof SVGSVGElement
1384
- ? nativeSvgViewportToClient(element)
1385
- : viewportSourceAffine(element, readStyle);
1550
+ const elementToClient = isNativeSvgRoot(element)
1551
+ ? nativeSvgViewportToClient(element)
1552
+ : viewportSourceAffine(element, readStyle);
1386
1553
  const matrix =
1387
1554
  space === "target-viewport-axis-aligned"
1388
1555
  ? composeAffine(
@@ -1412,7 +1579,7 @@ function relativeAffine(
1412
1579
  rect: geometry.physicalBounds,
1413
1580
  };
1414
1581
  }
1415
- if (!(element instanceof HTMLElement) || !(target instanceof HTMLElement))
1582
+ if (!isNativeHtmlElement(element) || !isNativeHtmlElement(target))
1416
1583
  throw new NativeSourceError(
1417
1584
  "source-transform",
1418
1585
  "A source has no HTML layout box.",
@@ -1566,7 +1733,7 @@ export function sourceClipPlan(
1566
1733
  space === "target-local" ? target : undefined,
1567
1734
  readStyle,
1568
1735
  );
1569
- if (!(node instanceof HTMLElement) && !(node instanceof SVGSVGElement))
1736
+ if (!isNativeHtmlElement(node) && !isNativeSvgRoot(node))
1570
1737
  throw new NativeSourceError(
1571
1738
  "source-clip-unreadable",
1572
1739
  "A source clip has no HTML border box.",
@@ -1736,12 +1903,12 @@ function nativeBackdropReceiver(
1736
1903
  ] as const) {
1737
1904
  let sibling = canvas[direction];
1738
1905
  while (
1739
- sibling instanceof HTMLCanvasElement &&
1906
+ isNativeHtmlTag(sibling, "canvas") &&
1740
1907
  sibling.hasAttribute("data-an-native-backdrop-presentation")
1741
1908
  )
1742
1909
  sibling = sibling[direction];
1743
1910
  if (
1744
- (sibling instanceof HTMLElement || sibling instanceof SVGSVGElement) &&
1911
+ (isNativeHtmlElement(sibling) || isNativeSvgRoot(sibling)) &&
1745
1912
  sibling.getAttribute("data-agent-native-node-id") === receiverNodeId
1746
1913
  )
1747
1914
  return sibling;
@@ -1765,9 +1932,9 @@ export function nativeTargetOverflowInsets(
1765
1932
  const overflow = classifyNativeComputedOverflowClip(style);
1766
1933
  if (!overflow.ok)
1767
1934
  throw new NativeSourceError(`source-${overflow.reason}`, overflow.detail);
1768
- if (target instanceof SVGSVGElement) {
1935
+ if (isNativeSvgRoot(target)) {
1769
1936
  if (overflow.edge === "none")
1770
- throw new NativeSourceError(
1937
+ throw new NativeSourceCapabilityError(
1771
1938
  "source-svg-overflow-unsupported",
1772
1939
  "An SVG root needs a bounded vector viewport clip.",
1773
1940
  );
@@ -2237,12 +2404,12 @@ function laterPaintMayPrecedeReceiver(
2237
2404
  order.phase === "flow");
2238
2405
  if (
2239
2406
  precedes &&
2240
- ((element instanceof HTMLElement &&
2407
+ ((isNativeHtmlElement(element) &&
2241
2408
  (hasOwnPaint(element) ||
2242
- element instanceof HTMLImageElement ||
2243
- element instanceof HTMLVideoElement ||
2244
- element instanceof HTMLCanvasElement)) ||
2245
- element instanceof SVGElement)
2409
+ isNativeHtmlTag(element, "img") ||
2410
+ isNativeHtmlTag(element, "video") ||
2411
+ isNativeHtmlTag(element, "canvas"))) ||
2412
+ isNativeSvgElement(element))
2246
2413
  ) {
2247
2414
  const rect = element.getBoundingClientRect();
2248
2415
  if (
@@ -2286,7 +2453,7 @@ function rasterOwnedStyleNodes(
2286
2453
  element: HTMLElement | SVGSVGElement,
2287
2454
  phase: NativeOwnPaintPhase,
2288
2455
  ): Element[] {
2289
- if (element instanceof SVGSVGElement)
2456
+ if (isNativeSvgRoot(element))
2290
2457
  return [element, ...element.querySelectorAll("*")];
2291
2458
  if (
2292
2459
  phase === "background" ||
@@ -2538,12 +2705,12 @@ function cloneOwnPaint(
2538
2705
  }
2539
2706
  if (ownText && isInlineFlowChild(child)) {
2540
2707
  if (
2541
- !(child instanceof HTMLElement) ||
2542
- child instanceof HTMLImageElement ||
2543
- child instanceof HTMLCanvasElement ||
2544
- child instanceof HTMLVideoElement
2708
+ !isNativeHtmlElement(child) ||
2709
+ isNativeHtmlTag(child, "img") ||
2710
+ isNativeHtmlTag(child, "canvas") ||
2711
+ isNativeHtmlTag(child, "video")
2545
2712
  ) {
2546
- throw new NativeSourceError(
2713
+ throw new NativeSourceCapabilityError(
2547
2714
  "source-inline-media",
2548
2715
  "Inline media mixed into a text flow needs a separate source path.",
2549
2716
  );
@@ -2552,7 +2719,7 @@ function cloneOwnPaint(
2552
2719
  continue;
2553
2720
  }
2554
2721
  if (ownText)
2555
- throw new NativeSourceError(
2722
+ throw new NativeSourceCapabilityError(
2556
2723
  "source-mixed-flow",
2557
2724
  "Block children mixed with direct text cannot be split without changing text layout.",
2558
2725
  );
@@ -2674,7 +2841,7 @@ function cloneOwnPaint(
2674
2841
  node.style.outlineColor = "transparent";
2675
2842
  for (const child of node.children)
2676
2843
  if (
2677
- child instanceof HTMLElement &&
2844
+ isNativeHtmlElement(child) &&
2678
2845
  !child.hasAttribute("data-an-native-canvas")
2679
2846
  )
2680
2847
  clearBox(child);
@@ -2717,7 +2884,7 @@ export function cloneNativeTextFlow(element: HTMLElement): HTMLElement {
2717
2884
  node.style.boxShadow = "none";
2718
2885
  node.style.opacity = "1";
2719
2886
  for (const child of node.children)
2720
- if (child instanceof HTMLElement) whiten(child);
2887
+ if (isNativeHtmlElement(child)) whiten(child);
2721
2888
  };
2722
2889
  whiten(clone);
2723
2890
  return clone;
@@ -2897,15 +3064,13 @@ function nativeLeafCaptureDensity(
2897
3064
  requested: number,
2898
3065
  phase: NativeOwnPaintPhase = "all",
2899
3066
  ): number {
2900
- const size =
2901
- element instanceof SVGSVGElement
2902
- ? nativeSvgViewportSize(element)
2903
- : sizeOf(element);
3067
+ const size = isNativeSvgRoot(element)
3068
+ ? nativeSvgViewportSize(element)
3069
+ : sizeOf(element);
2904
3070
  const style = getComputedStyle(element);
2905
- const paint =
2906
- element instanceof SVGSVGElement
2907
- ? { x: 0, y: 0, ...size }
2908
- : nativeOwnPaintCaptureBox(style, phase, size);
3071
+ const paint = isNativeSvgRoot(element)
3072
+ ? { x: 0, y: 0, ...size }
3073
+ : nativeOwnPaintCaptureBox(style, phase, size);
2909
3074
  const overflow = classifyNativeComputedOverflowClip(style);
2910
3075
  if (!overflow.ok)
2911
3076
  throw new NativeSourceError(`source-${overflow.reason}`, overflow.detail);
@@ -2962,7 +3127,7 @@ async function inlineMediaPaintImages(
2962
3127
  let sourceUrl: URL;
2963
3128
  try {
2964
3129
  assertLocalAsset(raw);
2965
- sourceUrl = new URL(raw, document.baseURI);
3130
+ sourceUrl = nativeAssetUrl(raw);
2966
3131
  } catch (error) {
2967
3132
  if (error instanceof NativeSourceError) throw error;
2968
3133
  throw new NativeSourceError(
@@ -2971,7 +3136,7 @@ async function inlineMediaPaintImages(
2971
3136
  );
2972
3137
  }
2973
3138
  const image = new Image();
2974
- image.src = sourceUrl.href;
3139
+ image.src = await resolveOpaquePublicAsset(sourceUrl.href);
2975
3140
  try {
2976
3141
  await image.decode();
2977
3142
  } catch {
@@ -3186,7 +3351,7 @@ async function rasterOwnPaint(
3186
3351
  nativeTextFlowUsesDocumentFont(element);
3187
3352
  if (canvasText) {
3188
3353
  if (!isPureTextFlow(element))
3189
- throw new NativeSourceError(
3354
+ throw new NativeSourceCapabilityError(
3190
3355
  "source-webfont-layout",
3191
3356
  "Webfont text mixed with independent child paint needs a separate source path.",
3192
3357
  );
@@ -3195,7 +3360,7 @@ async function rasterOwnPaint(
3195
3360
  node.style.setProperty("-webkit-text-fill-color", "transparent");
3196
3361
  node.style.textShadow = "none";
3197
3362
  for (const child of node.children)
3198
- if (child instanceof HTMLElement) clearText(child);
3363
+ if (isNativeHtmlElement(child)) clearText(child);
3199
3364
  };
3200
3365
  clearText(clone);
3201
3366
  }
@@ -3334,7 +3499,7 @@ function motionOnlyStyleChange(before: string, after: string): boolean {
3334
3499
  function unchangedAttributeMutation(record: MutationRecord): boolean {
3335
3500
  return (
3336
3501
  record.type === "attributes" &&
3337
- record.target instanceof Element &&
3502
+ isNativeElement(record.target) &&
3338
3503
  record.attributeName !== null &&
3339
3504
  record.oldValue === record.target.getAttribute(record.attributeName)
3340
3505
  );
@@ -3343,29 +3508,28 @@ function unchangedAttributeMutation(record: MutationRecord): boolean {
3343
3508
  function runtimeCanvasMutation(record: MutationRecord): boolean {
3344
3509
  const runtimeCanvas =
3345
3510
  "canvas[data-an-native-canvas],canvas[data-an-native-presentation]";
3346
- if (record.target instanceof Element && record.target.closest(runtimeCanvas))
3511
+ if (isNativeElement(record.target) && record.target.closest(runtimeCanvas))
3347
3512
  return true;
3348
3513
  if (record.type !== "childList") return false;
3349
3514
  const changed = [...record.addedNodes, ...record.removedNodes];
3350
3515
  return (
3351
3516
  changed.length > 0 &&
3352
3517
  changed.every(
3353
- (node) => node instanceof Element && node.matches(runtimeCanvas),
3518
+ (node) => isNativeElement(node) && node.matches(runtimeCanvas),
3354
3519
  )
3355
3520
  );
3356
3521
  }
3357
3522
 
3358
3523
  function omittedSourceMutation(record: MutationRecord): boolean {
3359
- const target =
3360
- record.target instanceof Element
3361
- ? record.target
3362
- : record.target.parentElement;
3524
+ const target = isNativeElement(record.target)
3525
+ ? record.target
3526
+ : record.target.parentElement;
3363
3527
  if (target?.closest(OMIT)) return true;
3364
3528
  if (record.type !== "childList") return false;
3365
3529
  const changed = [...record.addedNodes, ...record.removedNodes];
3366
3530
  return (
3367
3531
  changed.length > 0 &&
3368
- changed.every((node) => node instanceof Element && node.matches(OMIT))
3532
+ changed.every((node) => isNativeElement(node) && node.matches(OMIT))
3369
3533
  );
3370
3534
  }
3371
3535
 
@@ -3375,7 +3539,7 @@ export function isNativeSourceOmittedMutation(record: MutationRecord): boolean {
3375
3539
 
3376
3540
  function isNativeSvgVectorGroup(element: Element): boolean {
3377
3541
  return (
3378
- element instanceof HTMLElement &&
3542
+ isNativeHtmlElement(element) &&
3379
3543
  element.hasAttribute("data-an-svg-vector-group")
3380
3544
  );
3381
3545
  }
@@ -3421,8 +3585,8 @@ export class CachedLeaf<T extends HTMLElement | SVGSVGElement = HTMLElement> {
3421
3585
  canvas: HTMLCanvasElement,
3422
3586
  density: number,
3423
3587
  ) => Promise<void> = async (element, canvas, density) => {
3424
- if (!(element instanceof HTMLElement))
3425
- throw new NativeSourceError(
3588
+ if (!isNativeHtmlElement(element))
3589
+ throw new NativeSourceCapabilityError(
3426
3590
  "source-inline-svg",
3427
3591
  "An SVG source needs its vector raster path.",
3428
3592
  );
@@ -3446,7 +3610,7 @@ export class CachedLeaf<T extends HTMLElement | SVGSVGElement = HTMLElement> {
3446
3610
  document.documentElement.hasAttribute(
3447
3611
  "data-an-native-source-idle-observer",
3448
3612
  ) &&
3449
- record.target instanceof Element &&
3613
+ isNativeElement(record.target) &&
3450
3614
  record.attributeName
3451
3615
  ) {
3452
3616
  const target = record.target;
@@ -3621,10 +3785,10 @@ export class CachedLeaf<T extends HTMLElement | SVGSVGElement = HTMLElement> {
3621
3785
 
3622
3786
  function afterMaybePromise<T>(
3623
3787
  value: T | Promise<T>,
3624
- continuation: (resolved: T) => void,
3788
+ continuation: (resolved: T) => void | Promise<void>,
3625
3789
  ): void | Promise<void> {
3626
3790
  if (value instanceof Promise) return value.then(continuation);
3627
- continuation(value);
3791
+ return continuation(value);
3628
3792
  }
3629
3793
 
3630
3794
  function normalizeCachedLeafError(error: unknown, element?: Element): unknown {
@@ -3662,7 +3826,7 @@ async function readReplayImageSafety(
3662
3826
  ): Promise<NativeReplaySafety> {
3663
3827
  try {
3664
3828
  if (raw.length > MAX_REPLAY_IMAGE_BYTES * 2) return "unknown";
3665
- const url = new URL(raw, document.baseURI);
3829
+ const url = nativeAssetUrl(raw);
3666
3830
  if (
3667
3831
  url.protocol !== "data:" &&
3668
3832
  url.protocol !== "blob:" &&
@@ -3672,7 +3836,8 @@ async function readReplayImageSafety(
3672
3836
  if (!["data:", "blob:", "http:", "https:"].includes(url.protocol))
3673
3837
  return "unknown";
3674
3838
  const network = url.protocol === "http:" || url.protocol === "https:";
3675
- const response = await fetch(url.href, {
3839
+ const readableUrl = await resolveOpaquePublicAsset(url.href);
3840
+ const response = await fetch(readableUrl, {
3676
3841
  signal,
3677
3842
  ...(network
3678
3843
  ? {
@@ -3715,10 +3880,10 @@ async function readReplayImageSafety(
3715
3880
  }
3716
3881
 
3717
3882
  function staticDomRecord(record: NativeSourceRecord): NativeReplaySafety {
3718
- if (record.node instanceof SVGSVGElement) {
3883
+ if (isNativeSvgRoot(record.node)) {
3719
3884
  return validateNativeSvgPrimitiveMarkup(record.node.outerHTML);
3720
3885
  }
3721
- if (!(record.node instanceof HTMLElement)) return "unknown";
3886
+ if (!isNativeHtmlElement(record.node)) return "unknown";
3722
3887
  try {
3723
3888
  for (const pseudo of [undefined, "::before", "::after"]) {
3724
3889
  const style = getComputedStyle(record.node, pseudo);
@@ -3855,7 +4020,7 @@ class SceneProvider implements NativeSceneProvider {
3855
4020
  let moved = false;
3856
4021
  const scope = this.placement === "backdrop" ? document.body : this.target;
3857
4022
  for (const record of records) {
3858
- if (!(record.target instanceof Element)) continue;
4023
+ if (!isNativeElement(record.target)) continue;
3859
4024
  if (unchangedAttributeMutation(record) || runtimeCanvasMutation(record))
3860
4025
  continue;
3861
4026
  if (
@@ -3933,7 +4098,7 @@ class SceneProvider implements NativeSceneProvider {
3933
4098
 
3934
4099
  private omit(element: Element): boolean {
3935
4100
  if (
3936
- !(element instanceof HTMLCanvasElement) ||
4101
+ !isNativeHtmlTag(element, "canvas") ||
3937
4102
  !element.hasAttribute("data-an-native-backdrop-presentation")
3938
4103
  )
3939
4104
  return element.matches(OMIT);
@@ -3966,7 +4131,7 @@ class SceneProvider implements NativeSceneProvider {
3966
4131
  element: HTMLElement | SVGSVGElement,
3967
4132
  ): { color: string; textFillColor: string } | undefined {
3968
4133
  if (
3969
- !(element instanceof HTMLElement) ||
4134
+ !isNativeHtmlElement(element) ||
3970
4135
  this.targetCapture !== "content" ||
3971
4136
  element !== this.target ||
3972
4137
  !element.hasAttribute("data-an-native-text-suppressed")
@@ -4002,12 +4167,12 @@ class SceneProvider implements NativeSceneProvider {
4002
4167
 
4003
4168
  private wakeDynamicSource = (event: Event): void => {
4004
4169
  const scope = this.placement === "backdrop" ? document.body : this.target;
4005
- if (!(event.target instanceof Node)) return;
4170
+ if (!isNativeNode(event.target)) return;
4006
4171
  const withinSource = scope.contains(event.target);
4007
4172
  const ancestorAnimation =
4008
4173
  (event.type.startsWith("animation") ||
4009
4174
  event.type.startsWith("transition")) &&
4010
- event.target instanceof Element &&
4175
+ isNativeElement(event.target) &&
4011
4176
  event.target.contains(scope);
4012
4177
  if (withinSource || ancestorAnimation) this.onDirty();
4013
4178
  };
@@ -4142,25 +4307,42 @@ class SceneProvider implements NativeSceneProvider {
4142
4307
 
4143
4308
  needsContinuousFrames(): boolean {
4144
4309
  const scope = this.placement === "backdrop" ? document.body : this.target;
4310
+ const captured = (element: Element): boolean => {
4311
+ for (
4312
+ let current: Element | null = element;
4313
+ current;
4314
+ current = current.parentElement
4315
+ )
4316
+ if (this.omit(current)) return false;
4317
+ return true;
4318
+ };
4145
4319
  if (
4146
- (scope instanceof HTMLVideoElement && !scope.paused && !scope.ended) ||
4147
- [...scope.querySelectorAll<HTMLVideoElement>("video")].some(
4148
- (video) => !video.paused && !video.ended,
4149
- ) ||
4150
- (scope instanceof HTMLCanvasElement &&
4151
- !scope.hasAttribute("data-an-native-canvas") &&
4152
- !scope.hasAttribute("data-an-native-presentation")) ||
4153
- scope.querySelector(
4154
- "canvas:not([data-an-native-canvas]):not([data-an-native-presentation])",
4320
+ [scope, ...scope.querySelectorAll("video,canvas")].some(
4321
+ (element) =>
4322
+ captured(element) &&
4323
+ ((isNativeHtmlTag(element, "video") &&
4324
+ !element.paused &&
4325
+ !element.ended) ||
4326
+ (isNativeHtmlTag(element, "canvas") &&
4327
+ !element.hasAttribute("data-an-native-canvas") &&
4328
+ !element.hasAttribute("data-an-native-presentation"))),
4155
4329
  )
4156
4330
  )
4157
4331
  return true;
4158
- const animated = (element: Element): boolean =>
4159
- typeof element.getAnimations === "function" &&
4160
- element
4161
- .getAnimations({ subtree: true })
4162
- .some((animation) => animation.playState === "running");
4163
- if (animated(scope)) return true;
4332
+ const running = (animation: Animation): boolean => {
4333
+ if (animation.playState !== "running") return false;
4334
+ try {
4335
+ const target = (animation.effect as KeyframeEffect | null)?.target;
4336
+ return !isNativeElement(target) || captured(target);
4337
+ } catch {
4338
+ return true;
4339
+ }
4340
+ };
4341
+ if (
4342
+ typeof scope.getAnimations === "function" &&
4343
+ scope.getAnimations({ subtree: true }).some(running)
4344
+ )
4345
+ return true;
4164
4346
  for (
4165
4347
  let parent = scope.parentElement;
4166
4348
  parent;
@@ -4168,9 +4350,7 @@ class SceneProvider implements NativeSceneProvider {
4168
4350
  )
4169
4351
  if (
4170
4352
  typeof parent.getAnimations === "function" &&
4171
- parent
4172
- .getAnimations({ subtree: false })
4173
- .some((animation) => animation.playState === "running")
4353
+ parent.getAnimations({ subtree: false }).some(running)
4174
4354
  )
4175
4355
  return true;
4176
4356
  return false;
@@ -4192,7 +4372,7 @@ class SceneProvider implements NativeSceneProvider {
4192
4372
  if (
4193
4373
  (this.placement !== "layer" && this.placement !== "fill") ||
4194
4374
  !this.groupLocalBackdropSource ||
4195
- !(element instanceof HTMLCanvasElement) ||
4375
+ !isNativeHtmlTag(element, "canvas") ||
4196
4376
  !element.hasAttribute("data-an-native-backdrop-presentation") ||
4197
4377
  !element.getAttribute("data-an-native-canvas") ||
4198
4378
  !this.target.contains(element)
@@ -4585,7 +4765,7 @@ class SceneProvider implements NativeSceneProvider {
4585
4765
  readStyle: SourceStyleReader = getComputedStyle,
4586
4766
  ): NativeSourceIsolation[] | null {
4587
4767
  const isBackdropCanvas = (node: Element): node is HTMLCanvasElement =>
4588
- node instanceof HTMLCanvasElement &&
4768
+ isNativeHtmlTag(node, "canvas") &&
4589
4769
  node.hasAttribute("data-an-native-backdrop-presentation") &&
4590
4770
  !!node.getAttribute("data-an-native-canvas");
4591
4771
  const receiverForCanvas = nativeBackdropReceiver;
@@ -4705,10 +4885,10 @@ class SceneProvider implements NativeSceneProvider {
4705
4885
  if (current !== stop && !transformOwner && hasSourceTransform(style))
4706
4886
  transformOwner = current;
4707
4887
  if (
4708
- !(current === record.node && current instanceof SVGSVGElement) &&
4888
+ !(current === record.node && isNativeSvgRoot(current)) &&
4709
4889
  hasUnsupportedSourceMask(style.clipPath, style.maskImage)
4710
4890
  )
4711
- throw new NativeSourceError(
4891
+ throw new NativeSourceCapabilityError(
4712
4892
  "source-mask-unsupported",
4713
4893
  "CSS clip-path and masks need an explicit source mask compositor.",
4714
4894
  );
@@ -4792,7 +4972,7 @@ class SceneProvider implements NativeSceneProvider {
4792
4972
  "[data-an-native-canvas],[data-an-native-fill-instance],[data-an-native-layer-instance]",
4793
4973
  )
4794
4974
  )
4795
- throw new NativeSourceError(
4975
+ throw new NativeSourceCapabilityError(
4796
4976
  "source-svg-group-native-composition-unsupported",
4797
4977
  "An SVG vector group with nested native effects needs a composed vector source.",
4798
4978
  );
@@ -4807,7 +4987,7 @@ class SceneProvider implements NativeSceneProvider {
4807
4987
  const children = [...element.children].filter((child) => !this.omit(child));
4808
4988
  if (
4809
4989
  hasDirectText(element) ||
4810
- children.some((child) => !(child instanceof SVGSVGElement))
4990
+ children.some((child) => !isNativeSvgRoot(child))
4811
4991
  )
4812
4992
  throw new NativeSourceError(
4813
4993
  "receiver-svg-group-unsupported",
@@ -4824,7 +5004,7 @@ class SceneProvider implements NativeSceneProvider {
4824
5004
  return [];
4825
5005
  assertLeafSupported(svg);
4826
5006
  if (!supportsNativeOutput2D(style))
4827
- throw new NativeSourceError(
5007
+ throw new NativeSourceCapabilityError(
4828
5008
  "source-svg-transform-unsupported",
4829
5009
  "An SVG vector group has unsupported child geometry.",
4830
5010
  );
@@ -4859,8 +5039,8 @@ class SceneProvider implements NativeSceneProvider {
4859
5039
  if (metrics) metrics.recordDirectStyleReads += 1;
4860
5040
  const style = getComputedStyle(element);
4861
5041
  if (style.display === "none" || style.visibility === "hidden") return;
4862
- if (element instanceof SVGSVGElement && element.hasAttribute("transform"))
4863
- throw new NativeSourceError(
5042
+ if (isNativeSvgRoot(element) && element.hasAttribute("transform"))
5043
+ throw new NativeSourceCapabilityError(
4864
5044
  "source-svg-transform-unsupported",
4865
5045
  "An SVG root transform needs an affine vector source path.",
4866
5046
  );
@@ -4875,7 +5055,7 @@ class SceneProvider implements NativeSceneProvider {
4875
5055
  ) {
4876
5056
  if (metrics) metrics.recordDirectStyleReads += 1;
4877
5057
  if (!supportsNativeOutput2D(getComputedStyle(ancestor)))
4878
- throw new NativeSourceError(
5058
+ throw new NativeSourceCapabilityError(
4879
5059
  "source-svg-transform-unsupported",
4880
5060
  "An SVG source has a transformed HTML layout boundary.",
4881
5061
  );
@@ -4883,10 +5063,9 @@ class SceneProvider implements NativeSceneProvider {
4883
5063
  }
4884
5064
  if (isNativeSvgVectorGroup(element))
4885
5065
  this.assertSvgVectorGroupComposition(element);
4886
- const size =
4887
- element instanceof SVGSVGElement
4888
- ? nativeSvgViewportSize(element)
4889
- : sourceLayoutSize(element, this.target, this.coordinateSpace, memo);
5066
+ const size = isNativeSvgRoot(element)
5067
+ ? nativeSvgViewportSize(element)
5068
+ : sourceLayoutSize(element, this.target, this.coordinateSpace, memo);
4890
5069
  const geometry = relativeAffine(
4891
5070
  element,
4892
5071
  this.target,
@@ -4912,7 +5091,7 @@ class SceneProvider implements NativeSceneProvider {
4912
5091
  const isolationPath = this.isolationPath(
4913
5092
  element,
4914
5093
  sourceClip.groupClips,
4915
- element instanceof SVGSVGElement,
5094
+ isNativeSvgRoot(element),
4916
5095
  );
4917
5096
  if (
4918
5097
  !isolationPath ||
@@ -4932,10 +5111,10 @@ class SceneProvider implements NativeSceneProvider {
4932
5111
  nativeLeafCaptureDensity(
4933
5112
  element,
4934
5113
  this.density,
4935
- element instanceof SVGSVGElement ? "all" : "coverage",
5114
+ isNativeSvgRoot(element) ? "all" : "coverage",
4936
5115
  ),
4937
5116
  (node, canvas, density) =>
4938
- node instanceof SVGSVGElement
5117
+ isNativeSvgRoot(node)
4939
5118
  ? rasterNativeSvgSource(
4940
5119
  node,
4941
5120
  canvas,
@@ -4977,7 +5156,7 @@ class SceneProvider implements NativeSceneProvider {
4977
5156
  density: nativeLeafCaptureDensity(
4978
5157
  element,
4979
5158
  this.density,
4980
- element instanceof SVGSVGElement ? "all" : "coverage",
5159
+ isNativeSvgRoot(element) ? "all" : "coverage",
4981
5160
  ),
4982
5161
  maxDimension: 4096,
4983
5162
  maxPixels: 8_388_608,
@@ -5036,7 +5215,7 @@ class SceneProvider implements NativeSceneProvider {
5036
5215
  ): void | Promise<void> {
5037
5216
  if (!element.isConnected || this.omit(element)) return;
5038
5217
  if (element.hasAttribute("data-an-native-receiver-suppressed")) return;
5039
- if (element instanceof SVGSVGElement)
5218
+ if (isNativeSvgRoot(element))
5040
5219
  return this.recordSvg(
5041
5220
  element,
5042
5221
  out,
@@ -5044,12 +5223,12 @@ class SceneProvider implements NativeSceneProvider {
5044
5223
  memo,
5045
5224
  allowVisibleTargetOverflow,
5046
5225
  );
5047
- if (element instanceof SVGElement)
5048
- throw new NativeSourceError(
5226
+ if (isNativeSvgElement(element))
5227
+ throw new NativeSourceCapabilityError(
5049
5228
  "source-inline-svg",
5050
5229
  "An SVG fragment outside an SVG root cannot be captured.",
5051
5230
  );
5052
- if (!(element instanceof HTMLElement)) return;
5231
+ if (!isNativeHtmlElement(element)) return;
5053
5232
  const recordStyles =
5054
5233
  memo?.styles ?? new Map<Element, CSSStyleDeclaration>();
5055
5234
  const readRecordStyle: SourceStyleReader = (node) => {
@@ -5081,7 +5260,7 @@ class SceneProvider implements NativeSceneProvider {
5081
5260
  )
5082
5261
  return;
5083
5262
  if (
5084
- element instanceof HTMLCanvasElement &&
5263
+ isNativeHtmlTag(element, "canvas") &&
5085
5264
  element.hasAttribute("data-an-shader-canvas")
5086
5265
  ) {
5087
5266
  for (
@@ -5120,7 +5299,7 @@ class SceneProvider implements NativeSceneProvider {
5120
5299
  };
5121
5300
  const visible = intersect(box, sourceBounds);
5122
5301
  if (visible.width > 0 && visible.height > 0)
5123
- throw new NativeSourceError(
5302
+ throw new NativeSourceCapabilityError(
5124
5303
  "source-legacy-shader-unsupported",
5125
5304
  "A visible legacy WebGL shader has no synchronized texture and clock source for native composition.",
5126
5305
  );
@@ -5146,7 +5325,7 @@ class SceneProvider implements NativeSceneProvider {
5146
5325
  !isCanvasBackgroundOnly(element, style) &&
5147
5326
  (hasDirectText(element) || hasVisibleBoxPaint(style))
5148
5327
  )
5149
- throw new NativeSourceError(
5328
+ throw new NativeSourceCapabilityError(
5150
5329
  "source-empty-own-paint-unsupported",
5151
5330
  "A zero-size source has own paint that cannot be captured faithfully.",
5152
5331
  );
@@ -5164,14 +5343,13 @@ class SceneProvider implements NativeSceneProvider {
5164
5343
  );
5165
5344
  const box = geometry.rect;
5166
5345
  if (box.width <= 0 || box.height <= 0) return;
5167
- const nativeInstanceId =
5168
- element instanceof HTMLCanvasElement
5169
- ? element.getAttribute("data-an-native-canvas")
5170
- : null;
5346
+ const nativeInstanceId = isNativeHtmlTag(element, "canvas")
5347
+ ? element.getAttribute("data-an-native-canvas")
5348
+ : null;
5171
5349
  const media =
5172
- element instanceof HTMLImageElement ||
5173
- element instanceof HTMLVideoElement ||
5174
- (element instanceof HTMLCanvasElement && !nativeInstanceId);
5350
+ isNativeHtmlTag(element, "img") ||
5351
+ isNativeHtmlTag(element, "video") ||
5352
+ (isNativeHtmlTag(element, "canvas") && !nativeInstanceId);
5175
5353
  const ownOverflow = classifyNativeComputedOverflowClip(style);
5176
5354
  if (!ownOverflow.ok)
5177
5355
  throw new NativeSourceError(
@@ -5302,53 +5480,58 @@ class SceneProvider implements NativeSceneProvider {
5302
5480
  return recordMediaPaint(() => undefined);
5303
5481
  }
5304
5482
  const mediaBox = sourceClip.clips[0]?.localBox ?? geometry.localBox;
5305
- if (element instanceof HTMLImageElement) {
5483
+ if (isNativeHtmlTag(element, "img")) {
5306
5484
  const imageSourceUrl = element.currentSrc || element.src;
5307
5485
  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,
5486
+ return afterMaybePromise(
5487
+ resolveOpaquePublicImage(element, imageSourceUrl),
5488
+ (source) => {
5489
+ const imageWidth = source.naturalWidth;
5490
+ const imageHeight = source.naturalHeight;
5491
+ const imageRendering = style.imageRendering;
5492
+ if (!source.complete || imageWidth <= 0)
5493
+ throw new NativeSourceError(
5494
+ "source-image-pending",
5495
+ "An image source has not finished loading.",
5496
+ );
5497
+ const image = mediaPlacement(
5498
+ element,
5499
+ mediaBox,
5500
+ imageWidth,
5501
+ imageHeight,
5502
+ style,
5503
+ );
5504
+ const imageRect = relativeAffine(
5505
+ element,
5506
+ this.target,
5507
+ this.coordinateSpace,
5508
+ image.rect,
5509
+ readRecordStyle,
5510
+ undefined,
5511
+ memo,
5512
+ ).rect;
5513
+ const appendImage = () => {
5514
+ if (metrics) metrics.recordDirectAffineReads += 1;
5515
+ out.push({
5516
+ ...common,
5517
+ rect: imageRect,
5518
+ localBox: image.rect,
5519
+ uv: image.uv,
5520
+ kind: "image",
5521
+ imageRendering: { value: imageRendering },
5522
+ source,
5523
+ imageSourceUrl,
5524
+ width: imageWidth,
5525
+ height: imageHeight,
5526
+ revision: this.assetRevision,
5527
+ });
5528
+ };
5529
+ recordStyles.clear();
5530
+ return recordMediaPaint(appendImage);
5531
+ },
5322
5532
  );
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
5533
  }
5351
- if (element instanceof HTMLVideoElement) {
5534
+ if (isNativeHtmlTag(element, "video")) {
5352
5535
  assertLocalAsset(element.currentSrc || element.src);
5353
5536
  if (
5354
5537
  !element.videoWidth ||
@@ -5396,7 +5579,7 @@ class SceneProvider implements NativeSceneProvider {
5396
5579
  recordStyles.clear();
5397
5580
  return recordMediaPaint(appendVideo);
5398
5581
  }
5399
- if (element instanceof HTMLCanvasElement) {
5582
+ if (isNativeHtmlTag(element, "canvas")) {
5400
5583
  if (nativeInstanceId) {
5401
5584
  out.push({
5402
5585
  ...common,
@@ -5607,7 +5790,7 @@ class SceneProvider implements NativeSceneProvider {
5607
5790
  )
5608
5791
  return false;
5609
5792
  if (metrics) metrics.walkNodeVisits += 1;
5610
- if (element instanceof HTMLElement && element !== this.target) {
5793
+ if (isNativeHtmlElement(element) && element !== this.target) {
5611
5794
  if (metrics) metrics.walkDirectLayoutSizeReads += 1;
5612
5795
  initialSize = sourceLayoutSize(
5613
5796
  element,
@@ -5626,8 +5809,12 @@ class SceneProvider implements NativeSceneProvider {
5626
5809
  overflow.detail,
5627
5810
  );
5628
5811
  if (overflow.edge !== "none") {
5629
- if (hasDirectText(element) || hasVisibleBoxPaint(style))
5630
- throw new NativeSourceError(
5812
+ if (
5813
+ hasDirectText(element) ||
5814
+ hasVisibleBoxDecoration(style) ||
5815
+ (overflow.outset > 0 && hasVisibleBoxPaint(style))
5816
+ )
5817
+ throw new NativeSourceCapabilityError(
5631
5818
  "source-empty-own-paint-unsupported",
5632
5819
  "A zero-size clipped source has own paint that cannot be captured faithfully.",
5633
5820
  );
@@ -5644,11 +5831,14 @@ class SceneProvider implements NativeSceneProvider {
5644
5831
  const layerInstance =
5645
5832
  (element !== this.target || this.targetCapture === "appearance") &&
5646
5833
  element.getAttribute("data-an-native-layer-instance");
5647
- const replacementInstance = layerInstance || fillInstance;
5834
+ const replacementInstance =
5835
+ initialSize && hasEmptySourceLayout(initialSize)
5836
+ ? null
5837
+ : layerInstance || fillInstance;
5648
5838
  if (replacementInstance) {
5649
5839
  const presentations = [...(element.parentElement?.children ?? [])].filter(
5650
5840
  (child): child is HTMLCanvasElement =>
5651
- child instanceof HTMLCanvasElement &&
5841
+ isNativeHtmlTag(child, "canvas") &&
5652
5842
  child.hasAttribute("data-an-native-presentation") &&
5653
5843
  child.dataset.anNativeCanvas === replacementInstance,
5654
5844
  );
@@ -5775,7 +5965,7 @@ class SceneProvider implements NativeSceneProvider {
5775
5965
  );
5776
5966
  const boxBeforeNativeFill =
5777
5967
  fillCanvases.length > 0 &&
5778
- element instanceof HTMLElement &&
5968
+ isNativeHtmlElement(element) &&
5779
5969
  !hasDirectText(element);
5780
5970
  if (boxBeforeNativeFill) {
5781
5971
  if (
@@ -5815,8 +6005,8 @@ class SceneProvider implements NativeSceneProvider {
5815
6005
  )
5816
6006
  crossedAsyncBoundary = true;
5817
6007
  }
5818
- if (element instanceof SVGSVGElement) return crossedAsyncBoundary;
5819
- if (element instanceof HTMLElement) {
6008
+ if (isNativeSvgRoot(element)) return crossedAsyncBoundary;
6009
+ if (isNativeHtmlElement(element)) {
5820
6010
  let size = initialSize;
5821
6011
  if (crossedAsyncBoundary || !size) {
5822
6012
  if (metrics) metrics.walkDirectLayoutSizeReads += 1;
@@ -5874,7 +6064,7 @@ class SceneProvider implements NativeSceneProvider {
5874
6064
  side === "before" ? "previousElementSibling" : "nextElementSibling";
5875
6065
  for (
5876
6066
  let sibling = this.target[direction];
5877
- sibling instanceof HTMLCanvasElement &&
6067
+ isNativeHtmlTag(sibling, "canvas") &&
5878
6068
  sibling.hasAttribute("data-an-native-backdrop-presentation");
5879
6069
  sibling = sibling[direction]
5880
6070
  )
@@ -6102,14 +6292,14 @@ class SceneProvider implements NativeSceneProvider {
6102
6292
  getComputedStyle(root).opacity !== "1" ||
6103
6293
  (source !== root && style.opacity !== "1")
6104
6294
  )
6105
- throw new NativeSourceError(
6295
+ throw new NativeSourceCapabilityError(
6106
6296
  "source-viewport-background-unsupported",
6107
6297
  "The CSS canvas background extends beyond the root box and needs a supported opaque solid source.",
6108
6298
  );
6109
6299
  const hasImage = style.backgroundImage !== "none";
6110
6300
  if (!hasImage && alpha === 0) return null;
6111
6301
  if (!supportedViewportBackgroundImage(style.backgroundImage))
6112
- throw new NativeSourceError(
6302
+ throw new NativeSourceCapabilityError(
6113
6303
  "source-viewport-background-image-unsupported",
6114
6304
  "The CSS canvas background uses an image type the native renderer cannot capture.",
6115
6305
  );
@@ -6192,13 +6382,13 @@ class SceneProvider implements NativeSceneProvider {
6192
6382
  x: 0 - insets.left,
6193
6383
  y: 0 - insets.top,
6194
6384
  width:
6195
- (this.target instanceof SVGSVGElement
6385
+ (isNativeSvgRoot(this.target)
6196
6386
  ? nativeSvgViewportSize(this.target).width
6197
6387
  : this.target.offsetWidth) +
6198
6388
  insets.left +
6199
6389
  insets.right,
6200
6390
  height:
6201
- (this.target instanceof SVGSVGElement
6391
+ (isNativeSvgRoot(this.target)
6202
6392
  ? nativeSvgViewportSize(this.target).height
6203
6393
  : this.target.offsetHeight) +
6204
6394
  insets.top +
@@ -6297,10 +6487,9 @@ class SceneProvider implements NativeSceneProvider {
6297
6487
  if (isNativeSvgVectorGroup(target))
6298
6488
  this.assertSvgVectorGroupComposition(target);
6299
6489
  assertLeafSupported(target, target);
6300
- const size =
6301
- target instanceof SVGSVGElement
6302
- ? nativeSvgViewportSize(target)
6303
- : { width: target.offsetWidth, height: target.offsetHeight };
6490
+ const size = isNativeSvgRoot(target)
6491
+ ? nativeSvgViewportSize(target)
6492
+ : { width: target.offsetWidth, height: target.offsetHeight };
6304
6493
  const density = nativeLeafCaptureDensity(
6305
6494
  target,
6306
6495
  Math.max(1, this.density),
@@ -6311,7 +6500,7 @@ class SceneProvider implements NativeSceneProvider {
6311
6500
  this.trackLeaf(
6312
6501
  target,
6313
6502
  key,
6314
- target instanceof SVGSVGElement ? "svg" : "own-paint",
6503
+ isNativeSvgRoot(target) ? "svg" : "own-paint",
6315
6504
  );
6316
6505
  this.receiverLeaf = new CachedLeaf(
6317
6506
  target,
@@ -6323,7 +6512,7 @@ class SceneProvider implements NativeSceneProvider {
6323
6512
  "coverage",
6324
6513
  ),
6325
6514
  async (element, canvas, scale) => {
6326
- if (element instanceof SVGSVGElement) {
6515
+ if (isNativeSvgRoot(element)) {
6327
6516
  await rasterNativeSvgSource(
6328
6517
  element,
6329
6518
  canvas,
@@ -6410,12 +6599,11 @@ class SceneProvider implements NativeSceneProvider {
6410
6599
  cssBox: expected.plan.cssBox,
6411
6600
  ...size,
6412
6601
  revision: this.receiverLeaf.revision,
6413
- geometryKind:
6414
- target instanceof SVGSVGElement
6415
- ? "svg-silhouette"
6416
- : isNativeSvgVectorGroup(target)
6417
- ? "svg-group-silhouette"
6418
- : "box",
6602
+ geometryKind: isNativeSvgRoot(target)
6603
+ ? "svg-silhouette"
6604
+ : isNativeSvgVectorGroup(target)
6605
+ ? "svg-group-silhouette"
6606
+ : "box",
6419
6607
  };
6420
6608
  }
6421
6609
 
@@ -6454,7 +6642,12 @@ class SceneProvider implements NativeSceneProvider {
6454
6642
  this.svgFillLeaves.set(paint, leaf);
6455
6643
  }
6456
6644
  this.readSceneCalls += 1;
6457
- const source = await this.readSceneLeaf(leaf, undefined, phase);
6645
+ // Background and inner coverage share one fill raster and cache snapshot.
6646
+ const source = await this.readSceneLeaf(
6647
+ leaf,
6648
+ undefined,
6649
+ paint === "fill" ? "background" : phase,
6650
+ );
6458
6651
  const capture = nativeCaptureRoi(source);
6459
6652
  const box = { x: 0, y: 0, ...size };
6460
6653
  const expected = planNativeCaptureRoi({
@@ -6507,7 +6700,7 @@ class SceneProvider implements NativeSceneProvider {
6507
6700
  "source-placement-invalid",
6508
6701
  "Only a Fill target has an authored background capture.",
6509
6702
  );
6510
- if (this.target instanceof SVGSVGElement)
6703
+ if (isNativeSvgRoot(this.target))
6511
6704
  return this.readSvgFillPhase(this.target, phase);
6512
6705
  const style = getComputedStyle(this.target);
6513
6706
  if (
@@ -6560,7 +6753,7 @@ class SceneProvider implements NativeSceneProvider {
6560
6753
  );
6561
6754
  if (
6562
6755
  this.placement !== "fill" ||
6563
- !(this.target instanceof HTMLElement) ||
6756
+ !isNativeHtmlElement(this.target) ||
6564
6757
  !isPureTextFlow(this.target)
6565
6758
  )
6566
6759
  throw new NativeSourceError(
@@ -6596,7 +6789,7 @@ class SceneProvider implements NativeSceneProvider {
6596
6789
 
6597
6790
  hasFillGlyph(): boolean {
6598
6791
  return (
6599
- !(this.target instanceof SVGSVGElement) &&
6792
+ !isNativeSvgRoot(this.target) &&
6600
6793
  isPureTextFlow(this.target) &&
6601
6794
  Boolean(this.target.textContent?.trim())
6602
6795
  );
@@ -6613,10 +6806,10 @@ class SceneProvider implements NativeSceneProvider {
6613
6806
  "fill-foreground-unavailable",
6614
6807
  "Only a Fill target has a foreground phase.",
6615
6808
  );
6616
- if (this.target instanceof SVGSVGElement) return this.markReplayRead([]);
6809
+ if (isNativeSvgRoot(this.target)) return this.markReplayRead([]);
6617
6810
  if (isPureTextFlow(this.target)) return this.markReplayRead([]);
6618
6811
  if (hasDirectText(this.target))
6619
- throw new NativeSourceError(
6812
+ throw new NativeSourceCapabilityError(
6620
6813
  "fill-mixed-text-layout-unsupported",
6621
6814
  "Direct text mixed with independent child paint needs an ordered text source.",
6622
6815
  );
@@ -6796,14 +6989,12 @@ class SceneProvider implements NativeSceneProvider {
6796
6989
  "source-capture-geometry-stale",
6797
6990
  "The Layer records no longer match the current source epoch.",
6798
6991
  );
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;
6992
+ const width = isNativeSvgRoot(this.target)
6993
+ ? nativeSvgViewportSize(this.target).width
6994
+ : this.target.offsetWidth;
6995
+ const height = isNativeSvgRoot(this.target)
6996
+ ? nativeSvgViewportSize(this.target).height
6997
+ : this.target.offsetHeight;
6807
6998
  if (![width, height].every((value) => Number.isFinite(value) && value > 0))
6808
6999
  throw new NativeSourceError(
6809
7000
  "source-capture-geometry-invalid",
@@ -6883,15 +7074,16 @@ class SceneProvider implements NativeSceneProvider {
6883
7074
  if (staticDomRecord(record) === "unknown") safety = "unknown";
6884
7075
  continue;
6885
7076
  }
6886
- if (
6887
- record.kind !== "image" ||
6888
- !(record.source instanceof HTMLImageElement)
6889
- ) {
7077
+ if (record.kind !== "image" || !isNativeHtmlTag(record.source, "img")) {
6890
7078
  safety = "unknown";
6891
7079
  continue;
6892
7080
  }
6893
7081
  const url = record.imageSourceUrl;
6894
- if (!url || (record.source.currentSrc || record.source.src) !== url) {
7082
+ const localUrl = url ? await resolveOpaquePublicAsset(url) : null;
7083
+ if (
7084
+ !url ||
7085
+ (record.source.currentSrc || record.source.src) !== localUrl
7086
+ ) {
6895
7087
  safety = "unknown";
6896
7088
  continue;
6897
7089
  }
@@ -6910,7 +7102,7 @@ class SceneProvider implements NativeSceneProvider {
6910
7102
  }
6911
7103
  const imageSafety = await cached.result;
6912
7104
  if (!unchanged()) return "unknown";
6913
- if ((record.source.currentSrc || record.source.src) !== url)
7105
+ if ((record.source.currentSrc || record.source.src) !== localUrl)
6914
7106
  return "unknown";
6915
7107
  if (imageSafety === "dynamic") return "dynamic";
6916
7108
  if (imageSafety === "unknown") safety = "unknown";