@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,7 +1,9 @@
|
|
|
1
1
|
import { parseCssColor, rgbaToCss } from "@shared/color-utils";
|
|
2
2
|
import { IconTrash } from "@tabler/icons-react";
|
|
3
3
|
import {
|
|
4
|
+
type KeyboardEvent as ReactKeyboardEvent,
|
|
4
5
|
type PointerEvent as ReactPointerEvent,
|
|
6
|
+
useEffect,
|
|
5
7
|
useRef,
|
|
6
8
|
useState,
|
|
7
9
|
} from "react";
|
|
@@ -83,6 +85,44 @@ function clamp(n: number, min: number, max: number): number {
|
|
|
83
85
|
return Math.max(min, Math.min(max, n));
|
|
84
86
|
}
|
|
85
87
|
|
|
88
|
+
/**
|
|
89
|
+
* Parses a stop-position draft string into a finite 0–100 number, or `null`
|
|
90
|
+
* when the draft is invalid/empty and the field should revert instead of
|
|
91
|
+
* committing (mirrors `parseNumericDraft` in DesignColorPicker.tsx).
|
|
92
|
+
*/
|
|
93
|
+
export function parseStopPositionDraft(draft: string): number | null {
|
|
94
|
+
const trimmed = draft.trim();
|
|
95
|
+
if (trimmed === "") return null;
|
|
96
|
+
const parsed = Number(trimmed);
|
|
97
|
+
return Number.isFinite(parsed) ? clamp(parsed, 0, 100) : null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Picks which remaining stop should become selected after deleting one.
|
|
102
|
+
* Returns the id of the stop whose position is closest to the removed
|
|
103
|
+
* stop's position (ties broken by whichever appears first in `stops`),
|
|
104
|
+
* rather than always jumping to the leftmost stop — deleting a stop near
|
|
105
|
+
* the right edge of the ramp should keep selection nearby, not teleport
|
|
106
|
+
* the user's focus across the gradient.
|
|
107
|
+
*/
|
|
108
|
+
export function nearestStopId(
|
|
109
|
+
stops: GradientStopValue[],
|
|
110
|
+
removedPosition: number | undefined,
|
|
111
|
+
): string | null {
|
|
112
|
+
if (stops.length === 0) return null;
|
|
113
|
+
if (removedPosition === undefined) return sortedStops(stops)[0]?.id ?? null;
|
|
114
|
+
let best: GradientStopValue | null = null;
|
|
115
|
+
let bestDistance = Infinity;
|
|
116
|
+
for (const stop of stops) {
|
|
117
|
+
const distance = Math.abs(stop.position - removedPosition);
|
|
118
|
+
if (distance < bestDistance) {
|
|
119
|
+
best = stop;
|
|
120
|
+
bestDistance = distance;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return best?.id ?? null;
|
|
124
|
+
}
|
|
125
|
+
|
|
86
126
|
// ─── Default / parse helpers ───────────────────────────────────────────────────
|
|
87
127
|
|
|
88
128
|
let stopCounter = 0;
|
|
@@ -356,9 +396,17 @@ export function GradientEditor({
|
|
|
356
396
|
};
|
|
357
397
|
|
|
358
398
|
// Bar background click → add a new stop (only if no significant drag movement).
|
|
399
|
+
// setPointerCapture pins all subsequent pointermove/pointerup events to the
|
|
400
|
+
// bar element regardless of where the cursor physically ends up — without
|
|
401
|
+
// it, a fast drag that leaves the bar's bounding box before the next
|
|
402
|
+
// pointermove fires stops delivering events to this handler (hit-testing
|
|
403
|
+
// sends them to whatever's now under the cursor instead), so the movement
|
|
404
|
+
// never gets flagged and the eventual pointerup elsewhere is misread as a
|
|
405
|
+
// stationary click that adds a spurious stop.
|
|
359
406
|
const handleBarPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {
|
|
360
407
|
if (disabled) return;
|
|
361
408
|
barClickRef.current = { moved: false, startX: event.clientX };
|
|
409
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
362
410
|
};
|
|
363
411
|
|
|
364
412
|
const handleBarPointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {
|
|
@@ -369,6 +417,9 @@ export function GradientEditor({
|
|
|
369
417
|
};
|
|
370
418
|
|
|
371
419
|
const handleBarClick = (event: ReactPointerEvent<HTMLDivElement>) => {
|
|
420
|
+
if (event.currentTarget.hasPointerCapture(event.pointerId)) {
|
|
421
|
+
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
422
|
+
}
|
|
372
423
|
// Only add if the pointer didn't move significantly (not a drag).
|
|
373
424
|
if (!barClickRef.current || barClickRef.current.moved) {
|
|
374
425
|
barClickRef.current = null;
|
|
@@ -440,10 +491,11 @@ export function GradientEditor({
|
|
|
440
491
|
|
|
441
492
|
const removeStop = (id: string) => {
|
|
442
493
|
if (value.stops.length <= 2) return;
|
|
494
|
+
const removed = value.stops.find((stop) => stop.id === id);
|
|
443
495
|
const nextStops = value.stops.filter((stop) => stop.id !== id);
|
|
444
496
|
onChange({ ...value, stops: nextStops });
|
|
445
497
|
if (selectedStopId === id) {
|
|
446
|
-
onSelectStop(
|
|
498
|
+
onSelectStop(nearestStopId(nextStops, removed?.position) ?? "");
|
|
447
499
|
}
|
|
448
500
|
};
|
|
449
501
|
|
|
@@ -454,6 +506,40 @@ export function GradientEditor({
|
|
|
454
506
|
const showAngle = value.kind === "linear" || value.kind === "angular";
|
|
455
507
|
const selectedStop = value.stops.find((s) => s.id === selectedStopId);
|
|
456
508
|
|
|
509
|
+
// Stop-position draft: buffered so typing doesn't commit (and dirty the
|
|
510
|
+
// history) on every keystroke. Commits on blur/Enter; Escape reverts.
|
|
511
|
+
const [positionDraft, setPositionDraft] = useState<string>(() =>
|
|
512
|
+
String(Math.round(selectedStop?.position ?? 0)),
|
|
513
|
+
);
|
|
514
|
+
const positionDraftRef = useRef(positionDraft);
|
|
515
|
+
const skipPositionBlurRef = useRef(false);
|
|
516
|
+
const selectedStopPosition = selectedStop?.position;
|
|
517
|
+
useEffect(() => {
|
|
518
|
+
const next = String(Math.round(selectedStopPosition ?? 0));
|
|
519
|
+
positionDraftRef.current = next;
|
|
520
|
+
setPositionDraft(next);
|
|
521
|
+
// Resync whenever the selected stop changes or its position changes
|
|
522
|
+
// externally (drag on the bar, another control).
|
|
523
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
524
|
+
}, [selectedStopId, selectedStopPosition]);
|
|
525
|
+
|
|
526
|
+
const commitPositionDraft = () => {
|
|
527
|
+
const parsed = parseStopPositionDraft(positionDraftRef.current);
|
|
528
|
+
if (parsed === null) {
|
|
529
|
+
const reverted = String(Math.round(selectedStop?.position ?? 0));
|
|
530
|
+
positionDraftRef.current = reverted;
|
|
531
|
+
setPositionDraft(reverted);
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
updateStopPosition(selectedStopId, parsed);
|
|
535
|
+
};
|
|
536
|
+
|
|
537
|
+
const revertPositionDraft = () => {
|
|
538
|
+
const reverted = String(Math.round(selectedStop?.position ?? 0));
|
|
539
|
+
positionDraftRef.current = reverted;
|
|
540
|
+
setPositionDraft(reverted);
|
|
541
|
+
};
|
|
542
|
+
|
|
457
543
|
return (
|
|
458
544
|
<div className={cn("px-3 pt-1.5 pb-1 select-none", className)}>
|
|
459
545
|
{/* ── Gradient bar + stop handles ──────────────────────────────────────── */}
|
|
@@ -558,11 +644,31 @@ export function GradientEditor({
|
|
|
558
644
|
max={100}
|
|
559
645
|
aria-label={"Stop position" /* i18n-ignore */}
|
|
560
646
|
disabled={disabled}
|
|
561
|
-
value={
|
|
647
|
+
value={positionDraft}
|
|
562
648
|
onChange={(event) => {
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
649
|
+
positionDraftRef.current = event.target.value;
|
|
650
|
+
setPositionDraft(event.target.value);
|
|
651
|
+
}}
|
|
652
|
+
onFocus={(event) => event.target.select()}
|
|
653
|
+
onKeyDown={(event: ReactKeyboardEvent<HTMLInputElement>) => {
|
|
654
|
+
if (event.key === "Enter") {
|
|
655
|
+
event.preventDefault();
|
|
656
|
+
commitPositionDraft();
|
|
657
|
+
skipPositionBlurRef.current = true;
|
|
658
|
+
event.currentTarget.blur();
|
|
659
|
+
}
|
|
660
|
+
if (event.key === "Escape") {
|
|
661
|
+
revertPositionDraft();
|
|
662
|
+
skipPositionBlurRef.current = true;
|
|
663
|
+
event.currentTarget.blur();
|
|
664
|
+
}
|
|
665
|
+
}}
|
|
666
|
+
onBlur={() => {
|
|
667
|
+
if (skipPositionBlurRef.current) {
|
|
668
|
+
skipPositionBlurRef.current = false;
|
|
669
|
+
return;
|
|
670
|
+
}
|
|
671
|
+
commitPositionDraft();
|
|
566
672
|
}}
|
|
567
673
|
className="h-full min-w-0 flex-1 bg-transparent px-1.5 !text-[11px] tabular-nums focus-visible:outline-none"
|
|
568
674
|
/>
|
|
@@ -264,11 +264,18 @@ export function ImageFillControls({
|
|
|
264
264
|
const fileInputRef = useRef<HTMLInputElement>(null);
|
|
265
265
|
const [urlDraft, setUrlDraft] = useState(value.url);
|
|
266
266
|
const urlDraftRef = useRef(value.url);
|
|
267
|
+
// Guard re-syncing the draft from an external value change while the field
|
|
268
|
+
// is focused (mirrors ScrubInput's `focused` pattern): without this, an
|
|
269
|
+
// incoming prop update while the user is mid-typing a URL — e.g. a
|
|
270
|
+
// selection-driven re-render, or another control committing a sibling
|
|
271
|
+
// style in the same patch — clobbers their in-progress keystrokes.
|
|
272
|
+
const [focused, setFocused] = useState(false);
|
|
267
273
|
|
|
268
274
|
useEffect(() => {
|
|
275
|
+
if (focused) return;
|
|
269
276
|
urlDraftRef.current = value.url;
|
|
270
277
|
setUrlDraft(value.url);
|
|
271
|
-
}, [value.url]);
|
|
278
|
+
}, [focused, value.url]);
|
|
272
279
|
|
|
273
280
|
const commitUrl = () => {
|
|
274
281
|
onChange({ ...value, url: urlDraftRef.current.trim() });
|
|
@@ -352,7 +359,11 @@ export function ImageFillControls({
|
|
|
352
359
|
urlDraftRef.current = event.target.value;
|
|
353
360
|
setUrlDraft(event.target.value);
|
|
354
361
|
}}
|
|
355
|
-
|
|
362
|
+
onFocus={() => setFocused(true)}
|
|
363
|
+
onBlur={() => {
|
|
364
|
+
setFocused(false);
|
|
365
|
+
commitUrl();
|
|
366
|
+
}}
|
|
356
367
|
onKeyDown={(event) => {
|
|
357
368
|
if (event.key === "Enter") {
|
|
358
369
|
event.preventDefault();
|
|
@@ -23,6 +23,8 @@ import {
|
|
|
23
23
|
getScrubStepFromEvent,
|
|
24
24
|
normalizeScrubNumber,
|
|
25
25
|
parseScrubExpression,
|
|
26
|
+
startScrubDrag,
|
|
27
|
+
updateScrubDrag,
|
|
26
28
|
type ScrubExpressionOptions,
|
|
27
29
|
} from "./scrub-input-utils";
|
|
28
30
|
|
|
@@ -31,6 +33,20 @@ type ScrubInputIcon = (props: { className?: string }) => ReactNode;
|
|
|
31
33
|
export interface ScrubInputChangeMeta {
|
|
32
34
|
source: "commit" | "keyboard" | "scrub";
|
|
33
35
|
expression?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Gesture-lifecycle signal for downstream consumers that want to throttle
|
|
38
|
+
* expensive work during a drag and only do the expensive commit once.
|
|
39
|
+
*
|
|
40
|
+
* - "preview": a live, in-progress tick — e.g. one pointermove sample while
|
|
41
|
+
* scrubbing. There can be many of these per gesture; treat each as a
|
|
42
|
+
* cheap, throttleable preview of the value, not a point to commit at full
|
|
43
|
+
* cost.
|
|
44
|
+
* - "commit": the gesture's authoritative, final value. Fired exactly once
|
|
45
|
+
* per gesture: on pointerup that ends a scrub drag, and for every
|
|
46
|
+
* `source: "commit"` (blur/Enter) or `source: "keyboard"` (arrow step)
|
|
47
|
+
* change, since those are already discrete, complete edits.
|
|
48
|
+
*/
|
|
49
|
+
phase: "preview" | "commit";
|
|
34
50
|
}
|
|
35
51
|
|
|
36
52
|
export interface ScrubInputProps extends ScrubExpressionOptions {
|
|
@@ -85,10 +101,12 @@ export function ScrubInput({
|
|
|
85
101
|
const skipNextBlurCommitRef = useRef(false);
|
|
86
102
|
const dragRef = useRef({
|
|
87
103
|
pointerId: -1,
|
|
88
|
-
|
|
89
|
-
prevX: 0,
|
|
90
|
-
hasDragged: false,
|
|
104
|
+
drag: startScrubDrag(0),
|
|
91
105
|
});
|
|
106
|
+
// The last normalized value emitted as a "preview" scrub tick, so endDrag
|
|
107
|
+
// can re-emit it once as the gesture's authoritative "commit" — without
|
|
108
|
+
// recomputing from stale pointer deltas after pointer capture is released.
|
|
109
|
+
const lastScrubValueRef = useRef(value);
|
|
92
110
|
|
|
93
111
|
useEffect(() => {
|
|
94
112
|
if (!focused) {
|
|
@@ -109,6 +127,7 @@ export function ScrubInput({
|
|
|
109
127
|
const formatted = formatScrubValue(normalized, options);
|
|
110
128
|
draftRef.current = formatted;
|
|
111
129
|
setDraft(formatted);
|
|
130
|
+
return normalized;
|
|
112
131
|
};
|
|
113
132
|
|
|
114
133
|
const commitDraft = () => {
|
|
@@ -127,21 +146,45 @@ export function ScrubInput({
|
|
|
127
146
|
|
|
128
147
|
draftRef.current = parsed.normalized;
|
|
129
148
|
setDraft(parsed.normalized);
|
|
130
|
-
|
|
131
|
-
|
|
149
|
+
// From a mixed selection every explicitly typed value must commit, even
|
|
150
|
+
// when it equals the placeholder `value` prop (e.g. typing "0"): the
|
|
151
|
+
// selected objects hold differing values, so "no change" is meaningless.
|
|
152
|
+
if (parsed.value !== value || mixed) {
|
|
153
|
+
onChange(parsed.value, {
|
|
154
|
+
source: "commit",
|
|
155
|
+
expression: currentDraft,
|
|
156
|
+
phase: "commit",
|
|
157
|
+
});
|
|
132
158
|
}
|
|
133
159
|
};
|
|
134
160
|
|
|
135
161
|
const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
|
|
136
162
|
if (event.key === "ArrowUp" || event.key === "ArrowDown") {
|
|
137
163
|
event.preventDefault();
|
|
164
|
+
// Mixed selection: the `value` prop is only a placeholder (typically 0),
|
|
165
|
+
// so stepping from it would snap every selected object to a value the
|
|
166
|
+
// user never chose. Require an explicit typed value first — typing then
|
|
167
|
+
// committing applies to all, which is the design-editor convention.
|
|
168
|
+
if (mixed) return;
|
|
138
169
|
const direction = event.key === "ArrowUp" ? 1 : -1;
|
|
139
170
|
// getScrubStepFromEvent handles shiftKey (×10) and altKey (÷10).
|
|
140
171
|
// Cmd (metaKey) mirrors Shift for ×10 — editor convention on macOS.
|
|
141
172
|
const baseStep = getScrubStepFromEvent(event, step);
|
|
142
173
|
const cmdMultiplier = event.metaKey && !event.shiftKey ? 10 : 1;
|
|
143
|
-
|
|
174
|
+
// Step from the currently typed draft, not the last-committed `value`
|
|
175
|
+
// prop — otherwise an in-progress, uncommitted edit (typed but not yet
|
|
176
|
+
// blurred/entered) is silently discarded the moment an arrow key is
|
|
177
|
+
// pressed. Parse the draft the same way commitDraft does, falling back
|
|
178
|
+
// to `value` only when the draft doesn't parse (e.g. empty/invalid).
|
|
179
|
+
const draftParsed = parseScrubExpression(
|
|
180
|
+
draftRef.current,
|
|
181
|
+
value,
|
|
182
|
+
options,
|
|
183
|
+
);
|
|
184
|
+
const base = draftParsed ? draftParsed.value : value;
|
|
185
|
+
setNextValue(base + direction * baseStep * cmdMultiplier, {
|
|
144
186
|
source: "keyboard",
|
|
187
|
+
phase: "commit",
|
|
145
188
|
});
|
|
146
189
|
return;
|
|
147
190
|
}
|
|
@@ -169,9 +212,7 @@ export function ScrubInput({
|
|
|
169
212
|
event.preventDefault();
|
|
170
213
|
dragRef.current = {
|
|
171
214
|
pointerId: event.pointerId,
|
|
172
|
-
|
|
173
|
-
prevX: event.clientX,
|
|
174
|
-
hasDragged: false,
|
|
215
|
+
drag: startScrubDrag(event.clientX),
|
|
175
216
|
};
|
|
176
217
|
event.currentTarget.setPointerCapture(event.pointerId);
|
|
177
218
|
setDragging(true);
|
|
@@ -179,28 +220,50 @@ export function ScrubInput({
|
|
|
179
220
|
|
|
180
221
|
const handlePointerMove = (event: PointerEvent<HTMLLabelElement>) => {
|
|
181
222
|
if (!dragging || dragRef.current.pointerId !== event.pointerId) return;
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
223
|
+
// Mixed selection: scrubbing has no meaningful base value (the `value`
|
|
224
|
+
// prop is a placeholder), so committing drag deltas would snap every
|
|
225
|
+
// selected object to a step-from-0 value. Keep the drag inert; releasing
|
|
226
|
+
// without a committed drag focuses the input so the user can type an
|
|
227
|
+
// explicit value that then applies to all.
|
|
228
|
+
if (mixed) return;
|
|
229
|
+
// updateScrubDrag mirrors the jitter-threshold + hasDragged bookkeeping
|
|
230
|
+
// (see scrub-input-utils.ts) so it can be unit tested in isolation from
|
|
231
|
+
// real DOM pointer events.
|
|
232
|
+
const tick = updateScrubDrag(dragRef.current.drag, event.clientX);
|
|
233
|
+
dragRef.current.drag = tick.state;
|
|
234
|
+
if (tick.deltaX === null) return;
|
|
186
235
|
// Use incremental deltas from the last move so that clamped/rounded values
|
|
187
236
|
// committed by onChange are respected. A total-delta approach would create
|
|
188
237
|
// a dead zone equal to the amount dragged past the clamp boundary.
|
|
189
238
|
const next =
|
|
190
239
|
value +
|
|
191
|
-
|
|
240
|
+
tick.deltaX *
|
|
192
241
|
getScrubStepFromEvent(
|
|
193
242
|
{ altKey: event.altKey, shiftKey: event.shiftKey },
|
|
194
243
|
step,
|
|
195
244
|
);
|
|
196
|
-
setNextValue(next, {
|
|
245
|
+
lastScrubValueRef.current = setNextValue(next, {
|
|
246
|
+
source: "scrub",
|
|
247
|
+
phase: "preview",
|
|
248
|
+
});
|
|
197
249
|
};
|
|
198
250
|
|
|
199
251
|
const endDrag = (event: PointerEvent<HTMLLabelElement>) => {
|
|
200
252
|
if (dragRef.current.pointerId !== event.pointerId) return;
|
|
201
253
|
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
202
|
-
const wasDrag = dragRef.current.hasDragged;
|
|
254
|
+
const wasDrag = dragRef.current.drag.hasDragged;
|
|
203
255
|
setDragging(false);
|
|
256
|
+
// A real scrub drag emitted only "preview" ticks via handlePointerMove.
|
|
257
|
+
// Emit exactly one authoritative "commit" here with the final value so a
|
|
258
|
+
// downstream consumer can distinguish "gesture finished" from "still
|
|
259
|
+
// dragging" — without this, the last preview tick would be the only
|
|
260
|
+
// signal, and a consumer that ignores preview ticks would never commit.
|
|
261
|
+
if (wasDrag && !mixed) {
|
|
262
|
+
onChange(lastScrubValueRef.current, {
|
|
263
|
+
source: "scrub",
|
|
264
|
+
phase: "commit",
|
|
265
|
+
});
|
|
266
|
+
}
|
|
204
267
|
// If the pointer was released without dragging (a plain click), focus the
|
|
205
268
|
// input so the user can type immediately — mirrors the design editor's label click
|
|
206
269
|
// behaviour (the event.preventDefault() in handlePointerDown blocks the
|
|
@@ -39,6 +39,9 @@ export {
|
|
|
39
39
|
} from "./ExportSettingsPanel";
|
|
40
40
|
export {
|
|
41
41
|
DesignColorPicker,
|
|
42
|
+
endPointerGesture,
|
|
43
|
+
POINTER_GESTURE_IDLE,
|
|
44
|
+
startPointerGesture,
|
|
42
45
|
type DesignColorMode,
|
|
43
46
|
type DesignColorPickerLabels,
|
|
44
47
|
type DesignColorPickerProps,
|
|
@@ -49,6 +52,7 @@ export {
|
|
|
49
52
|
type DesignGradientStopPatch,
|
|
50
53
|
type DesignGradientType,
|
|
51
54
|
type DesignPaintType,
|
|
55
|
+
type PointerGestureState,
|
|
52
56
|
} from "./DesignColorPicker";
|
|
53
57
|
export {
|
|
54
58
|
GradientEditor,
|
|
@@ -85,6 +89,11 @@ export {
|
|
|
85
89
|
getScrubStepFromEvent,
|
|
86
90
|
normalizeScrubNumber,
|
|
87
91
|
parseScrubExpression,
|
|
92
|
+
SCRUB_DRAG_THRESHOLD_PX,
|
|
93
|
+
startScrubDrag,
|
|
94
|
+
updateScrubDrag,
|
|
88
95
|
type ParsedScrubExpression,
|
|
96
|
+
type ScrubDragState,
|
|
97
|
+
type ScrubDragTick,
|
|
89
98
|
type ScrubExpressionOptions,
|
|
90
99
|
} from "./scrub-input-utils";
|
|
@@ -5,6 +5,62 @@ export interface ScrubExpressionOptions {
|
|
|
5
5
|
precision?: number;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
+
// ─── Scrub-drag gesture-lifecycle state machine ───────────────────────────────
|
|
9
|
+
//
|
|
10
|
+
// Pure mirror of the pointerdown/pointermove/pointerup bookkeeping in
|
|
11
|
+
// ScrubInput's dragRef, extracted so the "exactly one commit-phase emission
|
|
12
|
+
// per gesture" contract can be unit tested without simulating real DOM
|
|
13
|
+
// pointer events (this template has no jsdom/testing-library dependency).
|
|
14
|
+
|
|
15
|
+
/** Cumulative pointer movement (px) required before a drag start is treated
|
|
16
|
+
* as a real scrub rather than jitter during a plain click. Mirrors
|
|
17
|
+
* ScrubInput's DRAG_THRESHOLD_PX. */
|
|
18
|
+
export const SCRUB_DRAG_THRESHOLD_PX = 3;
|
|
19
|
+
|
|
20
|
+
export interface ScrubDragState {
|
|
21
|
+
startX: number;
|
|
22
|
+
prevX: number;
|
|
23
|
+
hasDragged: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Begins tracking a new scrub gesture at the given starting pointer X. */
|
|
27
|
+
export function startScrubDrag(startX: number): ScrubDragState {
|
|
28
|
+
return { startX, prevX: startX, hasDragged: false };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface ScrubDragTick {
|
|
32
|
+
/** The updated drag state after this pointermove sample. */
|
|
33
|
+
state: ScrubDragState;
|
|
34
|
+
/** The incremental delta (px) to apply this tick, or null when the move
|
|
35
|
+
* should be ignored (no movement, or still under the jitter threshold). */
|
|
36
|
+
deltaX: number | null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Processes one pointermove sample against the in-progress drag state.
|
|
41
|
+
* Mirrors ScrubInput's handlePointerMove threshold/hasDragged logic exactly:
|
|
42
|
+
* a move is ignored until cumulative movement clears SCRUB_DRAG_THRESHOLD_PX,
|
|
43
|
+
* after which every subsequent move (including this one) yields an
|
|
44
|
+
* incremental delta and marks the gesture as a real drag.
|
|
45
|
+
*/
|
|
46
|
+
export function updateScrubDrag(
|
|
47
|
+
state: ScrubDragState,
|
|
48
|
+
clientX: number,
|
|
49
|
+
): ScrubDragTick {
|
|
50
|
+
const incr = clientX - state.prevX;
|
|
51
|
+
if (incr === 0) {
|
|
52
|
+
return { state, deltaX: null };
|
|
53
|
+
}
|
|
54
|
+
const cumulativeDelta = Math.abs(clientX - state.startX);
|
|
55
|
+
if (!state.hasDragged && cumulativeDelta < SCRUB_DRAG_THRESHOLD_PX) {
|
|
56
|
+
return { state: { ...state, prevX: clientX }, deltaX: null };
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
state: { ...state, prevX: clientX, hasDragged: true },
|
|
60
|
+
deltaX: incr,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
8
64
|
export interface ParsedScrubExpression {
|
|
9
65
|
value: number;
|
|
10
66
|
normalized: string;
|
|
@@ -17,6 +73,11 @@ type Token =
|
|
|
17
73
|
| { type: "operator"; value: MathOperator };
|
|
18
74
|
|
|
19
75
|
const NUMBER_CHAR_PATTERN = /[0-9.]/;
|
|
76
|
+
// Comma is only treated as a digit character while scanning a number token
|
|
77
|
+
// (see tokenizeExpression) so a locale-style decimal comma ("12,5") parses as
|
|
78
|
+
// 12.5, without swallowing the "," that a caller might use to separate
|
|
79
|
+
// distinct expressions elsewhere.
|
|
80
|
+
const NUMBER_OR_COMMA_CHAR_PATTERN = /[0-9.,]/;
|
|
20
81
|
|
|
21
82
|
export function parseScrubExpression(
|
|
22
83
|
input: string,
|
|
@@ -157,8 +218,12 @@ function tokenizeExpression(expression: string): Token[] {
|
|
|
157
218
|
if (NUMBER_CHAR_PATTERN.test(char) || signedNumber) {
|
|
158
219
|
const start = index;
|
|
159
220
|
index += 1;
|
|
160
|
-
|
|
161
|
-
|
|
221
|
+
// Allow a single comma decimal separator within this number token
|
|
222
|
+
// ("12,5" → 12.5), matching common European locale input. A second
|
|
223
|
+
// comma/period is left for the caller's Number() parse to reject.
|
|
224
|
+
while (NUMBER_OR_COMMA_CHAR_PATTERN.test(expression[index] ?? ""))
|
|
225
|
+
index += 1;
|
|
226
|
+
const value = Number(expression.slice(start, index).replace(",", "."));
|
|
162
227
|
if (!Number.isFinite(value)) return [];
|
|
163
228
|
tokens.push({ type: "number", value });
|
|
164
229
|
previousWasOperator = false;
|
|
@@ -18,6 +18,22 @@ export interface ElementInfo {
|
|
|
18
18
|
selector?: string;
|
|
19
19
|
classes: string[];
|
|
20
20
|
computedStyles: Record<string, string>;
|
|
21
|
+
/**
|
|
22
|
+
* Raw authored `el.style` values (not computed) for a bounded set of
|
|
23
|
+
* layout-relevant properties: position, left, right, top, bottom, width,
|
|
24
|
+
* height, transform, whiteSpace. Populated on SELECTION payloads only
|
|
25
|
+
* (not hover). Optional because older/hover payloads omit it — callers
|
|
26
|
+
* must fall back to computedStyles-based inference when absent.
|
|
27
|
+
*/
|
|
28
|
+
inlineStyles?: Record<string, string>;
|
|
29
|
+
/**
|
|
30
|
+
* Value of the element's `data-an-primitive` attribute (e.g. "text",
|
|
31
|
+
* "rectangle", "frame", "ellipse") when present. Canvas-drawn primitives —
|
|
32
|
+
* including T-tool text, which is a plain `div` — carry this marker so the
|
|
33
|
+
* inspector can identify them without relying on tagName alone. Optional
|
|
34
|
+
* because older payloads and non-primitive/source-backed elements omit it.
|
|
35
|
+
*/
|
|
36
|
+
primitiveKind?: string;
|
|
21
37
|
portableStyleSnapshot?: PortableStyleSnapshot;
|
|
22
38
|
boundingRect: { x: number; y: number; width: number; height: number };
|
|
23
39
|
textContent?: string;
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
type EmbeddedAppRef,
|
|
10
10
|
} from "@agent-native/core/embedding/react";
|
|
11
11
|
import {
|
|
12
|
+
IconApps,
|
|
12
13
|
IconPalette,
|
|
13
14
|
IconPhoto,
|
|
14
15
|
IconPlus,
|
|
@@ -288,6 +289,8 @@ function AssetsPickerSkeleton() {
|
|
|
288
289
|
);
|
|
289
290
|
}
|
|
290
291
|
|
|
292
|
+
export type PromptCreationMode = "design" | "app";
|
|
293
|
+
|
|
291
294
|
interface PromptPopoverProps {
|
|
292
295
|
open: boolean;
|
|
293
296
|
onOpenChange: (open: boolean) => void;
|
|
@@ -308,6 +311,14 @@ interface PromptPopoverProps {
|
|
|
308
311
|
selectedDesignSystemId?: string | null;
|
|
309
312
|
onDesignSystemChange?: (id: string | null) => void;
|
|
310
313
|
onCreateDesignSystem?: () => void;
|
|
314
|
+
/**
|
|
315
|
+
* "Design" (inline prototype, default) vs "Full app" (Builder Fusion cloud
|
|
316
|
+
* container). Omit both this and `onCreationModeChange` to hide the mode
|
|
317
|
+
* selector entirely — used when full-app building is flag-disabled, so the
|
|
318
|
+
* popover renders pixel-identical to the design-only version.
|
|
319
|
+
*/
|
|
320
|
+
creationMode?: PromptCreationMode;
|
|
321
|
+
onCreationModeChange?: (mode: PromptCreationMode) => void;
|
|
311
322
|
}
|
|
312
323
|
|
|
313
324
|
export interface PromptDesignSystemOption {
|
|
@@ -344,6 +355,8 @@ export default function PromptPopover({
|
|
|
344
355
|
selectedDesignSystemId,
|
|
345
356
|
onDesignSystemChange,
|
|
346
357
|
onCreateDesignSystem,
|
|
358
|
+
creationMode,
|
|
359
|
+
onCreationModeChange,
|
|
347
360
|
}: PromptPopoverProps) {
|
|
348
361
|
const t = useT();
|
|
349
362
|
const [uploading, setUploading] = useState(false);
|
|
@@ -533,10 +546,17 @@ export default function PromptPopover({
|
|
|
533
546
|
data-agent-native-prompt-popover
|
|
534
547
|
className="z-[200] w-[min(420px,calc(100vw-24px))] rounded-xl border-border p-0 shadow-2xl shadow-black/60"
|
|
535
548
|
>
|
|
536
|
-
<div className="px-3.5 pt-3 pb-2">
|
|
549
|
+
<div className="flex items-center justify-between gap-2 px-3.5 pt-3 pb-2">
|
|
537
550
|
<span className="text-sm font-medium text-foreground/90">
|
|
538
551
|
{title}
|
|
539
552
|
</span>
|
|
553
|
+
{creationMode && onCreationModeChange ? (
|
|
554
|
+
<CreationModeToggle
|
|
555
|
+
mode={creationMode}
|
|
556
|
+
onChange={onCreationModeChange}
|
|
557
|
+
disabled={loading || uploading}
|
|
558
|
+
/>
|
|
559
|
+
) : null}
|
|
540
560
|
</div>
|
|
541
561
|
|
|
542
562
|
<div className="px-2 pb-2">
|
|
@@ -757,3 +777,62 @@ function PromptAttachmentMenu({
|
|
|
757
777
|
</Popover>
|
|
758
778
|
);
|
|
759
779
|
}
|
|
780
|
+
|
|
781
|
+
/**
|
|
782
|
+
* Compact segmented "Design" / "Full app" pill selector shown in the new-design
|
|
783
|
+
* popover title row. Only rendered by the caller when full-app building is
|
|
784
|
+
* flag-enabled (see FULL_APP_BUILDING_ENABLED in shared/full-app.ts) — when
|
|
785
|
+
* absent the popover renders with no mode control at all.
|
|
786
|
+
*/
|
|
787
|
+
function CreationModeToggle({
|
|
788
|
+
mode,
|
|
789
|
+
onChange,
|
|
790
|
+
disabled,
|
|
791
|
+
}: {
|
|
792
|
+
mode: "design" | "app";
|
|
793
|
+
onChange: (mode: "design" | "app") => void;
|
|
794
|
+
disabled?: boolean;
|
|
795
|
+
}) {
|
|
796
|
+
return (
|
|
797
|
+
<div
|
|
798
|
+
role="radiogroup"
|
|
799
|
+
aria-label={
|
|
800
|
+
"Design or full app" /* i18n-ignore compact new-design mode toggle, flag-gated */
|
|
801
|
+
}
|
|
802
|
+
className="flex shrink-0 items-center gap-0.5 rounded-full border border-border bg-muted/40 p-0.5"
|
|
803
|
+
>
|
|
804
|
+
<button
|
|
805
|
+
type="button"
|
|
806
|
+
role="radio"
|
|
807
|
+
aria-checked={mode === "design"}
|
|
808
|
+
disabled={disabled}
|
|
809
|
+
onClick={() => onChange("design")}
|
|
810
|
+
className={`flex cursor-pointer items-center gap-1 rounded-full px-2 py-1 !text-[11px] font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${
|
|
811
|
+
mode === "design"
|
|
812
|
+
? "bg-background text-foreground shadow-sm"
|
|
813
|
+
: "text-muted-foreground hover:text-foreground/80"
|
|
814
|
+
}`}
|
|
815
|
+
>
|
|
816
|
+
<IconPalette className="h-3 w-3" />
|
|
817
|
+
{"Design" /* i18n-ignore compact new-design mode toggle, flag-gated */}
|
|
818
|
+
</button>
|
|
819
|
+
<button
|
|
820
|
+
type="button"
|
|
821
|
+
role="radio"
|
|
822
|
+
aria-checked={mode === "app"}
|
|
823
|
+
disabled={disabled}
|
|
824
|
+
onClick={() => onChange("app")}
|
|
825
|
+
className={`flex cursor-pointer items-center gap-1 rounded-full px-2 py-1 !text-[11px] font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${
|
|
826
|
+
mode === "app"
|
|
827
|
+
? "bg-background text-foreground shadow-sm"
|
|
828
|
+
: "text-muted-foreground hover:text-foreground/80"
|
|
829
|
+
}`}
|
|
830
|
+
>
|
|
831
|
+
<IconApps className="h-3 w-3" />
|
|
832
|
+
{
|
|
833
|
+
"Full app" /* i18n-ignore compact new-design mode toggle, flag-gated */
|
|
834
|
+
}
|
|
835
|
+
</button>
|
|
836
|
+
</div>
|
|
837
|
+
);
|
|
838
|
+
}
|
|
@@ -340,16 +340,34 @@ export function CanvasCommentPins({
|
|
|
340
340
|
const ro = new ResizeObserver(bump);
|
|
341
341
|
ro.observe(canvas);
|
|
342
342
|
|
|
343
|
-
// Scroll listeners on
|
|
344
|
-
//
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
343
|
+
// Scroll listeners on every scrollable ancestor and the window cover both
|
|
344
|
+
// page-level scrolling and container-level panning. Walk the ancestor
|
|
345
|
+
// chain with getComputedStyle instead of a class-name heuristic so
|
|
346
|
+
// inline-styled, nested, and multiple scroll containers are all covered.
|
|
347
|
+
const isScrollable = (value: string) =>
|
|
348
|
+
value === "auto" || value === "scroll" || value === "overlay";
|
|
349
|
+
const scrollTargets: Array<HTMLElement | Window> = [];
|
|
350
|
+
for (let el: HTMLElement | null = canvas; el; el = el.parentElement) {
|
|
351
|
+
const style = getComputedStyle(el);
|
|
352
|
+
if (
|
|
353
|
+
isScrollable(style.overflow) ||
|
|
354
|
+
isScrollable(style.overflowX) ||
|
|
355
|
+
isScrollable(style.overflowY)
|
|
356
|
+
) {
|
|
357
|
+
scrollTargets.push(el);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
scrollTargets.push(window);
|
|
361
|
+
for (const target of scrollTargets) {
|
|
362
|
+
target.addEventListener("scroll", bump, { passive: true });
|
|
363
|
+
}
|
|
348
364
|
window.addEventListener("resize", bump, { passive: true });
|
|
349
365
|
|
|
350
366
|
return () => {
|
|
351
367
|
ro.disconnect();
|
|
352
|
-
|
|
368
|
+
for (const target of scrollTargets) {
|
|
369
|
+
target.removeEventListener("scroll", bump);
|
|
370
|
+
}
|
|
353
371
|
window.removeEventListener("resize", bump);
|
|
354
372
|
};
|
|
355
373
|
}, [canvasEl]);
|