@agent-native/core 0.129.1 → 0.130.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 +2 -2
- package/corpus/core/CHANGELOG.md +78 -0
- package/corpus/core/docs/content/cloneable-saas.mdx +114 -0
- package/corpus/core/docs/content/creating-templates.mdx +28 -2
- package/corpus/core/docs/content/syncing-template-changes.mdx +7 -0
- package/corpus/core/docs/content/template-clips-developers.mdx +12 -5
- package/corpus/core/docs/content/template-dispatch-developers.mdx +1 -1
- package/corpus/core/docs/content/template-dispatch.mdx +1 -1
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/action-ui.ts +1 -0
- package/corpus/core/src/action.ts +5 -1
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +15 -5
- package/corpus/core/src/agent/harness/runner.ts +5 -0
- package/corpus/core/src/agent/production-agent.ts +33 -0
- package/corpus/core/src/agent/run-loop-with-resume.ts +5 -0
- package/corpus/core/src/agent/run-manager.ts +126 -1
- package/corpus/core/src/agent/thread-data-builder.ts +47 -2
- package/corpus/core/src/agent/types.ts +2 -0
- package/corpus/core/src/chat-threads/store.ts +4 -5
- package/corpus/core/src/cli/create.ts +1139 -65
- package/corpus/core/src/cli/design-connect.ts +3 -7
- package/corpus/core/src/cli/index.ts +5 -3
- package/corpus/core/src/cli/skills-content/design-visual-edit-skill.ts +83 -47
- package/corpus/core/src/client/AssistantChat.tsx +27 -16
- package/corpus/core/src/client/agent-chat-adapter.ts +24 -0
- package/corpus/core/src/client/blocks/library/wireframe-kit.tsx +17 -2
- package/corpus/core/src/client/chat/index.ts +1 -0
- package/corpus/core/src/client/chat/message-components.tsx +104 -1
- package/corpus/core/src/client/chat/run-recovery.tsx +15 -3
- package/corpus/core/src/client/chat/widgets/DataTableWidget.tsx +10 -29
- package/corpus/core/src/client/chat/widgets/WorkspaceFileWidget.tsx +71 -0
- package/corpus/core/src/client/chat/widgets/builtin-tool-renderers.tsx +22 -0
- package/corpus/core/src/client/chat/widgets/workspace-file-result.ts +49 -0
- package/corpus/core/src/client/embed-auth.ts +2 -0
- package/corpus/core/src/client/org/InvitationBanner.tsx +14 -1
- package/corpus/core/src/client/org/OrgSwitcher.tsx +23 -0
- package/corpus/core/src/client/org/TeamPage.tsx +130 -0
- package/corpus/core/src/client/org/WorkspaceNotice.tsx +85 -0
- package/corpus/core/src/client/org/hooks.ts +14 -0
- package/corpus/core/src/client/org/index.ts +2 -0
- package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +27 -40
- package/corpus/core/src/client/resources/ResourcesPanel.tsx +134 -51
- package/corpus/core/src/client/resources/mcp-integration-catalog.ts +7 -0
- package/corpus/core/src/client/resources/use-resources.ts +6 -0
- package/corpus/core/src/client/use-action.ts +3 -1
- package/corpus/core/src/client/widgets/index.ts +1 -0
- package/corpus/core/src/coding-tools/run-code.ts +2 -1
- package/corpus/core/src/db/client.ts +28 -4
- package/corpus/core/src/deploy/build.ts +31 -3
- package/corpus/core/src/eject/remote-mcp-presets.ts +1 -1
- package/corpus/core/src/index.browser.ts +1 -0
- package/corpus/core/src/index.ts +1 -0
- package/corpus/core/src/integrations/google-docs-poller.ts +3 -0
- package/corpus/core/src/integrations/webhook-handler.ts +28 -11
- package/corpus/core/src/jobs/scheduler.ts +4 -0
- package/corpus/core/src/localization/default-messages.ts +3 -2
- package/corpus/core/src/mcp/build-server.ts +20 -2
- package/corpus/core/src/observability/traces.ts +48 -12
- package/corpus/core/src/org/handlers.ts +52 -1
- package/corpus/core/src/org/migrations.ts +4 -0
- package/corpus/core/src/org/plugin.ts +14 -0
- package/corpus/core/src/org/schema.ts +1 -0
- package/corpus/core/src/org/types.ts +8 -0
- package/corpus/core/src/org/workspace-url.ts +74 -0
- package/corpus/core/src/resources/handlers.ts +35 -5
- package/corpus/core/src/scripts/runner.ts +183 -5
- package/corpus/core/src/server/action-routes.ts +32 -2
- package/corpus/core/src/server/agent-chat-plugin.ts +29 -0
- package/corpus/core/src/server/agent-teams.ts +10 -1
- package/corpus/core/src/server/auth.ts +33 -7
- package/corpus/core/src/server/embed-route.ts +9 -0
- package/corpus/core/src/server/embed-session.ts +62 -3
- package/corpus/core/src/server/open-route.ts +20 -6
- package/corpus/core/src/server/prompts/framework-core-compact.ts +1 -1
- package/corpus/core/src/server/prompts/framework-core.ts +1 -0
- package/corpus/core/src/server/request-context.ts +36 -1
- package/corpus/core/src/shared/embed-auth.ts +1 -0
- package/corpus/core/src/shared/html-document.ts +115 -0
- package/corpus/core/src/shared/index.ts +1 -0
- package/corpus/core/src/sharing/access.ts +8 -1
- package/corpus/core/src/sharing/registry.ts +11 -2
- package/corpus/core/src/workspace-files/actions.ts +100 -0
- package/corpus/core/src/workspace-files/tool.ts +4 -0
- package/corpus/templates/analytics/.agents/skills/analysis-workspace/SKILL.md +4 -0
- package/corpus/templates/analytics/.agents/skills/hubspot/SKILL.md +9 -1
- package/corpus/templates/analytics/AGENTS.md +17 -24
- package/corpus/templates/analytics/actions/data-source-status.ts +11 -1
- package/corpus/templates/analytics/app/i18n-data.ts +34 -0
- package/corpus/templates/analytics/app/lib/data-source-status.ts +86 -0
- package/corpus/templates/analytics/app/lib/native-mcp-exclusions.ts +9 -0
- package/corpus/templates/analytics/app/pages/DataSources.tsx +184 -20
- package/corpus/templates/analytics/changelog/2026-07-28-native-analytics-data-sources-no-longer-show-duplicate-mc.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-29-exports-now-appear-in-chat-with-a-direct-download-instead-of.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-29-queued-chat-prompts-no-longer-resend-after-analytics-navigat.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-29-scheduled-dashboard-emails-load-every-panel-reliably-without.md +6 -0
- package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +6 -3
- package/corpus/templates/analytics/server/lib/credential-keys.ts +1 -1
- package/corpus/templates/analytics/server/lib/hubspot.ts +1 -1
- package/corpus/templates/analytics/server/lib/provider-credentials.ts +55 -1
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +123 -27
- package/corpus/templates/analytics/server/routes/[...page].get.ts +2 -7
- package/corpus/templates/analytics/vite.config.ts +7 -0
- package/corpus/templates/brain/actions/list-connection-providers.ts +100 -2
- package/corpus/templates/brain/app/lib/brain.ts +10 -0
- package/corpus/templates/brain/app/routes/sources.tsx +15 -4
- package/corpus/templates/brain/changelog/2026-07-29-brain-automatically-retries-failed-source-syncs-and-guides-y.md +6 -0
- package/corpus/templates/brain/jobs/process-ingest-queue.ts +13 -0
- package/corpus/templates/brain/server/jobs/sync-sources.ts +27 -22
- package/corpus/templates/brain/server/plugins/agent-chat.ts +2 -1
- package/corpus/templates/brain/server/routes/api/brain/queue/run.post.ts +7 -1
- package/corpus/templates/clips/AGENTS.md +1 -1
- package/corpus/templates/clips/actions/create-recording-agent-link.ts +11 -1
- package/corpus/templates/clips/actions/update-comment.ts +68 -0
- package/corpus/templates/clips/app/components/editor/editor-layout.tsx +0 -1
- package/corpus/templates/clips/app/components/player/comments-panel.tsx +221 -65
- package/corpus/templates/clips/app/components/player/video-player.tsx +101 -27
- package/corpus/templates/clips/app/i18n/en-US.ts +2 -1
- package/corpus/templates/clips/app/routes/bug-report.done.tsx +48 -27
- package/corpus/templates/clips/app/routes/bug-report.tsx +43 -4
- package/corpus/templates/clips/app/routes/record.tsx +2 -0
- package/corpus/templates/clips/changelog/2026-07-29-clip-playback-now-recovers-instead-of-getting-stuck-when-a-b.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-29-comments-can-now-be-edited-after-posting.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-29-download-actions-now-use-a-shorter-clearer-label.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-29-embedded-bug-reports-now-return-a-temporary-agent-readable.md +6 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +1 -1
- package/corpus/templates/clips/desktop/src-tauri/src/system_audio.rs +21 -1
- package/corpus/templates/clips/shared/bug-report.ts +99 -0
- package/corpus/templates/content/actions/_content-database-personal-view.ts +7 -1
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +5 -2
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +20 -8
- package/corpus/templates/content/changelog/2026-07-29-missing-databases-no-longer-trigger-repeated-personal-view-e.md +6 -0
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +83 -47
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +474 -55
- package/corpus/templates/design/.generated/bridge/embedded-wheel.generated.ts +3 -0
- package/corpus/templates/design/.generated/bridge/hit-test.generated.ts +18 -1
- package/corpus/templates/design/.generated/bridge/source-location.generated.ts +348 -0
- package/corpus/templates/design/actions/add-localhost-screens.ts +2 -7
- package/corpus/templates/design/actions/apply-visual-edit.ts +7 -1
- package/corpus/templates/design/actions/connect-localhost.ts +5 -9
- package/corpus/templates/design/actions/create-component.ts +16 -13
- package/corpus/templates/design/actions/grant-localhost-write-consent.ts +2 -7
- package/corpus/templates/design/actions/list-design-source-capabilities.ts +4 -7
- package/corpus/templates/design/actions/list-local-files.ts +26 -50
- package/corpus/templates/design/actions/list-localhost-connections.ts +2 -7
- package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +2 -2
- package/corpus/templates/design/actions/open-visual-edit.ts +234 -135
- package/corpus/templates/design/actions/read-local-file.ts +26 -50
- package/corpus/templates/design/actions/request-localhost-write-consent.ts +2 -7
- package/corpus/templates/design/actions/write-local-file.ts +31 -73
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +307 -133
- package/corpus/templates/design/app/components/design/EditPanel.tsx +94 -22
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +137 -60
- package/corpus/templates/design/app/components/design/ResponsiveInteractBar.tsx +75 -14
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +755 -97
- package/corpus/templates/design/app/components/design/bridge/embedded-wheel.bridge.ts +8 -0
- package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +24 -1
- package/corpus/templates/design/app/components/design/bridge/source-location.bridge.ts +530 -0
- package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbenchLoader.tsx +278 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/MonacoHost.tsx +32 -12
- package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-setup.ts +14 -3
- package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +87 -24
- package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +36 -0
- package/corpus/templates/design/app/components/design/code-workbench/store.tsx +2 -1
- package/corpus/templates/design/app/components/design/code-workbench/workspace/localhost-provider.ts +48 -8
- package/corpus/templates/design/app/components/design/design-canvas/content-size-report.ts +3 -13
- package/corpus/templates/design/app/components/design/design-canvas/embedded-frame.ts +4 -2
- package/corpus/templates/design/app/components/design/design-canvas/hit-test.ts +3 -13
- package/corpus/templates/design/app/components/design/edit-panel/element-classification.ts +3 -1
- package/corpus/templates/design/app/components/design/edit-panel/inspect-code-source.ts +93 -0
- package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +4 -2
- package/corpus/templates/design/app/components/design/multi-screen/cross-screen-drop.ts +35 -0
- package/corpus/templates/design/app/components/design/multi-screen/iframe-targeting.ts +24 -0
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +9 -0
- package/corpus/templates/design/app/components/design/types.ts +29 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +7 -4
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +3 -0
- package/corpus/templates/design/app/i18n-data.ts +153 -46
- package/corpus/templates/design/app/i18n-responsive-interact.ts +12 -12
- package/corpus/templates/design/app/lib/design-editor-route.ts +23 -0
- package/corpus/templates/design/app/pages/VisualEdit.tsx +19 -6
- package/corpus/templates/design/app/pages/design-editor/action-error.ts +19 -0
- package/corpus/templates/design/app/pages/design-editor/canvas-primitive-insert.ts +29 -0
- package/corpus/templates/design/app/pages/design-editor/clone-and-pen-edit.ts +6 -0
- package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +277 -15
- package/corpus/templates/design/app/pages/design-editor/editor-state.ts +75 -9
- package/corpus/templates/design/app/pages/design-editor/layer-state-scope.ts +28 -0
- package/corpus/templates/design/app/pages/design-editor/live-screen-layer-drop.ts +41 -0
- package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +496 -41
- package/corpus/templates/design/app/pages/design-editor/pending-live-edit-unload-guard.ts +27 -0
- package/corpus/templates/design/app/pages/design-editor/pending-structure-verification.ts +10 -0
- package/corpus/templates/design/app/pages/design-editor/react-semantic-handoff.ts +168 -9
- package/corpus/templates/design/app/pages/design-editor/responsive-interact.ts +41 -3
- package/corpus/templates/design/app/pages/design-editor/screen-command-utils.ts +5 -0
- package/corpus/templates/design/app/pages/design-editor/selection-state.ts +42 -13
- package/corpus/templates/design/app/pages/design-editor/source-location.ts +180 -0
- package/corpus/templates/design/app/pages/design-editor/tool-state.ts +17 -0
- package/corpus/templates/design/app/public-routes.ts +1 -0
- package/corpus/templates/design/app/routes/visual-edit.$id.tsx +15 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-is-easier-to-find-and-named-screens-open-dir.md +1 -1
- package/corpus/templates/design/changelog/2026-07-28-deleting-a-selected-element-now-removes-it-from-the-live-pre.md +6 -0
- package/corpus/templates/design/changelog/2026-07-28-deleting-an-element-on-a-connected-localhost-screen-now-queu.md +6 -0
- package/corpus/templates/design/changelog/2026-07-28-interact-mode-now-shows-a-responsive-device-preview-with-pre.md +6 -0
- package/corpus/templates/design/changelog/2026-07-28-layer-hide-and-lock-now-apply-to-the-live-preview-instead-of.md +6 -0
- package/corpus/templates/design/changelog/2026-07-28-layers-panel-selections-on-a-connected-localhost-screen-can-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-28-locked-layers-now-show-a-subtle-dashed-outline-in-the-live-p.md +6 -0
- package/corpus/templates/design/changelog/2026-07-28-the-apply-design-updates-button-now-counts-pending-live-text.md +6 -0
- package/corpus/templates/design/changelog/2026-07-28-the-design-canvas-no-longer-stalls-on-a-render-loop-while-a-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-28-visual-edit-on-a-local-dev-server-no-longer-requires-signing.md +6 -0
- package/corpus/templates/design/changelog/2026-07-28-visual-edits-on-a-react-19-app-no-longer-report-a-source-lin.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-an-edit-that-cannot-be-written-to-source-now-names-the-reaso.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-applying-a-primitive-dropped-onto-a-connected-localhost-scre.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-changing-a-style-in-the-inspector-now-updates-a-connected-lo.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-choosing-edit-or-annotate-from-a-focused-screen-now-returns-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-concurrent-source-edits-now-return-a-clear-conflict-response.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-creating-a-component-from-an-element-that-repeats-in-the-sou.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-deleting-an-element-you-just-dropped-onto-a-live-screen-no-l.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-dragging-a-layer-across-screens-no-longer-dies-when-the-poin.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-dragging-an-element-from-a-stored-screen-into-a-live-localho.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-drawing-a-box-on-the-canvas-and-dragging-it-into-a-connected.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-fixed-a-loading-screen-flicker-when-reopening-designs-with-a.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-interact-mode-has-edit-and-annotate-buttons-again-so-you-can.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-layer-groups-can-be-dropped-onto-live-localhost-screens.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-localhost-source-errors-now-say-what-actually-went-wrong-whi.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-opening-or-refreshing-a-live-localhost-screen-in-single-scre.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-redo-after-undoing-a-drop-onto-a-live-screen-puts-the-elemen.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-shapes-can-be-drawn-directly-onto-live-localhost-screens.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-shapes-drawn-on-the-canvas-board-now-appear-immediately-inst.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-style-edits-on-a-running-localhost-screen-now-preview-live-a.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-the-apply-design-updates-control-now-appears-as-a-clean-conn.md +6 -0
- package/corpus/templates/design/changelog/2026-07-29-visual-edits-on-a-mapped-component-instance-now-tell-the-age.md +6 -0
- package/corpus/templates/design/server/lib/design-data-access.ts +21 -7
- package/corpus/templates/design/server/lib/localhost-connection.ts +240 -0
- package/corpus/templates/design/server/routes/[...page].get.ts +2 -5
- package/corpus/templates/design/server/source-workspace.ts +2 -0
- package/corpus/templates/design/shared/code-layer.ts +43 -0
- package/corpus/templates/design/shared/html-content.ts +26 -0
- package/corpus/templates/design/shared/html-integrity.ts +21 -1
- package/corpus/templates/design/shared/local-jsx-visual-edit.ts +15 -0
- package/corpus/templates/design/shared/source-mode.ts +76 -0
- package/corpus/templates/dispatch/changelog/2026-07-29-workspace-members-without-admin-access-now-see-a-clear-permi.md +6 -0
- package/corpus/templates/dispatch/server/lib/usage-metrics.ts +2 -1
- package/corpus/templates/plan/app/lib/plan-annotation-runtime.ts +3 -4
- package/corpus/templates/plan/server/routes/[...page].get.ts +2 -5
- package/corpus/templates/slides/actions/patch-deck.ts +29 -17
- package/corpus/toolkit/CHANGELOG.md +6 -0
- package/corpus/toolkit/package.json +1 -1
- package/corpus/toolkit/src/composer/ComposerPlusMenu.tsx +3 -2
- package/dist/action-ui.d.ts +1 -0
- package/dist/action-ui.d.ts.map +1 -1
- package/dist/action-ui.js +1 -0
- package/dist/action-ui.js.map +1 -1
- package/dist/action.d.ts +5 -1
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +13 -5
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/harness/runner.d.ts.map +1 -1
- package/dist/agent/harness/runner.js +5 -0
- package/dist/agent/harness/runner.js.map +1 -1
- package/dist/agent/production-agent.d.ts +16 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +18 -1
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
- package/dist/agent/run-loop-with-resume.js +6 -0
- package/dist/agent/run-loop-with-resume.js.map +1 -1
- package/dist/agent/run-manager.d.ts +14 -0
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +91 -1
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts +3 -0
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +35 -3
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/agent/types.d.ts +2 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +4 -6
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/cli/create.d.ts +66 -6
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +765 -66
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/design-connect.d.ts.map +1 -1
- package/dist/cli/design-connect.js +2 -7
- package/dist/cli/design-connect.js.map +1 -1
- package/dist/cli/index.js +5 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/skills-content/design-visual-edit-skill.d.ts +1 -1
- package/dist/cli/skills-content/design-visual-edit-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/design-visual-edit-skill.js +83 -47
- package/dist/cli/skills-content/design-visual-edit-skill.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +16 -9
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +21 -0
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/blocks/library/wireframe-kit.d.ts +2 -0
- package/dist/client/blocks/library/wireframe-kit.d.ts.map +1 -1
- package/dist/client/blocks/library/wireframe-kit.js +8 -2
- package/dist/client/blocks/library/wireframe-kit.js.map +1 -1
- package/dist/client/chat/index.d.ts +1 -1
- package/dist/client/chat/index.d.ts.map +1 -1
- package/dist/client/chat/index.js +1 -1
- package/dist/client/chat/index.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +17 -0
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +24 -2
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/run-recovery.d.ts +6 -0
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +13 -3
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/chat/widgets/DataTableWidget.d.ts.map +1 -1
- package/dist/client/chat/widgets/DataTableWidget.js +2 -3
- package/dist/client/chat/widgets/DataTableWidget.js.map +1 -1
- package/dist/client/chat/widgets/WorkspaceFileWidget.d.ts +5 -0
- package/dist/client/chat/widgets/WorkspaceFileWidget.d.ts.map +1 -0
- package/dist/client/chat/widgets/WorkspaceFileWidget.js +34 -0
- package/dist/client/chat/widgets/WorkspaceFileWidget.js.map +1 -0
- package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
- package/dist/client/chat/widgets/builtin-tool-renderers.js +13 -1
- package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
- package/dist/client/chat/widgets/workspace-file-result.d.ts +12 -0
- package/dist/client/chat/widgets/workspace-file-result.d.ts.map +1 -0
- package/dist/client/chat/widgets/workspace-file-result.js +34 -0
- package/dist/client/chat/widgets/workspace-file-result.js.map +1 -0
- package/dist/client/embed-auth.d.ts.map +1 -1
- package/dist/client/embed-auth.js +2 -1
- package/dist/client/embed-auth.js.map +1 -1
- package/dist/client/org/InvitationBanner.d.ts +5 -2
- package/dist/client/org/InvitationBanner.d.ts.map +1 -1
- package/dist/client/org/InvitationBanner.js +9 -2
- package/dist/client/org/InvitationBanner.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +3 -2
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +27 -3
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/org/WorkspaceNotice.d.ts +18 -0
- package/dist/client/org/WorkspaceNotice.d.ts.map +1 -0
- package/dist/client/org/WorkspaceNotice.js +56 -0
- package/dist/client/org/WorkspaceNotice.js.map +1 -0
- package/dist/client/org/hooks.d.ts +1 -0
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/org/hooks.js +12 -0
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/org/index.d.ts +2 -1
- package/dist/client/org/index.d.ts.map +1 -1
- package/dist/client/org/index.js +2 -1
- package/dist/client/org/index.js.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.js +8 -12
- package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts +3 -0
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +49 -20
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
- package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.js +3 -0
- package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
- package/dist/client/resources/use-resources.d.ts +1 -0
- package/dist/client/resources/use-resources.d.ts.map +1 -1
- package/dist/client/resources/use-resources.js +3 -0
- package/dist/client/resources/use-resources.js.map +1 -1
- package/dist/client/use-action.d.ts +3 -1
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +3 -1
- package/dist/client/use-action.js.map +1 -1
- package/dist/client/widgets/index.d.ts +1 -1
- package/dist/client/widgets/index.d.ts.map +1 -1
- package/dist/client/widgets/index.js +1 -1
- package/dist/client/widgets/index.js.map +1 -1
- package/dist/coding-tools/run-code.js +2 -1
- package/dist/coding-tools/run-code.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/db/client.d.ts +1 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +24 -3
- package/dist/db/client.js.map +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +25 -3
- package/dist/deploy/build.js.map +1 -1
- package/dist/eject/remote-mcp-presets.js +1 -1
- package/dist/eject/remote-mcp-presets.js.map +1 -1
- package/dist/index.browser.d.ts +1 -1
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.browser.js +1 -1
- package/dist/index.browser.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/google-docs-poller.d.ts.map +1 -1
- package/dist/integrations/google-docs-poller.js +4 -1
- package/dist/integrations/google-docs-poller.js.map +1 -1
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +23 -11
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/jobs/scheduler.js +4 -0
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/localization/default-messages.d.ts +3 -2
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +3 -2
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js +10 -1
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js +27 -7
- package/dist/observability/traces.js.map +1 -1
- package/dist/org/handlers.d.ts +15 -0
- package/dist/org/handlers.d.ts.map +1 -1
- package/dist/org/handlers.js +45 -1
- package/dist/org/handlers.js.map +1 -1
- package/dist/org/migrations.d.ts.map +1 -1
- package/dist/org/migrations.js +4 -0
- package/dist/org/migrations.js.map +1 -1
- package/dist/org/plugin.d.ts +1 -0
- package/dist/org/plugin.d.ts.map +1 -1
- package/dist/org/plugin.js +10 -1
- package/dist/org/plugin.js.map +1 -1
- package/dist/org/schema.d.ts +19 -0
- package/dist/org/schema.d.ts.map +1 -1
- package/dist/org/schema.js +1 -0
- package/dist/org/schema.js.map +1 -1
- package/dist/org/types.d.ts +8 -0
- package/dist/org/types.d.ts.map +1 -1
- package/dist/org/types.js.map +1 -1
- package/dist/org/workspace-url.d.ts +32 -0
- package/dist/org/workspace-url.d.ts.map +1 -0
- package/dist/org/workspace-url.js +63 -0
- package/dist/org/workspace-url.js.map +1 -0
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +11 -11
- package/dist/provider-api/actions/provider-api.d.ts +7 -7
- package/dist/resources/handlers.d.ts +2 -3
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +25 -5
- package/dist/resources/handlers.js.map +1 -1
- package/dist/scripts/runner.d.ts +17 -0
- package/dist/scripts/runner.d.ts.map +1 -1
- package/dist/scripts/runner.js +130 -5
- package/dist/scripts/runner.js.map +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/action-routes.d.ts.map +1 -1
- package/dist/server/action-routes.js +24 -2
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +26 -1
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/agent-teams.d.ts.map +1 -1
- package/dist/server/agent-teams.js +10 -1
- package/dist/server/agent-teams.js.map +1 -1
- package/dist/server/auth.d.ts +22 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +33 -7
- package/dist/server/auth.js.map +1 -1
- package/dist/server/embed-route.d.ts.map +1 -1
- package/dist/server/embed-route.js +6 -1
- package/dist/server/embed-route.js.map +1 -1
- package/dist/server/embed-session.d.ts +7 -0
- package/dist/server/embed-session.d.ts.map +1 -1
- package/dist/server/embed-session.js +46 -4
- package/dist/server/embed-session.js.map +1 -1
- package/dist/server/open-route.d.ts.map +1 -1
- package/dist/server/open-route.js +17 -7
- package/dist/server/open-route.js.map +1 -1
- package/dist/server/prompts/framework-core-compact.js +1 -1
- package/dist/server/prompts/framework-core-compact.js.map +1 -1
- package/dist/server/prompts/framework-core.d.ts.map +1 -1
- package/dist/server/prompts/framework-core.js +1 -0
- package/dist/server/prompts/framework-core.js.map +1 -1
- package/dist/server/request-context.d.ts +26 -0
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-context.js +18 -1
- package/dist/server/request-context.js.map +1 -1
- package/dist/shared/embed-auth.d.ts +1 -0
- package/dist/shared/embed-auth.d.ts.map +1 -1
- package/dist/shared/embed-auth.js +1 -0
- package/dist/shared/embed-auth.js.map +1 -1
- package/dist/shared/html-document.d.ts +12 -0
- package/dist/shared/html-document.d.ts.map +1 -0
- package/dist/shared/html-document.js +92 -0
- package/dist/shared/html-document.js.map +1 -0
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +1 -0
- package/dist/shared/index.js.map +1 -1
- package/dist/sharing/access.d.ts +1 -0
- package/dist/sharing/access.d.ts.map +1 -1
- package/dist/sharing/access.js +8 -2
- package/dist/sharing/access.js.map +1 -1
- package/dist/sharing/registry.d.ts +3 -0
- package/dist/sharing/registry.d.ts.map +1 -1
- package/dist/sharing/registry.js.map +1 -1
- package/dist/workspace-files/actions.d.ts +28 -0
- package/dist/workspace-files/actions.d.ts.map +1 -0
- package/dist/workspace-files/actions.js +75 -0
- package/dist/workspace-files/actions.js.map +1 -0
- package/dist/workspace-files/tool.d.ts.map +1 -1
- package/dist/workspace-files/tool.js +4 -0
- package/dist/workspace-files/tool.js.map +1 -1
- package/docs/content/cloneable-saas.mdx +114 -0
- package/docs/content/creating-templates.mdx +28 -2
- package/docs/content/syncing-template-changes.mdx +7 -0
- package/docs/content/template-clips-developers.mdx +12 -5
- package/docs/content/template-dispatch-developers.mdx +1 -1
- package/docs/content/template-dispatch.mdx +1 -1
- package/package.json +2 -2
- package/src/action-ui.ts +1 -0
- package/src/action.ts +5 -1
- package/src/agent/engine/ai-sdk-engine.ts +15 -5
- package/src/agent/harness/runner.ts +5 -0
- package/src/agent/production-agent.ts +33 -0
- package/src/agent/run-loop-with-resume.ts +5 -0
- package/src/agent/run-manager.ts +126 -1
- package/src/agent/thread-data-builder.ts +47 -2
- package/src/agent/types.ts +2 -0
- package/src/chat-threads/store.ts +4 -5
- package/src/cli/create.ts +1139 -65
- package/src/cli/design-connect.ts +3 -7
- package/src/cli/index.ts +5 -3
- package/src/cli/skills-content/design-visual-edit-skill.ts +83 -47
- package/src/client/AssistantChat.tsx +27 -16
- package/src/client/agent-chat-adapter.ts +24 -0
- package/src/client/blocks/library/wireframe-kit.tsx +17 -2
- package/src/client/chat/index.ts +1 -0
- package/src/client/chat/message-components.tsx +104 -1
- package/src/client/chat/run-recovery.tsx +15 -3
- package/src/client/chat/widgets/DataTableWidget.tsx +10 -29
- package/src/client/chat/widgets/WorkspaceFileWidget.tsx +71 -0
- package/src/client/chat/widgets/builtin-tool-renderers.tsx +22 -0
- package/src/client/chat/widgets/workspace-file-result.ts +49 -0
- package/src/client/embed-auth.ts +2 -0
- package/src/client/org/InvitationBanner.tsx +14 -1
- package/src/client/org/OrgSwitcher.tsx +23 -0
- package/src/client/org/TeamPage.tsx +130 -0
- package/src/client/org/WorkspaceNotice.tsx +85 -0
- package/src/client/org/hooks.ts +14 -0
- package/src/client/org/index.ts +2 -0
- package/src/client/resources/McpIntegrationDialog.tsx +27 -40
- package/src/client/resources/ResourcesPanel.tsx +134 -51
- package/src/client/resources/mcp-integration-catalog.ts +7 -0
- package/src/client/resources/use-resources.ts +6 -0
- package/src/client/use-action.ts +3 -1
- package/src/client/widgets/index.ts +1 -0
- package/src/coding-tools/run-code.ts +2 -1
- package/src/db/client.ts +28 -4
- package/src/deploy/build.ts +31 -3
- package/src/eject/remote-mcp-presets.ts +1 -1
- package/src/index.browser.ts +1 -0
- package/src/index.ts +1 -0
- package/src/integrations/google-docs-poller.ts +3 -0
- package/src/integrations/webhook-handler.ts +28 -11
- package/src/jobs/scheduler.ts +4 -0
- package/src/localization/default-messages.ts +3 -2
- package/src/mcp/build-server.ts +20 -2
- package/src/observability/traces.ts +48 -12
- package/src/org/handlers.ts +52 -1
- package/src/org/migrations.ts +4 -0
- package/src/org/plugin.ts +14 -0
- package/src/org/schema.ts +1 -0
- package/src/org/types.ts +8 -0
- package/src/org/workspace-url.ts +74 -0
- package/src/resources/handlers.ts +35 -5
- package/src/scripts/runner.ts +183 -5
- package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +2 -1
- package/src/server/action-routes.ts +32 -2
- package/src/server/agent-chat-plugin.ts +29 -0
- package/src/server/agent-teams.ts +10 -1
- package/src/server/auth.ts +33 -7
- package/src/server/embed-route.ts +9 -0
- package/src/server/embed-session.ts +62 -3
- package/src/server/open-route.ts +20 -6
- package/src/server/prompts/framework-core-compact.ts +1 -1
- package/src/server/prompts/framework-core.ts +1 -0
- package/src/server/request-context.ts +36 -1
- package/src/shared/embed-auth.ts +1 -0
- package/src/shared/html-document.ts +115 -0
- package/src/shared/index.ts +1 -0
- package/src/sharing/access.ts +8 -1
- package/src/sharing/registry.ts +11 -2
- package/src/workspace-files/actions.ts +100 -0
- package/src/workspace-files/tool.ts +4 -0
- package/corpus/templates/design/changelog/2026-07-28-interact-mode-can-preview-designs-in-responsive-device-sizes.md +0 -6
- package/corpus/templates/design/changelog/2026-07-28-interact-mode-now-opens-a-full-screen-responsive-preview-wit.md +0 -6
|
@@ -217,6 +217,7 @@ import {
|
|
|
217
217
|
} from "./edit-panel/fill-gradient-helpers";
|
|
218
218
|
import { FillProperties } from "./edit-panel/fill-properties";
|
|
219
219
|
import { FramePresetsPanel } from "./edit-panel/frame-presets-panel";
|
|
220
|
+
import type { InspectCodeSourceLocation } from "./edit-panel/inspect-code-source";
|
|
220
221
|
import {
|
|
221
222
|
InspectorIconButton,
|
|
222
223
|
InspectorSegment,
|
|
@@ -687,14 +688,91 @@ export interface InspectCodeData {
|
|
|
687
688
|
* Resolved source file for real-app sources (localhost / fusion), when the
|
|
688
689
|
* resolveNodeToFile capability is available.
|
|
689
690
|
*/
|
|
690
|
-
sourceLocation?:
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
691
|
+
sourceLocation?:
|
|
692
|
+
| (InspectCodeSourceLocation & {
|
|
693
|
+
/** Optional snippet to show above the Open-in-VS-Code button. */
|
|
694
|
+
snippet?: string;
|
|
695
|
+
})
|
|
696
|
+
| null;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
function sourcePositionLabel(
|
|
700
|
+
source: Pick<InspectCodeSourceLocation, "filePath" | "line" | "column">,
|
|
701
|
+
): string {
|
|
702
|
+
if (source.line == null) return source.filePath;
|
|
703
|
+
return `${source.filePath}:${source.line}${
|
|
704
|
+
source.column == null ? "" : `:${source.column}`
|
|
705
|
+
}`;
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
function sourcePrecisionLabel(
|
|
709
|
+
method: InspectCodeSourceLocation["method"],
|
|
710
|
+
): string | null {
|
|
711
|
+
if (method === "debug-stack") return "Runtime-transformed location"; // i18n-ignore design inspector technical provenance label
|
|
712
|
+
if (method === "debug-source" || method === "data-attribute") {
|
|
713
|
+
return "Authored source location"; // i18n-ignore design inspector technical provenance label
|
|
714
|
+
}
|
|
715
|
+
return null;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
function SourceLocationSummary({
|
|
719
|
+
source,
|
|
720
|
+
}: {
|
|
721
|
+
source: InspectCodeSourceLocation;
|
|
722
|
+
}) {
|
|
723
|
+
const precision = sourcePrecisionLabel(source.method);
|
|
724
|
+
const ownerPrecision = source.owner
|
|
725
|
+
? sourcePrecisionLabel(source.owner.method)
|
|
726
|
+
: null;
|
|
727
|
+
return (
|
|
728
|
+
<div className="space-y-1">
|
|
729
|
+
<div
|
|
730
|
+
className="rounded bg-[var(--design-editor-control-bg)] px-2 py-1.5"
|
|
731
|
+
title={sourcePositionLabel(source)}
|
|
732
|
+
>
|
|
733
|
+
<div className="flex min-w-0 items-center gap-1">
|
|
734
|
+
<IconCode className="size-3 shrink-0 text-muted-foreground/60" />
|
|
735
|
+
{source.componentName ? (
|
|
736
|
+
<span className="shrink-0 font-medium text-foreground">
|
|
737
|
+
{source.componentName}
|
|
738
|
+
</span>
|
|
739
|
+
) : null}
|
|
740
|
+
<span className="min-w-0 flex-1 truncate font-mono text-[10px] text-muted-foreground">
|
|
741
|
+
{sourcePositionLabel(source)}
|
|
742
|
+
</span>
|
|
743
|
+
</div>
|
|
744
|
+
{precision ? (
|
|
745
|
+
<div className="mt-0.5 pl-4 text-[9px] text-muted-foreground/70">
|
|
746
|
+
{precision}
|
|
747
|
+
</div>
|
|
748
|
+
) : null}
|
|
749
|
+
</div>
|
|
750
|
+
{source.owner ? (
|
|
751
|
+
<div
|
|
752
|
+
className="rounded border border-border/60 px-2 py-1 text-[10px] text-muted-foreground"
|
|
753
|
+
title={sourcePositionLabel(source.owner)}
|
|
754
|
+
>
|
|
755
|
+
<div className="truncate">
|
|
756
|
+
<span className="mr-1 font-medium text-foreground/80">
|
|
757
|
+
{"Owner" /* i18n-ignore design inspector provenance label */}
|
|
758
|
+
</span>
|
|
759
|
+
{source.owner.componentName
|
|
760
|
+
? `${source.owner.componentName} · `
|
|
761
|
+
: ""}
|
|
762
|
+
<span className="font-mono">
|
|
763
|
+
{sourcePositionLabel(source.owner)}
|
|
764
|
+
</span>
|
|
765
|
+
{source.owner.key ? ` · key ${source.owner.key}` : ""}
|
|
766
|
+
</div>
|
|
767
|
+
{ownerPrecision ? (
|
|
768
|
+
<div className="mt-0.5 text-[9px] text-muted-foreground/70">
|
|
769
|
+
{ownerPrecision}
|
|
770
|
+
</div>
|
|
771
|
+
) : null}
|
|
772
|
+
</div>
|
|
773
|
+
) : null}
|
|
774
|
+
</div>
|
|
775
|
+
);
|
|
698
776
|
}
|
|
699
777
|
|
|
700
778
|
/**
|
|
@@ -882,18 +960,7 @@ function InspectCodePopover({ data }: { data: InspectCodeData }) {
|
|
|
882
960
|
</Button>
|
|
883
961
|
</div>
|
|
884
962
|
|
|
885
|
-
{source
|
|
886
|
-
<div
|
|
887
|
-
className="flex items-center gap-1 rounded bg-[var(--design-editor-control-bg)] px-2 py-1"
|
|
888
|
-
title={source.absolutePath}
|
|
889
|
-
>
|
|
890
|
-
<IconCode className="size-3 shrink-0 text-muted-foreground/60" />
|
|
891
|
-
<span className="min-w-0 flex-1 truncate font-mono text-[10px] text-muted-foreground">
|
|
892
|
-
{source.absolutePath}
|
|
893
|
-
{source.line != null ? `:${source.line}` : ""}
|
|
894
|
-
</span>
|
|
895
|
-
</div>
|
|
896
|
-
)}
|
|
963
|
+
{source ? <SourceLocationSummary source={source} /> : null}
|
|
897
964
|
|
|
898
965
|
{snippet ? (
|
|
899
966
|
<pre className="max-h-64 overflow-auto rounded bg-[var(--design-editor-control-bg)] p-2 font-mono text-[10px] leading-relaxed text-foreground">
|
|
@@ -907,7 +974,7 @@ function InspectCodePopover({ data }: { data: InspectCodeData }) {
|
|
|
907
974
|
</p>
|
|
908
975
|
)}
|
|
909
976
|
|
|
910
|
-
{source
|
|
977
|
+
{source?.absolutePath ? (
|
|
911
978
|
<a
|
|
912
979
|
href={vscodeDeepLink(
|
|
913
980
|
source.absolutePath,
|
|
@@ -926,7 +993,7 @@ function InspectCodePopover({ data }: { data: InspectCodeData }) {
|
|
|
926
993
|
{"Open in VS Code" /* i18n-ignore design inspector action */}
|
|
927
994
|
</Button>
|
|
928
995
|
</a>
|
|
929
|
-
)}
|
|
996
|
+
) : null}
|
|
930
997
|
</PopoverContent>
|
|
931
998
|
</Popover>
|
|
932
999
|
);
|
|
@@ -1040,6 +1107,11 @@ function CodeInspectPanel({
|
|
|
1040
1107
|
) : null}
|
|
1041
1108
|
|
|
1042
1109
|
<PanelSection title={"Code" /* i18n-ignore design inspector section */}>
|
|
1110
|
+
{data?.sourceLocation ? (
|
|
1111
|
+
<div className="mb-2">
|
|
1112
|
+
<SourceLocationSummary source={data.sourceLocation} />
|
|
1113
|
+
</div>
|
|
1114
|
+
) : null}
|
|
1043
1115
|
{snippet ? (
|
|
1044
1116
|
<pre className="max-h-80 overflow-auto rounded bg-[var(--design-editor-control-bg)] p-2 font-mono text-[10px] leading-relaxed text-foreground">
|
|
1045
1117
|
<code>{highlightedHtml(snippet)}</code>
|
|
@@ -46,7 +46,6 @@ import {
|
|
|
46
46
|
type PenPath,
|
|
47
47
|
} from "@shared/pen-path";
|
|
48
48
|
import {
|
|
49
|
-
IconArrowsMaximize,
|
|
50
49
|
IconCopy,
|
|
51
50
|
IconDots,
|
|
52
51
|
IconHandClick,
|
|
@@ -213,6 +212,7 @@ import {
|
|
|
213
212
|
getActiveScreenIframeId,
|
|
214
213
|
getBreakpointIframeId,
|
|
215
214
|
isBreakpointSelectionTarget,
|
|
215
|
+
shouldSuppressFrameSelectionBox,
|
|
216
216
|
} from "./multi-screen/iframe-targeting";
|
|
217
217
|
import {
|
|
218
218
|
boardPointToBoardSurfaceLocalPoint,
|
|
@@ -266,6 +266,7 @@ import {
|
|
|
266
266
|
screenLocalRectToBoardGeometry,
|
|
267
267
|
} from "./multi-screen/coordinate-transforms";
|
|
268
268
|
import {
|
|
269
|
+
captureCrossScreenSourceHtmlSnapshot,
|
|
269
270
|
getCrossScreenDropGuideForHitTest,
|
|
270
271
|
getCrossScreenDropGuideStyle,
|
|
271
272
|
isCrossScreenDropAxis,
|
|
@@ -406,6 +407,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
406
407
|
zoom,
|
|
407
408
|
activeId,
|
|
408
409
|
selectedScreenIds,
|
|
410
|
+
selectedElementScreenId = null,
|
|
409
411
|
hiddenScreenIds = EMPTY_SCREEN_IDS,
|
|
410
412
|
lockedScreenIds = EMPTY_SCREEN_IDS,
|
|
411
413
|
fullViewScreenIds,
|
|
@@ -861,6 +863,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
861
863
|
sourceId?: string;
|
|
862
864
|
sourcePointerOffset?: Point;
|
|
863
865
|
sourceElementSize?: { width: number; height: number };
|
|
866
|
+
sourceHtmlSnapshot?: string;
|
|
864
867
|
styleSnapshot?: PortableStyleSnapshot;
|
|
865
868
|
} | null>(null);
|
|
866
869
|
const crossScreenParentDragCleanupRef = useRef<(() => void) | null>(null);
|
|
@@ -2070,6 +2073,38 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
2070
2073
|
});
|
|
2071
2074
|
};
|
|
2072
2075
|
|
|
2076
|
+
/**
|
|
2077
|
+
* Board-space point for a drag message's own pointer position. Every
|
|
2078
|
+
* phase carries it, so a drop never has to trust a ref that a mid-gesture
|
|
2079
|
+
* re-render or an interleaved message may have cleared — losing the board
|
|
2080
|
+
* point silently loses the whole drop.
|
|
2081
|
+
*/
|
|
2082
|
+
const boardPointFromDragMessage = (
|
|
2083
|
+
sourceScreenId: string,
|
|
2084
|
+
iframeX: number,
|
|
2085
|
+
iframeY: number,
|
|
2086
|
+
viewportW: number,
|
|
2087
|
+
viewportH: number,
|
|
2088
|
+
): Point | null => {
|
|
2089
|
+
if (sourceScreenId === boardFileId) {
|
|
2090
|
+
if (!boardSurfaceRenderGeometry) return null;
|
|
2091
|
+
return boardSurfaceLocalPointToBoardPoint(
|
|
2092
|
+
{ x: iframeX, y: iframeY },
|
|
2093
|
+
boardSurfaceRenderGeometry,
|
|
2094
|
+
);
|
|
2095
|
+
}
|
|
2096
|
+
const sourceScreen = screensRef.current.find(
|
|
2097
|
+
(s) => s.id === sourceScreenId,
|
|
2098
|
+
);
|
|
2099
|
+
const sourceGeometry = frameGeometryRef.current[sourceScreenId];
|
|
2100
|
+
if (!sourceScreen || !sourceGeometry) return null;
|
|
2101
|
+
return screenLocalPointToBoardPoint(
|
|
2102
|
+
{ x: iframeX, y: iframeY },
|
|
2103
|
+
sourceGeometry,
|
|
2104
|
+
{ width: viewportW, height: viewportH },
|
|
2105
|
+
);
|
|
2106
|
+
};
|
|
2107
|
+
|
|
2073
2108
|
const updateCrossScreenTargetFromBoardPoint = (
|
|
2074
2109
|
boardPoint: Point,
|
|
2075
2110
|
sourceScreenId: string,
|
|
@@ -2134,10 +2169,17 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
2134
2169
|
selector: string;
|
|
2135
2170
|
sourceId?: string;
|
|
2136
2171
|
sourcePointerOffset?: Point;
|
|
2172
|
+
sourceHtmlSnapshot?: string;
|
|
2137
2173
|
styleSnapshot?: PortableStyleSnapshot;
|
|
2138
2174
|
},
|
|
2139
2175
|
lastBoardPoint: Point | null,
|
|
2140
2176
|
) => {
|
|
2177
|
+
dndHostLog("overview:finalize", {
|
|
2178
|
+
sourceScreenId,
|
|
2179
|
+
candidate: candidate?.id ?? null,
|
|
2180
|
+
lastBoardPoint,
|
|
2181
|
+
selector: payload.selector,
|
|
2182
|
+
});
|
|
2141
2183
|
clearCrossScreenDrag();
|
|
2142
2184
|
crossScreenLastBoardPointRef.current = null;
|
|
2143
2185
|
const hasIdentifier = !!(payload.selector || payload.sourceId);
|
|
@@ -2186,6 +2228,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
2186
2228
|
)
|
|
2187
2229
|
: lastBoardPoint,
|
|
2188
2230
|
sourcePointerOffset: payload.sourcePointerOffset,
|
|
2231
|
+
sourceHtmlSnapshot: payload.sourceHtmlSnapshot,
|
|
2189
2232
|
styleSnapshot: payload.styleSnapshot,
|
|
2190
2233
|
});
|
|
2191
2234
|
},
|
|
@@ -2227,6 +2270,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
2227
2270
|
targetCanvasPoint: lastBoardPoint,
|
|
2228
2271
|
targetLocalPoint: targetLocalPoint ?? undefined,
|
|
2229
2272
|
sourcePointerOffset: payload.sourcePointerOffset,
|
|
2273
|
+
sourceHtmlSnapshot: payload.sourceHtmlSnapshot,
|
|
2230
2274
|
styleSnapshot: payload.styleSnapshot,
|
|
2231
2275
|
});
|
|
2232
2276
|
},
|
|
@@ -2316,6 +2360,13 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
2316
2360
|
clearCrossScreenDrag();
|
|
2317
2361
|
return;
|
|
2318
2362
|
}
|
|
2363
|
+
const sourceHtmlSnapshot =
|
|
2364
|
+
sourceScreenId === boardFileId
|
|
2365
|
+
? captureCrossScreenSourceHtmlSnapshot(
|
|
2366
|
+
sourcePreviewIframe.contentDocument,
|
|
2367
|
+
msg.sourceId,
|
|
2368
|
+
)
|
|
2369
|
+
: undefined;
|
|
2319
2370
|
|
|
2320
2371
|
if (msg.phase !== "move") {
|
|
2321
2372
|
dndHostLog("overview:cross-screen", {
|
|
@@ -2331,11 +2382,13 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
2331
2382
|
sourceId: msg.sourceId,
|
|
2332
2383
|
sourcePointerOffset,
|
|
2333
2384
|
sourceElementSize,
|
|
2385
|
+
sourceHtmlSnapshot,
|
|
2334
2386
|
styleSnapshot,
|
|
2335
2387
|
};
|
|
2336
2388
|
stopParentCrossScreenDrag();
|
|
2337
2389
|
const restorePreviewPointerEvents = mutePreviewIframePointerEvents(
|
|
2338
2390
|
surfaceRef.current,
|
|
2391
|
+
sourcePreviewIframe,
|
|
2339
2392
|
);
|
|
2340
2393
|
let didCleanup = false;
|
|
2341
2394
|
const cancelPendingParentDrag = () => {
|
|
@@ -2390,6 +2443,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
2390
2443
|
sourceId: msg.sourceId,
|
|
2391
2444
|
sourcePointerOffset,
|
|
2392
2445
|
sourceElementSize,
|
|
2446
|
+
sourceHtmlSnapshot,
|
|
2393
2447
|
styleSnapshot,
|
|
2394
2448
|
};
|
|
2395
2449
|
const lastBoardPoint = crossScreenLastBoardPointRef.current;
|
|
@@ -2454,13 +2508,16 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
2454
2508
|
// path where "start" itself didn't have one yet.
|
|
2455
2509
|
crossScreenDragMsgRef.current = {
|
|
2456
2510
|
selector: selector ?? "",
|
|
2457
|
-
sourceId,
|
|
2511
|
+
sourceId: sourceId ?? crossScreenDragMsgRef.current?.sourceId,
|
|
2458
2512
|
sourcePointerOffset:
|
|
2459
2513
|
crossScreenDragMsgRef.current?.sourcePointerOffset ??
|
|
2460
2514
|
sourcePointerOffset,
|
|
2461
2515
|
sourceElementSize:
|
|
2462
2516
|
sourceElementSize ??
|
|
2463
2517
|
crossScreenDragMsgRef.current?.sourceElementSize,
|
|
2518
|
+
sourceHtmlSnapshot:
|
|
2519
|
+
sourceHtmlSnapshot ??
|
|
2520
|
+
crossScreenDragMsgRef.current?.sourceHtmlSnapshot,
|
|
2464
2521
|
styleSnapshot:
|
|
2465
2522
|
styleSnapshot ?? crossScreenDragMsgRef.current?.styleSnapshot,
|
|
2466
2523
|
};
|
|
@@ -2491,44 +2548,26 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
2491
2548
|
// viewport from the bridge. In overview, the iframe viewport may be the
|
|
2492
2549
|
// frame geometry rather than the screen metadata width.
|
|
2493
2550
|
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
|
|
2500
|
-
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
} else {
|
|
2509
|
-
const sourceScreen = screensRef.current.find(
|
|
2510
|
-
(s) => s.id === sourceScreenId,
|
|
2511
|
-
);
|
|
2512
|
-
const sourceGeometry = frameGeometryRef.current[sourceScreenId];
|
|
2513
|
-
if (!sourceScreen || !sourceGeometry) {
|
|
2514
|
-
clearCrossScreenDrag();
|
|
2515
|
-
return;
|
|
2516
|
-
}
|
|
2517
|
-
const boardPoint = screenLocalPointToBoardPoint(
|
|
2518
|
-
{ x: iframeX, y: iframeY },
|
|
2519
|
-
sourceGeometry,
|
|
2520
|
-
{ width: viewportW, height: viewportH },
|
|
2521
|
-
);
|
|
2522
|
-
boardX = boardPoint.x;
|
|
2523
|
-
boardY = boardPoint.y;
|
|
2551
|
+
// The board iframe is pixel-exact: 1 iframe pixel == 1 canvas unit.
|
|
2552
|
+
// Its finite paint window can start anywhere within the much larger
|
|
2553
|
+
// logical board, so the helper adds the render origin (not the logical
|
|
2554
|
+
// board's fixed -65536 origin) to recover persisted canvas coords.
|
|
2555
|
+
const boardPoint = boardPointFromDragMessage(
|
|
2556
|
+
sourceScreenId,
|
|
2557
|
+
iframeX,
|
|
2558
|
+
iframeY,
|
|
2559
|
+
viewportW,
|
|
2560
|
+
viewportH,
|
|
2561
|
+
);
|
|
2562
|
+
if (!boardPoint) {
|
|
2563
|
+
clearCrossScreenDrag();
|
|
2564
|
+
return;
|
|
2524
2565
|
}
|
|
2525
|
-
const boardPoint = { x: boardX, y: boardY };
|
|
2526
2566
|
updateCrossScreenTargetFromBoardPoint(boardPoint, sourceScreenId);
|
|
2527
2567
|
return;
|
|
2528
2568
|
}
|
|
2529
2569
|
|
|
2530
2570
|
if (msg.phase === "end") {
|
|
2531
|
-
const candidate = crossScreenTargetRef.current;
|
|
2532
2571
|
// Use the saved payload from the last "move" as the primary source of
|
|
2533
2572
|
// truth; fall back to the "end" message's own fields in case the ref
|
|
2534
2573
|
// was cleared (e.g. a brief re-entry into the source iframe nulled it
|
|
@@ -2538,9 +2577,31 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
2538
2577
|
sourceId: msg.sourceId,
|
|
2539
2578
|
sourcePointerOffset,
|
|
2540
2579
|
sourceElementSize,
|
|
2580
|
+
sourceHtmlSnapshot,
|
|
2541
2581
|
styleSnapshot,
|
|
2542
2582
|
};
|
|
2543
|
-
|
|
2583
|
+
// Derive the release point from THIS message before falling back to
|
|
2584
|
+
// the refs the "move" phase maintained. The refs are cleared by any
|
|
2585
|
+
// cancel/blur/re-render that lands between the last move and the
|
|
2586
|
+
// release, and a drop that reads them empty returns silently — the
|
|
2587
|
+
// whole gesture vanishes with the element back on the board and no
|
|
2588
|
+
// error anywhere. The end message always describes its own pointer.
|
|
2589
|
+
const lastBoardPoint =
|
|
2590
|
+
boardPointFromDragMessage(
|
|
2591
|
+
sourceScreenId,
|
|
2592
|
+
msg.iframeX ?? 0,
|
|
2593
|
+
msg.iframeY ?? 0,
|
|
2594
|
+
msg.viewportW ?? 0,
|
|
2595
|
+
msg.viewportH ?? 0,
|
|
2596
|
+
) ?? crossScreenLastBoardPointRef.current;
|
|
2597
|
+
const targetAtRelease = lastBoardPoint
|
|
2598
|
+
? getFrameEntryAtPoint(lastBoardPoint)
|
|
2599
|
+
: null;
|
|
2600
|
+
const candidate =
|
|
2601
|
+
crossScreenTargetRef.current ??
|
|
2602
|
+
(targetAtRelease && targetAtRelease.id !== sourceScreenId
|
|
2603
|
+
? { id: targetAtRelease.id, geometry: targetAtRelease.geometry }
|
|
2604
|
+
: null);
|
|
2544
2605
|
finalizeCrossScreenDrop(
|
|
2545
2606
|
sourceScreenId,
|
|
2546
2607
|
candidate,
|
|
@@ -2552,7 +2613,6 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
2552
2613
|
|
|
2553
2614
|
window.addEventListener("message", handleMessage);
|
|
2554
2615
|
return () => {
|
|
2555
|
-
stopParentCrossScreenDrag();
|
|
2556
2616
|
window.removeEventListener("message", handleMessage);
|
|
2557
2617
|
};
|
|
2558
2618
|
}, [
|
|
@@ -2566,6 +2626,21 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
2566
2626
|
onCrossScreenElementDrop,
|
|
2567
2627
|
]);
|
|
2568
2628
|
|
|
2629
|
+
// Unmount only — deliberately NOT part of the message effect's cleanup
|
|
2630
|
+
// above. That effect re-subscribes whenever its deps change, which happens
|
|
2631
|
+
// several times during a single drag, and running the parent-drag teardown
|
|
2632
|
+
// there restores the preview iframes' pointer-events mid-gesture. The
|
|
2633
|
+
// pointer then falls into a live cross-origin screen iframe, the source
|
|
2634
|
+
// bridge stops receiving the drag, and the gesture dies with nothing
|
|
2635
|
+
// dropped and no error.
|
|
2636
|
+
useEffect(
|
|
2637
|
+
() => () => {
|
|
2638
|
+
crossScreenParentDragCleanupRef.current?.();
|
|
2639
|
+
crossScreenParentDragCleanupRef.current = null;
|
|
2640
|
+
},
|
|
2641
|
+
[],
|
|
2642
|
+
);
|
|
2643
|
+
|
|
2569
2644
|
const deleteSelectedItems = useCallback(() => {
|
|
2570
2645
|
if (readOnly) return false;
|
|
2571
2646
|
const frameIds = selectedIdsRef.current.filter(
|
|
@@ -7568,9 +7643,17 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
7568
7643
|
? canvasFrames.find((entry) => entry.screen.id === singleSelectedFrame.id)
|
|
7569
7644
|
?.screen
|
|
7570
7645
|
: undefined;
|
|
7646
|
+
// Overview element selection (a Layers-panel row or an in-canvas click
|
|
7647
|
+
// resolving to a specific node) also suppresses the frame box: the parent
|
|
7648
|
+
// still carries the screen in `selectedIds` (other UI — z-order, "topmost
|
|
7649
|
+
// screen" — depends on that), but the frame's own bounds are the wrong
|
|
7650
|
+
// outline for an element selection. See shouldSuppressFrameSelectionBox.
|
|
7571
7651
|
const suppressBaseSelectionBox = Boolean(
|
|
7572
7652
|
singleSelectedFrameScreen &&
|
|
7573
|
-
|
|
7653
|
+
shouldSuppressFrameSelectionBox(
|
|
7654
|
+
singleSelectedFrameScreen,
|
|
7655
|
+
selectedElementScreenId,
|
|
7656
|
+
),
|
|
7574
7657
|
);
|
|
7575
7658
|
const singleSelectedDraft =
|
|
7576
7659
|
selectedDraftEntries.length === 1 && !selectedDraftGroupBounds
|
|
@@ -7816,7 +7899,6 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
7816
7899
|
showFullView={fullViewIdSet.has(screen.id)}
|
|
7817
7900
|
pendingReview={pendingReviewScreenIdSet.has(screen.id)}
|
|
7818
7901
|
onReviewPendingScreen={onReviewPendingScreen}
|
|
7819
|
-
interactMode={interactMode}
|
|
7820
7902
|
isDirectlyHovered={screen.id === directlyHoveredScreenId}
|
|
7821
7903
|
isFileDragOver={
|
|
7822
7904
|
fileDragOverFrameId !== null &&
|
|
@@ -9125,7 +9207,6 @@ interface ScreenProps {
|
|
|
9125
9207
|
showFullView: boolean;
|
|
9126
9208
|
pendingReview: boolean;
|
|
9127
9209
|
onReviewPendingScreen?: (screenId: string) => void;
|
|
9128
|
-
interactMode: boolean;
|
|
9129
9210
|
readOnly: boolean;
|
|
9130
9211
|
isDirectlyHovered: boolean;
|
|
9131
9212
|
/** True while a native OS file drag is hovering this frame (Figma parity §1). */
|
|
@@ -9197,7 +9278,6 @@ const Screen = memo(function Screen({
|
|
|
9197
9278
|
showFullView,
|
|
9198
9279
|
pendingReview,
|
|
9199
9280
|
onReviewPendingScreen,
|
|
9200
|
-
interactMode,
|
|
9201
9281
|
readOnly,
|
|
9202
9282
|
isDirectlyHovered,
|
|
9203
9283
|
isFileDragOver,
|
|
@@ -9303,9 +9383,7 @@ const Screen = memo(function Screen({
|
|
|
9303
9383
|
// cover one another. Narrow frames collapse the action to its familiar icon;
|
|
9304
9384
|
// the accessible name and native tooltip preserve the action's meaning.
|
|
9305
9385
|
const compactFullView = frameScreenWidth < FRAME_HEADER_BUTTON_COMPACT_WIDTH;
|
|
9306
|
-
const frameActionLabel =
|
|
9307
|
-
? t("multiScreenCanvas.fullView")
|
|
9308
|
-
: t("designEditor.modes.interact");
|
|
9386
|
+
const frameActionLabel = t("designEditor.modes.interact");
|
|
9309
9387
|
const labelInfoMaxWidth = Math.max(
|
|
9310
9388
|
64,
|
|
9311
9389
|
frameScreenWidth -
|
|
@@ -9473,11 +9551,7 @@ const Screen = memo(function Screen({
|
|
|
9473
9551
|
onMouseEnter={() => updateDirectHover(true)}
|
|
9474
9552
|
onMouseLeave={() => updateDirectHover(false)}
|
|
9475
9553
|
>
|
|
9476
|
-
|
|
9477
|
-
<IconArrowsMaximize className="size-3 shrink-0" />
|
|
9478
|
-
) : (
|
|
9479
|
-
<IconHandClick className="size-3 shrink-0" />
|
|
9480
|
-
)}
|
|
9554
|
+
<IconHandClick className="size-3 shrink-0" />
|
|
9481
9555
|
<span className={cn("truncate", compactFullView && "sr-only")}>
|
|
9482
9556
|
{frameActionLabel}
|
|
9483
9557
|
</span>
|
|
@@ -9714,7 +9788,6 @@ const Screen = memo(function Screen({
|
|
|
9714
9788
|
renderBreakpointContent={renderBreakpointContent}
|
|
9715
9789
|
activeBreakpointWidth={screen.activeBreakpointWidth}
|
|
9716
9790
|
isScreenSelected={isSelected}
|
|
9717
|
-
interactMode={interactMode}
|
|
9718
9791
|
penActive={penActive}
|
|
9719
9792
|
creationToolActive={creationToolActive}
|
|
9720
9793
|
cullTier={cullTier}
|
|
@@ -9862,7 +9935,6 @@ function BreakpointPreviewRow({
|
|
|
9862
9935
|
renderBreakpointContent,
|
|
9863
9936
|
activeBreakpointWidth,
|
|
9864
9937
|
isScreenSelected,
|
|
9865
|
-
interactMode,
|
|
9866
9938
|
penActive,
|
|
9867
9939
|
creationToolActive,
|
|
9868
9940
|
cullTier,
|
|
@@ -9906,7 +9978,6 @@ function BreakpointPreviewRow({
|
|
|
9906
9978
|
* mirrors `Screen`'s own `isSelected`, used so a breakpoint frame's chrome
|
|
9907
9979
|
* reads as "part of a selected group" the same way the base frame does. */
|
|
9908
9980
|
isScreenSelected: boolean;
|
|
9909
|
-
interactMode: boolean;
|
|
9910
9981
|
penActive: boolean;
|
|
9911
9982
|
creationToolActive: boolean;
|
|
9912
9983
|
/** Uses the owning screen's exact culling lifecycle: never-seen/evicted
|
|
@@ -9943,9 +10014,7 @@ function BreakpointPreviewRow({
|
|
|
9943
10014
|
canEdit?: boolean;
|
|
9944
10015
|
}) {
|
|
9945
10016
|
const t = useT();
|
|
9946
|
-
const frameActionLabel =
|
|
9947
|
-
? t("multiScreenCanvas.fullView")
|
|
9948
|
-
: t("designEditor.modes.interact");
|
|
10017
|
+
const frameActionLabel = t("designEditor.modes.interact");
|
|
9949
10018
|
const breakpointWidths = visibleBreakpointWidths(
|
|
9950
10019
|
screen.breakpointWidths,
|
|
9951
10020
|
// Immutable device width, not the resizable box width (see frame-geometry).
|
|
@@ -10264,11 +10333,7 @@ function BreakpointPreviewRow({
|
|
|
10264
10333
|
e.stopPropagation();
|
|
10265
10334
|
}}
|
|
10266
10335
|
>
|
|
10267
|
-
|
|
10268
|
-
<IconArrowsMaximize className="size-3" />
|
|
10269
|
-
) : (
|
|
10270
|
-
<IconHandClick className="size-3" />
|
|
10271
|
-
)}
|
|
10336
|
+
<IconHandClick className="size-3" />
|
|
10272
10337
|
</button>
|
|
10273
10338
|
) : null}
|
|
10274
10339
|
<span
|
|
@@ -10917,12 +10982,24 @@ function isInteractiveScreenContentTarget(target: EventTarget | null) {
|
|
|
10917
10982
|
);
|
|
10918
10983
|
}
|
|
10919
10984
|
|
|
10920
|
-
|
|
10985
|
+
/**
|
|
10986
|
+
* `except` (the iframe a cross-screen drag STARTED in) must keep its pointer
|
|
10987
|
+
* events: its bridge owns the gesture — the lift visual, the move/end posts
|
|
10988
|
+
* this canvas finalizes on — and muting it hands the whole event stream to the
|
|
10989
|
+
* parent mid-drag, which silently drops the drop. Every OTHER preview iframe
|
|
10990
|
+
* still gets muted, which is the point: an unmuted cross-origin screen frame
|
|
10991
|
+
* swallows the pointer the moment the drag crosses into it.
|
|
10992
|
+
*/
|
|
10993
|
+
function mutePreviewIframePointerEvents(
|
|
10994
|
+
root: HTMLElement | null,
|
|
10995
|
+
except?: HTMLIFrameElement | null,
|
|
10996
|
+
) {
|
|
10921
10997
|
if (!root) return () => {};
|
|
10922
10998
|
const previous = new Map<HTMLIFrameElement, string>();
|
|
10923
10999
|
root
|
|
10924
11000
|
.querySelectorAll<HTMLIFrameElement>("[data-design-preview-iframe]")
|
|
10925
11001
|
.forEach((iframe) => {
|
|
11002
|
+
if (iframe === except) return;
|
|
10926
11003
|
previous.set(iframe, iframe.style.pointerEvents);
|
|
10927
11004
|
iframe.style.pointerEvents = "none";
|
|
10928
11005
|
});
|