@agent-native/core 0.85.6 → 0.86.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 +130 -1
- package/corpus/core/README.md +0 -11
- package/corpus/core/docs/content/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/ar-SA/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/ar-SA/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/ar-SA/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/ar-SA/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/ar-SA/workspace-connections.mdx +11 -11
- package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/de-DE/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/de-DE/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/de-DE/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/de-DE/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/de-DE/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/es-ES/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/es-ES/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/es-ES/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/es-ES/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/fr-FR/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/fr-FR/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/fr-FR/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/fr-FR/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/hi-IN/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/hi-IN/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/hi-IN/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/hi-IN/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/ja-JP/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/ja-JP/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/ja-JP/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/ja-JP/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/ko-KR/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/ko-KR/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/ko-KR/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/ko-KR/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/pt-BR/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/pt-BR/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/pt-BR/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/pt-BR/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/zh-CN/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/zh-CN/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/zh-CN/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/zh-CN/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/zh-TW/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/zh-TW/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/zh-TW/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/zh-TW/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/plan-plugin.mdx +12 -11
- package/corpus/core/docs/content/sharing.mdx +1 -2
- package/corpus/core/docs/content/skills-guide.mdx +4 -3
- package/corpus/core/docs/content/template-plan.mdx +37 -6
- package/corpus/core/docs/content/tracking.mdx +1 -1
- package/corpus/core/docs/content/workspace-connections.mdx +1 -1
- package/corpus/core/package.json +6 -6
- package/corpus/core/src/agent/run-store.ts +1 -1
- package/corpus/core/src/chat-threads/store.ts +73 -11
- package/corpus/core/src/checkpoints/store.ts +13 -2
- package/corpus/core/src/cli/create.ts +3 -4
- package/corpus/core/src/cli/design-connect.ts +469 -9
- package/corpus/core/src/cli/index.ts +13 -0
- package/corpus/core/src/cli/plan-local.ts +281 -24
- package/corpus/core/src/cli/skills.ts +177 -21
- package/corpus/core/src/cli/templates-meta.ts +0 -13
- package/corpus/core/src/cli/visualize-repo.ts +715 -0
- package/corpus/core/src/client/AssistantChat.tsx +126 -17
- package/corpus/core/src/client/agent-chat-adapter.ts +6 -5
- package/corpus/core/src/client/app-providers.tsx +2 -2
- package/corpus/core/src/client/collab/index.ts +31 -0
- package/corpus/core/src/client/components/LiveCursorOverlay.tsx +16 -1
- package/corpus/core/src/client/components/PresenceBar.tsx +14 -1
- package/corpus/core/src/client/components/RecentEditHighlights.tsx +219 -0
- package/corpus/core/src/client/components/RemoteSelectionRings.tsx +40 -6
- package/corpus/core/src/client/index.ts +48 -0
- package/corpus/core/src/client/org/OrgSwitcher.tsx +0 -4
- package/corpus/core/src/client/rich-markdown-editor/SharedRichEditor.tsx +49 -32
- package/corpus/core/src/client/rich-markdown-editor/index.ts +6 -0
- package/corpus/core/src/client/rich-markdown-editor/surgical-apply.ts +192 -0
- package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +59 -8
- package/corpus/core/src/client/session-replay.ts +181 -15
- package/corpus/core/src/client/sse-event-processor.ts +90 -1
- package/corpus/core/src/client/use-action.ts +123 -25
- package/corpus/core/src/client/use-agent-engine-configured.ts +7 -1
- package/corpus/core/src/client/use-chat-threads.ts +18 -7
- package/corpus/core/src/client/use-db-sync.ts +104 -19
- package/corpus/core/src/client/use-pinch-zoom.ts +76 -11
- package/corpus/core/src/client/visual-style-controls.tsx +475 -0
- package/corpus/core/src/collab/agent-presence.ts +191 -62
- package/corpus/core/src/collab/awareness.ts +83 -6
- package/corpus/core/src/collab/client.ts +89 -146
- package/corpus/core/src/collab/index.ts +34 -0
- package/corpus/core/src/collab/presence.ts +63 -3
- package/corpus/core/src/collab/recent-edits.ts +171 -0
- package/corpus/core/src/collab/undo.ts +432 -0
- package/corpus/core/src/collab/ydoc-manager.ts +68 -0
- package/corpus/core/src/connections/catalog.ts +2 -3
- package/corpus/core/src/db/create-get-db.ts +86 -1
- package/corpus/core/src/db/ensure-additive-columns.ts +430 -0
- package/corpus/core/src/db/index.ts +6 -0
- package/corpus/core/src/db/migrations.ts +236 -35
- package/corpus/core/src/jobs/scheduler.ts +17 -14
- package/corpus/core/src/observability/traces.ts +182 -1
- package/corpus/core/src/org/context.ts +79 -2
- package/corpus/core/src/server/agent-chat-plugin.ts +10 -6
- package/corpus/core/src/server/auth-marketing.ts +0 -11
- package/corpus/core/src/server/auth.ts +11 -4
- package/corpus/core/src/server/collab-plugin.ts +56 -13
- package/corpus/core/src/server/design-token-utils.ts +1 -1
- package/corpus/core/src/server/fusion-app.ts +447 -0
- package/corpus/core/src/server/index.ts +13 -0
- package/corpus/core/src/server/onboarding-html.ts +3 -4
- package/corpus/core/src/server/poll-events.ts +14 -2
- package/corpus/core/src/server/poll.ts +219 -12
- package/corpus/core/src/server/schema-prompt.ts +28 -9
- package/corpus/core/src/settings/store.ts +33 -2
- package/corpus/core/src/sharing/actions/set-resource-visibility.ts +2 -0
- package/corpus/core/src/sharing/actions/share-resource.ts +3 -0
- package/corpus/core/src/sharing/actions/unshare-resource.ts +2 -0
- package/corpus/core/src/styles/agent-native.css +0 -5
- package/corpus/core/src/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/core/src/templates/default/package.json +3 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
- package/corpus/core/src/tracking/providers.ts +22 -1
- package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +20 -5
- package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/analytics/AGENTS.md +33 -6
- package/corpus/templates/analytics/actions/navigate.ts +14 -4
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
- package/corpus/templates/analytics/actions/view-screen.ts +57 -0
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +23 -1
- package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -0
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +21 -0
- package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +7 -0
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +15 -1
- package/corpus/templates/analytics/app/i18n-data.ts +151 -10
- package/corpus/templates/analytics/app/pages/Agents.tsx +118 -0
- package/corpus/templates/analytics/app/pages/DataSources.tsx +11 -1
- package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +76 -40
- package/corpus/templates/analytics/app/pages/sessions/session-replay-devtools.ts +5 -0
- package/corpus/templates/analytics/app/routes/agents.tsx +10 -0
- package/corpus/templates/analytics/changelog/2026-07-03-agent-admin-tools-page.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-03-agent-llm-observability-dashboard.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-03-session-recordings-now-include-response-bodies-for-5xx-error.md +6 -0
- package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +34 -0
- package/corpus/templates/analytics/docs/schemas/tracked-events.md +6 -0
- package/corpus/templates/analytics/package.json +3 -3
- package/corpus/templates/analytics/seeds/dashboards/agent-observability-llm.json +173 -0
- package/corpus/templates/analytics/server/jobs/analytics-alerts.ts +23 -5
- package/corpus/templates/analytics/server/lib/analytics-alerts.ts +58 -13
- package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +23 -0
- package/corpus/templates/analytics/server/lib/dashboard-seeds.ts +5 -0
- package/corpus/templates/analytics/server/lib/session-replay-agent-context.ts +120 -8
- package/corpus/templates/analytics/server/lib/session-replay.ts +3 -2
- package/corpus/templates/analytics/server/plugins/db.ts +93 -2
- package/corpus/templates/analytics/server/routes/api/session-replay/agent-diagnostics.json.get.ts +45 -1
- package/corpus/templates/analytics/shared/session-replay-diagnostics.ts +10 -0
- package/corpus/templates/assets/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/assets/package.json +3 -3
- package/corpus/templates/assets/server/plugins/db.ts +63 -2
- package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/brain/package.json +3 -3
- package/corpus/templates/brain/server/plugins/db.ts +75 -2
- package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/calendar/package.json +3 -3
- package/corpus/templates/calendar/server/plugins/db.ts +64 -2
- package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/chat/package.json +3 -3
- package/corpus/templates/clips/actions/finalize-recording.ts +50 -40
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +8 -6
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +3 -3
- package/corpus/templates/clips/changelog/2026-07-03-mobile-recording-pages-keep-videos-in-a-16-9-player-with-act.md +6 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +245 -77
- package/corpus/templates/clips/package.json +3 -3
- package/corpus/templates/clips/server/lib/recording-upload-state.ts +56 -0
- package/corpus/templates/clips/server/plugins/db.ts +68 -1
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +27 -3
- package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/content/actions/edit-document.ts +48 -1
- package/corpus/templates/content/actions/list-documents.ts +101 -94
- package/corpus/templates/content/actions/search-documents.ts +19 -3
- package/corpus/templates/content/actions/update-document.ts +54 -1
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +127 -7
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +97 -2
- package/corpus/templates/content/changelog/2026-07-03-agent-document-edits-now-appear-as-a-live-collaborator-prese.md +6 -0
- package/corpus/templates/content/changelog/2026-07-03-document-search-and-list-views-load-faster-on-large-workspac.md +6 -0
- package/corpus/templates/content/package.json +3 -3
- package/corpus/templates/content/server/plugins/db.ts +57 -1
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +190 -13
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +16 -4
- package/corpus/templates/design/.agents/skills/export-handoff/SKILL.md +46 -3
- package/corpus/templates/design/.agents/skills/full-app-build/SKILL.md +140 -0
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +20 -0
- package/corpus/templates/design/AGENTS.md +83 -13
- package/corpus/templates/design/actions/add-fusion-screens.ts +91 -0
- package/corpus/templates/design/actions/apply-a11y-fix.ts +5 -1
- package/corpus/templates/design/actions/apply-component-prop-edit.ts +24 -69
- package/corpus/templates/design/actions/apply-fusion-edits.ts +161 -0
- package/corpus/templates/design/actions/apply-motion-edit.ts +29 -2
- package/corpus/templates/design/actions/apply-visual-edit.ts +38 -3
- package/corpus/templates/design/actions/connect-localhost.ts +25 -18
- package/corpus/templates/design/actions/create-component.ts +5 -1
- package/corpus/templates/design/actions/create-fusion-app.ts +202 -0
- package/corpus/templates/design/actions/deploy-fusion-app.ts +123 -0
- package/corpus/templates/design/actions/edit-design.ts +13 -16
- package/corpus/templates/design/actions/export-pdf.ts +8 -1
- package/corpus/templates/design/actions/export-zip.ts +10 -1
- package/corpus/templates/design/actions/get-fusion-deploy-status.ts +86 -0
- package/corpus/templates/design/actions/get-motion-timeline.ts +26 -20
- package/corpus/templates/design/actions/grant-localhost-write-consent.ts +10 -0
- package/corpus/templates/design/actions/insert-asset.ts +190 -7
- package/corpus/templates/design/actions/list-fusion-edits.ts +96 -0
- package/corpus/templates/design/actions/list-local-files.ts +133 -0
- package/corpus/templates/design/actions/open-visual-edit.ts +27 -5
- package/corpus/templates/design/actions/present-design-variants.ts +2 -2
- package/corpus/templates/design/actions/push-fusion-app.ts +62 -0
- package/corpus/templates/design/actions/queue-fusion-edit.ts +112 -0
- package/corpus/templates/design/actions/read-local-file.ts +139 -0
- package/corpus/templates/design/actions/revoke-localhost-write-consent.ts +18 -14
- package/corpus/templates/design/actions/run-design-audit.ts +7 -4
- package/corpus/templates/design/actions/send-fusion-message.ts +69 -0
- package/corpus/templates/design/actions/sync-fusion-app.ts +196 -0
- package/corpus/templates/design/actions/write-local-file.ts +162 -36
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +12 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +600 -66
- package/corpus/templates/design/app/components/design/EditPanel.tsx +793 -304
- package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +328 -0
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +671 -154
- package/corpus/templates/design/app/components/design/LocalhostWriteConsentDialog.tsx +1 -1
- package/corpus/templates/design/app/components/design/MotionDock.tsx +234 -46
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +2070 -420
- package/corpus/templates/design/app/components/design/StatesPanel.tsx +25 -2
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +7 -98
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +640 -72
- package/corpus/templates/design/app/components/design/bridge/motion-preview.bridge.ts +605 -0
- package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +50 -26
- package/corpus/templates/design/app/components/design/code-workbench/ActivityBar.tsx +85 -0
- package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +466 -0
- package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +53 -0
- package/corpus/templates/design/app/components/design/code-workbench/commands.ts +339 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/Breadcrumbs.tsx +42 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/BufferSync.tsx +128 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/EditorTabs.tsx +363 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/MonacoHost.tsx +268 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/StatusBar.tsx +208 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-setup.ts +61 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-theme-palette.ts +191 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-theme.ts +29 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/status-bar-lang.ts +21 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/tab-drag.ts +27 -0
- package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +155 -0
- package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +551 -0
- package/corpus/templates/design/app/components/design/code-workbench/explorer/file-icons.tsx +115 -0
- package/corpus/templates/design/app/components/design/code-workbench/format/format-on-open.ts +65 -0
- package/corpus/templates/design/app/components/design/code-workbench/format/prettier-format.ts +182 -0
- package/corpus/templates/design/app/components/design/code-workbench/model-registry.ts +133 -0
- package/corpus/templates/design/app/components/design/code-workbench/quickinput/QuickInput.tsx +563 -0
- package/corpus/templates/design/app/components/design/code-workbench/quickinput/fuzzy.ts +170 -0
- package/corpus/templates/design/app/components/design/code-workbench/search/SearchView.tsx +508 -0
- package/corpus/templates/design/app/components/design/code-workbench/search/search-engine.ts +280 -0
- package/corpus/templates/design/app/components/design/code-workbench/store.tsx +734 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/create-providers.ts +39 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/inline-provider.ts +196 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/localhost-provider.ts +177 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/tree.ts +110 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/types.ts +103 -0
- package/corpus/templates/design/app/components/design/code-workbench-theme.ts +68 -0
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +16 -4
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +217 -113
- package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +111 -5
- package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +13 -2
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +79 -16
- package/corpus/templates/design/app/components/design/inspector/index.ts +9 -0
- package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +67 -2
- package/corpus/templates/design/app/components/design/types.ts +16 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +80 -1
- package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +24 -6
- package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +15 -1
- package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +6 -16
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +77 -0
- package/corpus/templates/design/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/design/app/i18n-data.ts +31 -0
- package/corpus/templates/design/app/lib/design-import.ts +95 -0
- package/corpus/templates/design/app/pages/DesignEditor.tsx +5586 -1112
- package/corpus/templates/design/app/pages/Index.tsx +90 -17
- package/corpus/templates/design/changelog/2026-07-03-canvas-interactions-now-match-figma-rotation-aware-resizing-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-inspector-fixes-mixed-selections-show-mixed-instead-of-wrong.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-keyframe-timeline-works-reliably-drag-keyframes-smoothly-pic.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-layers-panel-matches-figma-top-layer-on-top-drag-with-auto-s.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-much-faster-editor-smooth-dragging-zooming-and-panel-updates.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-pen-tool-refinements-click-the-first-point-to-close-with-a-d.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-text-editing-enter-adds-a-line-break-international-ime-typin.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-the-ai-now-edits-like-a-collaborator-on-canvas-its-cursor-gl.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-the-code-panel-is-now-a-full-vs-code-style-editor-with-a-fil.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-undo-and-redo-are-dependable-across-agent-edits-screen-switc.md +6 -0
- package/corpus/templates/design/package.json +4 -3
- package/corpus/templates/design/server/db/schema.ts +31 -0
- package/corpus/templates/design/server/lib/design-export.ts +43 -1
- package/corpus/templates/design/server/lib/fusion-screens.ts +246 -0
- package/corpus/templates/design/server/plugins/db.ts +89 -2
- package/corpus/templates/design/shared/board-file.ts +25 -5
- package/corpus/templates/design/shared/canvas-math.ts +754 -9
- package/corpus/templates/design/shared/code-layer.ts +304 -26
- package/corpus/templates/design/shared/collab-selection.ts +52 -0
- package/corpus/templates/design/shared/color-utils.ts +84 -0
- package/corpus/templates/design/shared/design-source-capabilities.ts +16 -7
- package/corpus/templates/design/shared/full-app.ts +126 -0
- package/corpus/templates/design/shared/motion-compiler.ts +75 -31
- package/corpus/templates/design/shared/motion-timeline.ts +335 -0
- package/corpus/templates/design/shared/pen-path.ts +496 -23
- package/corpus/templates/dispatch/package.json +3 -3
- package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/forms/package.json +3 -3
- package/corpus/templates/forms/server/plugins/db.ts +62 -2
- package/corpus/templates/macros/package.json +3 -3
- package/corpus/templates/macros/server/plugins/db.ts +63 -2
- package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/mail/package.json +3 -3
- package/corpus/templates/mail/server/lib/contact-frequency.ts +42 -15
- package/corpus/templates/mail/server/plugins/db.ts +63 -2
- package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +9 -3
- package/corpus/templates/plan/.agents/skills/visualize-repo/SKILL.md +92 -0
- package/corpus/templates/plan/actions/export-visual-plan.ts +5 -0
- package/corpus/templates/plan/actions/get-local-plan-folder.ts +4 -22
- package/corpus/templates/plan/actions/get-plan-version.ts +6 -16
- package/corpus/templates/plan/actions/list-plan-versions.ts +48 -20
- package/corpus/templates/plan/actions/patch-visual-plan-source.ts +41 -1
- package/corpus/templates/plan/actions/promote-local-plan-folder.ts +4 -22
- package/corpus/templates/plan/actions/update-local-plan-comments.ts +4 -2
- package/corpus/templates/plan/actions/update-local-plan-folder.ts +4 -22
- package/corpus/templates/plan/actions/update-visual-plan.ts +60 -1
- package/corpus/templates/plan/agent-native.app-skill.json +10 -0
- package/corpus/templates/plan/app/components/editor/PlanDocumentEditor.tsx +138 -39
- package/corpus/templates/plan/app/components/editor/usePlanUndoStack.ts +165 -23
- package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +80 -4
- package/corpus/templates/plan/app/global.css +11 -9
- package/corpus/templates/plan/app/hooks/use-navigation-state.ts +10 -1
- package/corpus/templates/plan/app/hooks/use-plan-presence.ts +66 -0
- package/corpus/templates/plan/app/pages/PlansPage.tsx +215 -63
- package/corpus/templates/plan/changelog/2026-07-03-local-visual-plans-and-recaps-can-save-comments-without-sign.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-03-plan-tabs-render-nested-text-instead-of-raw-json.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-03-plans-are-now-fully-real-time-collaborative-multiple-people-.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-03-plans-open-and-refresh-faster-especially-long-lived-plans-wi.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-03-undo-now-survives-agent-edits-cmd-z-keeps-working-on-your-ow.md +6 -0
- package/corpus/templates/plan/package.json +5 -3
- package/corpus/templates/plan/server/db/schema.ts +12 -0
- package/corpus/templates/plan/server/lib/local-plan-kind.ts +25 -0
- package/corpus/templates/plan/server/lib/plan-versions.ts +83 -1
- package/corpus/templates/plan/server/lib/public-action-paths.ts +0 -2
- package/corpus/templates/plan/server/plans.ts +26 -3
- package/corpus/templates/plan/server/plugins/db.ts +105 -2
- package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +8 -4
- package/corpus/templates/slides/AGENTS.md +4 -0
- package/corpus/templates/slides/actions/_agent-presence.ts +48 -0
- package/corpus/templates/slides/actions/add-slide.ts +16 -18
- package/corpus/templates/slides/actions/patch-deck.ts +4 -2
- package/corpus/templates/slides/actions/update-slide.ts +114 -77
- package/corpus/templates/slides/actions/view-screen.ts +39 -0
- package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +47 -3
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +32 -35
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +625 -199
- package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +342 -0
- package/corpus/templates/slides/app/components/editor/TweaksPanel.tsx +46 -96
- package/corpus/templates/slides/app/components/visual-editor/SaveStatusIndicator.tsx +8 -1
- package/corpus/templates/slides/app/context/DeckContext.tsx +589 -176
- package/corpus/templates/slides/app/hooks/use-deck-presence.ts +84 -42
- package/corpus/templates/slides/app/i18n/ar-SA.ts +46 -0
- package/corpus/templates/slides/app/i18n/de-DE.ts +46 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +46 -0
- package/corpus/templates/slides/app/i18n/es-ES.ts +46 -0
- package/corpus/templates/slides/app/i18n/fr-FR.ts +46 -0
- package/corpus/templates/slides/app/i18n/hi-IN.ts +46 -0
- package/corpus/templates/slides/app/i18n/ja-JP.ts +46 -0
- package/corpus/templates/slides/app/i18n/ko-KR.ts +46 -0
- package/corpus/templates/slides/app/i18n/pt-BR.ts +46 -0
- package/corpus/templates/slides/app/i18n/zh-CN.ts +46 -0
- package/corpus/templates/slides/app/i18n/zh-TW.ts +46 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +25 -13
- package/corpus/templates/slides/changelog/2026-07-03-figma-style-slide-editing.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-03-see-the-ai-working-with-you-when-the-agent-edits-a-slide-it-.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-03-undo-redo-is-now-precise-and-safe-with-collaborators-it-only.md +6 -0
- package/corpus/templates/slides/package.json +3 -3
- package/corpus/templates/slides/server/handlers/decks.ts +31 -3
- package/corpus/templates/slides/server/plugins/db.ts +65 -2
- package/corpus/templates/videos/netlify.toml +1 -12
- package/dist/agent/run-store.js +1 -1
- package/dist/agent/run-store.js.map +1 -1
- package/dist/chat-threads/store.d.ts +9 -1
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +63 -11
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/checkpoints/store.d.ts.map +1 -1
- package/dist/checkpoints/store.js +10 -2
- package/dist/checkpoints/store.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +3 -5
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/design-connect.d.ts +49 -1
- package/dist/cli/design-connect.d.ts.map +1 -1
- package/dist/cli/design-connect.js +414 -9
- package/dist/cli/design-connect.js.map +1 -1
- package/dist/cli/index.js +12 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/plan-local.d.ts +24 -0
- package/dist/cli/plan-local.d.ts.map +1 -1
- package/dist/cli/plan-local.js +188 -20
- package/dist/cli/plan-local.js.map +1 -1
- package/dist/cli/skills.d.ts +3 -1
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +173 -21
- package/dist/cli/skills.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +0 -14
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/cli/visualize-repo.d.ts +49 -0
- package/dist/cli/visualize-repo.d.ts.map +1 -0
- package/dist/cli/visualize-repo.js +561 -0
- package/dist/cli/visualize-repo.js.map +1 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +120 -15
- 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 +6 -5
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/app-providers.d.ts +2 -2
- package/dist/client/app-providers.js.map +1 -1
- package/dist/client/collab/index.d.ts +4 -1
- package/dist/client/collab/index.d.ts.map +1 -1
- package/dist/client/collab/index.js +3 -0
- package/dist/client/collab/index.js.map +1 -1
- package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
- package/dist/client/components/LiveCursorOverlay.js +11 -3
- package/dist/client/components/LiveCursorOverlay.js.map +1 -1
- package/dist/client/components/PresenceBar.d.ts.map +1 -1
- package/dist/client/components/PresenceBar.js +6 -1
- package/dist/client/components/PresenceBar.js.map +1 -1
- package/dist/client/components/RecentEditHighlights.d.ts +43 -0
- package/dist/client/components/RecentEditHighlights.d.ts.map +1 -0
- package/dist/client/components/RecentEditHighlights.js +146 -0
- package/dist/client/components/RecentEditHighlights.js.map +1 -0
- package/dist/client/components/RemoteSelectionRings.d.ts +9 -0
- package/dist/client/components/RemoteSelectionRings.d.ts.map +1 -1
- package/dist/client/components/RemoteSelectionRings.js +22 -8
- package/dist/client/components/RemoteSelectionRings.js.map +1 -1
- package/dist/client/index.d.ts +6 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +7 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +1 -3
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +8 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.js +8 -2
- package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
- package/dist/client/rich-markdown-editor/index.d.ts +1 -0
- package/dist/client/rich-markdown-editor/index.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/index.js +1 -0
- package/dist/client/rich-markdown-editor/index.js.map +1 -1
- package/dist/client/rich-markdown-editor/surgical-apply.d.ts +66 -0
- package/dist/client/rich-markdown-editor/surgical-apply.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/surgical-apply.js +147 -0
- package/dist/client/rich-markdown-editor/surgical-apply.js.map +1 -0
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts +18 -2
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/useCollabReconcile.js +39 -8
- package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
- package/dist/client/session-replay.d.ts +10 -1
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +134 -7
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +81 -1
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/use-action.d.ts +24 -0
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +109 -27
- package/dist/client/use-action.js.map +1 -1
- package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
- package/dist/client/use-agent-engine-configured.js +7 -1
- package/dist/client/use-agent-engine-configured.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +11 -3
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/client/use-db-sync.d.ts +36 -0
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +68 -12
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/client/use-pinch-zoom.d.ts.map +1 -1
- package/dist/client/use-pinch-zoom.js +76 -11
- package/dist/client/use-pinch-zoom.js.map +1 -1
- package/dist/client/visual-style-controls.d.ts +79 -0
- package/dist/client/visual-style-controls.d.ts.map +1 -0
- package/dist/client/visual-style-controls.js +150 -0
- package/dist/client/visual-style-controls.js.map +1 -0
- package/dist/collab/agent-presence.d.ts +51 -5
- package/dist/collab/agent-presence.d.ts.map +1 -1
- package/dist/collab/agent-presence.js +144 -58
- package/dist/collab/agent-presence.js.map +1 -1
- package/dist/collab/awareness-store.d.ts +32 -0
- package/dist/collab/awareness-store.d.ts.map +1 -0
- package/dist/collab/awareness-store.js +0 -0
- package/dist/collab/awareness-store.js.map +1 -0
- package/dist/collab/awareness.d.ts +14 -3
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/awareness.js +53 -5
- package/dist/collab/awareness.js.map +1 -1
- package/dist/collab/client.d.ts +2 -0
- package/dist/collab/client.d.ts.map +1 -1
- package/dist/collab/client.js +79 -119
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/index.d.ts +3 -1
- package/dist/collab/index.d.ts.map +1 -1
- package/dist/collab/index.js +5 -1
- package/dist/collab/index.js.map +1 -1
- package/dist/collab/presence.d.ts.map +1 -1
- package/dist/collab/presence.js +54 -3
- package/dist/collab/presence.js.map +1 -1
- package/dist/collab/recent-edits.d.ts +87 -0
- package/dist/collab/recent-edits.d.ts.map +1 -0
- package/dist/collab/recent-edits.js +116 -0
- package/dist/collab/recent-edits.js.map +1 -0
- package/dist/collab/undo.d.ts +121 -0
- package/dist/collab/undo.d.ts.map +1 -0
- package/dist/collab/undo.js +244 -0
- package/dist/collab/undo.js.map +1 -0
- package/dist/collab/ydoc-manager.d.ts +10 -0
- package/dist/collab/ydoc-manager.d.ts.map +1 -1
- package/dist/collab/ydoc-manager.js +57 -0
- package/dist/collab/ydoc-manager.js.map +1 -1
- package/dist/connections/catalog.d.ts +2 -2
- package/dist/connections/catalog.d.ts.map +1 -1
- package/dist/connections/catalog.js +1 -1
- package/dist/connections/catalog.js.map +1 -1
- package/dist/db/create-get-db.d.ts +22 -0
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +73 -1
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/db/ensure-additive-columns.d.ts +93 -0
- package/dist/db/ensure-additive-columns.d.ts.map +1 -0
- package/dist/db/ensure-additive-columns.js +355 -0
- package/dist/db/ensure-additive-columns.js.map +1 -0
- package/dist/db/index.d.ts +1 -0
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +1 -0
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrations.d.ts +70 -0
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +196 -33
- package/dist/db/migrations.js.map +1 -1
- package/dist/jobs/scheduler.js +17 -10
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +5 -5
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js +155 -1
- package/dist/observability/traces.js.map +1 -1
- package/dist/org/context.d.ts +7 -0
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +54 -2
- package/dist/org/context.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/secrets/routes.d.ts +6 -6
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +10 -6
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/auth-marketing.d.ts.map +1 -1
- package/dist/server/auth-marketing.js +0 -10
- package/dist/server/auth-marketing.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +6 -4
- package/dist/server/auth.js.map +1 -1
- package/dist/server/collab-plugin.d.ts.map +1 -1
- package/dist/server/collab-plugin.js +45 -13
- package/dist/server/collab-plugin.js.map +1 -1
- package/dist/server/design-token-utils.d.ts +1 -1
- package/dist/server/design-token-utils.js +1 -1
- package/dist/server/design-token-utils.js.map +1 -1
- package/dist/server/fusion-app.d.ts +107 -0
- package/dist/server/fusion-app.d.ts.map +1 -0
- package/dist/server/fusion-app.js +371 -0
- package/dist/server/fusion-app.js.map +1 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +3 -4
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/poll-events.d.ts +2 -0
- package/dist/server/poll-events.d.ts.map +1 -1
- package/dist/server/poll-events.js +7 -2
- package/dist/server/poll-events.js.map +1 -1
- package/dist/server/poll.d.ts +47 -3
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +176 -10
- package/dist/server/poll.js.map +1 -1
- package/dist/server/schema-prompt.d.ts.map +1 -1
- package/dist/server/schema-prompt.js +24 -7
- package/dist/server/schema-prompt.js.map +1 -1
- package/dist/settings/store.d.ts.map +1 -1
- package/dist/settings/store.js +32 -3
- package/dist/settings/store.js.map +1 -1
- package/dist/sharing/actions/set-resource-visibility.js +2 -0
- package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
- package/dist/sharing/actions/share-resource.d.ts.map +1 -1
- package/dist/sharing/actions/share-resource.js +3 -0
- package/dist/sharing/actions/share-resource.js.map +1 -1
- package/dist/sharing/actions/unshare-resource.js +2 -0
- package/dist/sharing/actions/unshare-resource.js.map +1 -1
- package/dist/styles/agent-native.css +0 -5
- package/dist/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/dist/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
- package/dist/templates/default/package.json +3 -3
- package/dist/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
- package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
- package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
- package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
- package/dist/tracking/providers.d.ts.map +1 -1
- package/dist/tracking/providers.js +17 -1
- package/dist/tracking/providers.js.map +1 -1
- package/docs/content/cloneable-saas.mdx +0 -1
- package/docs/content/locales/ar-SA/cloneable-saas.mdx +0 -1
- package/docs/content/locales/ar-SA/plan-plugin.mdx +10 -9
- package/docs/content/locales/ar-SA/sharing.mdx +1 -2
- package/docs/content/locales/ar-SA/skills-guide.mdx +2 -3
- package/docs/content/locales/ar-SA/template-plan.mdx +23 -7
- package/docs/content/locales/ar-SA/tracking.mdx +1 -1
- package/docs/content/locales/ar-SA/workspace-connections.mdx +11 -11
- package/docs/content/locales/de-DE/cloneable-saas.mdx +0 -1
- package/docs/content/locales/de-DE/plan-plugin.mdx +10 -9
- package/docs/content/locales/de-DE/sharing.mdx +1 -2
- package/docs/content/locales/de-DE/skills-guide.mdx +2 -3
- package/docs/content/locales/de-DE/template-plan.mdx +23 -7
- package/docs/content/locales/de-DE/tracking.mdx +1 -1
- package/docs/content/locales/de-DE/workspace-connections.mdx +1 -1
- package/docs/content/locales/es-ES/cloneable-saas.mdx +0 -1
- package/docs/content/locales/es-ES/plan-plugin.mdx +10 -9
- package/docs/content/locales/es-ES/sharing.mdx +1 -2
- package/docs/content/locales/es-ES/skills-guide.mdx +2 -3
- package/docs/content/locales/es-ES/template-plan.mdx +23 -7
- package/docs/content/locales/es-ES/tracking.mdx +1 -1
- package/docs/content/locales/es-ES/workspace-connections.mdx +1 -1
- package/docs/content/locales/fr-FR/cloneable-saas.mdx +0 -1
- package/docs/content/locales/fr-FR/plan-plugin.mdx +10 -9
- package/docs/content/locales/fr-FR/sharing.mdx +1 -2
- package/docs/content/locales/fr-FR/skills-guide.mdx +2 -3
- package/docs/content/locales/fr-FR/template-plan.mdx +23 -7
- package/docs/content/locales/fr-FR/tracking.mdx +1 -1
- package/docs/content/locales/fr-FR/workspace-connections.mdx +1 -1
- package/docs/content/locales/hi-IN/cloneable-saas.mdx +0 -1
- package/docs/content/locales/hi-IN/plan-plugin.mdx +10 -9
- package/docs/content/locales/hi-IN/sharing.mdx +1 -2
- package/docs/content/locales/hi-IN/skills-guide.mdx +2 -3
- package/docs/content/locales/hi-IN/template-plan.mdx +23 -7
- package/docs/content/locales/hi-IN/tracking.mdx +1 -1
- package/docs/content/locales/hi-IN/workspace-connections.mdx +1 -1
- package/docs/content/locales/ja-JP/cloneable-saas.mdx +0 -1
- package/docs/content/locales/ja-JP/plan-plugin.mdx +10 -9
- package/docs/content/locales/ja-JP/sharing.mdx +1 -2
- package/docs/content/locales/ja-JP/skills-guide.mdx +2 -3
- package/docs/content/locales/ja-JP/template-plan.mdx +23 -7
- package/docs/content/locales/ja-JP/tracking.mdx +1 -1
- package/docs/content/locales/ja-JP/workspace-connections.mdx +1 -1
- package/docs/content/locales/ko-KR/cloneable-saas.mdx +0 -1
- package/docs/content/locales/ko-KR/plan-plugin.mdx +10 -9
- package/docs/content/locales/ko-KR/sharing.mdx +1 -2
- package/docs/content/locales/ko-KR/skills-guide.mdx +2 -3
- package/docs/content/locales/ko-KR/template-plan.mdx +23 -7
- package/docs/content/locales/ko-KR/tracking.mdx +1 -1
- package/docs/content/locales/ko-KR/workspace-connections.mdx +1 -1
- package/docs/content/locales/pt-BR/cloneable-saas.mdx +0 -1
- package/docs/content/locales/pt-BR/plan-plugin.mdx +10 -9
- package/docs/content/locales/pt-BR/sharing.mdx +1 -2
- package/docs/content/locales/pt-BR/skills-guide.mdx +2 -3
- package/docs/content/locales/pt-BR/template-plan.mdx +23 -7
- package/docs/content/locales/pt-BR/tracking.mdx +1 -1
- package/docs/content/locales/pt-BR/workspace-connections.mdx +1 -1
- package/docs/content/locales/zh-CN/cloneable-saas.mdx +0 -1
- package/docs/content/locales/zh-CN/plan-plugin.mdx +10 -9
- package/docs/content/locales/zh-CN/sharing.mdx +1 -2
- package/docs/content/locales/zh-CN/skills-guide.mdx +2 -3
- package/docs/content/locales/zh-CN/template-plan.mdx +23 -7
- package/docs/content/locales/zh-CN/tracking.mdx +1 -1
- package/docs/content/locales/zh-CN/workspace-connections.mdx +1 -1
- package/docs/content/locales/zh-TW/cloneable-saas.mdx +0 -1
- package/docs/content/locales/zh-TW/plan-plugin.mdx +10 -9
- package/docs/content/locales/zh-TW/sharing.mdx +1 -2
- package/docs/content/locales/zh-TW/skills-guide.mdx +2 -3
- package/docs/content/locales/zh-TW/template-plan.mdx +23 -7
- package/docs/content/locales/zh-TW/tracking.mdx +1 -1
- package/docs/content/locales/zh-TW/workspace-connections.mdx +1 -1
- package/docs/content/plan-plugin.mdx +12 -11
- package/docs/content/sharing.mdx +1 -2
- package/docs/content/skills-guide.mdx +4 -3
- package/docs/content/template-plan.mdx +37 -6
- package/docs/content/tracking.mdx +1 -1
- package/docs/content/workspace-connections.mdx +1 -1
- package/package.json +6 -6
- package/src/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/src/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
- package/src/templates/default/package.json +3 -3
- package/src/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
- package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
- package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
- package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
- package/corpus/core/docs/content/locales/ar-SA/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/de-DE/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/es-ES/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/fr-FR/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/hi-IN/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/ja-JP/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/ko-KR/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/pt-BR/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/zh-CN/template-videos.mdx +0 -334
- package/corpus/core/docs/content/locales/zh-TW/template-videos.mdx +0 -334
- package/corpus/core/docs/content/template-videos.mdx +0 -332
- package/corpus/templates/design/app/components/design/CodeWorkbenchHost.tsx +0 -697
- package/corpus/templates/slides/app/components/editor/CodeEditor.tsx +0 -49
- package/corpus/templates/videos/.agents/skills/actions/SKILL.md +0 -432
- package/corpus/templates/videos/.agents/skills/animation-tracks/SKILL.md +0 -99
- package/corpus/templates/videos/.agents/skills/capture-learnings/SKILL.md +0 -76
- package/corpus/templates/videos/.agents/skills/composition-management/SKILL.md +0 -106
- package/corpus/templates/videos/.agents/skills/create-skill/SKILL.md +0 -221
- package/corpus/templates/videos/.agents/skills/delegate-to-agent/SKILL.md +0 -263
- package/corpus/templates/videos/.agents/skills/frontend-design/SKILL.md +0 -112
- package/corpus/templates/videos/.agents/skills/security/SKILL.md +0 -263
- package/corpus/templates/videos/.agents/skills/self-modifying-code/SKILL.md +0 -88
- package/corpus/templates/videos/.agents/skills/shadcn-ui/SKILL.md +0 -95
- package/corpus/templates/videos/.builder/ANIMATED_PROPERTIES.md +0 -335
- package/corpus/templates/videos/.builder/KEYFRAME_SYNC.md +0 -166
- package/corpus/templates/videos/.builder/SEAMLESS_SYNC.md +0 -211
- package/corpus/templates/videos/.builder/rules/deploy-app.mdc +0 -22
- package/corpus/templates/videos/.builder/rules/organize-ui.mdc +0 -9
- package/corpus/templates/videos/.builder/skills/remotion/SKILL.md +0 -29
- package/corpus/templates/videos/.builder/skills/remotion/rules/animations.md +0 -27
- package/corpus/templates/videos/.builder/skills/remotion/rules/assets.md +0 -43
- package/corpus/templates/videos/.builder/skills/remotion/rules/audio.md +0 -58
- package/corpus/templates/videos/.builder/skills/remotion/rules/compositions.md +0 -129
- package/corpus/templates/videos/.builder/skills/remotion/rules/fonts.md +0 -47
- package/corpus/templates/videos/.builder/skills/remotion/rules/images.md +0 -41
- package/corpus/templates/videos/.builder/skills/remotion/rules/parameters.md +0 -59
- package/corpus/templates/videos/.builder/skills/remotion/rules/sequencing.md +0 -54
- package/corpus/templates/videos/.builder/skills/remotion/rules/tailwind.md +0 -11
- package/corpus/templates/videos/.builder/skills/remotion/rules/text-animations.md +0 -18
- package/corpus/templates/videos/.builder/skills/remotion/rules/timing.md +0 -103
- package/corpus/templates/videos/.builder/skills/remotion/rules/transparent-videos.md +0 -35
- package/corpus/templates/videos/.builder/skills/remotion/rules/trimming.md +0 -38
- package/corpus/templates/videos/.builder/skills/remotion/rules/videos.md +0 -54
- package/corpus/templates/videos/.dockerignore +0 -62
- package/corpus/templates/videos/.env.example +0 -4
- package/corpus/templates/videos/.oxfmtrc.json +0 -8
- package/corpus/templates/videos/AGENTS.md +0 -46
- package/corpus/templates/videos/CHANGELOG.md +0 -10
- package/corpus/templates/videos/DEVELOPING.md +0 -143
- package/corpus/templates/videos/README.md +0 -33
- package/corpus/templates/videos/actions/analyze-brand-assets.ts +0 -151
- package/corpus/templates/videos/actions/apply-design-system.ts +0 -35
- package/corpus/templates/videos/actions/create-design-system.ts +0 -84
- package/corpus/templates/videos/actions/create-folder.ts +0 -48
- package/corpus/templates/videos/actions/db-connect.ts +0 -45
- package/corpus/templates/videos/actions/db-health.ts +0 -24
- package/corpus/templates/videos/actions/db-status.ts +0 -28
- package/corpus/templates/videos/actions/delete-composition.ts +0 -272
- package/corpus/templates/videos/actions/delete-folder.ts +0 -27
- package/corpus/templates/videos/actions/generate-animated-component.ts +0 -470
- package/corpus/templates/videos/actions/get-composition.ts +0 -36
- package/corpus/templates/videos/actions/get-design-system.ts +0 -35
- package/corpus/templates/videos/actions/import-code.ts +0 -67
- package/corpus/templates/videos/actions/import-design-project.ts +0 -42
- package/corpus/templates/videos/actions/import-document.ts +0 -125
- package/corpus/templates/videos/actions/import-from-url.ts +0 -18
- package/corpus/templates/videos/actions/import-github.ts +0 -182
- package/corpus/templates/videos/actions/list-compositions.ts +0 -32
- package/corpus/templates/videos/actions/list-design-systems.ts +0 -66
- package/corpus/templates/videos/actions/list-folders.ts +0 -61
- package/corpus/templates/videos/actions/move-composition-to-folder.ts +0 -59
- package/corpus/templates/videos/actions/navigate.ts +0 -40
- package/corpus/templates/videos/actions/rename-folder.ts +0 -41
- package/corpus/templates/videos/actions/run.ts +0 -2
- package/corpus/templates/videos/actions/save-composition.ts +0 -114
- package/corpus/templates/videos/actions/set-default-design-system.ts +0 -40
- package/corpus/templates/videos/actions/update-composition.ts +0 -81
- package/corpus/templates/videos/actions/update-design-system.ts +0 -68
- package/corpus/templates/videos/actions/validate-compositions.ts +0 -502
- package/corpus/templates/videos/actions/view-screen.ts +0 -48
- package/corpus/templates/videos/app/components/CameraControls.tsx +0 -442
- package/corpus/templates/videos/app/components/CameraToolbar.tsx +0 -437
- package/corpus/templates/videos/app/components/CloudUpgrade.tsx +0 -287
- package/corpus/templates/videos/app/components/CollabPresenceBar.tsx +0 -81
- package/corpus/templates/videos/app/components/CompSettingsEditor.tsx +0 -107
- package/corpus/templates/videos/app/components/ComponentLibrarySidebar.tsx +0 -457
- package/corpus/templates/videos/app/components/ComponentPropsPanel.tsx +0 -227
- package/corpus/templates/videos/app/components/ComponentsSidebar.tsx +0 -70
- package/corpus/templates/videos/app/components/CompositionCard.tsx +0 -147
- package/corpus/templates/videos/app/components/CurrentElementPanel.tsx +0 -835
- package/corpus/templates/videos/app/components/CursorControls.tsx +0 -664
- package/corpus/templates/videos/app/components/CursorPositioningOverlay.tsx +0 -238
- package/corpus/templates/videos/app/components/LibraryFolderRow.tsx +0 -235
- package/corpus/templates/videos/app/components/MotionCurveSelect.tsx +0 -61
- package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +0 -192
- package/corpus/templates/videos/app/components/PropsEditor.tsx +0 -210
- package/corpus/templates/videos/app/components/QuestionFlow.tsx +0 -40
- package/corpus/templates/videos/app/components/Sidebar.tsx +0 -609
- package/corpus/templates/videos/app/components/StudioHeader.tsx +0 -109
- package/corpus/templates/videos/app/components/Timeline.tsx +0 -2067
- package/corpus/templates/videos/app/components/TrackPropertiesPanel.tsx +0 -922
- package/corpus/templates/videos/app/components/TweaksPanel.tsx +0 -277
- package/corpus/templates/videos/app/components/VideoPlayer.tsx +0 -487
- package/corpus/templates/videos/app/components/design-system/DesignSystemCard.tsx +0 -134
- package/corpus/templates/videos/app/components/design-system/DesignSystemPreview.tsx +0 -176
- package/corpus/templates/videos/app/components/design-system/DesignSystemSetup.tsx +0 -707
- package/corpus/templates/videos/app/components/keyframes/KeyframeActionButtons.tsx +0 -78
- package/corpus/templates/videos/app/components/keyframes/KeyframeNavigation.tsx +0 -59
- package/corpus/templates/videos/app/components/keyframes/PropertyNumberInput.tsx +0 -56
- package/corpus/templates/videos/app/components/layout/Header.tsx +0 -64
- package/corpus/templates/videos/app/components/layout/HeaderActions.tsx +0 -84
- package/corpus/templates/videos/app/components/layout/Layout.tsx +0 -132
- package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +0 -180
- package/corpus/templates/videos/app/components/ui/accordion.tsx +0 -56
- package/corpus/templates/videos/app/components/ui/alert-dialog.tsx +0 -139
- package/corpus/templates/videos/app/components/ui/alert.tsx +0 -59
- package/corpus/templates/videos/app/components/ui/aspect-ratio.tsx +0 -5
- package/corpus/templates/videos/app/components/ui/avatar.tsx +0 -48
- package/corpus/templates/videos/app/components/ui/badge.tsx +0 -37
- package/corpus/templates/videos/app/components/ui/breadcrumb.tsx +0 -115
- package/corpus/templates/videos/app/components/ui/button.tsx +0 -57
- package/corpus/templates/videos/app/components/ui/calendar.tsx +0 -68
- package/corpus/templates/videos/app/components/ui/card.tsx +0 -86
- package/corpus/templates/videos/app/components/ui/carousel.tsx +0 -260
- package/corpus/templates/videos/app/components/ui/chart.tsx +0 -375
- package/corpus/templates/videos/app/components/ui/checkbox.tsx +0 -28
- package/corpus/templates/videos/app/components/ui/collapsible.tsx +0 -9
- package/corpus/templates/videos/app/components/ui/command.tsx +0 -154
- package/corpus/templates/videos/app/components/ui/context-menu.tsx +0 -202
- package/corpus/templates/videos/app/components/ui/dialog.tsx +0 -130
- package/corpus/templates/videos/app/components/ui/drawer.tsx +0 -116
- package/corpus/templates/videos/app/components/ui/dropdown-menu.tsx +0 -212
- package/corpus/templates/videos/app/components/ui/form.tsx +0 -177
- package/corpus/templates/videos/app/components/ui/hover-card.tsx +0 -27
- package/corpus/templates/videos/app/components/ui/input-otp.tsx +0 -69
- package/corpus/templates/videos/app/components/ui/input.tsx +0 -22
- package/corpus/templates/videos/app/components/ui/label.tsx +0 -24
- package/corpus/templates/videos/app/components/ui/menubar.tsx +0 -234
- package/corpus/templates/videos/app/components/ui/navigation-menu.tsx +0 -128
- package/corpus/templates/videos/app/components/ui/pagination.tsx +0 -121
- package/corpus/templates/videos/app/components/ui/popover.tsx +0 -44
- package/corpus/templates/videos/app/components/ui/progress.tsx +0 -26
- package/corpus/templates/videos/app/components/ui/radio-group.tsx +0 -42
- package/corpus/templates/videos/app/components/ui/resizable.tsx +0 -43
- package/corpus/templates/videos/app/components/ui/scroll-area.tsx +0 -46
- package/corpus/templates/videos/app/components/ui/select.tsx +0 -158
- package/corpus/templates/videos/app/components/ui/separator.tsx +0 -29
- package/corpus/templates/videos/app/components/ui/sheet.tsx +0 -160
- package/corpus/templates/videos/app/components/ui/sidebar.tsx +0 -782
- package/corpus/templates/videos/app/components/ui/skeleton.tsx +0 -15
- package/corpus/templates/videos/app/components/ui/slider.tsx +0 -26
- package/corpus/templates/videos/app/components/ui/sonner.tsx +0 -58
- package/corpus/templates/videos/app/components/ui/spinner.tsx +0 -17
- package/corpus/templates/videos/app/components/ui/switch.tsx +0 -27
- package/corpus/templates/videos/app/components/ui/table.tsx +0 -117
- package/corpus/templates/videos/app/components/ui/tabs.tsx +0 -53
- package/corpus/templates/videos/app/components/ui/textarea.tsx +0 -23
- package/corpus/templates/videos/app/components/ui/toast.tsx +0 -127
- package/corpus/templates/videos/app/components/ui/toaster.tsx +0 -33
- package/corpus/templates/videos/app/components/ui/toggle-group.tsx +0 -59
- package/corpus/templates/videos/app/components/ui/toggle.tsx +0 -43
- package/corpus/templates/videos/app/components/ui/tooltip.tsx +0 -30
- package/corpus/templates/videos/app/components/ui/use-toast.ts +0 -3
- package/corpus/templates/videos/app/config/constants.ts +0 -204
- package/corpus/templates/videos/app/contexts/CompositionContext.tsx +0 -437
- package/corpus/templates/videos/app/contexts/CurrentElementContext.tsx +0 -247
- package/corpus/templates/videos/app/contexts/PlaybackContext.tsx +0 -65
- package/corpus/templates/videos/app/contexts/TimelineContext.tsx +0 -433
- package/corpus/templates/videos/app/entry.client.tsx +0 -19
- package/corpus/templates/videos/app/entry.server.tsx +0 -10
- package/corpus/templates/videos/app/global.css +0 -171
- package/corpus/templates/videos/app/hooks/use-composition-collab.ts +0 -269
- package/corpus/templates/videos/app/hooks/use-composition-design-system.ts +0 -47
- package/corpus/templates/videos/app/hooks/use-database-compositions.ts +0 -144
- package/corpus/templates/videos/app/hooks/use-db-status.ts +0 -30
- package/corpus/templates/videos/app/hooks/use-design-systems.ts +0 -21
- package/corpus/templates/videos/app/hooks/use-folders.ts +0 -199
- package/corpus/templates/videos/app/hooks/use-mobile.tsx +0 -21
- package/corpus/templates/videos/app/hooks/use-navigation-state.ts +0 -52
- package/corpus/templates/videos/app/hooks/use-question-flow.ts +0 -14
- package/corpus/templates/videos/app/hooks/use-toast.ts +0 -188
- package/corpus/templates/videos/app/hooks/useUnsavedChanges.ts +0 -48
- package/corpus/templates/videos/app/i18n/ar-SA.ts +0 -446
- package/corpus/templates/videos/app/i18n/de-DE.ts +0 -470
- package/corpus/templates/videos/app/i18n/en-US.ts +0 -452
- package/corpus/templates/videos/app/i18n/es-ES.ts +0 -468
- package/corpus/templates/videos/app/i18n/fr-FR.ts +0 -469
- package/corpus/templates/videos/app/i18n/hi-IN.ts +0 -446
- package/corpus/templates/videos/app/i18n/index.ts +0 -34
- package/corpus/templates/videos/app/i18n/ja-JP.ts +0 -460
- package/corpus/templates/videos/app/i18n/ko-KR.ts +0 -453
- package/corpus/templates/videos/app/i18n/pt-BR.ts +0 -461
- package/corpus/templates/videos/app/i18n/zh-CN.ts +0 -437
- package/corpus/templates/videos/app/i18n/zh-TW.ts +0 -437
- package/corpus/templates/videos/app/lib/database-compositions.ts +0 -67
- package/corpus/templates/videos/app/lib/design-systems.ts +0 -234
- package/corpus/templates/videos/app/lib/tab-id.ts +0 -1
- package/corpus/templates/videos/app/lib/utils.ts +0 -1
- package/corpus/templates/videos/app/pages/ComponentLibrary.tsx +0 -134
- package/corpus/templates/videos/app/pages/ComponentLibraryView.tsx +0 -362
- package/corpus/templates/videos/app/pages/CompositionView.tsx +0 -715
- package/corpus/templates/videos/app/pages/DesignSystems.tsx +0 -180
- package/corpus/templates/videos/app/pages/Index.tsx +0 -258
- package/corpus/templates/videos/app/pages/NewComposition.tsx +0 -95
- package/corpus/templates/videos/app/pages/NotFound.tsx +0 -36
- package/corpus/templates/videos/app/remotion/CameraHost.tsx +0 -223
- package/corpus/templates/videos/app/remotion/animations/useElementAnimations.ts +0 -231
- package/corpus/templates/videos/app/remotion/componentRegistry.ts +0 -473
- package/corpus/templates/videos/app/remotion/components/AnimatedElement.tsx +0 -436
- package/corpus/templates/videos/app/remotion/components/InteractiveElement.tsx +0 -159
- package/corpus/templates/videos/app/remotion/components/InteractiveZoneEditor.tsx +0 -273
- package/corpus/templates/videos/app/remotion/compositions/BlankComposition.tsx +0 -204
- package/corpus/templates/videos/app/remotion/compositions/index.ts +0 -2
- package/corpus/templates/videos/app/remotion/createComponentCursorTrack.ts +0 -132
- package/corpus/templates/videos/app/remotion/docs/CURSOR_TRACKS.md +0 -285
- package/corpus/templates/videos/app/remotion/easingFunctions.ts +0 -255
- package/corpus/templates/videos/app/remotion/hooks/createInteractiveComposition.tsx +0 -283
- package/corpus/templates/videos/app/remotion/hooks/useCursorHistory.ts +0 -72
- package/corpus/templates/videos/app/remotion/hooks/useCursorTypeFromHover.ts +0 -35
- package/corpus/templates/videos/app/remotion/hooks/useEditableZones.tsx +0 -267
- package/corpus/templates/videos/app/remotion/hooks/useHoverAnimation.ts +0 -90
- package/corpus/templates/videos/app/remotion/hooks/useHoverAnimationSmooth.ts +0 -146
- package/corpus/templates/videos/app/remotion/hooks/useInteractiveComponent.ts +0 -711
- package/corpus/templates/videos/app/remotion/hooks/useRegisterInteractiveElement.ts +0 -56
- package/corpus/templates/videos/app/remotion/library-components/Button.tsx +0 -252
- package/corpus/templates/videos/app/remotion/library-components/Card.tsx +0 -241
- package/corpus/templates/videos/app/remotion/library-components/CodePanel.tsx +0 -1005
- package/corpus/templates/videos/app/remotion/library-components/FileItem.tsx +0 -196
- package/corpus/templates/videos/app/remotion/library-components/FolderItem.tsx +0 -199
- package/corpus/templates/videos/app/remotion/library-components/PrimaryButton.tsx +0 -177
- package/corpus/templates/videos/app/remotion/library-components/SecondaryButton.tsx +0 -167
- package/corpus/templates/videos/app/remotion/library-components/SectionHeader.tsx +0 -108
- package/corpus/templates/videos/app/remotion/library-components/TEMPLATE.tsx +0 -211
- package/corpus/templates/videos/app/remotion/library-components/index.ts +0 -10
- package/corpus/templates/videos/app/remotion/registry.ts +0 -91
- package/corpus/templates/videos/app/remotion/testing/animationTestUtils.ts +0 -366
- package/corpus/templates/videos/app/remotion/trackAnimation.ts +0 -179
- package/corpus/templates/videos/app/remotion/trackHelpers.ts +0 -110
- package/corpus/templates/videos/app/remotion/ui-components/Cursor.tsx +0 -182
- package/corpus/templates/videos/app/remotion/ui-components/InteractiveButton.tsx +0 -116
- package/corpus/templates/videos/app/remotion/ui-components/InteractiveCard.tsx +0 -126
- package/corpus/templates/videos/app/remotion/ui-components/index.ts +0 -16
- package/corpus/templates/videos/app/remotion/utils/animationHelpers.ts +0 -444
- package/corpus/templates/videos/app/remotion/utils/interactiveElements.ts +0 -235
- package/corpus/templates/videos/app/remotion/utils/springAnimation.ts +0 -76
- package/corpus/templates/videos/app/root.tsx +0 -165
- package/corpus/templates/videos/app/routes/$.tsx +0 -10
- package/corpus/templates/videos/app/routes/_index.tsx +0 -25
- package/corpus/templates/videos/app/routes/c.$compositionId.tsx +0 -10
- package/corpus/templates/videos/app/routes/components.tsx +0 -10
- package/corpus/templates/videos/app/routes/design-systems.tsx +0 -10
- package/corpus/templates/videos/app/routes/extensions.$id.$slug.tsx +0 -2
- package/corpus/templates/videos/app/routes/extensions.$id.tsx +0 -5
- package/corpus/templates/videos/app/routes/extensions._index.tsx +0 -5
- package/corpus/templates/videos/app/routes/extensions.tsx +0 -5
- package/corpus/templates/videos/app/routes/settings.tsx +0 -88
- package/corpus/templates/videos/app/routes/team.tsx +0 -11
- package/corpus/templates/videos/app/routes.ts +0 -4
- package/corpus/templates/videos/app/state.ts +0 -77
- package/corpus/templates/videos/app/types/elementAnimations.ts +0 -121
- package/corpus/templates/videos/app/types.ts +0 -200
- package/corpus/templates/videos/app/utils/compositionHelpers.ts +0 -445
- package/corpus/templates/videos/app/utils/debug.ts +0 -63
- package/corpus/templates/videos/app/utils/keyframeUtils.ts +0 -331
- package/corpus/templates/videos/app/utils/timelineCoordinates.ts +0 -79
- package/corpus/templates/videos/app/vite-env.d.ts +0 -6
- package/corpus/templates/videos/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +0 -6
- package/corpus/templates/videos/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +0 -6
- package/corpus/templates/videos/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +0 -6
- package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +0 -6
- package/corpus/templates/videos/changelog/2026-06-29-video-layouts-adapt-when-the-agent-sidebar-is-open.md +0 -6
- package/corpus/templates/videos/components.json +0 -20
- package/corpus/templates/videos/data/sync-config.json +0 -3
- package/corpus/templates/videos/docs/examples/create-composition.example.ts +0 -128
- package/corpus/templates/videos/drizzle.config.ts +0 -3
- package/corpus/templates/videos/learnings.defaults.md +0 -5
- package/corpus/templates/videos/package.json +0 -114
- package/corpus/templates/videos/public/agent-native-icon-dark.svg +0 -10
- package/corpus/templates/videos/public/agent-native-icon-light.svg +0 -10
- package/corpus/templates/videos/public/agent-native-logo-dark.svg +0 -21
- package/corpus/templates/videos/public/agent-native-logo-light.svg +0 -21
- package/corpus/templates/videos/public/favicon.svg +0 -1
- package/corpus/templates/videos/public/icon-180.svg +0 -1
- package/corpus/templates/videos/public/icon-192.svg +0 -1
- package/corpus/templates/videos/public/icon-512.svg +0 -1
- package/corpus/templates/videos/public/manifest.json +0 -21
- package/corpus/templates/videos/public/placeholder.svg +0 -1
- package/corpus/templates/videos/public/robots.txt +0 -14
- package/corpus/templates/videos/react-router.config.ts +0 -7
- package/corpus/templates/videos/server/db/index.ts +0 -37
- package/corpus/templates/videos/server/db/schema.ts +0 -55
- package/corpus/templates/videos/server/middleware/auth.ts +0 -15
- package/corpus/templates/videos/server/plugins/agent-chat.ts +0 -29
- package/corpus/templates/videos/server/plugins/auth.ts +0 -14
- package/corpus/templates/videos/server/plugins/collab.ts +0 -11
- package/corpus/templates/videos/server/plugins/core-routes.ts +0 -22
- package/corpus/templates/videos/server/plugins/db.ts +0 -160
- package/corpus/templates/videos/server/routes/[...page].get.ts +0 -5
- package/corpus/templates/videos/server/routes/[...page].head.ts +0 -1
- package/corpus/templates/videos/server/routes/api/save-composition-defaults.post.ts +0 -274
- package/corpus/templates/videos/shared/api.ts +0 -75
- package/corpus/templates/videos/ssr-entry.ts +0 -15
- package/corpus/templates/videos/tsconfig.json +0 -21
- package/corpus/templates/videos/vite.config.ts +0 -19
- package/corpus/templates/videos/vitest.config.ts +0 -16
- package/docs/content/locales/ar-SA/template-videos.mdx +0 -336
- package/docs/content/locales/de-DE/template-videos.mdx +0 -336
- package/docs/content/locales/es-ES/template-videos.mdx +0 -336
- package/docs/content/locales/fr-FR/template-videos.mdx +0 -336
- package/docs/content/locales/hi-IN/template-videos.mdx +0 -336
- package/docs/content/locales/ja-JP/template-videos.mdx +0 -336
- package/docs/content/locales/ko-KR/template-videos.mdx +0 -336
- package/docs/content/locales/pt-BR/template-videos.mdx +0 -336
- package/docs/content/locales/zh-CN/template-videos.mdx +0 -334
- package/docs/content/locales/zh-TW/template-videos.mdx +0 -334
- package/docs/content/template-videos.mdx +0 -332
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { usePinchZoom, useT } from "@agent-native/core/client";
|
|
2
|
+
import { getDraftGeometryFromPoints } from "@shared/canvas-math";
|
|
2
3
|
import { ensureCodeLayerNodeIdsInHtml } from "@shared/code-layer";
|
|
3
4
|
import { useRef, useEffect, useCallback, useMemo, useState } from "react";
|
|
4
5
|
|
|
@@ -12,6 +13,7 @@ import {
|
|
|
12
13
|
type CanvasPin,
|
|
13
14
|
} from "@/components/visual-editor";
|
|
14
15
|
import { sendToDesignAgentChat } from "@/lib/agent-chat";
|
|
16
|
+
import { cn } from "@/lib/utils";
|
|
15
17
|
|
|
16
18
|
import { editorChromeBridgeScript } from "../../../.generated/bridge/editor-chrome.generated";
|
|
17
19
|
import { embeddedWheelBridgeScript } from "../../../.generated/bridge/embedded-wheel.generated";
|
|
@@ -447,6 +449,14 @@ interface DesignCanvasProps {
|
|
|
447
449
|
* needs the tracks so the bridge can interpolate values at each tick.
|
|
448
450
|
*/
|
|
449
451
|
motionTracks?: MotionTrackWire[];
|
|
452
|
+
/**
|
|
453
|
+
* Timeline-level default easing applied to any keyframe that omits its own
|
|
454
|
+
* `ease`. Threaded to the motion-preview bridge alongside the tracks so the
|
|
455
|
+
* scrub/playback preview matches the persisted CSS (the compiler uses the
|
|
456
|
+
* same `defaultEase` fallback when emitting `animation-timing-function`).
|
|
457
|
+
* When omitted the bridge falls back to "ease".
|
|
458
|
+
*/
|
|
459
|
+
motionDefaultEase?: string;
|
|
450
460
|
/**
|
|
451
461
|
* Explicit iframe width in pixels. When provided it overrides the width
|
|
452
462
|
* derived from `deviceFrame`, enabling per-breakpoint preview (e.g. Mobile
|
|
@@ -485,6 +495,88 @@ interface DesignCanvasProps {
|
|
|
485
495
|
nodeId: string;
|
|
486
496
|
componentName: string;
|
|
487
497
|
}) => void;
|
|
498
|
+
/**
|
|
499
|
+
* Figma-style click-to-place primitive creation while focused on a single
|
|
500
|
+
* screen. When set to a non-null tool, DesignCanvas mounts a transparent
|
|
501
|
+
* capture overlay above the iframe so pointer gestures draw a new
|
|
502
|
+
* primitive instead of reaching the iframe's own content/editor-chrome
|
|
503
|
+
* bridge. `null`/`undefined` fully restores prior (pre-creation-tool)
|
|
504
|
+
* behavior — the overlay never mounts.
|
|
505
|
+
*/
|
|
506
|
+
activeCreationTool?: CreationTool | null;
|
|
507
|
+
/**
|
|
508
|
+
* Fired once per completed click or drag gesture while `activeCreationTool`
|
|
509
|
+
* is set. Geometry is in SCREEN-CONTENT coordinates — the screen's own
|
|
510
|
+
* pixel coordinate system, matching what `getDraftGeometryFromPoints` and
|
|
511
|
+
* `draftPrimitiveToInsert` already use in MultiScreenCanvas — NOT viewport
|
|
512
|
+
* pixels. The parent (DesignEditor) is responsible for turning this into a
|
|
513
|
+
* persisted primitive (see `appendCanvasPrimitiveToHtml` /
|
|
514
|
+
* `draftPrimitiveToInsert` on the overview side).
|
|
515
|
+
*/
|
|
516
|
+
onCreatePrimitive?: (spec: CreatePrimitiveSpec) => void;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
/** Creation tools supported by the single-screen click-to-place overlay. */
|
|
520
|
+
export type CreationTool =
|
|
521
|
+
| "rectangle"
|
|
522
|
+
| "ellipse"
|
|
523
|
+
| "line"
|
|
524
|
+
| "arrow"
|
|
525
|
+
| "text"
|
|
526
|
+
| "pen";
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* Geometry payload emitted by the single-screen creation overlay. Coordinates
|
|
530
|
+
* are always in screen-content space (see `activeCreationTool` doc above).
|
|
531
|
+
*
|
|
532
|
+
* - `rect` is present for rectangle/ellipse/text (a click uses a sensible
|
|
533
|
+
* default size; a drag uses the dragged bounds via
|
|
534
|
+
* `getDraftGeometryFromPoints`, matching MultiScreenCanvas).
|
|
535
|
+
* - `points` is present for line/arrow (always exactly 2 points) and for a
|
|
536
|
+
* pen click (a single start point — see the deferred multi-click pen note
|
|
537
|
+
* on the overlay component itself).
|
|
538
|
+
* - `fromClick` distinguishes a negligible-movement click (true) from a
|
|
539
|
+
* drag past the movement threshold (false), mirroring MultiScreenCanvas's
|
|
540
|
+
* own click-vs-drag draft creation semantics.
|
|
541
|
+
*/
|
|
542
|
+
export interface CreatePrimitiveSpec {
|
|
543
|
+
tool: CreationTool;
|
|
544
|
+
rect?: { x: number; y: number; width: number; height: number };
|
|
545
|
+
points?: Array<{ x: number; y: number }>;
|
|
546
|
+
fromClick: boolean;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
/**
|
|
550
|
+
* Converts a pointer position in viewport (client) coordinates into
|
|
551
|
+
* screen-content coordinates — the screen's own pixel coordinate system, as
|
|
552
|
+
* used by `getDraftGeometryFromPoints` / `draftPrimitiveToInsert` in
|
|
553
|
+
* MultiScreenCanvas.
|
|
554
|
+
*
|
|
555
|
+
* The iframe's rendered rect (`getBoundingClientRect()`) already reflects any
|
|
556
|
+
* outer zoom `transform: scale(...)` wrapper, while `iframe.clientWidth` /
|
|
557
|
+
* `iframe.clientHeight` are the raw (unscaled) layout size that equals the
|
|
558
|
+
* screen's own content pixel dimensions. Dividing out that ratio undoes the
|
|
559
|
+
* zoom scale, matching the scaleX/scaleY convention already used by the
|
|
560
|
+
* `element-contextmenu` bridge handler below.
|
|
561
|
+
*/
|
|
562
|
+
export function getScreenContentPointFromClient(
|
|
563
|
+
clientX: number,
|
|
564
|
+
clientY: number,
|
|
565
|
+
iframeRect: { left: number; top: number; width: number; height: number },
|
|
566
|
+
iframeContentSize: { width: number; height: number },
|
|
567
|
+
): { x: number; y: number } {
|
|
568
|
+
const scaleX =
|
|
569
|
+
iframeContentSize.width > 0
|
|
570
|
+
? iframeRect.width / iframeContentSize.width
|
|
571
|
+
: 1;
|
|
572
|
+
const scaleY =
|
|
573
|
+
iframeContentSize.height > 0
|
|
574
|
+
? iframeRect.height / iframeContentSize.height
|
|
575
|
+
: 1;
|
|
576
|
+
return {
|
|
577
|
+
x: (clientX - iframeRect.left) / (scaleX || 1),
|
|
578
|
+
y: (clientY - iframeRect.top) / (scaleY || 1),
|
|
579
|
+
};
|
|
488
580
|
}
|
|
489
581
|
|
|
490
582
|
function getExternalPreviewUrl(content: string): string | null {
|
|
@@ -683,9 +775,12 @@ export function DesignCanvas({
|
|
|
683
775
|
commentContextLabel,
|
|
684
776
|
onPrototypeNavigate,
|
|
685
777
|
motionTracks,
|
|
778
|
+
motionDefaultEase,
|
|
686
779
|
previewWidthPx,
|
|
687
780
|
onComponentSourceJump,
|
|
688
781
|
shaderFillPreview,
|
|
782
|
+
activeCreationTool = null,
|
|
783
|
+
onCreatePrimitive,
|
|
689
784
|
}: DesignCanvasProps) {
|
|
690
785
|
const t = useT();
|
|
691
786
|
const iframeRef = useRef<HTMLIFrameElement>(null);
|
|
@@ -695,6 +790,40 @@ export function DesignCanvas({
|
|
|
695
790
|
const runtimeReplacementContentRef = useRef(runtimeReplacementContent);
|
|
696
791
|
const runtimeReplacementKeyRef = useRef(runtimeReplacementKey);
|
|
697
792
|
const lastRuntimeReplacementKeyRef = useRef(runtimeReplacementKey);
|
|
793
|
+
// Bridge-ready handshake (see EDITOR_CHROME_BRIDGE_SCRIPT's
|
|
794
|
+
// agent-native:editor-chrome-ready post on install). One-shot commands —
|
|
795
|
+
// begin-text-edit, set-editor-chrome-scale, style-change, delete-element,
|
|
796
|
+
// replace-document-content — are fire-and-forget postMessages with no retry:
|
|
797
|
+
// if the iframe document is still loading (fresh srcdoc, screen switch, or a
|
|
798
|
+
// mid-flight reload) the bridge script hasn't attached its message listener
|
|
799
|
+
// yet and the command is silently dropped. replayIframeEditorState only
|
|
800
|
+
// re-sends steady-state selection/hover/tweak/motion values, never these
|
|
801
|
+
// one-shot commands, so a dropped one-shot never recovers on its own.
|
|
802
|
+
// Queue them here until ready fires (or the iframe finishes loading, as a
|
|
803
|
+
// fallback for older/interact-mode documents that never inject the chrome
|
|
804
|
+
// bridge and thus never post ready) and flush in order.
|
|
805
|
+
const bridgeReadyRef = useRef(false);
|
|
806
|
+
const pendingOneShotMessagesRef = useRef<unknown[]>([]);
|
|
807
|
+
const flushPendingOneShotMessages = useCallback(() => {
|
|
808
|
+
const iframe = iframeRef.current;
|
|
809
|
+
const win = iframe?.contentWindow;
|
|
810
|
+
if (!win) return;
|
|
811
|
+
const queued = pendingOneShotMessagesRef.current;
|
|
812
|
+
if (queued.length === 0) return;
|
|
813
|
+
pendingOneShotMessagesRef.current = [];
|
|
814
|
+
queued.forEach((message) => win.postMessage(message, "*"));
|
|
815
|
+
}, []);
|
|
816
|
+
const postOneShotBridgeMessage = useCallback((message: unknown) => {
|
|
817
|
+
const iframe = iframeRef.current;
|
|
818
|
+
const win = iframe?.contentWindow;
|
|
819
|
+
if (!win) return false;
|
|
820
|
+
if (!bridgeReadyRef.current) {
|
|
821
|
+
pendingOneShotMessagesRef.current.push(message);
|
|
822
|
+
return true;
|
|
823
|
+
}
|
|
824
|
+
win.postMessage(message, "*");
|
|
825
|
+
return true;
|
|
826
|
+
}, []);
|
|
698
827
|
const [renderedContent, setRenderedContent] = useState(content);
|
|
699
828
|
const [annotationPins, setAnnotationPins] = useState<CanvasPin[]>([]);
|
|
700
829
|
const [pinSubmitSignal, setPinSubmitSignal] = useState(0);
|
|
@@ -865,6 +994,15 @@ export function DesignCanvas({
|
|
|
865
994
|
if (previousContentKeyRef.current !== contentKey) {
|
|
866
995
|
previousContentKeyRef.current = contentKey;
|
|
867
996
|
lastRuntimeReplacementKeyRef.current = runtimeReplacementKey;
|
|
997
|
+
// A content-key change rebuilds srcdoc, which reloads the iframe with a
|
|
998
|
+
// brand-new document. The previous document's ready handshake (and any
|
|
999
|
+
// one-shot commands still queued against it) no longer apply — reset
|
|
1000
|
+
// synchronously here rather than on the iframe's `load` event, since
|
|
1001
|
+
// `load` fires AFTER the freshly (re)injected editor-chrome bridge script
|
|
1002
|
+
// has already run and posted its own new ready message; resetting on
|
|
1003
|
+
// `load` would incorrectly clobber that just-arrived ready signal.
|
|
1004
|
+
bridgeReadyRef.current = false;
|
|
1005
|
+
pendingOneShotMessagesRef.current = [];
|
|
868
1006
|
setRenderedContent(content);
|
|
869
1007
|
}
|
|
870
1008
|
// Same-screen visual edits are already applied optimistically inside the
|
|
@@ -888,11 +1026,14 @@ export function DesignCanvas({
|
|
|
888
1026
|
// outside Edit mode. The editor chrome bridge is omitted for Interact mode
|
|
889
1027
|
// so preview/app users can interact with the app normally.
|
|
890
1028
|
//
|
|
891
|
-
// readOnly
|
|
892
|
-
// !interactMode and the initial __READ_ONLY__
|
|
893
|
-
//
|
|
894
|
-
//
|
|
895
|
-
//
|
|
1029
|
+
// readOnly and editMode are intentionally NOT deps here: the bridge is
|
|
1030
|
+
// injected whenever !interactMode and the initial __READ_ONLY__ /
|
|
1031
|
+
// __TEXT_EDITING_ENABLED__ placeholders are baked from the *first* render
|
|
1032
|
+
// only (so first paint never flashes the wrong mode). After that, live
|
|
1033
|
+
// readOnly / editMode changes flow through the set-read-only and
|
|
1034
|
+
// set-text-editing-enabled postMessages (see the useEffects below) so
|
|
1035
|
+
// switching the active surface (board ↔ screen) or toggling Edit ⇄ Preview
|
|
1036
|
+
// never rebuilds srcdoc / reloads every screen iframe.
|
|
896
1037
|
const srcdoc = useMemo(() => {
|
|
897
1038
|
if (externalPreviewUrl) return undefined;
|
|
898
1039
|
const editorChromeBridge = interactMode
|
|
@@ -917,12 +1058,20 @@ export function DesignCanvas({
|
|
|
917
1058
|
"__EMBEDDED_WHEEL_FORWARDING_ENABLED__",
|
|
918
1059
|
isEmbeddedFrame ? "true" : "false",
|
|
919
1060
|
);
|
|
1061
|
+
// ALWAYS injected (like the other always-on bridges above) so
|
|
1062
|
+
// MultiScreenCanvas's cross-screen drag hit-testing
|
|
1063
|
+
// (agent-native:hit-test / agent-native:hit-test-result) resolves an
|
|
1064
|
+
// anchor+placement against this screen's live DOM too, not only the
|
|
1065
|
+
// static-fallback board thumbnails that call appendHitTestResponder.
|
|
1066
|
+
// Without this, a drop onto a live/active screen has no responder and
|
|
1067
|
+
// always falls through to the 50ms request timeout.
|
|
920
1068
|
const bridgeToInject =
|
|
921
1069
|
MOTION_PREVIEW_BRIDGE_SCRIPT +
|
|
922
1070
|
SHADER_FILL_PREVIEW_BRIDGE_SCRIPT +
|
|
923
1071
|
TWEAK_BRIDGE_SCRIPT +
|
|
924
1072
|
ZOOM_BRIDGE_SCRIPT +
|
|
925
1073
|
NAV_BRIDGE_SCRIPT +
|
|
1074
|
+
LIGHTWEIGHT_HIT_TEST_BRIDGE_SCRIPT +
|
|
926
1075
|
embeddedWheelBridge +
|
|
927
1076
|
editorChromeBridge;
|
|
928
1077
|
const frameContent = getEmbeddedFrameDocumentContent({
|
|
@@ -954,10 +1103,10 @@ export function DesignCanvas({
|
|
|
954
1103
|
// baked chrome scale. Live zoom updates flow through the set-editor-chrome-scale
|
|
955
1104
|
// postMessage above. Including them here rebuilds srcdoc on every zoom commit,
|
|
956
1105
|
// which reloads the iframe and flashes the screen content white.
|
|
957
|
-
// readOnly
|
|
1106
|
+
// readOnly and editMode are intentionally NOT deps: live changes flow
|
|
1107
|
+
// through set-read-only / set-text-editing-enabled.
|
|
958
1108
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
959
1109
|
}, [
|
|
960
|
-
editMode,
|
|
961
1110
|
boardSurface,
|
|
962
1111
|
externalPreviewUrl,
|
|
963
1112
|
interactMode,
|
|
@@ -996,6 +1145,11 @@ export function DesignCanvas({
|
|
|
996
1145
|
return;
|
|
997
1146
|
}
|
|
998
1147
|
if (!e.data || !e.data.type) return;
|
|
1148
|
+
if (e.data.type === "agent-native:editor-chrome-ready") {
|
|
1149
|
+
bridgeReadyRef.current = true;
|
|
1150
|
+
flushPendingOneShotMessages();
|
|
1151
|
+
return;
|
|
1152
|
+
}
|
|
999
1153
|
if (e.data.type === "clear-selection") {
|
|
1000
1154
|
onClearSelection?.();
|
|
1001
1155
|
return;
|
|
@@ -1256,17 +1410,30 @@ export function DesignCanvas({
|
|
|
1256
1410
|
const iframe = iframeRef.current;
|
|
1257
1411
|
const scroll = scrollContainerRef.current;
|
|
1258
1412
|
if (!iframe || !scroll) return;
|
|
1413
|
+
// Guard against non-finite values (NaN/undefined/string) before they
|
|
1414
|
+
// reach Math.max/Math.min/Math.exp — an unguarded NaN here would
|
|
1415
|
+
// propagate through nextZoom and silently break zoom (mirrors the
|
|
1416
|
+
// Number.isFinite-style validation the embedded-canvas-wheel sibling
|
|
1417
|
+
// handler above applies to its own wheel deltas/coordinates).
|
|
1418
|
+
const rawDeltaY = Number(e.data.deltaY);
|
|
1419
|
+
if (!Number.isFinite(rawDeltaY)) return;
|
|
1259
1420
|
// Mirror usePinchZoom's algorithm here. We can't reliably re-dispatch
|
|
1260
1421
|
// a synthetic WheelEvent to trigger the hook's listener — untrusted
|
|
1261
1422
|
// events are inconsistent across browsers — so just compute the
|
|
1262
1423
|
// next zoom directly using the same exponential factor + cursor-anchor
|
|
1263
1424
|
// math. Clamp range matches the usePinchZoom call above (10–500).
|
|
1264
1425
|
const currentZoom = zoomRef.current;
|
|
1265
|
-
const clampedDelta = Math.max(-50, Math.min(50,
|
|
1426
|
+
const clampedDelta = Math.max(-50, Math.min(50, rawDeltaY));
|
|
1266
1427
|
const factor = Math.exp(-clampedDelta * 0.01);
|
|
1267
1428
|
const nextZoom = Math.max(10, Math.min(500, currentZoom * factor));
|
|
1268
|
-
if (nextZoom === currentZoom) return;
|
|
1429
|
+
if (!Number.isFinite(nextZoom) || nextZoom === currentZoom) return;
|
|
1269
1430
|
if (deviceFrame === "none") {
|
|
1431
|
+
const rawClientX = Number(e.data.clientX);
|
|
1432
|
+
const rawClientY = Number(e.data.clientY);
|
|
1433
|
+
if (!Number.isFinite(rawClientX) || !Number.isFinite(rawClientY)) {
|
|
1434
|
+
onZoomChange(nextZoom);
|
|
1435
|
+
return;
|
|
1436
|
+
}
|
|
1270
1437
|
// The iframe lives inside a `transform: scale(zoom/100)` wrapper, so
|
|
1271
1438
|
// its visual scale relative to viewport is currentZoom / 100. Convert
|
|
1272
1439
|
// the iframe-document point under the cursor → viewport point →
|
|
@@ -1274,8 +1441,8 @@ export function DesignCanvas({
|
|
|
1274
1441
|
const iframeRect = iframe.getBoundingClientRect();
|
|
1275
1442
|
const scrollRect = scroll.getBoundingClientRect();
|
|
1276
1443
|
const scale = currentZoom / 100;
|
|
1277
|
-
const viewportX = iframeRect.left +
|
|
1278
|
-
const viewportY = iframeRect.top +
|
|
1444
|
+
const viewportX = iframeRect.left + rawClientX * scale;
|
|
1445
|
+
const viewportY = iframeRect.top + rawClientY * scale;
|
|
1279
1446
|
const cx = viewportX - scrollRect.left + scroll.scrollLeft;
|
|
1280
1447
|
const cy = viewportY - scrollRect.top + scroll.scrollTop;
|
|
1281
1448
|
const ratio = nextZoom / currentZoom;
|
|
@@ -1315,6 +1482,7 @@ export function DesignCanvas({
|
|
|
1315
1482
|
isEmbeddedFrame,
|
|
1316
1483
|
sourceType,
|
|
1317
1484
|
fusionUrl,
|
|
1485
|
+
flushPendingOneShotMessages,
|
|
1318
1486
|
]);
|
|
1319
1487
|
|
|
1320
1488
|
const replayIframeEditorState = useCallback(() => {
|
|
@@ -1362,7 +1530,11 @@ export function DesignCanvas({
|
|
|
1362
1530
|
// Re-send motion tracks so the preview bridge is ready after a reload.
|
|
1363
1531
|
if (motionTracks && motionTracks.length > 0) {
|
|
1364
1532
|
iframe.contentWindow?.postMessage(
|
|
1365
|
-
{
|
|
1533
|
+
{
|
|
1534
|
+
type: "motion-load-tracks",
|
|
1535
|
+
tracks: motionTracks,
|
|
1536
|
+
defaultEase: motionDefaultEase,
|
|
1537
|
+
},
|
|
1366
1538
|
"*",
|
|
1367
1539
|
);
|
|
1368
1540
|
} else {
|
|
@@ -1392,6 +1564,7 @@ export function DesignCanvas({
|
|
|
1392
1564
|
hiddenSelectors,
|
|
1393
1565
|
lockedSelectors,
|
|
1394
1566
|
motionTracks,
|
|
1567
|
+
motionDefaultEase,
|
|
1395
1568
|
scaleMode,
|
|
1396
1569
|
selectedSelector,
|
|
1397
1570
|
selectedSelectorCandidates,
|
|
@@ -1411,6 +1584,27 @@ export function DesignCanvas({
|
|
|
1411
1584
|
return () => iframe.removeEventListener("load", replayIframeEditorState);
|
|
1412
1585
|
}, [replayIframeEditorState]);
|
|
1413
1586
|
|
|
1587
|
+
// Fallback for documents that never inject the editor-chrome bridge (e.g.
|
|
1588
|
+
// interactMode, or an external-preview iframe where srcdoc is undefined):
|
|
1589
|
+
// those never post agent-native:editor-chrome-ready, so nothing would ever
|
|
1590
|
+
// flush a queued one-shot command. Treat the iframe's `load` event as an
|
|
1591
|
+
// implicit ready in that case — the queued commands (begin-text-edit,
|
|
1592
|
+
// style-change, delete-element, replace-document-content) target the
|
|
1593
|
+
// editor-chrome bridge's own message handlers, so with no chrome bridge
|
|
1594
|
+
// present there is nothing that would have handled them regardless; this
|
|
1595
|
+
// just prevents the queue from growing unbounded across repeated reloads.
|
|
1596
|
+
useEffect(() => {
|
|
1597
|
+
const iframe = iframeRef.current;
|
|
1598
|
+
if (!iframe) return;
|
|
1599
|
+
function handleLoadReadyFallback() {
|
|
1600
|
+
if (bridgeReadyRef.current) return;
|
|
1601
|
+
bridgeReadyRef.current = true;
|
|
1602
|
+
flushPendingOneShotMessages();
|
|
1603
|
+
}
|
|
1604
|
+
iframe.addEventListener("load", handleLoadReadyFallback);
|
|
1605
|
+
return () => iframe.removeEventListener("load", handleLoadReadyFallback);
|
|
1606
|
+
}, [flushPendingOneShotMessages]);
|
|
1607
|
+
|
|
1414
1608
|
useEffect(() => {
|
|
1415
1609
|
if (clearSelectionRequest === undefined) return;
|
|
1416
1610
|
iframeRef.current?.contentWindow?.postMessage(
|
|
@@ -1429,11 +1623,15 @@ export function DesignCanvas({
|
|
|
1429
1623
|
win.postMessage({ type: "motion-preview-clear" }, "*");
|
|
1430
1624
|
} else {
|
|
1431
1625
|
win.postMessage(
|
|
1432
|
-
{
|
|
1626
|
+
{
|
|
1627
|
+
type: "motion-load-tracks",
|
|
1628
|
+
tracks: motionTracks,
|
|
1629
|
+
defaultEase: motionDefaultEase,
|
|
1630
|
+
},
|
|
1433
1631
|
"*",
|
|
1434
1632
|
);
|
|
1435
1633
|
}
|
|
1436
|
-
}, [motionTracks]);
|
|
1634
|
+
}, [motionTracks, motionDefaultEase]);
|
|
1437
1635
|
|
|
1438
1636
|
// Sync shader-fill preview to the iframe whenever the prop changes.
|
|
1439
1637
|
// When cleared (null / undefined) send a clear message so the bridge
|
|
@@ -1461,16 +1659,16 @@ export function DesignCanvas({
|
|
|
1461
1659
|
// overview zoom settles. This is intentionally separate from the srcdoc build so
|
|
1462
1660
|
// a scale change never rebuilds srcdoc / reloads the iframe (which flashes the
|
|
1463
1661
|
// content white). The baked __EDITOR_CHROME_SCALE__ values cover first paint.
|
|
1662
|
+
// Routed through the one-shot queue too: a zoom settle that lands while the
|
|
1663
|
+
// iframe is mid-reload would otherwise be silently dropped, leaving the
|
|
1664
|
+
// chrome at a stale scale until the next zoom change.
|
|
1464
1665
|
useEffect(() => {
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
"*",
|
|
1472
|
-
);
|
|
1473
|
-
}, [editorChromeScaleX, editorChromeScaleY]);
|
|
1666
|
+
postOneShotBridgeMessage({
|
|
1667
|
+
type: "set-editor-chrome-scale",
|
|
1668
|
+
scaleX: editorChromeScaleX,
|
|
1669
|
+
scaleY: editorChromeScaleY,
|
|
1670
|
+
});
|
|
1671
|
+
}, [editorChromeScaleX, editorChromeScaleY, postOneShotBridgeMessage]);
|
|
1474
1672
|
|
|
1475
1673
|
// Sync readOnly to the bridge IN-PLACE via postMessage so switching the active
|
|
1476
1674
|
// surface (board ↔ screen) does not rebuild srcdoc / reload the iframe.
|
|
@@ -1495,6 +1693,34 @@ export function DesignCanvas({
|
|
|
1495
1693
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
1496
1694
|
}, [readOnly]);
|
|
1497
1695
|
|
|
1696
|
+
// Sync editMode to the bridge IN-PLACE via postMessage so toggling Edit ⇄
|
|
1697
|
+
// Preview does not rebuild srcdoc / reload every screen iframe (which was
|
|
1698
|
+
// PF21: __TEXT_EDITING_ENABLED__ used to be baked into srcdoc, so flipping
|
|
1699
|
+
// edit/preview mode reloaded every iframe — white flash + lost in-iframe
|
|
1700
|
+
// Alpine state). The initial baked __TEXT_EDITING_ENABLED__ placeholder
|
|
1701
|
+
// covers first paint; subsequent changes arrive here. Also re-send on
|
|
1702
|
+
// iframe load so the bridge is in sync after any content-key-driven reload.
|
|
1703
|
+
const editModeRef = useRef(editMode);
|
|
1704
|
+
editModeRef.current = editMode;
|
|
1705
|
+
useEffect(() => {
|
|
1706
|
+
const iframe = iframeRef.current;
|
|
1707
|
+
if (!iframe) return;
|
|
1708
|
+
function sendTextEditingEnabled() {
|
|
1709
|
+
iframe!.contentWindow?.postMessage(
|
|
1710
|
+
{
|
|
1711
|
+
type: "set-text-editing-enabled",
|
|
1712
|
+
enabled: editModeRef.current,
|
|
1713
|
+
},
|
|
1714
|
+
"*",
|
|
1715
|
+
);
|
|
1716
|
+
}
|
|
1717
|
+
sendTextEditingEnabled();
|
|
1718
|
+
iframe.addEventListener("load", sendTextEditingEnabled);
|
|
1719
|
+
return () => iframe.removeEventListener("load", sendTextEditingEnabled);
|
|
1720
|
+
// Only re-run when editMode changes; iframe identity is stable.
|
|
1721
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
1722
|
+
}, [editMode]);
|
|
1723
|
+
|
|
1498
1724
|
/**
|
|
1499
1725
|
* Trigger immediate text-editing mode for a specific node inside the iframe,
|
|
1500
1726
|
* identified by its data-agent-native-node-id value. Call this after
|
|
@@ -1504,14 +1730,18 @@ export function DesignCanvas({
|
|
|
1504
1730
|
* Posts { type: 'begin-text-edit', nodeId } to the iframe bridge.
|
|
1505
1731
|
* The bridge enters the same contenteditable text-editing path used on dblclick.
|
|
1506
1732
|
*/
|
|
1507
|
-
const beginTextEdit = useCallback(
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
{
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1733
|
+
const beginTextEdit = useCallback(
|
|
1734
|
+
(nodeId: string) => {
|
|
1735
|
+
const iframe = iframeRef.current;
|
|
1736
|
+
if (!iframe?.contentWindow || !nodeId) return;
|
|
1737
|
+
postOneShotBridgeMessage({
|
|
1738
|
+
type: "begin-text-edit",
|
|
1739
|
+
nodeId,
|
|
1740
|
+
force: true,
|
|
1741
|
+
});
|
|
1742
|
+
},
|
|
1743
|
+
[postOneShotBridgeMessage],
|
|
1744
|
+
);
|
|
1515
1745
|
|
|
1516
1746
|
const sendStyleChange = useCallback(
|
|
1517
1747
|
(
|
|
@@ -1522,19 +1752,16 @@ export function DesignCanvas({
|
|
|
1522
1752
|
) => {
|
|
1523
1753
|
const iframe = iframeRef.current;
|
|
1524
1754
|
if (!iframe?.contentWindow) return;
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
},
|
|
1534
|
-
"*",
|
|
1535
|
-
);
|
|
1755
|
+
postOneShotBridgeMessage({
|
|
1756
|
+
type: "style-change",
|
|
1757
|
+
selector,
|
|
1758
|
+
property,
|
|
1759
|
+
value,
|
|
1760
|
+
selectorCandidates: options?.selectorCandidates ?? [],
|
|
1761
|
+
nodeId: options?.nodeId ?? "",
|
|
1762
|
+
});
|
|
1536
1763
|
},
|
|
1537
|
-
[],
|
|
1764
|
+
[postOneShotBridgeMessage],
|
|
1538
1765
|
);
|
|
1539
1766
|
|
|
1540
1767
|
/**
|
|
@@ -1601,19 +1828,15 @@ export function DesignCanvas({
|
|
|
1601
1828
|
) => {
|
|
1602
1829
|
const iframe = iframeRef.current;
|
|
1603
1830
|
if (!iframe?.contentWindow) return false;
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
},
|
|
1612
|
-
"*",
|
|
1613
|
-
);
|
|
1614
|
-
return true;
|
|
1831
|
+
return postOneShotBridgeMessage({
|
|
1832
|
+
type: "replace-document-content",
|
|
1833
|
+
content: nextContent,
|
|
1834
|
+
selectedSelector: selector ?? "",
|
|
1835
|
+
selectorCandidates: candidates ?? [],
|
|
1836
|
+
forceFullDocument: options?.forceFullDocument === true,
|
|
1837
|
+
});
|
|
1615
1838
|
},
|
|
1616
|
-
[],
|
|
1839
|
+
[postOneShotBridgeMessage],
|
|
1617
1840
|
);
|
|
1618
1841
|
|
|
1619
1842
|
const replaceRuntimeContentInPlace = useCallback(
|
|
@@ -1680,17 +1903,13 @@ export function DesignCanvas({
|
|
|
1680
1903
|
(selector?: string | null, candidates?: string[]) => {
|
|
1681
1904
|
const iframe = iframeRef.current;
|
|
1682
1905
|
if (!iframe?.contentWindow) return false;
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
},
|
|
1689
|
-
"*",
|
|
1690
|
-
);
|
|
1691
|
-
return true;
|
|
1906
|
+
return postOneShotBridgeMessage({
|
|
1907
|
+
type: "delete-element",
|
|
1908
|
+
selector: selector ?? "",
|
|
1909
|
+
selectorCandidates: candidates ?? [],
|
|
1910
|
+
});
|
|
1692
1911
|
},
|
|
1693
|
-
[],
|
|
1912
|
+
[postOneShotBridgeMessage],
|
|
1694
1913
|
);
|
|
1695
1914
|
|
|
1696
1915
|
// Expose iframe runtime mutations for the editor orchestrator.
|
|
@@ -1826,7 +2045,29 @@ export function DesignCanvas({
|
|
|
1826
2045
|
sandbox={
|
|
1827
2046
|
externalPreviewUrl
|
|
1828
2047
|
? "allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox allow-same-origin"
|
|
1829
|
-
:
|
|
2048
|
+
: // NOTE(security): allow-same-origin is still present on this
|
|
2049
|
+
// branch (the inline srcdoc iframe, where agent/user-generated
|
|
2050
|
+
// design HTML executes) even though allow-scripts +
|
|
2051
|
+
// allow-same-origin together defeat the sandbox in principle.
|
|
2052
|
+
// This is a deliberate, currently-blocked tradeoff, not an
|
|
2053
|
+
// oversight — see the long comment above DesignCanvasProps /
|
|
2054
|
+
// sourceType for the security model, and the PNG/SVG export
|
|
2055
|
+
// handlers in DesignEditor.tsx (handleDownloadPng /
|
|
2056
|
+
// handleDownloadSvg). Those handlers read this same iframe's
|
|
2057
|
+
// `contentDocument` directly and hand the LIVE document element
|
|
2058
|
+
// to html2canvas, and read live CSSOM (getComputedStyle,
|
|
2059
|
+
// doc.styleSheets) for SVG serialization. That cannot be
|
|
2060
|
+
// expressed over the postMessage bridge without moving
|
|
2061
|
+
// html2canvas execution and CSSOM-dependent serialization logic
|
|
2062
|
+
// INTO the sandboxed iframe itself — a separate, larger rewrite,
|
|
2063
|
+
// not a bridge-handler addition. All other former
|
|
2064
|
+
// `contentDocument`/`contentWindow.document` reads on this
|
|
2065
|
+
// iframe (e.g. text-edit-status) now go through bridge
|
|
2066
|
+
// request/response postMessage handlers in
|
|
2067
|
+
// editor-chrome.bridge.ts and no longer need allow-same-origin.
|
|
2068
|
+
// Do not remove this flag until PNG/SVG export is rebuilt to run
|
|
2069
|
+
// inside the iframe.
|
|
2070
|
+
"allow-scripts allow-popups allow-popups-to-escape-sandbox allow-same-origin"
|
|
1830
2071
|
}
|
|
1831
2072
|
data-design-preview-iframe
|
|
1832
2073
|
data-screen-iframe-id={
|
|
@@ -1845,6 +2086,18 @@ export function DesignCanvas({
|
|
|
1845
2086
|
}}
|
|
1846
2087
|
title={t("designEditor.designPreview")}
|
|
1847
2088
|
/>
|
|
2089
|
+
{/* Single-screen click-to-place creation overlay — sits over the
|
|
2090
|
+
iframe, NOT inside it, mirroring the SharedDrawOverlay pattern
|
|
2091
|
+
below. Only mounts while a creation tool is active so it never
|
|
2092
|
+
changes existing behavior otherwise (T14: single-screen mode
|
|
2093
|
+
previously had no creation capability at all). */}
|
|
2094
|
+
{activeCreationTool ? (
|
|
2095
|
+
<SingleScreenCreationOverlay
|
|
2096
|
+
tool={activeCreationTool}
|
|
2097
|
+
iframeRef={iframeRef}
|
|
2098
|
+
onCreatePrimitive={onCreatePrimitive}
|
|
2099
|
+
/>
|
|
2100
|
+
) : null}
|
|
1848
2101
|
{waitingForEditableExternalSnapshot ? (
|
|
1849
2102
|
<div className="pointer-events-none absolute inset-0 z-10 flex items-center justify-center bg-background/85 px-4 text-center text-sm text-muted-foreground">
|
|
1850
2103
|
<div className="max-w-[28rem] rounded-md border bg-card px-4 py-3 shadow-sm">
|
|
@@ -2020,3 +2273,284 @@ export function DesignCanvas({
|
|
|
2020
2273
|
</div>
|
|
2021
2274
|
);
|
|
2022
2275
|
}
|
|
2276
|
+
|
|
2277
|
+
/** Minimum pointer movement (in viewport/client px) before a pointerdown→up
|
|
2278
|
+
* gesture counts as a drag instead of a click. Matches the small-threshold
|
|
2279
|
+
* click-vs-drag convention used elsewhere in the editor (e.g. marquee-vs-
|
|
2280
|
+
* click hit-testing) rather than MultiScreenCanvas's own canvas-space
|
|
2281
|
+
* threshold, since this overlay only ever sees viewport-space pointer
|
|
2282
|
+
* events. */
|
|
2283
|
+
const CREATION_CLICK_MOVE_THRESHOLD_PX = 4;
|
|
2284
|
+
|
|
2285
|
+
/** Default click-to-place sizes, in screen-content px, for tools that need a
|
|
2286
|
+
* sensible size when the user clicks instead of drags. Mirrors
|
|
2287
|
+
* MultiScreenCanvas's own DRAFT_*_WIDTH/HEIGHT defaults closely enough for
|
|
2288
|
+
* single-screen placement (kept local — those constants aren't exported). */
|
|
2289
|
+
const CREATION_DEFAULT_SIZE: Record<
|
|
2290
|
+
Exclude<CreationTool, "line" | "arrow" | "pen">,
|
|
2291
|
+
{ width: number; height: number }
|
|
2292
|
+
> = {
|
|
2293
|
+
rectangle: { width: 160, height: 100 },
|
|
2294
|
+
ellipse: { width: 120, height: 120 },
|
|
2295
|
+
text: { width: 160, height: 32 },
|
|
2296
|
+
};
|
|
2297
|
+
|
|
2298
|
+
/** Default line/arrow length (screen-content px) for a click (no drag). */
|
|
2299
|
+
const CREATION_DEFAULT_LINE_LENGTH = 120;
|
|
2300
|
+
|
|
2301
|
+
interface CreationDragState {
|
|
2302
|
+
tool: CreationTool;
|
|
2303
|
+
/** Screen-content coordinates of the initial pointerdown. */
|
|
2304
|
+
startContent: { x: number; y: number };
|
|
2305
|
+
/** Screen-content coordinates of the latest pointer position. */
|
|
2306
|
+
currentContent: { x: number; y: number };
|
|
2307
|
+
/** Viewport (client) coordinates of the initial pointerdown — kept
|
|
2308
|
+
* alongside startContent so the click-vs-drag movement threshold can be
|
|
2309
|
+
* measured in client space (a constant visual distance regardless of
|
|
2310
|
+
* zoom) without re-deriving it from content-space coordinates. */
|
|
2311
|
+
startClient: { x: number; y: number };
|
|
2312
|
+
pointerId: number;
|
|
2313
|
+
moved: boolean;
|
|
2314
|
+
}
|
|
2315
|
+
|
|
2316
|
+
interface SingleScreenCreationOverlayProps {
|
|
2317
|
+
tool: CreationTool;
|
|
2318
|
+
iframeRef: React.RefObject<HTMLIFrameElement | null>;
|
|
2319
|
+
onCreatePrimitive?: (spec: CreatePrimitiveSpec) => void;
|
|
2320
|
+
}
|
|
2321
|
+
|
|
2322
|
+
/**
|
|
2323
|
+
* Figma-style click-to-place creation overlay for single-screen mode.
|
|
2324
|
+
*
|
|
2325
|
+
* Mounts a transparent, `pointer-events: auto` surface above the iframe
|
|
2326
|
+
* (matching the `SharedDrawOverlay` mount pattern) that intercepts pointer
|
|
2327
|
+
* gestures instead of letting them reach the iframe's own content/editor-
|
|
2328
|
+
* chrome bridge. A pointerdown→move→up past `CREATION_CLICK_MOVE_THRESHOLD_PX`
|
|
2329
|
+
* is treated as a drag (draws a rect/line via `getDraftGeometryFromPoints`,
|
|
2330
|
+
* the same helper MultiScreenCanvas uses for overview drafts); a
|
|
2331
|
+
* pointerdown→up with negligible movement is treated as a click (places a
|
|
2332
|
+
* default-sized primitive, or for pen, starts a path at that point).
|
|
2333
|
+
*
|
|
2334
|
+
* Deferred: multi-click pen path authoring. In single-screen mode a single
|
|
2335
|
+
* click emits `points: [point], fromClick: true` so the parent can start a
|
|
2336
|
+
* pen path (matching MultiScreenCanvas's click-to-start behavior), but there
|
|
2337
|
+
* is no in-overlay support yet for adding further anchor points before
|
|
2338
|
+
* committing — that's a follow-up once the parent's pen-path commit flow is
|
|
2339
|
+
* wired for single-screen. This intentionally never force-switches to
|
|
2340
|
+
* overview to get full pen authoring.
|
|
2341
|
+
*/
|
|
2342
|
+
function SingleScreenCreationOverlay({
|
|
2343
|
+
tool,
|
|
2344
|
+
iframeRef,
|
|
2345
|
+
onCreatePrimitive,
|
|
2346
|
+
}: SingleScreenCreationOverlayProps) {
|
|
2347
|
+
const [drag, setDrag] = useState<CreationDragState | null>(null);
|
|
2348
|
+
const dragRef = useRef<CreationDragState | null>(null);
|
|
2349
|
+
|
|
2350
|
+
const toContentPoint = useCallback(
|
|
2351
|
+
(clientX: number, clientY: number) => {
|
|
2352
|
+
const iframe = iframeRef.current;
|
|
2353
|
+
const rect = iframe?.getBoundingClientRect();
|
|
2354
|
+
if (!iframe || !rect) return { x: clientX, y: clientY };
|
|
2355
|
+
return getScreenContentPointFromClient(clientX, clientY, rect, {
|
|
2356
|
+
width: iframe.clientWidth,
|
|
2357
|
+
height: iframe.clientHeight,
|
|
2358
|
+
});
|
|
2359
|
+
},
|
|
2360
|
+
[iframeRef],
|
|
2361
|
+
);
|
|
2362
|
+
|
|
2363
|
+
const emit = useCallback(
|
|
2364
|
+
(state: CreationDragState) => {
|
|
2365
|
+
if (!onCreatePrimitive) return;
|
|
2366
|
+
const { tool: activeTool, startContent, currentContent, moved } = state;
|
|
2367
|
+
|
|
2368
|
+
if (activeTool === "line" || activeTool === "arrow") {
|
|
2369
|
+
const end = moved
|
|
2370
|
+
? currentContent
|
|
2371
|
+
: {
|
|
2372
|
+
x: startContent.x + CREATION_DEFAULT_LINE_LENGTH,
|
|
2373
|
+
y: startContent.y,
|
|
2374
|
+
};
|
|
2375
|
+
onCreatePrimitive({
|
|
2376
|
+
tool: activeTool,
|
|
2377
|
+
points: [startContent, end],
|
|
2378
|
+
fromClick: !moved,
|
|
2379
|
+
});
|
|
2380
|
+
return;
|
|
2381
|
+
}
|
|
2382
|
+
|
|
2383
|
+
if (activeTool === "pen") {
|
|
2384
|
+
// Deferred: multi-click pen authoring (see component doc comment).
|
|
2385
|
+
// A click starts a path; a drag is treated the same as a click for
|
|
2386
|
+
// now — only the start point is emitted.
|
|
2387
|
+
onCreatePrimitive({
|
|
2388
|
+
tool: "pen",
|
|
2389
|
+
points: [startContent],
|
|
2390
|
+
fromClick: true,
|
|
2391
|
+
});
|
|
2392
|
+
return;
|
|
2393
|
+
}
|
|
2394
|
+
|
|
2395
|
+
if (!moved) {
|
|
2396
|
+
const size = CREATION_DEFAULT_SIZE[activeTool];
|
|
2397
|
+
onCreatePrimitive({
|
|
2398
|
+
tool: activeTool,
|
|
2399
|
+
rect: {
|
|
2400
|
+
x: startContent.x,
|
|
2401
|
+
y: startContent.y,
|
|
2402
|
+
width: size.width,
|
|
2403
|
+
height: size.height,
|
|
2404
|
+
},
|
|
2405
|
+
fromClick: true,
|
|
2406
|
+
});
|
|
2407
|
+
return;
|
|
2408
|
+
}
|
|
2409
|
+
|
|
2410
|
+
const geometry = getDraftGeometryFromPoints(
|
|
2411
|
+
startContent,
|
|
2412
|
+
currentContent,
|
|
2413
|
+
{
|
|
2414
|
+
minWidth: activeTool === "text" ? 24 : 8,
|
|
2415
|
+
minHeight: activeTool === "text" ? 18 : 8,
|
|
2416
|
+
defaultWidth: CREATION_DEFAULT_SIZE[activeTool].width,
|
|
2417
|
+
defaultHeight: CREATION_DEFAULT_SIZE[activeTool].height,
|
|
2418
|
+
},
|
|
2419
|
+
);
|
|
2420
|
+
onCreatePrimitive({
|
|
2421
|
+
tool: activeTool,
|
|
2422
|
+
rect: geometry,
|
|
2423
|
+
fromClick: false,
|
|
2424
|
+
});
|
|
2425
|
+
},
|
|
2426
|
+
[onCreatePrimitive],
|
|
2427
|
+
);
|
|
2428
|
+
|
|
2429
|
+
const handlePointerDown = useCallback(
|
|
2430
|
+
(e: React.PointerEvent<HTMLDivElement>) => {
|
|
2431
|
+
if (e.button !== 0) return;
|
|
2432
|
+
const point = toContentPoint(e.clientX, e.clientY);
|
|
2433
|
+
const next: CreationDragState = {
|
|
2434
|
+
tool,
|
|
2435
|
+
startContent: point,
|
|
2436
|
+
currentContent: point,
|
|
2437
|
+
startClient: { x: e.clientX, y: e.clientY },
|
|
2438
|
+
pointerId: e.pointerId,
|
|
2439
|
+
moved: false,
|
|
2440
|
+
};
|
|
2441
|
+
dragRef.current = next;
|
|
2442
|
+
setDrag(next);
|
|
2443
|
+
(e.target as HTMLElement).setPointerCapture(e.pointerId);
|
|
2444
|
+
},
|
|
2445
|
+
[tool, toContentPoint],
|
|
2446
|
+
);
|
|
2447
|
+
|
|
2448
|
+
const handlePointerMove = useCallback(
|
|
2449
|
+
(e: React.PointerEvent<HTMLDivElement>) => {
|
|
2450
|
+
const current = dragRef.current;
|
|
2451
|
+
if (!current || current.pointerId !== e.pointerId) return;
|
|
2452
|
+
// Movement threshold measured in client (viewport) space — a constant
|
|
2453
|
+
// visual distance regardless of zoom — rather than screen-content
|
|
2454
|
+
// space, which would need dividing by scale to mean the same thing at
|
|
2455
|
+
// every zoom level.
|
|
2456
|
+
const movedPastThreshold =
|
|
2457
|
+
Math.hypot(
|
|
2458
|
+
e.clientX - current.startClient.x,
|
|
2459
|
+
e.clientY - current.startClient.y,
|
|
2460
|
+
) > CREATION_CLICK_MOVE_THRESHOLD_PX;
|
|
2461
|
+
const point = toContentPoint(e.clientX, e.clientY);
|
|
2462
|
+
const next: CreationDragState = {
|
|
2463
|
+
...current,
|
|
2464
|
+
currentContent: point,
|
|
2465
|
+
moved: current.moved || movedPastThreshold,
|
|
2466
|
+
};
|
|
2467
|
+
dragRef.current = next;
|
|
2468
|
+
setDrag(next);
|
|
2469
|
+
},
|
|
2470
|
+
[toContentPoint],
|
|
2471
|
+
);
|
|
2472
|
+
|
|
2473
|
+
const handlePointerUp = useCallback(
|
|
2474
|
+
(e: React.PointerEvent<HTMLDivElement>) => {
|
|
2475
|
+
const current = dragRef.current;
|
|
2476
|
+
if (!current || current.pointerId !== e.pointerId) return;
|
|
2477
|
+
dragRef.current = null;
|
|
2478
|
+
setDrag(null);
|
|
2479
|
+
emit(current);
|
|
2480
|
+
},
|
|
2481
|
+
[emit],
|
|
2482
|
+
);
|
|
2483
|
+
|
|
2484
|
+
const handlePointerCancel = useCallback(
|
|
2485
|
+
(e: React.PointerEvent<HTMLDivElement>) => {
|
|
2486
|
+
const current = dragRef.current;
|
|
2487
|
+
if (!current || current.pointerId !== e.pointerId) return;
|
|
2488
|
+
dragRef.current = null;
|
|
2489
|
+
setDrag(null);
|
|
2490
|
+
},
|
|
2491
|
+
[],
|
|
2492
|
+
);
|
|
2493
|
+
|
|
2494
|
+
const cursorClass = tool === "text" ? "cursor-text" : "cursor-crosshair";
|
|
2495
|
+
const isLineTool = tool === "line" || tool === "arrow";
|
|
2496
|
+
|
|
2497
|
+
// Live drag preview, converted back from screen-content space to the
|
|
2498
|
+
// overlay's own (unscaled, layout-space) coordinates. The overlay div is
|
|
2499
|
+
// sized to the iframe's layout box (via inset-0 on a wrapper that already
|
|
2500
|
+
// matches iframe.clientWidth/Height 1:1 before the outer zoom transform),
|
|
2501
|
+
// so screen-content coordinates ARE this overlay's local coordinates —
|
|
2502
|
+
// no extra scale conversion is needed for the preview's own CSS position.
|
|
2503
|
+
const previewRect =
|
|
2504
|
+
drag && drag.moved && !isLineTool && tool !== "pen"
|
|
2505
|
+
? getDraftGeometryFromPoints(drag.startContent, drag.currentContent, {
|
|
2506
|
+
minWidth: tool === "text" ? 24 : 8,
|
|
2507
|
+
minHeight: tool === "text" ? 18 : 8,
|
|
2508
|
+
})
|
|
2509
|
+
: null;
|
|
2510
|
+
const previewLine =
|
|
2511
|
+
drag && drag.moved && isLineTool
|
|
2512
|
+
? { start: drag.startContent, end: drag.currentContent }
|
|
2513
|
+
: null;
|
|
2514
|
+
|
|
2515
|
+
return (
|
|
2516
|
+
<div
|
|
2517
|
+
data-design-canvas-creation-overlay
|
|
2518
|
+
data-creation-tool={tool}
|
|
2519
|
+
className={cn("absolute inset-0 z-20 pointer-events-auto", cursorClass)}
|
|
2520
|
+
onPointerDown={handlePointerDown}
|
|
2521
|
+
onPointerMove={handlePointerMove}
|
|
2522
|
+
onPointerUp={handlePointerUp}
|
|
2523
|
+
onPointerCancel={handlePointerCancel}
|
|
2524
|
+
>
|
|
2525
|
+
{previewRect ? (
|
|
2526
|
+
<div
|
|
2527
|
+
data-creation-preview-rect
|
|
2528
|
+
className="pointer-events-none absolute rounded-[2px] border-[1.5px] border-[var(--design-editor-accent-color)] bg-[var(--design-editor-accent-color)]/10"
|
|
2529
|
+
style={{
|
|
2530
|
+
left: previewRect.x,
|
|
2531
|
+
top: previewRect.y,
|
|
2532
|
+
width: Math.max(1, previewRect.width),
|
|
2533
|
+
height: Math.max(1, previewRect.height),
|
|
2534
|
+
borderRadius: tool === "ellipse" ? "9999px" : undefined,
|
|
2535
|
+
}}
|
|
2536
|
+
/>
|
|
2537
|
+
) : null}
|
|
2538
|
+
{previewLine ? (
|
|
2539
|
+
<svg
|
|
2540
|
+
data-creation-preview-line
|
|
2541
|
+
className="pointer-events-none absolute inset-0 h-full w-full overflow-visible"
|
|
2542
|
+
>
|
|
2543
|
+
<line
|
|
2544
|
+
x1={previewLine.start.x}
|
|
2545
|
+
y1={previewLine.start.y}
|
|
2546
|
+
x2={previewLine.end.x}
|
|
2547
|
+
y2={previewLine.end.y}
|
|
2548
|
+
stroke="var(--design-editor-accent-color)"
|
|
2549
|
+
strokeWidth={2}
|
|
2550
|
+
strokeDasharray="4 3"
|
|
2551
|
+
/>
|
|
2552
|
+
</svg>
|
|
2553
|
+
) : null}
|
|
2554
|
+
</div>
|
|
2555
|
+
);
|
|
2556
|
+
}
|