@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.
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/.agents/skills/actions/references/action-fields.md +1 -1
- package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +61 -1
- package/corpus/templates/analytics/AGENTS.md +1 -1
- package/corpus/templates/analytics/CHANGELOG.md +2 -0
- package/corpus/templates/analytics/actions/get-session-replay-summary.ts +9 -65
- package/corpus/templates/analytics/actions/list-event-catalog.ts +1 -1
- package/corpus/templates/analytics/actions/list-session-outputs.ts +40 -0
- package/corpus/templates/analytics/actions/list-session-recordings.ts +17 -4
- package/corpus/templates/analytics/actions/view-screen.ts +29 -3
- package/corpus/templates/analytics/app/i18n/en-US.ts +27 -0
- package/corpus/templates/analytics/app/pages/sessions/EventCatalogPage.tsx +18 -1
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +3 -1
- package/corpus/templates/analytics/app/pages/sessions/SessionOutputs.tsx +197 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionsTriagePage.tsx +114 -4
- package/corpus/templates/analytics/changelog/2026-10-15-sessions-can-find-people-who-made-a-slides-deck-but-didn-t-p.md +6 -0
- package/corpus/templates/analytics/changelog/2026-10-16-the-activation-funnel-counts-visitors-who-decline-analytics-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-10-21-session-replay-quotas-count-the-compressed-size-analytics-st.md +6 -0
- package/corpus/templates/analytics/server/db/schema.ts +67 -0
- package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +9 -0
- package/corpus/templates/analytics/server/lib/first-party-analytics.ts +28 -22
- package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +36 -1
- package/corpus/templates/analytics/server/lib/output-outcomes.ts +712 -0
- package/corpus/templates/analytics/server/lib/replay-origins.ts +33 -0
- package/corpus/templates/analytics/server/lib/session-event-index.ts +20 -0
- package/corpus/templates/analytics/server/lib/session-performance.ts +6 -40
- package/corpus/templates/analytics/server/lib/session-recording-associations.ts +30 -1
- package/corpus/templates/analytics/server/lib/session-replay-triage.ts +99 -0
- package/corpus/templates/analytics/server/lib/session-replay.ts +85 -40
- package/corpus/templates/analytics/server/lib/sessions-triage-lab.ts +8 -2
- package/corpus/templates/analytics/server/plugins/db.ts +46 -0
- package/corpus/templates/analytics/shared/output-use.ts +205 -0
- package/corpus/templates/analytics/shared/session-events.ts +6 -0
- package/corpus/templates/assets/.agents/skills/actions/references/action-fields.md +1 -1
- package/corpus/templates/brain/.agents/skills/actions/references/action-fields.md +1 -1
- package/corpus/templates/calendar/.agents/skills/actions/references/action-fields.md +1 -1
- package/corpus/templates/calendar/CHANGELOG.md +6 -0
- package/corpus/templates/calendar/actions/create-event.ts +2 -4
- package/corpus/templates/calendar/actions/update-event.ts +35 -6
- package/corpus/templates/calendar/changelog/2026-10-21-solo-events-avoid-notification-approval.md +6 -0
- package/corpus/templates/chat/.agents/skills/actions/references/action-fields.md +1 -1
- package/corpus/templates/clips/.agents/skills/actions/references/action-fields.md +1 -1
- package/corpus/templates/community/qr/package.json +1 -1
- package/corpus/templates/content/.agents/skills/actions/references/action-fields.md +1 -1
- package/corpus/templates/content/.agents/skills/content-product-development/references/verification.md +36 -0
- package/corpus/templates/content/.agents/skills/document-editing/SKILL.md +10 -0
- package/corpus/templates/content/.agents/skills/document-editing/references/databases.md +17 -3
- package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +4 -2
- package/corpus/templates/content/CHANGELOG.md +54 -0
- package/corpus/templates/content/acceptance/_writers.ts +604 -0
- package/corpus/templates/content/acceptance/generate-action-registry.ts +10 -0
- package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/create-document.json +75 -0
- package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/duplicate-page.json +75 -0
- package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/edit-document-find-and-replace-without-a-revision.json +75 -0
- package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/edit-document-find-and-replace.json +75 -0
- package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/edit-document-initializecontent.json +75 -0
- package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/import-content.json +75 -0
- package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-import-content-source-existing-page.json +75 -0
- package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-import-content-source-new-page.json +75 -0
- package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-sync-local-folder-source-changed-file.json +75 -0
- package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/local-files-sync-local-folder-source-new-file.json +75 -0
- package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/restore-document-version.json +75 -0
- package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/set-document-property-primary-blocks-field.json +75 -0
- package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/set-image-alt-text.json +75 -0
- package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/undo-content-import.json +75 -0
- package/corpus/templates/content/acceptance/golden/gate-off-stored-bytes/update-document-browser-full-rewrite.json +75 -0
- package/corpus/templates/content/acceptance/known-loss.ts +69 -0
- package/corpus/templates/content/acceptance/round-trip-corpus.ts +1397 -0
- package/corpus/templates/content/actions/_blocks-field-identity.ts +35 -1
- package/corpus/templates/content/actions/_browser-document-save-attempt.ts +23 -1
- package/corpus/templates/content/actions/_builder-cms-blob-custody.ts +467 -0
- package/corpus/templates/content/actions/_builder-cms-execution-lease.ts +17 -0
- package/corpus/templates/content/actions/_builder-cms-intent-lookup.ts +5 -0
- package/corpus/templates/content/actions/_builder-cms-read-client.ts +881 -21
- package/corpus/templates/content/actions/_builder-cms-write-adapter.ts +28 -2
- package/corpus/templates/content/actions/_builder-cms-write-client.ts +109 -11
- package/corpus/templates/content/actions/_builder-docs-client.ts +1 -0
- package/corpus/templates/content/actions/_builder-private-blob.test-fixture.ts +90 -0
- package/corpus/templates/content/actions/_builder-source-execution-guard.ts +48 -0
- package/corpus/templates/content/actions/_content-database-lifecycle.ts +11 -11
- package/corpus/templates/content/actions/_content-database-personal-view.ts +2 -0
- package/corpus/templates/content/actions/_content-favorites.ts +37 -0
- package/corpus/templates/content/actions/_content-save-outcomes.ts +5 -0
- package/corpus/templates/content/actions/_database-membership-lock.ts +39 -8
- package/corpus/templates/content/actions/_database-navigation.ts +19 -21
- package/corpus/templates/content/actions/_database-row-batch.ts +41 -18
- package/corpus/templates/content/actions/_database-row-mutation.ts +17 -28
- package/corpus/templates/content/actions/_database-source-utils.ts +308 -9
- package/corpus/templates/content/actions/_database-utils.ts +96 -7
- package/corpus/templates/content/actions/_database-view-setup.ts +37 -2
- package/corpus/templates/content/actions/_delete-content-space.ts +8 -1
- package/corpus/templates/content/actions/_document-edit-mutation.ts +33 -32
- package/corpus/templates/content/actions/_document-flush.ts +593 -171
- package/corpus/templates/content/actions/_document-save-locks.ts +54 -0
- package/corpus/templates/content/actions/_document-save-row.ts +133 -0
- package/corpus/templates/content/actions/_github-source-freshness.ts +30 -4
- package/corpus/templates/content/actions/_github-source.ts +18 -8
- package/corpus/templates/content/actions/_move-page-to-space.ts +189 -25
- package/corpus/templates/content/actions/_nfm-syntax.ts +2 -0
- package/corpus/templates/content/actions/_row-lock-order.ts +115 -0
- package/corpus/templates/content/actions/add-content-database-source-field-property.ts +23 -6
- package/corpus/templates/content/actions/cancel-prepared-builder-source-update.ts +110 -26
- package/corpus/templates/content/actions/change-content-database-source-role.ts +51 -7
- package/corpus/templates/content/actions/create-content-database.ts +11 -0
- package/corpus/templates/content/actions/create-document.ts +13 -1
- package/corpus/templates/content/actions/delete-content-database.ts +17 -14
- package/corpus/templates/content/actions/delete-document-property.ts +5 -0
- package/corpus/templates/content/actions/delete-document.ts +311 -100
- package/corpus/templates/content/actions/disconnect-content-database-source.ts +68 -2
- package/corpus/templates/content/actions/disconnect-local-folder-source.ts +33 -2
- package/corpus/templates/content/actions/edit-document.ts +18 -5
- package/corpus/templates/content/actions/execute-builder-source-execution.ts +900 -140
- package/corpus/templates/content/actions/export-document.ts +3 -0
- package/corpus/templates/content/actions/get-blocks-field-word-count.ts +22 -5
- package/corpus/templates/content/actions/get-document.ts +2 -0
- package/corpus/templates/content/actions/import-content-source.ts +170 -54
- package/corpus/templates/content/actions/move-document.ts +191 -73
- package/corpus/templates/content/actions/permanently-delete-document.ts +6 -0
- package/corpus/templates/content/actions/prepare-builder-source-execution.ts +155 -13
- package/corpus/templates/content/actions/prepare-builder-source-review.ts +299 -73
- package/corpus/templates/content/actions/pull-document.ts +8 -2
- package/corpus/templates/content/actions/remove-database-items.ts +23 -4
- package/corpus/templates/content/actions/restore-content-database.ts +76 -55
- package/corpus/templates/content/actions/restore-document-version.ts +19 -35
- package/corpus/templates/content/actions/restore-document.ts +65 -53
- package/corpus/templates/content/actions/rollback-created-slash-document.ts +11 -16
- package/corpus/templates/content/actions/set-document-property.ts +15 -1
- package/corpus/templates/content/actions/set-live-body-switch.ts +45 -0
- package/corpus/templates/content/actions/share-local-file-document.ts +18 -14
- package/corpus/templates/content/actions/suggest-document-edit.ts +2 -3
- package/corpus/templates/content/actions/sync-local-folder-source.ts +35 -1
- package/corpus/templates/content/actions/undo-content-import.ts +16 -12
- package/corpus/templates/content/actions/update-content-database-view.ts +2 -0
- package/corpus/templates/content/actions/update-document.ts +158 -34
- package/corpus/templates/content/actions/validate-builder-source-execution.ts +135 -26
- package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +1 -6
- package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +49 -3
- package/corpus/templates/content/app/components/editor/ContentImportDialog.tsx +2 -0
- package/corpus/templates/content/app/components/editor/DocumentBlockFields.tsx +53 -11
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +608 -353
- package/corpus/templates/content/app/components/editor/StaticDocumentBody.tsx +765 -0
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +233 -80
- package/corpus/templates/content/app/components/editor/blockFieldSaveController.ts +32 -3
- package/corpus/templates/content/app/components/editor/blockFieldSaveRegistry.ts +88 -23
- package/corpus/templates/content/app/components/editor/comment-anchors.ts +19 -0
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +228 -71
- package/corpus/templates/content/app/components/editor/database/GitHubSourceStatusLine.tsx +27 -2
- package/corpus/templates/content/app/components/editor/database/ListItemLayout.tsx +32 -8
- package/corpus/templates/content/app/components/editor/database/ListItemRow.tsx +27 -2
- package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +1 -0
- package/corpus/templates/content/app/components/editor/document-flush-participant.ts +253 -0
- package/corpus/templates/content/app/components/editor/editor-transaction-meta.ts +28 -0
- package/corpus/templates/content/app/components/editor/extensions/AudioBlock.tsx +2 -1
- package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +27 -6
- package/corpus/templates/content/app/components/editor/extensions/LocalMdxComponentNode.tsx +0 -1
- package/corpus/templates/content/app/components/editor/extensions/NotionExtensions.tsx +4 -4
- package/corpus/templates/content/app/components/editor/extensions/SuggestionHighlight.ts +24 -2
- package/corpus/templates/content/app/components/editor/extensions/VideoBlock.tsx +25 -6
- package/corpus/templates/content/app/components/editor/pending-document-persistence.ts +59 -1
- package/corpus/templates/content/app/components/editor/stored-body-images.ts +27 -0
- package/corpus/templates/content/app/components/editor/suggestions/presentation-rebase.ts +17 -0
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +11 -4
- package/corpus/templates/content/app/components/trash/TrashBrowser.tsx +4 -1
- package/corpus/templates/content/app/global.css +21 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +40 -2
- package/corpus/templates/content/app/hooks/use-content-trash.ts +8 -0
- package/corpus/templates/content/app/hooks/use-documents.ts +14 -0
- package/corpus/templates/content/app/i18n-data.ts +1 -0
- package/corpus/templates/content/app/import-messages.ts +25 -0
- package/corpus/templates/content/app/trash-messages.ts +16 -0
- 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
- package/corpus/templates/content/changelog/2026-10-16-a-page-restored-from-trash-returns-to-its-place-in-its-colle.md +6 -0
- package/corpus/templates/content/changelog/2026-10-16-agent-written-markdown-keeps-nested-lists-indented-with-spac.md +6 -0
- package/corpus/templates/content/changelog/2026-10-16-opening-a-page-you-can-edit-no-longer-rebuilds-its-editor-on.md +6 -0
- package/corpus/templates/content/changelog/2026-10-16-pages-moved-or-imported-at-the-same-time-can-no-longer-end-u.md +6 -0
- package/corpus/templates/content/changelog/2026-10-16-re-importing-a-markdown-export-of-a-page-no-longer-reports-t.md +6 -0
- package/corpus/templates/content/changelog/2026-10-16-saving-a-page-or-restoring-one-of-its-versions-no-longer-fai.md +6 -0
- package/corpus/templates/content/changelog/2026-10-17-agents-reading-a-page-you-have-open-no-longer-wait-or-fail-w.md +6 -0
- package/corpus/templates/content/changelog/2026-10-17-builder-content-avoids-retrying-a-write-when-builder-accepte.md +6 -0
- package/corpus/templates/content/changelog/2026-10-18-link-a-new-collection-to-a-github-folder-from-its-sources.md +1 -1
- package/corpus/templates/content/changelog/2026-10-19-fresh-document-reads-require-confirmation-from-every-open-ed.md +6 -0
- package/corpus/templates/content/changelog/2026-10-20-builder-content-sync-keeps-read-and-write-status-accurate-wh.md +6 -0
- package/corpus/templates/content/changelog/2026-10-20-html-table-cells-preserve-a-trailing-backslash-when-opening-.md +6 -0
- package/corpus/templates/content/changelog/2026-10-20-preserve-empty-paragraph-colors-and-refuse-unsupported-inlin.md +6 -0
- package/corpus/templates/content/changelog/2026-10-20-the-advanced-filter-and-each-filter-group-inside-it-have-the.md +6 -0
- package/corpus/templates/content/changelog/2026-10-21-blocks-fields-keep-unconfirmed-saves-visible-and-agent-reads.md +6 -0
- package/corpus/templates/content/changelog/2026-10-21-list-rows-can-show-each-pages-first-lines.md +6 -0
- package/corpus/templates/content/changelog/2026-10-21-preserve-compact-table-row-groups-and-report-invalid-block-colors.md +6 -0
- package/corpus/templates/content/changelog/2026-10-21-suggested-edits-show-an-agent-s-whole-reason-open-a-group-to.md +6 -0
- package/corpus/templates/content/changelog/2026-10-21-suggestions-keep-refusing-unmatched-emphasis-in-stored-markd.md +6 -0
- package/corpus/templates/content/changelog/2026-10-22-a-collection-linked-to-a-big-github-folder-fills-faster-and-p.md +6 -0
- package/corpus/templates/content/changelog/2026-10-22-accept-remaining-and-reject-remaining-show-the-result-for-ev.md +6 -0
- package/corpus/templates/content/changelog/2026-10-22-accepting-a-group-of-suggested-edits-saves-faster-and-adds-o.md +6 -0
- package/corpus/templates/content/changelog/2026-10-22-agents-read-saved-page-text-after-failed-icon-change.md +6 -0
- 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
- package/corpus/templates/content/changelog/2026-10-22-text-an-agent-writes-inside-a-callout-column-or-synced-block.md +6 -0
- package/corpus/templates/content/docs/product/capabilities/content.source.adapters.md +29 -0
- package/corpus/templates/content/e2e/auth-files.ts +28 -0
- package/corpus/templates/content/e2e/convergence-summary.ts +84 -29
- package/corpus/templates/content/e2e/gate-arm.ts +15 -0
- package/corpus/templates/content/e2e/global-setup.ts +43 -75
- package/corpus/templates/content/e2e/global-teardown.ts +34 -0
- package/corpus/templates/content/e2e/helpers.ts +598 -92
- package/corpus/templates/content/e2e/live-body-gate.ts +188 -0
- package/corpus/templates/content/e2e/playwright.config.ts +12 -3
- package/corpus/templates/content/e2e/server-identity.ts +47 -0
- package/corpus/templates/content/e2e/stored-form/collab-blocks.ts +123 -0
- package/corpus/templates/content/package.json +1 -1
- package/corpus/templates/content/parity/matrix.md +42 -42
- package/corpus/templates/content/parity/matrix.ts +3 -1
- package/corpus/templates/content/scripts/_stored-form-census-kinds.ts +30 -2
- package/corpus/templates/content/scripts/historical-icon-apply.ts +9 -1
- package/corpus/templates/content/scripts/trace-startup.mjs +460 -133
- package/corpus/templates/content/server/db/exec.ts +58 -0
- package/corpus/templates/content/server/db/schema.ts +21 -0
- package/corpus/templates/content/server/lib/content-trash-purge.ts +222 -144
- package/corpus/templates/content/server/lib/document-metadata-updated-at.ts +43 -1
- package/corpus/templates/content/server/lib/document-revision.ts +23 -0
- package/corpus/templates/content/server/lib/live-body-writer.ts +311 -0
- package/corpus/templates/content/server/lib/notion-sync.ts +63 -29
- package/corpus/templates/content/server/lib/notion.ts +5 -5
- package/corpus/templates/content/server/lib/suggested-edits.ts +357 -230
- package/corpus/templates/content/server/live-copy/binding.ts +31 -0
- package/corpus/templates/content/server/live-copy/bounded-task.d.ts +6 -0
- package/corpus/templates/content/server/live-copy/exec-db.ts +1 -0
- package/corpus/templates/content/server/live-copy/holds.ts +59 -0
- package/corpus/templates/content/server/live-copy/persist.ts +656 -0
- package/corpus/templates/content/server/live-copy/switch.ts +136 -0
- package/corpus/templates/content/server/live-copy/task-names.ts +4 -0
- package/corpus/templates/content/server/live-copy/tasks.ts +183 -0
- package/corpus/templates/content/server/live-copy/write-cause.ts +85 -0
- package/corpus/templates/content/server/live-copy/write.ts +85 -0
- package/corpus/templates/content/server/plugins/builder-private-payload-cleanup.ts +22 -0
- package/corpus/templates/content/server/plugins/collab.ts +3 -0
- package/corpus/templates/content/server/plugins/db.ts +33 -0
- package/corpus/templates/content/server/routes/api/documents/[id]/move.patch.ts +50 -168
- package/corpus/templates/content/shared/api.ts +32 -1
- package/corpus/templates/content/shared/blocks-fields-manifest.ts +106 -0
- package/corpus/templates/content/shared/database-item-layout.ts +54 -22
- package/corpus/templates/content/shared/database-query.ts +192 -30
- package/corpus/templates/content/shared/document-export.ts +12 -14
- package/corpus/templates/content/shared/document-flush-protocol.ts +88 -0
- package/corpus/templates/content/shared/document-intent-merge.ts +16 -9
- package/corpus/templates/content/shared/editor-save-state.ts +97 -0
- package/corpus/templates/content/shared/feature-flags.ts +10 -0
- package/corpus/templates/content/shared/import/markdown.ts +91 -7
- package/corpus/templates/content/shared/import/types.ts +2 -0
- package/corpus/templates/content/shared/inline-math.ts +6 -4
- package/corpus/templates/content/shared/nfm-fidelity.ts +247 -0
- package/corpus/templates/content/shared/nfm.ts +1933 -340
- package/corpus/templates/content/shared/og-description.ts +258 -36
- package/corpus/templates/content/shared/suggestion-diff.ts +13 -0
- package/corpus/templates/content/shared/suggestion-formatting.ts +143 -20
- package/corpus/templates/content/shared/suggestion-text.ts +39 -0
- package/corpus/templates/content/vitest.config.ts +10 -0
- package/corpus/templates/crm/.agents/skills/actions/references/action-fields.md +1 -1
- package/corpus/templates/design/.agents/skills/actions/references/action-fields.md +1 -1
- package/corpus/templates/design/.agents/skills/design-templates/SKILL.md +5 -1
- package/corpus/templates/design/.agents/skills/native-effects/SKILL.md +9 -2
- package/corpus/templates/design/.generated/bridge/shader-fill-preview.generated.ts +3 -249
- package/corpus/templates/design/.generated/bridge/shader-runtime.generated.ts +30 -92
- package/corpus/templates/design/AGENTS.md +1 -3
- package/corpus/templates/design/CHANGELOG.md +34 -0
- package/corpus/templates/design/CODE_NATIVE_DESIGN_STUDIO_IMPLEMENTATION_PLAN.md +1 -6
- package/corpus/templates/design/DESIGN-STUDIO-PLAN.md +5 -7
- package/corpus/templates/design/actions/_native-local-export-server.ts +44 -31
- package/corpus/templates/design/actions/_native-render-contexts.ts +76 -21
- package/corpus/templates/design/actions/claim-native-local-export.ts +5 -0
- package/corpus/templates/design/actions/finish-native-local-export.ts +13 -2
- package/corpus/templates/design/actions/get-getting-started.ts +53 -0
- package/corpus/templates/design/actions/get-native-shader-approvals.ts +35 -0
- package/corpus/templates/design/actions/get-shader.ts +134 -219
- package/corpus/templates/design/actions/list-design-extensions.ts +3 -58
- package/corpus/templates/design/actions/request-native-local-export.ts +32 -6
- package/corpus/templates/design/actions/run-design-extension-action.ts +0 -29
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +141 -108
- package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +0 -218
- package/corpus/templates/design/app/components/design/DesignThumbnail.tsx +59 -3
- package/corpus/templates/design/app/components/design/EditPanel.tsx +35 -47
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +242 -62
- package/corpus/templates/design/app/components/design/NativePreviewErrorBoundary.tsx +53 -0
- package/corpus/templates/design/app/components/design/bridge/codegen.ts +18 -3
- package/corpus/templates/design/app/components/design/bridge/native-composition-clock.ts +5 -4
- package/corpus/templates/design/app/components/design/bridge/native-dom.ts +37 -0
- package/corpus/templates/design/app/components/design/bridge/native-intrinsic-image.ts +2 -1
- package/corpus/templates/design/app/components/design/bridge/native-mesh-grid.ts +90 -0
- package/corpus/templates/design/app/components/design/bridge/native-opaque-public-asset.ts +363 -0
- package/corpus/templates/design/app/components/design/bridge/native-opaque-worker-lease.ts +179 -0
- package/corpus/templates/design/app/components/design/bridge/native-preview-geometry.ts +132 -7
- package/corpus/templates/design/app/components/design/bridge/native-preview-policy.ts +4 -0
- package/corpus/templates/design/app/components/design/bridge/native-preview-viewport-transport.ts +378 -0
- package/corpus/templates/design/app/components/design/bridge/native-scene-body-transform.ts +62 -0
- package/corpus/templates/design/app/components/design/bridge/native-scene-presentation-element.ts +10 -0
- package/corpus/templates/design/app/components/design/bridge/native-shader-runtime.bridge.ts +778 -246
- package/corpus/templates/design/app/components/design/bridge/native-source-provider.ts +512 -320
- package/corpus/templates/design/app/components/design/bridge/native-stateful-resource.ts +2 -2
- package/corpus/templates/design/app/components/design/bridge/native-stateless-compute.ts +5 -2
- package/corpus/templates/design/app/components/design/bridge/native-svg-source.ts +11 -1
- package/corpus/templates/design/app/components/design/bridge/native-worker-broker.ts +6 -0
- package/corpus/templates/design/app/components/design/bridge/native-worker-entry.ts +761 -303
- package/corpus/templates/design/app/components/design/bridge/native-worker-fill.ts +16 -6
- package/corpus/templates/design/app/components/design/bridge/native-worker-gpu.ts +854 -91
- package/corpus/templates/design/app/components/design/bridge/native-worker-host.ts +15 -1
- package/corpus/templates/design/app/components/design/bridge/native-worker-input-assets.ts +200 -0
- package/corpus/templates/design/app/components/design/bridge/native-worker-protocol.ts +40 -1
- package/corpus/templates/design/app/components/design/bridge/native-worker-scene-host.ts +540 -161
- package/corpus/templates/design/app/components/design/bridge/native-worker-source-snapshot.ts +21 -0
- package/corpus/templates/design/app/components/design/bridge/shader-fill-preview.bridge.ts +5 -371
- package/corpus/templates/design/app/components/design/bridge/shader-runtime.bridge.ts +45 -150
- package/corpus/templates/design/app/components/design/design-canvas/interact-document.ts +5 -9
- package/corpus/templates/design/app/components/design/design-canvas/native-preview-surface.ts +150 -0
- package/corpus/templates/design/app/components/design/design-canvas/native-public-asset-preview.ts +409 -0
- package/corpus/templates/design/app/components/design/design-canvas/native-public-worker-preview.ts +1086 -0
- package/corpus/templates/design/app/components/design/design-canvas/private-replay-screenshot-preview.ts +2 -2
- package/corpus/templates/design/app/components/design/design-canvas/text-content-change-result.ts +46 -12
- package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +15 -26
- package/corpus/templates/design/app/components/design/edit-panel/fill-properties.tsx +74 -67
- package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +7 -19
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +39 -30
- package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +4 -0
- package/corpus/templates/design/app/components/design/inspector/NativeShaderColorControls.tsx +3 -7
- package/corpus/templates/design/app/components/design/inspector/NativeShaderPaintControls.tsx +12 -5
- package/corpus/templates/design/app/components/design/inspector/NativeShaderPanel.tsx +705 -190
- package/corpus/templates/design/app/components/design/inspector/fill-field-reading.ts +1 -2
- package/corpus/templates/design/app/components/design/inspector/index.ts +0 -6
- package/corpus/templates/design/app/components/design/inspector/native-catalog-display.ts +26 -5
- package/corpus/templates/design/app/components/design/inspector/native-shader-catalog-fixture.ts +42 -0
- package/corpus/templates/design/app/components/design/inspector/native-shader-catalog-preview.ts +51 -33
- package/corpus/templates/design/app/components/design/inspector/native-shader-paint.ts +1 -0
- package/corpus/templates/design/app/components/design/inspector/native-shader-property-draft.ts +89 -23
- package/corpus/templates/design/app/components/design/inspector/saved-glsl-shader.tsx +243 -0
- package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +54 -5
- package/corpus/templates/design/app/components/design/shader-source-coordination.ts +66 -0
- package/corpus/templates/design/app/components/design/use-native-shader-approvals.ts +36 -8
- package/corpus/templates/design/app/components/home/DesignHomeLibrary.tsx +15 -8
- package/corpus/templates/design/app/components/layout/GettingStarted.tsx +50 -0
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +3 -0
- package/corpus/templates/design/app/components/templates/DesignTemplateGrid.tsx +163 -0
- package/corpus/templates/design/app/components/templates/DesignTemplateLibrary.tsx +65 -78
- package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +66 -5
- package/corpus/templates/design/app/global.css +6 -0
- package/corpus/templates/design/app/i18n/en-US.ts +95 -2
- package/corpus/templates/design/app/lib/canvas-load-outcome.ts +147 -0
- package/corpus/templates/design/app/lib/canvas-outcome-tracking.ts +531 -0
- package/corpus/templates/design/app/lib/canvas-style-kind.ts +50 -0
- package/corpus/templates/design/app/pages/Index.tsx +10 -3
- package/corpus/templates/design/app/pages/Present.tsx +36 -1
- package/corpus/templates/design/app/pages/design-editor/commands/apply-file-content-update.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/apply-local-content-update.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/commit-visual-styles.ts +88 -32
- package/corpus/templates/design/app/pages/design-editor/commands/cross-screen-element-drop.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/layer-move-to-screen.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/paste-selection.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/paste-svg-layer.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/prepare-content-history-replay.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/redo.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/render-png-blob.ts +84 -41
- package/corpus/templates/design/app/pages/design-editor/commands/save-file-content.ts +38 -3
- package/corpus/templates/design/app/pages/design-editor/commands/shader-source-edit.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/commands/undo.ts +1 -1
- package/corpus/templates/design/app/pages/design-editor/design-editor-view.tsx +0 -2
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-content-and-components.ts +4 -33
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-core.ts +9 -0
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-export-and-handoff.ts +2 -2
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-files-and-saving.ts +2 -0
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-history.ts +0 -11
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-layer-models.ts +2 -55
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-screen-rendering.tsx +0 -3
- package/corpus/templates/design/app/pages/design-editor/domains/use-editor-selection-and-styles.ts +0 -24
- package/corpus/templates/design/app/pages/design-editor/text-edit-utils.ts +0 -16
- package/corpus/templates/design/app/pages/design-editor/use-native-local-export-requests.ts +70 -11
- package/corpus/templates/design/app/pages/design-editor/view/single-screen-canvas.tsx +0 -2
- package/corpus/templates/design/changelog/2026-10-20-folded-mesh-adds-an-animated-sculpted-fill-with-editable-col.md +6 -0
- package/corpus/templates/design/changelog/2026-10-20-read-only-design-views-render-native-shader-previews-in-nest.md +6 -0
- package/corpus/templates/design/changelog/2026-10-20-selected-screens-with-shader-effects-can-be-exported-togethe.md +6 -0
- package/corpus/templates/design/changelog/2026-10-20-shader-previews-reuse-validated-scene-data-while-panning-inc.md +6 -0
- package/corpus/templates/design/changelog/2026-10-20-shader-previews-stay-aligned-while-you-zoom.md +6 -0
- package/corpus/templates/design/changelog/2026-10-20-signed-out-sessions-no-longer-watch-for-private-png-export-r.md +6 -0
- package/corpus/templates/design/changelog/2026-10-21-a-getting-started-checklist-at-the-bottom-of-the-sidebar-tra.md +6 -0
- package/corpus/templates/design/changelog/2026-10-21-effect-thumbnails-show-richer-previews.md +6 -0
- package/corpus/templates/design/changelog/2026-10-21-native-effects-render-across-previews.md +6 -0
- package/corpus/templates/design/changelog/2026-10-21-native-shader-previews-use-less-gpu-memory-when-many-mesh-ef.md +6 -0
- package/corpus/templates/design/changelog/2026-10-21-opening-design-no-longer-shows-png-export-errors-when-no-exp.md +6 -0
- package/corpus/templates/design/changelog/2026-10-21-pulsing-border-controls-grouped.md +6 -0
- package/corpus/templates/design/changelog/2026-10-21-pulsing-border-follows-element-outlines.md +6 -0
- package/corpus/templates/design/changelog/2026-10-21-remove-obsolete-shader-fills.md +6 -0
- package/corpus/templates/design/changelog/2026-10-21-shader-previews-recover-from-temporary-gpu-and-image-failure.md +6 -0
- package/corpus/templates/design/changelog/2026-10-21-templates-now-open-a-read-only-preview-from-the-card-and-the.md +6 -0
- package/corpus/templates/design/changelog/2026-10-22-collapsed-shader-layers-no-longer-interrupt-other-shaders-on.md +6 -0
- package/corpus/templates/design/changelog/2026-10-22-shader-fills-and-effects-render-correctly-on-canvas-elements.md +6 -0
- package/corpus/templates/design/changelog/2026-10-22-shader-fills-keep-rendering-when-other-screen-content-cannot.md +6 -0
- package/corpus/templates/design/package.json +0 -1
- package/corpus/templates/design/playwright.config.ts +1 -1
- package/corpus/templates/design/scripts/design-export-validation/export-baseline.json +24 -0
- package/corpus/templates/design/scripts/runtime-budget-zoom.ts +9 -21
- package/corpus/templates/design/scripts/runtime-budget.ts +10 -24
- package/corpus/templates/design/server/lib/getting-started.ts +267 -0
- package/corpus/templates/design/server/plugins/agent-chat.ts +0 -2
- package/corpus/templates/design/server/plugins/getting-started.ts +5 -0
- package/corpus/templates/design/shared/design-template-presets/analytics-dashboard.ts +127 -0
- package/corpus/templates/design/shared/design-template-presets/design-studio.ts +98 -0
- package/corpus/templates/design/shared/design-template-presets/messaging-app.ts +101 -0
- package/corpus/templates/design/shared/design-template-presets/project-tasks.ts +120 -0
- package/corpus/templates/design/shared/design-template-presets.ts +8 -0
- package/corpus/templates/design/shared/effect-graph.ts +46 -1
- package/corpus/templates/design/shared/generation-output-receipt.ts +0 -1
- package/corpus/templates/design/shared/native-effect-animation-capability.ts +6 -0
- package/corpus/templates/design/shared/native-effect-folded-mesh-v1.ts +268 -0
- package/corpus/templates/design/shared/native-effect-folded-mesh-v2.ts +310 -0
- package/corpus/templates/design/shared/native-effect-folded-mesh.ts +489 -0
- package/corpus/templates/design/shared/native-effect-gallery-additions.ts +2 -2
- package/corpus/templates/design/shared/native-effect-paint.ts +8 -0
- package/corpus/templates/design/shared/native-effect-parameter-constraints.ts +8 -1
- package/corpus/templates/design/shared/native-effect-presets.ts +18 -1
- package/corpus/templates/design/shared/native-effect-property-presentation.ts +81 -0
- package/corpus/templates/design/shared/native-effect-pulsing-border-v3.ts +281 -0
- package/corpus/templates/design/shared/native-effect-pulsing-border-v4.ts +284 -0
- package/corpus/templates/design/shared/native-effect-pulsing-border.ts +300 -0
- package/corpus/templates/design/shared/native-effect-trust.ts +6 -0
- package/corpus/templates/design/shared/native-effect-wgsl.ts +12 -0
- package/corpus/templates/design/shared/native-effects.ts +528 -15
- package/corpus/templates/design/shared/native-input-resources.ts +36 -0
- package/corpus/templates/design/shared/native-local-export.ts +14 -0
- package/corpus/templates/design/shared/native-parameter-animation.ts +1 -0
- package/corpus/templates/design/shared/native-pointer-input.ts +9 -11
- package/corpus/templates/design/shared/shader-fills.ts +0 -513
- package/corpus/templates/design/vitest.setup.ts +7 -1
- package/corpus/templates/dispatch/.agents/skills/actions/references/action-fields.md +1 -1
- package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +20 -18
- package/corpus/templates/factory/.agents/skills/actions/references/action-fields.md +1 -1
- package/corpus/templates/factory/.agents/skills/review-latest-feedback/SKILL.md +36 -80
- package/corpus/templates/factory/.agents/skills/review-latest-feedback/references/channel-inventory.md +54 -16
- package/corpus/templates/factory/.agents/skills/review-latest-feedback/references/slack-reaction-replies.md +50 -73
- package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +20 -18
- package/corpus/templates/forms/.agents/skills/actions/references/action-fields.md +1 -1
- package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/mail/.agents/skills/actions/references/action-fields.md +1 -1
- package/corpus/templates/plan/.agents/skills/actions/references/action-fields.md +1 -1
- package/corpus/templates/slides/.agents/skills/actions/references/action-fields.md +1 -1
- package/corpus/templates/slides/CHANGELOG.md +6 -0
- package/corpus/templates/slides/actions/delete-deck.ts +7 -0
- package/corpus/templates/slides/changelog/2026-10-21-connected-deck-deletion-requires-approval.md +6 -0
- package/corpus/templates/slides/scripts/edit-fidelity/client-action.ts +61 -0
- package/corpus/templates/slides/scripts/edit-fidelity/run.ts +10 -0
- package/corpus/templates/slides-2/.agents/skills/actions/SKILL.md +199 -0
- package/corpus/templates/slides-2/.agents/skills/actions/references/action-fields.md +145 -0
- package/corpus/templates/slides-2/.agents/skills/actions/references/examples.md +96 -0
- package/corpus/templates/slides-2/.agents/skills/actions/references/provider-apis.md +95 -0
- package/corpus/templates/slides-2/.agents/skills/adding-a-feature/SKILL.md +235 -0
- package/corpus/templates/slides-2/.agents/skills/agent-native-docs/SKILL.md +161 -0
- package/corpus/templates/slides-2/.agents/skills/agent-native-toolkit/SKILL.md +314 -0
- package/corpus/templates/slides-2/.agents/skills/analytics-data-for-decks/SKILL.md +44 -0
- package/corpus/templates/slides-2/.agents/skills/apply-slide-comments/SKILL.md +63 -0
- package/corpus/templates/slides-2/.agents/skills/client-side-routing/SKILL.md +87 -0
- package/corpus/templates/slides-2/.agents/skills/context-awareness/SKILL.md +282 -0
- package/corpus/templates/slides-2/.agents/skills/create-deck/SKILL.md +263 -0
- package/corpus/templates/slides-2/.agents/skills/create-deck/references/reference-inputs.md +72 -0
- package/corpus/templates/slides-2/.agents/skills/create-deck/references/slide-templates.md +93 -0
- package/corpus/templates/slides-2/.agents/skills/create-deck/references/source-material.md +16 -0
- package/corpus/templates/slides-2/.agents/skills/creative-context/SKILL.md +134 -0
- package/corpus/templates/slides-2/.agents/skills/customizing-agent-native/SKILL.md +219 -0
- package/corpus/templates/slides-2/.agents/skills/deck-management/SKILL.md +182 -0
- package/corpus/templates/slides-2/.agents/skills/delegate-to-agent/SKILL.md +62 -0
- package/corpus/templates/slides-2/.agents/skills/design-systems/SKILL.md +233 -0
- package/corpus/templates/slides-2/.agents/skills/external-agents/SKILL.md +549 -0
- package/corpus/templates/slides-2/.agents/skills/external-agents/references/mcp-apps-embedding.md +169 -0
- package/corpus/templates/slides-2/.agents/skills/frontend-design/SKILL.md +102 -0
- package/corpus/templates/slides-2/.agents/skills/frontend-design/references/visual-direction.md +102 -0
- package/corpus/templates/slides-2/.agents/skills/image-generation-via-a2a/SKILL.md +134 -0
- package/corpus/templates/slides-2/.agents/skills/performance/SKILL.md +79 -0
- package/corpus/templates/slides-2/.agents/skills/portability/SKILL.md +108 -0
- package/corpus/templates/slides-2/.agents/skills/real-time-sync/SKILL.md +146 -0
- package/corpus/templates/slides-2/.agents/skills/reliable-mutations/SKILL.md +72 -0
- package/corpus/templates/slides-2/.agents/skills/secrets/SKILL.md +82 -0
- package/corpus/templates/slides-2/.agents/skills/security/SKILL.md +80 -0
- package/corpus/templates/slides-2/.agents/skills/self-modifying-code/SKILL.md +123 -0
- package/corpus/templates/slides-2/.agents/skills/shadcn-ui/SKILL.md +71 -0
- package/corpus/templates/slides-2/.agents/skills/sharing/SKILL.md +286 -0
- package/corpus/templates/slides-2/.agents/skills/slide-design/SKILL.md +144 -0
- package/corpus/templates/slides-2/.agents/skills/slide-editing/SKILL.md +284 -0
- package/corpus/templates/slides-2/.agents/skills/slide-editing/references/animations.md +33 -0
- package/corpus/templates/slides-2/.agents/skills/slide-editing/references/freeform-objects.md +22 -0
- package/corpus/templates/slides-2/.agents/skills/slide-editing/references/restyling.md +69 -0
- package/corpus/templates/slides-2/.agents/skills/slide-editing/references/transitions.md +26 -0
- package/corpus/templates/slides-2/.agents/skills/slide-editing/references/video.md +45 -0
- package/corpus/templates/slides-2/.agents/skills/slide-images/SKILL.md +136 -0
- package/corpus/templates/slides-2/.agents/skills/storing-data/SKILL.md +234 -0
- package/corpus/templates/slides-2/.agents/skills/turn-into-skill/SKILL.md +112 -0
- package/corpus/templates/slides-2/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
- package/corpus/templates/slides-2/.agents/skills/workspace-conventions/SKILL.md +103 -0
- package/corpus/templates/slides-2/.builder/rules/deploy-app.mdc +22 -0
- package/corpus/templates/slides-2/.builder/rules/organize-ui.mdc +9 -0
- package/corpus/templates/slides-2/.dockerignore +61 -0
- package/corpus/templates/slides-2/.env.example +23 -0
- package/corpus/templates/slides-2/.ignore +3 -0
- package/corpus/templates/slides-2/.mcp.json +8 -0
- package/corpus/templates/slides-2/.oxfmtrc.json +8 -0
- package/corpus/templates/slides-2/AGENTS.md +66 -0
- package/corpus/templates/slides-2/CHANGELOG.md +76 -0
- package/corpus/templates/slides-2/DEVELOPING.md +157 -0
- package/corpus/templates/slides-2/README.md +58 -0
- package/corpus/templates/slides-2/THIRD_PARTY_NOTICES.md +33 -0
- package/corpus/templates/slides-2/_gitignore +38 -0
- package/corpus/templates/slides-2/actions/_agent-presence.ts +29 -0
- package/corpus/templates/slides-2/actions/_app-url.ts +37 -0
- package/corpus/templates/slides-2/actions/_deck-app-scope.ts +30 -0
- package/corpus/templates/slides-2/actions/_deck-tracking.ts +260 -0
- package/corpus/templates/slides-2/actions/_deck-write.ts +206 -0
- package/corpus/templates/slides-2/actions/_imported-slide-source.ts +162 -0
- package/corpus/templates/slides-2/actions/_inline-image-storage.ts +1013 -0
- package/corpus/templates/slides-2/actions/_linked-design-system.ts +83 -0
- package/corpus/templates/slides-2/actions/_presenter-notes.ts +83 -0
- package/corpus/templates/slides-2/actions/_render-artifacts.ts +111 -0
- package/corpus/templates/slides-2/actions/_slide-source.ts +344 -0
- package/corpus/templates/slides-2/actions/_tab-state.ts +51 -0
- package/corpus/templates/slides-2/actions/_test-brandfetch.ts +31 -0
- package/corpus/templates/slides-2/actions/_uploaded-files.ts +114 -0
- package/corpus/templates/slides-2/actions/add-deck.ts +123 -0
- package/corpus/templates/slides-2/actions/add-slide-comment.ts +267 -0
- package/corpus/templates/slides-2/actions/add-slide.ts +888 -0
- package/corpus/templates/slides-2/actions/analyze-brand-assets.ts +66 -0
- package/corpus/templates/slides-2/actions/apply-design-system.ts +111 -0
- package/corpus/templates/slides-2/actions/approve-deck-access-request.ts +287 -0
- package/corpus/templates/slides-2/actions/audit-contrast.ts +143 -0
- package/corpus/templates/slides-2/actions/check-image-gen.ts +17 -0
- package/corpus/templates/slides-2/actions/clone-context-slide.ts +340 -0
- package/corpus/templates/slides-2/actions/clone-creative-context-deck.ts +143 -0
- package/corpus/templates/slides-2/actions/control-deck-history.ts +186 -0
- package/corpus/templates/slides-2/actions/control-presenter.ts +117 -0
- package/corpus/templates/slides-2/actions/control-slide-editor.ts +267 -0
- package/corpus/templates/slides-2/actions/create-deck-from-template.ts +274 -0
- package/corpus/templates/slides-2/actions/create-deck.ts +1243 -0
- package/corpus/templates/slides-2/actions/create-design-system.ts +131 -0
- package/corpus/templates/slides-2/actions/create-share-link.ts +127 -0
- package/corpus/templates/slides-2/actions/db-health.ts +22 -0
- package/corpus/templates/slides-2/actions/delete-asset.ts +154 -0
- package/corpus/templates/slides-2/actions/delete-deck.ts +427 -0
- package/corpus/templates/slides-2/actions/delete-design-system.ts +167 -0
- package/corpus/templates/slides-2/actions/delete-slide-comment.ts +143 -0
- package/corpus/templates/slides-2/actions/delete-staged-dataset.ts +30 -0
- package/corpus/templates/slides-2/actions/duplicate-deck.ts +299 -0
- package/corpus/templates/slides-2/actions/export-google-slides.ts +41 -0
- package/corpus/templates/slides-2/actions/export-html.ts +770 -0
- package/corpus/templates/slides-2/actions/export-pptx.ts +2203 -0
- package/corpus/templates/slides-2/actions/extract-pdf.ts +49 -0
- package/corpus/templates/slides-2/actions/generate-image-api.ts +671 -0
- package/corpus/templates/slides-2/actions/generate-image.ts +492 -0
- package/corpus/templates/slides-2/actions/get-agent-access-deck.ts +52 -0
- package/corpus/templates/slides-2/actions/get-deck-access-status.ts +130 -0
- package/corpus/templates/slides-2/actions/get-deck-design-tokens.ts +62 -0
- package/corpus/templates/slides-2/actions/get-deck-reference-context.ts +232 -0
- package/corpus/templates/slides-2/actions/get-deck-template.ts +38 -0
- package/corpus/templates/slides-2/actions/get-deck-version.ts +85 -0
- package/corpus/templates/slides-2/actions/get-deck.ts +562 -0
- package/corpus/templates/slides-2/actions/get-design-system-decode-job-status.ts +57 -0
- package/corpus/templates/slides-2/actions/get-design-system-tier-limit.ts +12 -0
- package/corpus/templates/slides-2/actions/get-design-system.ts +453 -0
- package/corpus/templates/slides-2/actions/get-google-docs-status.ts +106 -0
- package/corpus/templates/slides-2/actions/get-google-picker-token.ts +84 -0
- package/corpus/templates/slides-2/actions/get-home-suggestions.ts +52 -0
- package/corpus/templates/slides-2/actions/get-layout-overflows.ts +192 -0
- package/corpus/templates/slides-2/actions/get-slide-render.ts +125 -0
- package/corpus/templates/slides-2/actions/get-slide-source.ts +115 -0
- package/corpus/templates/slides-2/actions/get-slide-theme-preview.ts +64 -0
- package/corpus/templates/slides-2/actions/get-slide-theme.ts +44 -0
- package/corpus/templates/slides-2/actions/get-slides-2-upload-storage-status.ts +17 -0
- package/corpus/templates/slides-2/actions/get-slides-notification-prefs.ts +37 -0
- package/corpus/templates/slides-2/actions/get-workspace-defaults.ts +51 -0
- package/corpus/templates/slides-2/actions/image-gen-status.ts +35 -0
- package/corpus/templates/slides-2/actions/import-code.ts +26 -0
- package/corpus/templates/slides-2/actions/import-design-project.ts +49 -0
- package/corpus/templates/slides-2/actions/import-document.ts +125 -0
- package/corpus/templates/slides-2/actions/import-docx.ts +57 -0
- package/corpus/templates/slides-2/actions/import-file.ts +1273 -0
- package/corpus/templates/slides-2/actions/import-from-url.ts +25 -0
- package/corpus/templates/slides-2/actions/import-google-doc.ts +208 -0
- package/corpus/templates/slides-2/actions/import-google-font.ts +110 -0
- package/corpus/templates/slides-2/actions/import-google-slides-reference.ts +667 -0
- package/corpus/templates/slides-2/actions/import-pptx.ts +564 -0
- package/corpus/templates/slides-2/actions/import-svgl-logo.ts +115 -0
- package/corpus/templates/slides-2/actions/index-design-system-with-builder.ts +181 -0
- package/corpus/templates/slides-2/actions/index-uploaded-design-system-files.ts +77 -0
- package/corpus/templates/slides-2/actions/list-assets.ts +286 -0
- package/corpus/templates/slides-2/actions/list-deck-templates.ts +83 -0
- package/corpus/templates/slides-2/actions/list-deck-versions.ts +185 -0
- package/corpus/templates/slides-2/actions/list-decks.ts +591 -0
- package/corpus/templates/slides-2/actions/list-design-systems.ts +180 -0
- package/corpus/templates/slides-2/actions/list-slide-comments.ts +128 -0
- package/corpus/templates/slides-2/actions/list-slide-themes.ts +17 -0
- package/corpus/templates/slides-2/actions/list-staged-datasets.ts +14 -0
- package/corpus/templates/slides-2/actions/logo-config.ts +13 -0
- package/corpus/templates/slides-2/actions/navigate.ts +158 -0
- package/corpus/templates/slides-2/actions/patch-deck.ts +2378 -0
- package/corpus/templates/slides-2/actions/provider-api-catalog.ts +25 -0
- package/corpus/templates/slides-2/actions/provider-api-docs.ts +83 -0
- package/corpus/templates/slides-2/actions/provider-api-request.ts +222 -0
- package/corpus/templates/slides-2/actions/query-staged-dataset.ts +83 -0
- package/corpus/templates/slides-2/actions/read-composer-source.ts +108 -0
- package/corpus/templates/slides-2/actions/request-deck-access.ts +803 -0
- package/corpus/templates/slides-2/actions/restore-deck-version.ts +203 -0
- package/corpus/templates/slides-2/actions/run.ts +2 -0
- package/corpus/templates/slides-2/actions/save-deck.ts +313 -0
- package/corpus/templates/slides-2/actions/search-google-fonts.ts +61 -0
- package/corpus/templates/slides-2/actions/search-images.ts +30 -0
- package/corpus/templates/slides-2/actions/search-logos.ts +23 -0
- package/corpus/templates/slides-2/actions/search-svgl-logos.ts +42 -0
- package/corpus/templates/slides-2/actions/set-default-design-system.ts +88 -0
- package/corpus/templates/slides-2/actions/set-workspace-defaults.ts +61 -0
- package/corpus/templates/slides-2/actions/start-design-system-upload.ts +80 -0
- package/corpus/templates/slides-2/actions/sync-design-system-with-builder.ts +84 -0
- package/corpus/templates/slides-2/actions/toggle-slide-comment-reaction.ts +150 -0
- package/corpus/templates/slides-2/actions/transform-slide-objects.ts +1528 -0
- package/corpus/templates/slides-2/actions/update-asset.ts +499 -0
- package/corpus/templates/slides-2/actions/update-deck-aspect-ratio.ts +95 -0
- package/corpus/templates/slides-2/actions/update-deck-design-tokens.ts +175 -0
- package/corpus/templates/slides-2/actions/update-design-system.ts +95 -0
- package/corpus/templates/slides-2/actions/update-slide-comment.ts +213 -0
- package/corpus/templates/slides-2/actions/update-slide-source.ts +353 -0
- package/corpus/templates/slides-2/actions/update-slide.ts +850 -0
- package/corpus/templates/slides-2/actions/update-slides-notification-prefs.ts +55 -0
- package/corpus/templates/slides-2/actions/view-screen.ts +1098 -0
- package/corpus/templates/slides-2/agent-native.app-skill.json +165 -0
- package/corpus/templates/slides-2/agent-native.config.ts +20 -0
- package/corpus/templates/slides-2/agent-native.json +18 -0
- package/corpus/templates/slides-2/app/components/ThemeToggle.tsx +47 -0
- package/corpus/templates/slides-2/app/components/comments/SlideCommentPins.tsx +781 -0
- package/corpus/templates/slides-2/app/components/comments/SlideCommentsPanel.tsx +1075 -0
- package/corpus/templates/slides-2/app/components/deck/DeckCard.tsx +304 -0
- package/corpus/templates/slides-2/app/components/deck/DeckFilterMenu.tsx +83 -0
- package/corpus/templates/slides-2/app/components/deck/ExcalidrawSlide.tsx +183 -0
- package/corpus/templates/slides-2/app/components/deck/MermaidRenderer.tsx +126 -0
- package/corpus/templates/slides-2/app/components/deck/SlideRenderer.tsx +1553 -0
- package/corpus/templates/slides-2/app/components/design-system/DesignSystemCard.tsx +235 -0
- package/corpus/templates/slides-2/app/components/design-system/DesignSystemSetup.tsx +2021 -0
- package/corpus/templates/slides-2/app/components/design-system/builder-design-system-upload.ts +200 -0
- package/corpus/templates/slides-2/app/components/design-system/builder-index-response.ts +104 -0
- package/corpus/templates/slides-2/app/components/editor/AddSlidePopover.tsx +461 -0
- package/corpus/templates/slides-2/app/components/editor/AiEditingMarker.tsx +24 -0
- package/corpus/templates/slides-2/app/components/editor/AlignmentGuides.tsx +82 -0
- package/corpus/templates/slides-2/app/components/editor/AnimationsPanel.tsx +698 -0
- package/corpus/templates/slides-2/app/components/editor/AppMenu.tsx +356 -0
- package/corpus/templates/slides-2/app/components/editor/AssetLibraryPanel.tsx +508 -0
- package/corpus/templates/slides-2/app/components/editor/BlockBubbleMenu.tsx +548 -0
- package/corpus/templates/slides-2/app/components/editor/DeckAccessDeniedPage.tsx +173 -0
- package/corpus/templates/slides-2/app/components/editor/DeckEditorSkeleton.tsx +35 -0
- package/corpus/templates/slides-2/app/components/editor/DeferredPopoverFallback.tsx +148 -0
- package/corpus/templates/slides-2/app/components/editor/EditorActionCluster.tsx +217 -0
- package/corpus/templates/slides-2/app/components/editor/EditorSidebar.tsx +1047 -0
- package/corpus/templates/slides-2/app/components/editor/EditorToolbar.tsx +1285 -0
- package/corpus/templates/slides-2/app/components/editor/ExportMenu.tsx +579 -0
- package/corpus/templates/slides-2/app/components/editor/GeneratingOverlay.tsx +21 -0
- package/corpus/templates/slides-2/app/components/editor/GeneratingSlidePreview.tsx +73 -0
- package/corpus/templates/slides-2/app/components/editor/GoogleDocImportHint.tsx +378 -0
- package/corpus/templates/slides-2/app/components/editor/GoogleDriveConnectionCta.tsx +154 -0
- package/corpus/templates/slides-2/app/components/editor/GoogleSlidesReferenceImport.tsx +299 -0
- package/corpus/templates/slides-2/app/components/editor/HistoryPanel.tsx +354 -0
- package/corpus/templates/slides-2/app/components/editor/HomeQuickStartDialog.tsx +202 -0
- package/corpus/templates/slides-2/app/components/editor/ImageCropOverlay.tsx +820 -0
- package/corpus/templates/slides-2/app/components/editor/ImageDropPromptPopover.tsx +280 -0
- package/corpus/templates/slides-2/app/components/editor/ImageGenPanel.tsx +244 -0
- package/corpus/templates/slides-2/app/components/editor/ImageOverlay.tsx +280 -0
- package/corpus/templates/slides-2/app/components/editor/ImageSearchPanel.tsx +183 -0
- package/corpus/templates/slides-2/app/components/editor/ImportDeckButton.tsx +247 -0
- package/corpus/templates/slides-2/app/components/editor/LogoSearchPanel.tsx +366 -0
- package/corpus/templates/slides-2/app/components/editor/MermaidToExcalidrawPanel.tsx +99 -0
- package/corpus/templates/slides-2/app/components/editor/MissingDeckAccessPane.tsx +219 -0
- package/corpus/templates/slides-2/app/components/editor/NewDeckReferenceStep.tsx +812 -0
- package/corpus/templates/slides-2/app/components/editor/PromptDialog.tsx +963 -0
- package/corpus/templates/slides-2/app/components/editor/QuestionFlow.tsx +119 -0
- package/corpus/templates/slides-2/app/components/editor/RequestDeckAccessDialog.tsx +101 -0
- package/corpus/templates/slides-2/app/components/editor/ShareDialog.tsx +126 -0
- package/corpus/templates/slides-2/app/components/editor/SlideContextToolbar.tsx +1471 -0
- package/corpus/templates/slides-2/app/components/editor/SlideEditor.tsx +11183 -0
- package/corpus/templates/slides-2/app/components/editor/SlideOverflowWarning.tsx +82 -0
- package/corpus/templates/slides-2/app/components/editor/SlideScrollStack.tsx +307 -0
- package/corpus/templates/slides-2/app/components/editor/SlideSlashCommandMenu.tsx +692 -0
- package/corpus/templates/slides-2/app/components/editor/SlideThumbnailContextMenu.tsx +52 -0
- package/corpus/templates/slides-2/app/components/editor/SlideTransitionControl.tsx +184 -0
- package/corpus/templates/slides-2/app/components/editor/SlidesComposerContext.tsx +789 -0
- package/corpus/templates/slides-2/app/components/editor/SlidesComposerContextProvider.tsx +74 -0
- package/corpus/templates/slides-2/app/components/editor/SlidesLayersPanel.tsx +377 -0
- package/corpus/templates/slides-2/app/components/editor/SpeakerNotesPanel.tsx +119 -0
- package/corpus/templates/slides-2/app/components/editor/TweaksPanel.tsx +77 -0
- package/corpus/templates/slides-2/app/components/editor/UploadStorageGate.tsx +37 -0
- package/corpus/templates/slides-2/app/components/editor/bullet-editing.ts +880 -0
- package/corpus/templates/slides-2/app/components/editor/canvas-interactions/index.ts +12 -0
- package/corpus/templates/slides-2/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +119 -0
- package/corpus/templates/slides-2/app/components/editor/commit-active-edit.ts +14 -0
- package/corpus/templates/slides-2/app/components/editor/editor-command-model.ts +35 -0
- package/corpus/templates/slides-2/app/components/editor/fit-text-object.ts +31 -0
- package/corpus/templates/slides-2/app/components/editor/in-place-text-session.browser-cases.json +983 -0
- package/corpus/templates/slides-2/app/components/editor/in-place-text-session.browser-host.ts +747 -0
- package/corpus/templates/slides-2/app/components/editor/in-place-text-session.ts +6891 -0
- package/corpus/templates/slides-2/app/components/editor/inline-edit-session.ts +26 -0
- package/corpus/templates/slides-2/app/components/editor/list-editing.ts +501 -0
- package/corpus/templates/slides-2/app/components/editor/rich-text-selection.ts +975 -0
- package/corpus/templates/slides-2/app/components/editor/rte-test-utils.ts +265 -0
- package/corpus/templates/slides-2/app/components/editor/selection-overlay-measurement.ts +191 -0
- package/corpus/templates/slides-2/app/components/editor/slide-escape-arbiter.ts +34 -0
- package/corpus/templates/slides-2/app/components/editor/slide-object-interactions.ts +6362 -0
- package/corpus/templates/slides-2/app/components/editor/slide-object-transform.browser-host.ts +19 -0
- package/corpus/templates/slides-2/app/components/editor/slide-pointer-target.ts +432 -0
- package/corpus/templates/slides-2/app/components/editor/slide-presence.ts +13 -0
- package/corpus/templates/slides-2/app/components/editor/slide-style.ts +243 -0
- package/corpus/templates/slides-2/app/components/editor/slide-text-targets.ts +540 -0
- package/corpus/templates/slides-2/app/components/editor/style-clipboard.ts +102 -0
- package/corpus/templates/slides-2/app/components/editor/use-prompt-import.ts +159 -0
- package/corpus/templates/slides-2/app/components/home/SlidesHomeLibrary.tsx +79 -0
- package/corpus/templates/slides-2/app/components/layout/AgentWorkIndicator.tsx +193 -0
- package/corpus/templates/slides-2/app/components/layout/Header.tsx +110 -0
- package/corpus/templates/slides-2/app/components/layout/Layout.tsx +492 -0
- package/corpus/templates/slides-2/app/components/layout/Sidebar.tsx +109 -0
- package/corpus/templates/slides-2/app/components/layout/layout-route-policy.ts +28 -0
- package/corpus/templates/slides-2/app/components/presentation/PresentationView.tsx +1116 -0
- package/corpus/templates/slides-2/app/components/presentation/PresenterView.tsx +526 -0
- package/corpus/templates/slides-2/app/components/presentation/SlideTransitionStage.tsx +297 -0
- package/corpus/templates/slides-2/app/components/presentation/present-channel.ts +31 -0
- package/corpus/templates/slides-2/app/components/presentation/slide-build-steps.ts +231 -0
- package/corpus/templates/slides-2/app/components/presentation/slide-navigation.ts +273 -0
- package/corpus/templates/slides-2/app/components/presentation/slide-transition-motion.ts +258 -0
- package/corpus/templates/slides-2/app/components/presentation/voice-navigation.ts +61 -0
- package/corpus/templates/slides-2/app/components/settings/notification-settings.tsx +93 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2AssetBrowser.tsx +726 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2CommandMenu.tsx +453 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2Comments.tsx +571 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2DesignTokens.tsx +345 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2Editor.tsx +4804 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2ExportMenu.tsx +671 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2FontBrowser.tsx +342 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2ImageCropControls.tsx +487 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2Inspector.tsx +950 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/Slides2SvglLogoSearchDialog.tsx +332 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/cross-slide-edit-history.ts +151 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/design-token-presets.ts +140 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/editor-action-errors.ts +47 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/editor-export-errors.ts +60 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/geometry.ts +275 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/image-crop-style.ts +82 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/inline-text-editor.tsx +631 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/keyboard-shortcuts.ts +104 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/object-insertion.ts +13 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/preview-patches.ts +54 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/sandbox-render-errors.ts +23 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/source-structure.ts +634 -0
- package/corpus/templates/slides-2/app/components/slides-2-editor/types.ts +85 -0
- package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2BlackoutOverlay.tsx +13 -0
- package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2ControlBar.tsx +285 -0
- package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2HelpDialog.tsx +72 -0
- package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2JumpInput.tsx +38 -0
- package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2LaserPointer.tsx +67 -0
- package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2Overview.tsx +161 -0
- package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2Player.tsx +839 -0
- package/corpus/templates/slides-2/app/components/slides-2-presenter/Slides2ProgressBar.tsx +23 -0
- package/corpus/templates/slides-2/app/components/slides-2-presenter/keyboard.ts +36 -0
- package/corpus/templates/slides-2/app/components/slides-2-presenter/presenter-channel.ts +131 -0
- package/corpus/templates/slides-2/app/components/slides-2-presenter/use-presenter-action-bridge.ts +296 -0
- package/corpus/templates/slides-2/app/components/slides-2-presenter/useSlides2TouchSwipe.ts +80 -0
- package/corpus/templates/slides-2/app/components/slides-2-runtime/SandboxedSlide.tsx +724 -0
- package/corpus/templates/slides-2/app/components/slides-2-runtime/SlideContentRenderer.tsx +137 -0
- package/corpus/templates/slides-2/app/components/slides-2-runtime/Slides2Canvas.tsx +99 -0
- package/corpus/templates/slides-2/app/components/slides-2-runtime/constants.ts +4 -0
- package/corpus/templates/slides-2/app/components/slides-2-runtime/protocol.ts +1400 -0
- package/corpus/templates/slides-2/app/components/slides-2-runtime/transition-frame.ts +439 -0
- package/corpus/templates/slides-2/app/components/templates/DeckTemplateLibrary.tsx +314 -0
- package/corpus/templates/slides-2/app/components/templates/DeckTemplatePreview.tsx +60 -0
- package/corpus/templates/slides-2/app/components/templates/DeckTemplateStage.tsx +45 -0
- package/corpus/templates/slides-2/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/avatar.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/button-group.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/button.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/card.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/command.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/context-menu.tsx +32 -0
- package/corpus/templates/slides-2/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/filter-trigger.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/input.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/label.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/progress.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/scroll-area.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/select.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/slider.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/tabs.tsx +59 -0
- package/corpus/templates/slides-2/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/toggle-group.tsx +1 -0
- package/corpus/templates/slides-2/app/components/ui/toolkit-provider.tsx +17 -0
- package/corpus/templates/slides-2/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/slides-2/app/components/visual-editor/CanvasCommentPins.tsx +46 -0
- package/corpus/templates/slides-2/app/components/visual-editor/DrawOverlay.tsx +27 -0
- package/corpus/templates/slides-2/app/components/visual-editor/MultiSelectChip.tsx +97 -0
- package/corpus/templates/slides-2/app/components/visual-editor/SaveStatusIndicator.tsx +273 -0
- package/corpus/templates/slides-2/app/components/visual-editor/index.ts +4 -0
- package/corpus/templates/slides-2/app/context/DeckContext.tsx +7486 -0
- package/corpus/templates/slides-2/app/design-system.ts +3 -0
- package/corpus/templates/slides-2/app/entry.client.tsx +10 -0
- package/corpus/templates/slides-2/app/entry.server.tsx +10 -0
- package/corpus/templates/slides-2/app/global.css +1626 -0
- package/corpus/templates/slides-2/app/hooks/use-agent-generating.ts +517 -0
- package/corpus/templates/slides-2/app/hooks/use-compact-editor-layout.ts +26 -0
- package/corpus/templates/slides-2/app/hooks/use-contrast-audit-bridge.ts +49 -0
- package/corpus/templates/slides-2/app/hooks/use-deck-access-reload.ts +70 -0
- package/corpus/templates/slides-2/app/hooks/use-deck-access.ts +50 -0
- package/corpus/templates/slides-2/app/hooks/use-deck-design-system.ts +146 -0
- package/corpus/templates/slides-2/app/hooks/use-deck-history-action-bridge.ts +266 -0
- package/corpus/templates/slides-2/app/hooks/use-deck-presence.ts +89 -0
- package/corpus/templates/slides-2/app/hooks/use-deck-role.ts +46 -0
- package/corpus/templates/slides-2/app/hooks/use-deck-versions.ts +43 -0
- package/corpus/templates/slides-2/app/hooks/use-design-system-workflows.ts +11 -0
- package/corpus/templates/slides-2/app/hooks/use-design-systems.ts +31 -0
- package/corpus/templates/slides-2/app/hooks/use-generating-slide-preview.ts +115 -0
- package/corpus/templates/slides-2/app/hooks/use-navigation-state.ts +229 -0
- package/corpus/templates/slides-2/app/hooks/use-new-deck-generation-signal.ts +46 -0
- package/corpus/templates/slides-2/app/hooks/use-new-deck-generation.ts +710 -0
- package/corpus/templates/slides-2/app/hooks/use-sidebar-collapsed.ts +95 -0
- package/corpus/templates/slides-2/app/hooks/use-slide-comments.ts +202 -0
- package/corpus/templates/slides-2/app/hooks/use-slide-file-storage-status.ts +55 -0
- package/corpus/templates/slides-2/app/hooks/use-undo-selection.ts +66 -0
- package/corpus/templates/slides-2/app/hooks/use-workspace-defaults.ts +31 -0
- package/corpus/templates/slides-2/app/i18n/en-US.ts +1507 -0
- package/corpus/templates/slides-2/app/i18n/index.ts +19 -0
- package/corpus/templates/slides-2/app/lib/agent-visible-message.ts +21 -0
- package/corpus/templates/slides-2/app/lib/aspect-ratios.ts +7 -0
- package/corpus/templates/slides-2/app/lib/asset-error-copy.ts +59 -0
- package/corpus/templates/slides-2/app/lib/canvas-zoom.ts +47 -0
- package/corpus/templates/slides-2/app/lib/composer-context.ts +152 -0
- package/corpus/templates/slides-2/app/lib/composer-draft.ts +34 -0
- package/corpus/templates/slides-2/app/lib/contrast-audit.ts +390 -0
- package/corpus/templates/slides-2/app/lib/contrast-resolve.ts +240 -0
- package/corpus/templates/slides-2/app/lib/create-deck-generation.ts +938 -0
- package/corpus/templates/slides-2/app/lib/deck-access-lost.ts +4 -0
- package/corpus/templates/slides-2/app/lib/deck-backup.ts +186 -0
- package/corpus/templates/slides-2/app/lib/deck-editor-loading.ts +91 -0
- package/corpus/templates/slides-2/app/lib/deck-export-file-client.ts +77 -0
- package/corpus/templates/slides-2/app/lib/deck-filter.ts +52 -0
- package/corpus/templates/slides-2/app/lib/deck-list-loading.ts +16 -0
- package/corpus/templates/slides-2/app/lib/deck-preview-frame.ts +15 -0
- package/corpus/templates/slides-2/app/lib/deck-share-links.ts +9 -0
- package/corpus/templates/slides-2/app/lib/deck-sorting.ts +19 -0
- package/corpus/templates/slides-2/app/lib/deferred-editor-surfaces.ts +24 -0
- package/corpus/templates/slides-2/app/lib/design-system-selection.ts +11 -0
- package/corpus/templates/slides-2/app/lib/design-systems.ts +231 -0
- package/corpus/templates/slides-2/app/lib/dynamic-import.ts +50 -0
- package/corpus/templates/slides-2/app/lib/editor-agent-handoff.ts +92 -0
- package/corpus/templates/slides-2/app/lib/editor-shortcuts.ts +153 -0
- package/corpus/templates/slides-2/app/lib/export-google-slides-client.ts +168 -0
- package/corpus/templates/slides-2/app/lib/export-pdf-client.ts +684 -0
- package/corpus/templates/slides-2/app/lib/export-pptx-client.ts +2420 -0
- package/corpus/templates/slides-2/app/lib/generation-lifecycle.ts +24 -0
- package/corpus/templates/slides-2/app/lib/generation-state.ts +247 -0
- package/corpus/templates/slides-2/app/lib/google-docs-client.ts +110 -0
- package/corpus/templates/slides-2/app/lib/google-slides-export-availability-client.ts +53 -0
- package/corpus/templates/slides-2/app/lib/google-slides-reference-source.ts +18 -0
- package/corpus/templates/slides-2/app/lib/image-download.ts +85 -0
- package/corpus/templates/slides-2/app/lib/image-drop-to-agent.ts +210 -0
- package/corpus/templates/slides-2/app/lib/import-uploaded-deck.ts +132 -0
- package/corpus/templates/slides-2/app/lib/inline-edit-remote.ts +55 -0
- package/corpus/templates/slides-2/app/lib/localize-slides-changelog.ts +47 -0
- package/corpus/templates/slides-2/app/lib/mermaid-blocks.ts +18 -0
- package/corpus/templates/slides-2/app/lib/new-deck-reference-selection.ts +174 -0
- package/corpus/templates/slides-2/app/lib/normalize-slide-padding.ts +74 -0
- package/corpus/templates/slides-2/app/lib/pending-deck-changes.ts +33 -0
- package/corpus/templates/slides-2/app/lib/portaled-layer.ts +7 -0
- package/corpus/templates/slides-2/app/lib/pptx-google-slides.ts +204 -0
- package/corpus/templates/slides-2/app/lib/prompt-attachment-adapter.ts +37 -0
- package/corpus/templates/slides-2/app/lib/prompt-file-uploads.ts +557 -0
- package/corpus/templates/slides-2/app/lib/recent-references.ts +106 -0
- package/corpus/templates/slides-2/app/lib/reference-document-hydration.ts +406 -0
- package/corpus/templates/slides-2/app/lib/register-chat-renderers.tsx +645 -0
- package/corpus/templates/slides-2/app/lib/reveal-after-delete.ts +55 -0
- package/corpus/templates/slides-2/app/lib/sanitize-slide-html.ts +752 -0
- package/corpus/templates/slides-2/app/lib/slide-agent-context.ts +148 -0
- package/corpus/templates/slides-2/app/lib/slide-animation-elements.ts +900 -0
- package/corpus/templates/slides-2/app/lib/slide-clipboard.ts +534 -0
- package/corpus/templates/slides-2/app/lib/slide-comment-anchor.ts +286 -0
- package/corpus/templates/slides-2/app/lib/slide-content-merge.ts +295 -0
- package/corpus/templates/slides-2/app/lib/slide-image-replacement.ts +1919 -0
- package/corpus/templates/slides-2/app/lib/slide-live-remote.ts +215 -0
- package/corpus/templates/slides-2/app/lib/slide-scroll.ts +56 -0
- package/corpus/templates/slides-2/app/lib/slide-source-map.ts +1099 -0
- package/corpus/templates/slides-2/app/lib/slide-video.ts +390 -0
- package/corpus/templates/slides-2/app/lib/slides-relay-tracking.ts +114 -0
- package/corpus/templates/slides-2/app/lib/streaming-slide-html.ts +77 -0
- package/corpus/templates/slides-2/app/lib/tab-id.ts +3 -0
- package/corpus/templates/slides-2/app/lib/template-navigation.ts +15 -0
- package/corpus/templates/slides-2/app/lib/text-tool-shortcut.ts +75 -0
- package/corpus/templates/slides-2/app/lib/undo-reveal.ts +332 -0
- package/corpus/templates/slides-2/app/lib/upload-response.ts +107 -0
- package/corpus/templates/slides-2/app/lib/utils.ts +38 -0
- package/corpus/templates/slides-2/app/lib/validate-native-slide-html.ts +177 -0
- package/corpus/templates/slides-2/app/lib/video-upload.ts +354 -0
- package/corpus/templates/slides-2/app/pages/DeckEditor.tsx +6158 -0
- package/corpus/templates/slides-2/app/pages/DesignSystems.tsx +363 -0
- package/corpus/templates/slides-2/app/pages/Index.tsx +3254 -0
- package/corpus/templates/slides-2/app/pages/NotFound.tsx +33 -0
- package/corpus/templates/slides-2/app/pages/Presentation.tsx +120 -0
- package/corpus/templates/slides-2/app/pages/SharedPresentation.tsx +174 -0
- package/corpus/templates/slides-2/app/pages/SlideThemeDetail.tsx +227 -0
- package/corpus/templates/slides-2/app/pages/SlideThemes.tsx +155 -0
- package/corpus/templates/slides-2/app/pages/Slides2EditorPage.tsx +1618 -0
- package/corpus/templates/slides-2/app/pages/Slides2PresenterConsolePage.tsx +937 -0
- package/corpus/templates/slides-2/app/pages/Slides2PresenterPage.tsx +979 -0
- package/corpus/templates/slides-2/app/pages/Templates.tsx +32 -0
- package/corpus/templates/slides-2/app/root.tsx +391 -0
- package/corpus/templates/slides-2/app/routes/$.tsx +10 -0
- package/corpus/templates/slides-2/app/routes/_index.tsx +1 -0
- package/corpus/templates/slides-2/app/routes/access-request.approve.tsx +276 -0
- package/corpus/templates/slides-2/app/routes/agent.tsx +19 -0
- package/corpus/templates/slides-2/app/routes/chat.$threadId.tsx +1 -0
- package/corpus/templates/slides-2/app/routes/chat.tsx +190 -0
- package/corpus/templates/slides-2/app/routes/deck.$id.tsx +10 -0
- package/corpus/templates/slides-2/app/routes/deck.$id_.present.tsx +10 -0
- package/corpus/templates/slides-2/app/routes/design-systems.tsx +10 -0
- package/corpus/templates/slides-2/app/routes/extensions.$id.$slug.tsx +2 -0
- package/corpus/templates/slides-2/app/routes/extensions.$id.tsx +5 -0
- package/corpus/templates/slides-2/app/routes/extensions._index.tsx +5 -0
- package/corpus/templates/slides-2/app/routes/extensions.tsx +5 -0
- package/corpus/templates/slides-2/app/routes/home-layout.tsx +31 -0
- package/corpus/templates/slides-2/app/routes/home.tsx +22 -0
- package/corpus/templates/slides-2/app/routes/p.$id.tsx +195 -0
- package/corpus/templates/slides-2/app/routes/settings.$.tsx +1 -0
- package/corpus/templates/slides-2/app/routes/settings.tsx +131 -0
- package/corpus/templates/slides-2/app/routes/share.$token.tsx +137 -0
- package/corpus/templates/slides-2/app/routes/slide.tsx +209 -0
- package/corpus/templates/slides-2/app/routes/team.tsx +11 -0
- package/corpus/templates/slides-2/app/routes/templates.tsx +1 -0
- package/corpus/templates/slides-2/app/routes/themes.$id.tsx +1 -0
- package/corpus/templates/slides-2/app/routes/themes.tsx +1 -0
- package/corpus/templates/slides-2/app/routes.ts +24 -0
- package/corpus/templates/slides-2/app/vite-env.d.ts +24 -0
- package/corpus/templates/slides-2/changelog/2026-10-17-find-and-switch-decks-from-the-presenter-console.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-17-meet-slides-2-create-and-refine-editable-slide-decks-with-an.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-17-pptx-image-export.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-17-visual-editor.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-18-apply-an-accessible-design-system-to-an-existing-deck-before.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-18-choose-a-template-or-start-a-new-presentation-from-the-slide.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-18-generate-decks-from-a-prompt-then-edit-slide-elements-direct.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-18-generate-presentation-decks-from-a-prompt-and-edit-every-sli.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-18-new-presentation-drafts-save-before-generation-starts-so-you.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-18-the-assistant-can-undo-redo-and-save-pending-edits-in-the-vi.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-19-agents-can-insert-duplicate-and-delete-canvas-objects-in-sou.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-19-browse-slide-themes.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-19-clicking-a-slide-preview-in-overview-selects-that-slide.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-19-create-decks-from-a-prompt-and-edit-slides-directly-on-the-c.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-19-creating-and-editing-decks-now-starts-with-the-tools-most-re.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-19-deleting-decks-revokes-public-links.md +7 -0
- package/corpus/templates/slides-2/changelog/2026-10-19-escape-cancels-an-in-progress-slide-drag-without-losing-earl.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-19-import-failures-now-show-clear-localized-descriptions-instea.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-19-presenter-controls-stay-responsive-when-moving-over-the-slid.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-19-presenter-notes-stay-private-from-viewers-and-commenters.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-19-preview-generated-slides-in-chat.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-19-remote-image-previews-accept-supported-raster-formats.md +6 -0
- 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
- package/corpus/templates/slides-2/changelog/2026-10-19-slide-generation-explains-when-react-effect-hooks-cannot-run.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-19-the-editor-highlights-hovered-objects-and-keeps-image-replac.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-19-the-slide-editor-uses-the-shared-agent-native-controls.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-20-deck-editing-controls-match-the-workspace.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-20-google-slides-imports-now-report-missing-image-data-instead-.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-20-imports-and-previews-handle-large-content-safely.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-20-public-deck-pages-can-export-source-backed-slides-to-pdf.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-20-saved-slide-images-stay-available.md +6 -0
- package/corpus/templates/slides-2/changelog/2026-10-20-scope-global-media-picks-to-assets-the-current-deck-can-reso.md +6 -0
- package/corpus/templates/slides-2/components.json +20 -0
- package/corpus/templates/slides-2/drizzle.config.ts +3 -0
- package/corpus/templates/slides-2/learnings.defaults.md +5 -0
- package/corpus/templates/slides-2/netlify.toml +24 -0
- package/corpus/templates/slides-2/package.json +147 -0
- package/corpus/templates/slides-2/public/agent-native-icon-dark.svg +10 -0
- package/corpus/templates/slides-2/public/agent-native-icon-light.svg +10 -0
- package/corpus/templates/slides-2/public/agent-native-logo-dark.svg +21 -0
- package/corpus/templates/slides-2/public/agent-native-logo-light.svg +21 -0
- package/corpus/templates/slides-2/public/assets/builder-logo-white.svg +15 -0
- package/corpus/templates/slides-2/public/assets/generated/preview.html +61 -0
- package/corpus/templates/slides-2/public/assets/intuit-logo-white.svg +6 -0
- package/corpus/templates/slides-2/public/assets/walmart-logo-white.svg +6 -0
- package/corpus/templates/slides-2/public/chatgpt-plugin-icon.svg +7 -0
- package/corpus/templates/slides-2/public/favicon.svg +1 -0
- package/corpus/templates/slides-2/public/icon-180.svg +1 -0
- package/corpus/templates/slides-2/public/icon-192.svg +1 -0
- package/corpus/templates/slides-2/public/icon-512.svg +1 -0
- package/corpus/templates/slides-2/public/manifest.json +20 -0
- package/corpus/templates/slides-2/public/placeholder.svg +1 -0
- package/corpus/templates/slides-2/public/robots.txt +14 -0
- package/corpus/templates/slides-2/public/visual-edit-structure-proof.html +99 -0
- package/corpus/templates/slides-2/react-router.config.ts +7 -0
- package/corpus/templates/slides-2/scripts/edit-fidelity/README.md +499 -0
- package/corpus/templates/slides-2/scripts/edit-fidelity/authoring-fuzz.ts +9517 -0
- package/corpus/templates/slides-2/scripts/edit-fidelity/baseline.json +16427 -0
- package/corpus/templates/slides-2/scripts/edit-fidelity/dev-server-url.ts +10 -0
- package/corpus/templates/slides-2/scripts/edit-fidelity/lib/in-page.ts +1975 -0
- package/corpus/templates/slides-2/scripts/edit-fidelity/lib/metrics.ts +1401 -0
- package/corpus/templates/slides-2/scripts/edit-fidelity/retry-infra.ts +7 -0
- package/corpus/templates/slides-2/scripts/edit-fidelity/run-options.ts +21 -0
- package/corpus/templates/slides-2/scripts/edit-fidelity/run-outcomes.ts +127 -0
- package/corpus/templates/slides-2/scripts/edit-fidelity/run.ts +8451 -0
- package/corpus/templates/slides-2/scripts/export-fidelity/README.md +116 -0
- package/corpus/templates/slides-2/scripts/export-fidelity/compare-layout-lib.ts +241 -0
- package/corpus/templates/slides-2/scripts/export-fidelity/compare-layout.ts +30 -0
- package/corpus/templates/slides-2/scripts/export-fidelity/diff.ts +222 -0
- package/corpus/templates/slides-2/scripts/export-fidelity/export.ts +765 -0
- package/corpus/templates/slides-2/scripts/export-fidelity/fixtures/agent-dark-deck.json +48 -0
- package/corpus/templates/slides-2/scripts/export-fidelity/generate-calibration.ts +765 -0
- package/corpus/templates/slides-2/scripts/export-fidelity/google-export.ts +137 -0
- package/corpus/templates/slides-2/scripts/export-fidelity/google-layout.ts +82 -0
- package/corpus/templates/slides-2/scripts/export-fidelity/resolve-pkg.ts +29 -0
- package/corpus/templates/slides-2/scripts/migrate-production.ts +22 -0
- package/corpus/templates/slides-2/server/db/index.ts +73 -0
- package/corpus/templates/slides-2/server/db/schema.ts +189 -0
- package/corpus/templates/slides-2/server/handlers/assets-url.ts +13 -0
- package/corpus/templates/slides-2/server/handlers/assets.ts +3217 -0
- package/corpus/templates/slides-2/server/handlers/decks.ts +185 -0
- package/corpus/templates/slides-2/server/handlers/demo.ts +9 -0
- package/corpus/templates/slides-2/server/handlers/design-systems.ts +219 -0
- package/corpus/templates/slides-2/server/handlers/google-docs-auth.ts +165 -0
- package/corpus/templates/slides-2/server/handlers/image-gen.ts +153 -0
- package/corpus/templates/slides-2/server/handlers/image-providers/gemini.ts +209 -0
- package/corpus/templates/slides-2/server/handlers/image-providers/index.ts +61 -0
- package/corpus/templates/slides-2/server/handlers/image-providers/openai.ts +288 -0
- package/corpus/templates/slides-2/server/handlers/image-providers/types.ts +35 -0
- package/corpus/templates/slides-2/server/handlers/import/docx-parser.ts +31 -0
- package/corpus/templates/slides-2/server/handlers/import/html-converter.ts +1534 -0
- package/corpus/templates/slides-2/server/handlers/import/pdf-fidelity-parser.ts +1039 -0
- package/corpus/templates/slides-2/server/handlers/import/pdf-sidecar-reader.ts +81 -0
- package/corpus/templates/slides-2/server/handlers/import/pdf-style-digest.ts +187 -0
- package/corpus/templates/slides-2/server/handlers/import/pptx-assets.ts +155 -0
- package/corpus/templates/slides-2/server/handlers/import/pptx-parser.ts +57 -0
- package/corpus/templates/slides-2/server/handlers/request-auth-context.ts +108 -0
- package/corpus/templates/slides-2/server/handlers/share.ts +52 -0
- package/corpus/templates/slides-2/server/handlers/uploads-chunked.ts +1066 -0
- package/corpus/templates/slides-2/server/handlers/uploads.ts +457 -0
- package/corpus/templates/slides-2/server/lib/access-request-email.ts +66 -0
- package/corpus/templates/slides-2/server/lib/assets-image-delegation.ts +331 -0
- package/corpus/templates/slides-2/server/lib/bounded-multipart.ts +49 -0
- package/corpus/templates/slides-2/server/lib/builder-design-system-proxy.ts +122 -0
- package/corpus/templates/slides-2/server/lib/chat-attachments.ts +425 -0
- package/corpus/templates/slides-2/server/lib/chatgpt-directory-tools.ts +246 -0
- package/corpus/templates/slides-2/server/lib/chunked-upload-session.ts +195 -0
- package/corpus/templates/slides-2/server/lib/comment-notifications.ts +184 -0
- package/corpus/templates/slides-2/server/lib/deck-access-requests.ts +102 -0
- package/corpus/templates/slides-2/server/lib/deck-asset-scope.ts +150 -0
- package/corpus/templates/slides-2/server/lib/deck-export-tracking.ts +119 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/a-case-study.ts +154 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/a-company.ts +160 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/a-pitch.ts +151 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/a-quarterly.ts +264 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/a-shared.ts +35 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/a-update.ts +188 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/a-workshop.ts +196 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/b-keynote.ts +131 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/b-lesson.ts +209 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/b-manifesto.ts +149 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/b-portfolio.ts +144 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/b-research.ts +221 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/b-roadmap.ts +264 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/b-shared.ts +44 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/group-a.ts +16 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/group-b.ts +16 -0
- package/corpus/templates/slides-2/server/lib/deck-templates/legacy.ts +567 -0
- package/corpus/templates/slides-2/server/lib/deck-templates.ts +60 -0
- package/corpus/templates/slides-2/server/lib/deck-versions.ts +233 -0
- package/corpus/templates/slides-2/server/lib/design-system-workflows.ts +22 -0
- package/corpus/templates/slides-2/server/lib/emails.ts +84 -0
- package/corpus/templates/slides-2/server/lib/env-config.ts +15 -0
- package/corpus/templates/slides-2/server/lib/fetch-remote-image.ts +245 -0
- package/corpus/templates/slides-2/server/lib/generation-completion.ts +278 -0
- package/corpus/templates/slides-2/server/lib/google-docs-access.ts +51 -0
- package/corpus/templates/slides-2/server/lib/google-docs-error.ts +54 -0
- package/corpus/templates/slides-2/server/lib/google-docs-oauth.ts +422 -0
- package/corpus/templates/slides-2/server/lib/google-fonts.ts +509 -0
- package/corpus/templates/slides-2/server/lib/google-oauth-preflight.ts +119 -0
- package/corpus/templates/slides-2/server/lib/google-slides-export-availability.ts +55 -0
- package/corpus/templates/slides-2/server/lib/image-proxy-response.ts +16 -0
- package/corpus/templates/slides-2/server/lib/image-proxy-url.ts +155 -0
- package/corpus/templates/slides-2/server/lib/import-asset-storage.ts +214 -0
- package/corpus/templates/slides-2/server/lib/imported-asset-batch.ts +218 -0
- package/corpus/templates/slides-2/server/lib/legacy-slide-source.ts +692 -0
- package/corpus/templates/slides-2/server/lib/media-search-providers.ts +216 -0
- package/corpus/templates/slides-2/server/lib/native-creative-context.ts +295 -0
- package/corpus/templates/slides-2/server/lib/pdf-parse-setup.ts +115 -0
- package/corpus/templates/slides-2/server/lib/provider-api.ts +57 -0
- package/corpus/templates/slides-2/server/lib/request-wait-until.ts +30 -0
- package/corpus/templates/slides-2/server/lib/shared-deck.ts +29 -0
- package/corpus/templates/slides-2/server/lib/slide-asset-references.ts +309 -0
- package/corpus/templates/slides-2/server/lib/slide-content-patch.ts +1004 -0
- package/corpus/templates/slides-2/server/lib/slide-hygiene.ts +731 -0
- package/corpus/templates/slides-2/server/lib/slide-image-insertion.ts +136 -0
- package/corpus/templates/slides-2/server/lib/slide-reveal-issues.ts +41 -0
- package/corpus/templates/slides-2/server/lib/slide-source-editing/babel-walk.ts +117 -0
- package/corpus/templates/slides-2/server/lib/slide-source-editing/batch-edit.ts +152 -0
- package/corpus/templates/slides-2/server/lib/slide-source-editing/edit-ops.ts +1478 -0
- package/corpus/templates/slides-2/server/lib/slide-source-editing/image-target.ts +128 -0
- package/corpus/templates/slides-2/server/lib/slide-source-editing/text-diff.ts +23 -0
- package/corpus/templates/slides-2/server/lib/slide-source-limits.ts +9 -0
- package/corpus/templates/slides-2/server/lib/slide-source.ts +1786 -0
- package/corpus/templates/slides-2/server/lib/slide-theme-demo-sources.ts +2106 -0
- package/corpus/templates/slides-2/server/lib/slide-themes.ts +2174 -0
- package/corpus/templates/slides-2/server/lib/slide-worker-runtime.ts +1995 -0
- package/corpus/templates/slides-2/server/lib/slides-tracking.ts +73 -0
- package/corpus/templates/slides-2/server/lib/source-import.ts +213 -0
- package/corpus/templates/slides-2/server/lib/svgl.ts +364 -0
- package/corpus/templates/slides-2/server/lib/tenant-files.ts +179 -0
- package/corpus/templates/slides-2/server/lib/upload-storage-status.ts +9 -0
- package/corpus/templates/slides-2/server/lib/uploaded-asset-cleanup-outbox.ts +521 -0
- package/corpus/templates/slides-2/server/lib/uploaded-asset-object-lifecycle.ts +404 -0
- package/corpus/templates/slides-2/server/lib/uploaded-fonts.ts +696 -0
- package/corpus/templates/slides-2/server/lib/uploaded-reference-storage.ts +77 -0
- package/corpus/templates/slides-2/server/lib/validate-slide-animations.ts +341 -0
- package/corpus/templates/slides-2/server/middleware/auth.ts +6 -0
- package/corpus/templates/slides-2/server/plugins/_dev-upload-stub.ts +6 -0
- package/corpus/templates/slides-2/server/plugins/agent-chat.ts +402 -0
- package/corpus/templates/slides-2/server/plugins/auth.ts +31 -0
- package/corpus/templates/slides-2/server/plugins/collab.ts +30 -0
- package/corpus/templates/slides-2/server/plugins/config.ts +6 -0
- package/corpus/templates/slides-2/server/plugins/core-routes.ts +30 -0
- package/corpus/templates/slides-2/server/plugins/creative-context.ts +187 -0
- package/corpus/templates/slides-2/server/plugins/db.ts +462 -0
- package/corpus/templates/slides-2/server/plugins/feature-flags.ts +5 -0
- package/corpus/templates/slides-2/server/plugins/labs.ts +8 -0
- package/corpus/templates/slides-2/server/plugins/orphaned-asset-cleanup.ts +17 -0
- package/corpus/templates/slides-2/server/plugins/otel.ts +6 -0
- package/corpus/templates/slides-2/server/plugins/transactional-emails.ts +5 -0
- package/corpus/templates/slides-2/server/register-secrets.ts +209 -0
- package/corpus/templates/slides-2/server/routes/[...page].get.ts +5 -0
- package/corpus/templates/slides-2/server/routes/[...page].head.ts +1 -0
- package/corpus/templates/slides-2/server/routes/[base]/_agent-native/google-docs/auth-url.get.ts +1 -0
- package/corpus/templates/slides-2/server/routes/[base]/_agent-native/google-docs/callback.get.ts +1 -0
- package/corpus/templates/slides-2/server/routes/_agent-native/google-docs/auth-url.get.ts +1 -0
- package/corpus/templates/slides-2/server/routes/_agent-native/google-docs/callback.get.ts +1 -0
- package/corpus/templates/slides-2/server/routes/api/assets/upload-video.post.ts +1 -0
- package/corpus/templates/slides-2/server/routes/api/assets/upload.post.ts +1 -0
- package/corpus/templates/slides-2/server/routes/api/assets/video-uploads.delete.ts +1 -0
- package/corpus/templates/slides-2/server/routes/api/deck-agent-context.json.get.ts +105 -0
- package/corpus/templates/slides-2/server/routes/api/decks/events.get.ts +1 -0
- package/corpus/templates/slides-2/server/routes/api/demo.get.ts +1 -0
- package/corpus/templates/slides-2/server/routes/api/exports/[filename].get.ts +221 -0
- package/corpus/templates/slides-2/server/routes/api/exports/google-slides.post.ts +240 -0
- package/corpus/templates/slides-2/server/routes/api/exports/html.post.ts +67 -0
- package/corpus/templates/slides-2/server/routes/api/exports/pptx.post.ts +100 -0
- package/corpus/templates/slides-2/server/routes/api/gen-preview/[...].get.ts +24 -0
- package/corpus/templates/slides-2/server/routes/api/generated/[...].get.ts +24 -0
- package/corpus/templates/slides-2/server/routes/api/image-proxy.get.ts +518 -0
- package/corpus/templates/slides-2/server/routes/api/import-assets/[token].get.ts +70 -0
- package/corpus/templates/slides-2/server/routes/api/preview-images.get.ts +20 -0
- package/corpus/templates/slides-2/server/routes/api/share/[token].get.ts +1 -0
- package/corpus/templates/slides-2/server/routes/api/uploads-chunked/[sessionId]/chunk.post.ts +1 -0
- package/corpus/templates/slides-2/server/routes/api/uploads-chunked/[sessionId]/status.get.ts +1 -0
- package/corpus/templates/slides-2/server/routes/api/uploads-chunked/[sessionId].delete.ts +1 -0
- package/corpus/templates/slides-2/server/routes/api/uploads-chunked/start.post.ts +1 -0
- package/corpus/templates/slides-2/server/routes/api/uploads.delete.ts +1 -0
- package/corpus/templates/slides-2/server/routes/api/uploads.post.ts +1 -0
- package/corpus/templates/slides-2/server/workspace-defaults.ts +196 -0
- package/corpus/templates/slides-2/shared/action-ui.ts +147 -0
- package/corpus/templates/slides-2/shared/agent-readable.ts +2 -0
- package/corpus/templates/slides-2/shared/api.ts +406 -0
- package/corpus/templates/slides-2/shared/app-state-tabs.ts +30 -0
- package/corpus/templates/slides-2/shared/app-storage.ts +9 -0
- package/corpus/templates/slides-2/shared/aspect-ratios.ts +49 -0
- package/corpus/templates/slides-2/shared/blank-slide.ts +179 -0
- package/corpus/templates/slides-2/shared/client-compatibility.ts +2 -0
- package/corpus/templates/slides-2/shared/contrast-audit.ts +255 -0
- package/corpus/templates/slides-2/shared/deck-access.ts +26 -0
- package/corpus/templates/slides-2/shared/deck-app-scope.ts +14 -0
- package/corpus/templates/slides-2/shared/deck-content.ts +37 -0
- package/corpus/templates/slides-2/shared/deck-history-control.ts +79 -0
- package/corpus/templates/slides-2/shared/deck-scope.ts +5 -0
- package/corpus/templates/slides-2/shared/deck-title.ts +199 -0
- package/corpus/templates/slides-2/shared/deck-write.ts +61 -0
- package/corpus/templates/slides-2/shared/design-flags.ts +7 -0
- package/corpus/templates/slides-2/shared/design-system-validation.ts +88 -0
- package/corpus/templates/slides-2/shared/editor-control.ts +120 -0
- package/corpus/templates/slides-2/shared/generation-timing.ts +19 -0
- package/corpus/templates/slides-2/shared/google-docs.ts +69 -0
- package/corpus/templates/slides-2/shared/labs.ts +10 -0
- package/corpus/templates/slides-2/shared/overview-navigation.ts +34 -0
- package/corpus/templates/slides-2/shared/ownership.ts +6 -0
- package/corpus/templates/slides-2/shared/pdf-sidecar.ts +130 -0
- package/corpus/templates/slides-2/shared/presenter-control.ts +111 -0
- package/corpus/templates/slides-2/shared/representative-slide.ts +89 -0
- package/corpus/templates/slides-2/shared/slide-background.ts +30 -0
- package/corpus/templates/slides-2/shared/slide-comment-anchor.ts +117 -0
- package/corpus/templates/slides-2/shared/slide-comment-reactions.ts +47 -0
- package/corpus/templates/slides-2/shared/slide-design-tokens.ts +92 -0
- package/corpus/templates/slides-2/shared/slide-fit.ts +78 -0
- package/corpus/templates/slides-2/shared/slide-ids.ts +133 -0
- package/corpus/templates/slides-2/shared/slide-number.ts +124 -0
- package/corpus/templates/slides-2/shared/slide-object-structure.ts +790 -0
- package/corpus/templates/slides-2/shared/slide-text-range-selection.ts +50 -0
- package/corpus/templates/slides-2/shared/slide-transitions.ts +70 -0
- package/corpus/templates/slides-2/shared/slides-2-transition.ts +194 -0
- package/corpus/templates/slides-2/shared/slides-user-prefs.ts +22 -0
- package/corpus/templates/slides-2/shared/source-import-errors.ts +12 -0
- package/corpus/templates/slides-2/shared/source-runtime-export.ts +76 -0
- package/corpus/templates/slides-2/shared/upload-types.ts +41 -0
- package/corpus/templates/slides-2/ssr-entry.ts +11 -0
- package/corpus/templates/slides-2/tsconfig.json +27 -0
- package/corpus/templates/slides-2/vite.config.ts +77 -0
- package/corpus/templates/slides-2/vitest.config.ts +28 -0
- package/corpus/templates/tasks/.agents/skills/actions/references/action-fields.md +1 -1
- package/package.json +1 -1
- package/corpus/templates/design/.agents/skills/shader-fills/SKILL.md +0 -182
- package/corpus/templates/design/actions/apply-shader-fill.ts +0 -450
- package/corpus/templates/design/actions/apply-shader.ts +0 -257
- package/corpus/templates/design/actions/preview-shader-fill.ts +0 -157
- package/corpus/templates/design/app/components/design/inspector/GlslShaderPanel.tsx +0 -1144
- package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +0 -450
- package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +0 -71
- package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +0 -555
- package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +0 -105
- package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +0 -433
- package/corpus/templates/design/app/components/design/inspector/color-picker-shader-pane.tsx +0 -648
- package/corpus/templates/design/shared/shader-fill.ts +0 -174
- 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
|
-
|
|
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
|
-
|
|
370
|
-
|
|
371
|
-
|
|
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 =
|
|
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
|
|
430
|
+
throw new NativeSourceCapabilityError(
|
|
393
431
|
"source-shadow-dom",
|
|
394
432
|
"Shadow DOM source content is unsupported.",
|
|
395
433
|
);
|
|
396
434
|
}
|
|
397
|
-
if (element
|
|
398
|
-
throw new
|
|
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
|
|
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
|
|
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
|
|
426
|
-
|
|
427
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
504
|
-
child
|
|
505
|
-
child
|
|
506
|
-
child
|
|
507
|
-
child
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
style
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
"
|
|
651
|
-
|
|
652
|
-
)
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
:
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
segments
|
|
665
|
-
index
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
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
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
1053
|
+
isNativeHtmlElement(element)
|
|
886
1054
|
? element.offsetWidth || rect.width
|
|
887
1055
|
: rect.width,
|
|
888
1056
|
);
|
|
889
1057
|
const height = Math.ceil(
|
|
890
|
-
element
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1374
|
-
(element
|
|
1375
|
-
(target
|
|
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
|
|
1384
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1935
|
+
if (isNativeSvgRoot(target)) {
|
|
1769
1936
|
if (overflow.edge === "none")
|
|
1770
|
-
throw new
|
|
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
|
|
2407
|
+
((isNativeHtmlElement(element) &&
|
|
2241
2408
|
(hasOwnPaint(element) ||
|
|
2242
|
-
element
|
|
2243
|
-
element
|
|
2244
|
-
element
|
|
2245
|
-
element
|
|
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
|
|
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
|
|
2542
|
-
child
|
|
2543
|
-
child
|
|
2544
|
-
child
|
|
2708
|
+
!isNativeHtmlElement(child) ||
|
|
2709
|
+
isNativeHtmlTag(child, "img") ||
|
|
2710
|
+
isNativeHtmlTag(child, "canvas") ||
|
|
2711
|
+
isNativeHtmlTag(child, "video")
|
|
2545
2712
|
) {
|
|
2546
|
-
throw new
|
|
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
|
|
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
|
|
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
|
|
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
|
|
2902
|
-
|
|
2903
|
-
: sizeOf(element);
|
|
3067
|
+
const size = isNativeSvgRoot(element)
|
|
3068
|
+
? nativeSvgViewportSize(element)
|
|
3069
|
+
: sizeOf(element);
|
|
2904
3070
|
const style = getComputedStyle(element);
|
|
2905
|
-
const paint =
|
|
2906
|
-
|
|
2907
|
-
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
3361
|
-
|
|
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
|
|
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
|
|
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
|
|
3425
|
-
throw new
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
3883
|
+
if (isNativeSvgRoot(record.node)) {
|
|
3719
3884
|
return validateNativeSvgPrimitiveMarkup(record.node.outerHTML);
|
|
3720
3885
|
}
|
|
3721
|
-
if (!(record.node
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
4147
|
-
|
|
4148
|
-
|
|
4149
|
-
|
|
4150
|
-
|
|
4151
|
-
|
|
4152
|
-
|
|
4153
|
-
|
|
4154
|
-
|
|
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
|
|
4159
|
-
|
|
4160
|
-
|
|
4161
|
-
.
|
|
4162
|
-
|
|
4163
|
-
|
|
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
|
|
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
|
|
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
|
|
4888
|
+
!(current === record.node && isNativeSvgRoot(current)) &&
|
|
4709
4889
|
hasUnsupportedSourceMask(style.clipPath, style.maskImage)
|
|
4710
4890
|
)
|
|
4711
|
-
throw new
|
|
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
|
|
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
|
|
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
|
|
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
|
|
4863
|
-
throw new
|
|
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
|
|
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
|
|
4888
|
-
|
|
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
|
|
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
|
|
5114
|
+
isNativeSvgRoot(element) ? "all" : "coverage",
|
|
4936
5115
|
),
|
|
4937
5116
|
(node, canvas, density) =>
|
|
4938
|
-
node
|
|
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
|
|
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
|
|
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
|
|
5048
|
-
throw new
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
5169
|
-
|
|
5170
|
-
: null;
|
|
5346
|
+
const nativeInstanceId = isNativeHtmlTag(element, "canvas")
|
|
5347
|
+
? element.getAttribute("data-an-native-canvas")
|
|
5348
|
+
: null;
|
|
5171
5349
|
const media =
|
|
5172
|
-
element
|
|
5173
|
-
element
|
|
5174
|
-
(element
|
|
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
|
|
5483
|
+
if (isNativeHtmlTag(element, "img")) {
|
|
5306
5484
|
const imageSourceUrl = element.currentSrc || element.src;
|
|
5307
5485
|
assertLocalAsset(imageSourceUrl);
|
|
5308
|
-
|
|
5309
|
-
|
|
5310
|
-
|
|
5311
|
-
|
|
5312
|
-
|
|
5313
|
-
|
|
5314
|
-
|
|
5315
|
-
|
|
5316
|
-
|
|
5317
|
-
|
|
5318
|
-
|
|
5319
|
-
|
|
5320
|
-
|
|
5321
|
-
|
|
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
|
|
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
|
|
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
|
|
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 (
|
|
5630
|
-
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
5819
|
-
if (element
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
6302
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
6415
|
-
|
|
6416
|
-
|
|
6417
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
6801
|
-
|
|
6802
|
-
|
|
6803
|
-
|
|
6804
|
-
this.target
|
|
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
|
-
|
|
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) !==
|
|
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";
|