@agent-native/core 0.85.7 → 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 +124 -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/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/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/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/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 +50 -12
- 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 +10 -2
- package/corpus/templates/design/actions/apply-fusion-edits.ts +161 -0
- package/corpus/templates/design/actions/apply-visual-edit.ts +34 -1
- 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/get-fusion-deploy-status.ts +86 -0
- 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/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/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 +115 -14
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +12 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +379 -0
- package/corpus/templates/design/app/components/design/EditPanel.tsx +149 -73
- package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +328 -0
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +148 -30
- package/corpus/templates/design/app/components/design/LocalhostWriteConsentDialog.tsx +1 -1
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +567 -6
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +7 -98
- 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/DesignColorPicker.tsx +127 -10
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +52 -29
- package/corpus/templates/design/app/components/design/inspector/index.ts +9 -0
- package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +56 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +80 -1
- package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +6 -16
- package/corpus/templates/design/app/i18n/zh-TW.ts +2 -1
- package/corpus/templates/design/app/i18n-data.ts +31 -18
- package/corpus/templates/design/app/pages/DesignEditor.tsx +1474 -175
- package/corpus/templates/design/app/pages/Index.tsx +90 -17
- 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/package.json +4 -3
- package/corpus/templates/design/server/db/schema.ts +31 -0
- 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/collab-selection.ts +52 -0
- package/corpus/templates/design/shared/full-app.ts +126 -0
- package/corpus/templates/design/shared/pen-path.ts +296 -0
- 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/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 +12 -1
- 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/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/routes.d.ts +2 -2
- package/dist/collab/struct-routes.d.ts +1 -1
- 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 +2 -2
- 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/resources/handlers.d.ts +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- 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/server/transcribe-voice.d.ts +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
|
@@ -138,6 +138,17 @@ export interface DesignColorPickerLabels {
|
|
|
138
138
|
export interface DesignColorPickerProps {
|
|
139
139
|
value: string;
|
|
140
140
|
onChange: (value: string) => void;
|
|
141
|
+
/**
|
|
142
|
+
* Optional gesture-lifecycle signal, complementary to `onChange`. The SV
|
|
143
|
+
* field, hue slider, and alpha slider call `onChange` on every pointermove
|
|
144
|
+
* tick for live preview (cheap/throttleable), but only call
|
|
145
|
+
* `onChangeComplete` once per gesture — on pointerup/drag-end — with the
|
|
146
|
+
* final color. Discrete, already-final commits (hex entry, RGB/HSL/HSB
|
|
147
|
+
* field commits, keyboard nudges, document-color swatch clicks, paint-type
|
|
148
|
+
* switches) also fire it once, immediately. Omit this prop to keep the
|
|
149
|
+
* existing every-tick `onChange`-only behavior.
|
|
150
|
+
*/
|
|
151
|
+
onChangeComplete?: (value: string) => void;
|
|
141
152
|
onPaintValueChange?: (value: string) => void;
|
|
142
153
|
onImageFillChange?: (value: ImageFillValue) => void;
|
|
143
154
|
backgroundImage?: string;
|
|
@@ -611,6 +622,7 @@ const BLEND_MODE_OPTIONS = [
|
|
|
611
622
|
export function DesignColorPicker({
|
|
612
623
|
value,
|
|
613
624
|
onChange,
|
|
625
|
+
onChangeComplete,
|
|
614
626
|
onPaintValueChange,
|
|
615
627
|
onImageFillChange,
|
|
616
628
|
backgroundImage,
|
|
@@ -773,11 +785,24 @@ export function DesignColorPicker({
|
|
|
773
785
|
|
|
774
786
|
// ── Emit helpers ────────────────────────────────────────────────────────────
|
|
775
787
|
|
|
788
|
+
// Tracks the last CSS value handed to onChange/onPaintValueChange, so a
|
|
789
|
+
// gesture-end (pointerup on the SV field / hue / alpha tracks) can re-emit
|
|
790
|
+
// that exact value once via onChangeComplete without recomputing it from
|
|
791
|
+
// pointer coordinates after the drag has already ended.
|
|
792
|
+
const lastEmittedValueRef = useRef(value);
|
|
793
|
+
|
|
794
|
+
const notifyChangeComplete = () => {
|
|
795
|
+
onChangeComplete?.(lastEmittedValueRef.current);
|
|
796
|
+
};
|
|
797
|
+
|
|
776
798
|
const emitColor = (nextColor: RgbaColor, nextOpacity = effectiveOpacity) => {
|
|
777
|
-
|
|
799
|
+
const next = rgbaToCss(withColorOpacity(nextColor, nextOpacity));
|
|
800
|
+
lastEmittedValueRef.current = next;
|
|
801
|
+
onChange(next);
|
|
778
802
|
};
|
|
779
803
|
|
|
780
804
|
const emitPaintValue = (nextValue: string) => {
|
|
805
|
+
lastEmittedValueRef.current = nextValue;
|
|
781
806
|
if (onPaintValueChange) onPaintValueChange(nextValue);
|
|
782
807
|
else onChange(nextValue);
|
|
783
808
|
};
|
|
@@ -809,6 +834,7 @@ export function DesignColorPicker({
|
|
|
809
834
|
if (activeGradient) {
|
|
810
835
|
const hexIncludesAlpha = hasHexAlpha(currentDraft);
|
|
811
836
|
emitStopColor(hexIncludesAlpha ? parsed : { ...parsed, a: fieldColor.a });
|
|
837
|
+
notifyChangeComplete();
|
|
812
838
|
return;
|
|
813
839
|
}
|
|
814
840
|
const hexIncludesAlpha = hasHexAlpha(currentDraft);
|
|
@@ -817,11 +843,19 @@ export function DesignColorPicker({
|
|
|
817
843
|
: effectiveOpacity;
|
|
818
844
|
if (hexIncludesAlpha && onOpacityChange) onOpacityChange(nextOpacity);
|
|
819
845
|
emitColor(parsed, nextOpacity);
|
|
846
|
+
notifyChangeComplete();
|
|
820
847
|
};
|
|
821
848
|
|
|
822
849
|
const setOpacity = (nextOpacity: number) => {
|
|
850
|
+
// Track the resulting CSS value even when the opacity itself is reported
|
|
851
|
+
// through the separate onOpacityChange prop, so a subsequent
|
|
852
|
+
// notifyChangeComplete() call still reports the current color+opacity —
|
|
853
|
+
// not a stale value from before this opacity edit.
|
|
854
|
+
lastEmittedValueRef.current = rgbaToCss(
|
|
855
|
+
withColorOpacity(color, nextOpacity),
|
|
856
|
+
);
|
|
823
857
|
if (onOpacityChange) onOpacityChange(nextOpacity);
|
|
824
|
-
else onChange(
|
|
858
|
+
else onChange(lastEmittedValueRef.current);
|
|
825
859
|
};
|
|
826
860
|
|
|
827
861
|
// ── Gradient editing ─────────────────────────────────────────────────────────
|
|
@@ -935,12 +969,18 @@ export function DesignColorPicker({
|
|
|
935
969
|
|
|
936
970
|
setLocalPaintType(nextType);
|
|
937
971
|
|
|
972
|
+
// Every branch below is a discrete, one-shot commit (a paint-type click),
|
|
973
|
+
// never a live drag tick — so each one notifies onChangeComplete once,
|
|
974
|
+
// immediately, right after the matching onChange/onPaintValueChange call.
|
|
938
975
|
if (nextType === "none") {
|
|
976
|
+
lastEmittedValueRef.current = "transparent";
|
|
939
977
|
onChange("transparent");
|
|
978
|
+
notifyChangeComplete();
|
|
940
979
|
return;
|
|
941
980
|
}
|
|
942
981
|
if (nextType === "solid") {
|
|
943
982
|
emitColor(color, effectiveOpacity > 0 ? effectiveOpacity : 100);
|
|
983
|
+
notifyChangeComplete();
|
|
944
984
|
return;
|
|
945
985
|
}
|
|
946
986
|
if (GRADIENT_TYPES.has(nextType)) {
|
|
@@ -953,6 +993,7 @@ export function DesignColorPicker({
|
|
|
953
993
|
const next: GradientValue = { ...base, kind: nextType as GradientKind };
|
|
954
994
|
setSelectedStopId(next.stops[0]?.id ?? "");
|
|
955
995
|
emitGradient(next);
|
|
996
|
+
notifyChangeComplete();
|
|
956
997
|
return;
|
|
957
998
|
}
|
|
958
999
|
if (nextType === "image") {
|
|
@@ -964,20 +1005,24 @@ export function DesignColorPicker({
|
|
|
964
1005
|
emitPaintValue(
|
|
965
1006
|
nextImageFill.url ? imageFillToCss(nextImageFill) : "transparent",
|
|
966
1007
|
);
|
|
1008
|
+
notifyChangeComplete();
|
|
967
1009
|
return;
|
|
968
1010
|
}
|
|
969
1011
|
if (nextType === "video") {
|
|
970
1012
|
// No standalone CSS for video; mark the fill type and keep a checker fill
|
|
971
1013
|
// until a source is wired. The agent can replace it with a <video> layer.
|
|
972
1014
|
emitPaintValue("transparent");
|
|
1015
|
+
notifyChangeComplete();
|
|
973
1016
|
return;
|
|
974
1017
|
}
|
|
975
1018
|
if (nextType === "noise") {
|
|
976
1019
|
emitPaintValue(NOISE_FALLBACK_CSS);
|
|
1020
|
+
notifyChangeComplete();
|
|
977
1021
|
return;
|
|
978
1022
|
}
|
|
979
1023
|
if (nextType === "pattern") {
|
|
980
1024
|
emitPaintValue(PATTERN_FALLBACK_CSS);
|
|
1025
|
+
notifyChangeComplete();
|
|
981
1026
|
return;
|
|
982
1027
|
}
|
|
983
1028
|
};
|
|
@@ -1000,8 +1045,11 @@ export function DesignColorPicker({
|
|
|
1000
1045
|
const parsed = parseCssColor(result.sRGBHex);
|
|
1001
1046
|
if (parsed) emitStopColor({ ...parsed, a: fieldColor.a });
|
|
1002
1047
|
} else {
|
|
1048
|
+
lastEmittedValueRef.current = result.sRGBHex;
|
|
1003
1049
|
onChange(result.sRGBHex);
|
|
1004
1050
|
}
|
|
1051
|
+
// The eyedropper pick is a single discrete commit, not a drag tick.
|
|
1052
|
+
notifyChangeComplete();
|
|
1005
1053
|
}
|
|
1006
1054
|
} catch {
|
|
1007
1055
|
// Browser cancels are expected; keep the current color.
|
|
@@ -1355,6 +1403,7 @@ export function DesignColorPicker({
|
|
|
1355
1403
|
emitColorFromHsv(nextHsv);
|
|
1356
1404
|
}
|
|
1357
1405
|
}}
|
|
1406
|
+
onCommit={notifyChangeComplete}
|
|
1358
1407
|
/>
|
|
1359
1408
|
</div>
|
|
1360
1409
|
)}
|
|
@@ -1429,6 +1478,7 @@ export function DesignColorPicker({
|
|
|
1429
1478
|
emitColorFromHsv({ ...hsv, h });
|
|
1430
1479
|
}
|
|
1431
1480
|
}}
|
|
1481
|
+
onCommit={notifyChangeComplete}
|
|
1432
1482
|
/>
|
|
1433
1483
|
|
|
1434
1484
|
{/* Current-color swatch left of alpha (matches the design editor's layout) */}
|
|
@@ -1462,6 +1512,7 @@ export function DesignColorPicker({
|
|
|
1462
1512
|
setOpacity(next);
|
|
1463
1513
|
}
|
|
1464
1514
|
}}
|
|
1515
|
+
onCommit={notifyChangeComplete}
|
|
1465
1516
|
/>
|
|
1466
1517
|
</div>
|
|
1467
1518
|
</div>
|
|
@@ -1593,6 +1644,9 @@ export function DesignColorPicker({
|
|
|
1593
1644
|
parseCssColorExtended(docColor) ?? color;
|
|
1594
1645
|
if (activeGradient) emitStopColor(parsed);
|
|
1595
1646
|
else emitColor(parsed);
|
|
1647
|
+
// A swatch click is a discrete, one-shot
|
|
1648
|
+
// commit, not a drag tick.
|
|
1649
|
+
notifyChangeComplete();
|
|
1596
1650
|
}}
|
|
1597
1651
|
/>
|
|
1598
1652
|
</TooltipTrigger>
|
|
@@ -1716,14 +1770,22 @@ function SaturationBrightnessField({
|
|
|
1716
1770
|
label,
|
|
1717
1771
|
disabled,
|
|
1718
1772
|
onChange,
|
|
1773
|
+
onCommit,
|
|
1719
1774
|
}: {
|
|
1720
1775
|
hsv: HsvaColor;
|
|
1721
1776
|
label: string;
|
|
1722
1777
|
disabled: boolean;
|
|
1723
1778
|
onChange: (color: HsvaColor) => void;
|
|
1779
|
+
/**
|
|
1780
|
+
* Fired once per gesture with the final value already applied — on
|
|
1781
|
+
* pointerup/pointercancel that ends a drag, and after every keyboard step
|
|
1782
|
+
* (each arrow press is its own discrete, complete edit). Never fired per
|
|
1783
|
+
* pointermove tick.
|
|
1784
|
+
*/
|
|
1785
|
+
onCommit?: () => void;
|
|
1724
1786
|
}) {
|
|
1725
1787
|
const fieldRef = useRef<HTMLDivElement>(null);
|
|
1726
|
-
const draggingRef = useRef(
|
|
1788
|
+
const draggingRef = useRef<PointerGestureState>(POINTER_GESTURE_IDLE);
|
|
1727
1789
|
const hueColor = rgbaToCss(hsvToRgba({ h: hsv.h, s: 100, v: 100, a: 1 }));
|
|
1728
1790
|
|
|
1729
1791
|
const updateFromPointer = (event: PointerEvent<HTMLDivElement>) => {
|
|
@@ -1745,18 +1807,22 @@ function SaturationBrightnessField({
|
|
|
1745
1807
|
if (event.key === "ArrowRight") {
|
|
1746
1808
|
event.preventDefault();
|
|
1747
1809
|
onChange({ ...hsv, s: clamp(hsv.s + step, 0, 100) });
|
|
1810
|
+
onCommit?.();
|
|
1748
1811
|
}
|
|
1749
1812
|
if (event.key === "ArrowLeft") {
|
|
1750
1813
|
event.preventDefault();
|
|
1751
1814
|
onChange({ ...hsv, s: clamp(hsv.s - step, 0, 100) });
|
|
1815
|
+
onCommit?.();
|
|
1752
1816
|
}
|
|
1753
1817
|
if (event.key === "ArrowUp") {
|
|
1754
1818
|
event.preventDefault();
|
|
1755
1819
|
onChange({ ...hsv, v: clamp(hsv.v + step, 0, 100) });
|
|
1820
|
+
onCommit?.();
|
|
1756
1821
|
}
|
|
1757
1822
|
if (event.key === "ArrowDown") {
|
|
1758
1823
|
event.preventDefault();
|
|
1759
1824
|
onChange({ ...hsv, v: clamp(hsv.v - step, 0, 100) });
|
|
1825
|
+
onCommit?.();
|
|
1760
1826
|
}
|
|
1761
1827
|
};
|
|
1762
1828
|
|
|
@@ -1768,7 +1834,7 @@ function SaturationBrightnessField({
|
|
|
1768
1834
|
aria-disabled={disabled}
|
|
1769
1835
|
onPointerDown={(event) => {
|
|
1770
1836
|
if (disabled) return;
|
|
1771
|
-
draggingRef.current =
|
|
1837
|
+
draggingRef.current = startPointerGesture();
|
|
1772
1838
|
event.currentTarget.setPointerCapture(event.pointerId);
|
|
1773
1839
|
updateFromPointer(event);
|
|
1774
1840
|
}}
|
|
@@ -1777,13 +1843,17 @@ function SaturationBrightnessField({
|
|
|
1777
1843
|
updateFromPointer(event);
|
|
1778
1844
|
}}
|
|
1779
1845
|
onPointerUp={(event) => {
|
|
1780
|
-
draggingRef.current
|
|
1846
|
+
const ended = endPointerGesture(draggingRef.current);
|
|
1847
|
+
draggingRef.current = ended.state;
|
|
1781
1848
|
if (event.currentTarget.hasPointerCapture(event.pointerId)) {
|
|
1782
1849
|
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
1783
1850
|
}
|
|
1851
|
+
if (ended.shouldCommit) onCommit?.();
|
|
1784
1852
|
}}
|
|
1785
1853
|
onPointerCancel={() => {
|
|
1786
|
-
draggingRef.current
|
|
1854
|
+
const ended = endPointerGesture(draggingRef.current);
|
|
1855
|
+
draggingRef.current = ended.state;
|
|
1856
|
+
if (ended.shouldCommit) onCommit?.();
|
|
1787
1857
|
}}
|
|
1788
1858
|
onKeyDown={stepWithKeyboard}
|
|
1789
1859
|
className={cn(
|
|
@@ -1818,6 +1888,7 @@ function ColorTrack({
|
|
|
1818
1888
|
backgroundSize,
|
|
1819
1889
|
backgroundPosition,
|
|
1820
1890
|
onChange,
|
|
1891
|
+
onCommit,
|
|
1821
1892
|
}: {
|
|
1822
1893
|
label: string;
|
|
1823
1894
|
value: number;
|
|
@@ -1828,9 +1899,16 @@ function ColorTrack({
|
|
|
1828
1899
|
backgroundSize?: string;
|
|
1829
1900
|
backgroundPosition?: string;
|
|
1830
1901
|
onChange: (value: number) => void;
|
|
1902
|
+
/**
|
|
1903
|
+
* Fired once per gesture with the final value already applied — on
|
|
1904
|
+
* pointerup/pointercancel that ends a drag, and after every keyboard step
|
|
1905
|
+
* (each arrow/Home/End press is its own discrete, complete edit). Never
|
|
1906
|
+
* fired per pointermove tick.
|
|
1907
|
+
*/
|
|
1908
|
+
onCommit?: () => void;
|
|
1831
1909
|
}) {
|
|
1832
1910
|
const trackRef = useRef<HTMLDivElement>(null);
|
|
1833
|
-
const draggingRef = useRef(
|
|
1911
|
+
const draggingRef = useRef<PointerGestureState>(POINTER_GESTURE_IDLE);
|
|
1834
1912
|
const percent = ((value - min) / (max - min)) * 100;
|
|
1835
1913
|
|
|
1836
1914
|
const updateFromPointer = (event: PointerEvent<HTMLDivElement>) => {
|
|
@@ -1846,18 +1924,22 @@ function ColorTrack({
|
|
|
1846
1924
|
if (event.key === "ArrowRight" || event.key === "ArrowUp") {
|
|
1847
1925
|
event.preventDefault();
|
|
1848
1926
|
onChange(clamp(value + step, min, max));
|
|
1927
|
+
onCommit?.();
|
|
1849
1928
|
}
|
|
1850
1929
|
if (event.key === "ArrowLeft" || event.key === "ArrowDown") {
|
|
1851
1930
|
event.preventDefault();
|
|
1852
1931
|
onChange(clamp(value - step, min, max));
|
|
1932
|
+
onCommit?.();
|
|
1853
1933
|
}
|
|
1854
1934
|
if (event.key === "Home") {
|
|
1855
1935
|
event.preventDefault();
|
|
1856
1936
|
onChange(min);
|
|
1937
|
+
onCommit?.();
|
|
1857
1938
|
}
|
|
1858
1939
|
if (event.key === "End") {
|
|
1859
1940
|
event.preventDefault();
|
|
1860
1941
|
onChange(max);
|
|
1942
|
+
onCommit?.();
|
|
1861
1943
|
}
|
|
1862
1944
|
};
|
|
1863
1945
|
|
|
@@ -1874,7 +1956,7 @@ function ColorTrack({
|
|
|
1874
1956
|
onKeyDown={stepWithKeyboard}
|
|
1875
1957
|
onPointerDown={(event) => {
|
|
1876
1958
|
if (disabled) return;
|
|
1877
|
-
draggingRef.current =
|
|
1959
|
+
draggingRef.current = startPointerGesture();
|
|
1878
1960
|
event.currentTarget.setPointerCapture(event.pointerId);
|
|
1879
1961
|
updateFromPointer(event);
|
|
1880
1962
|
}}
|
|
@@ -1883,13 +1965,17 @@ function ColorTrack({
|
|
|
1883
1965
|
updateFromPointer(event);
|
|
1884
1966
|
}}
|
|
1885
1967
|
onPointerUp={(event) => {
|
|
1886
|
-
draggingRef.current
|
|
1968
|
+
const ended = endPointerGesture(draggingRef.current);
|
|
1969
|
+
draggingRef.current = ended.state;
|
|
1887
1970
|
if (event.currentTarget.hasPointerCapture(event.pointerId)) {
|
|
1888
1971
|
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
1889
1972
|
}
|
|
1973
|
+
if (ended.shouldCommit) onCommit?.();
|
|
1890
1974
|
}}
|
|
1891
1975
|
onPointerCancel={() => {
|
|
1892
|
-
draggingRef.current
|
|
1976
|
+
const ended = endPointerGesture(draggingRef.current);
|
|
1977
|
+
draggingRef.current = ended.state;
|
|
1978
|
+
if (ended.shouldCommit) onCommit?.();
|
|
1893
1979
|
}}
|
|
1894
1980
|
className={cn(
|
|
1895
1981
|
"relative h-3.5 cursor-pointer rounded-full border border-border/60 outline-none",
|
|
@@ -2011,6 +2097,37 @@ function ScrubbyNumberInput({
|
|
|
2011
2097
|
);
|
|
2012
2098
|
}
|
|
2013
2099
|
|
|
2100
|
+
// ─── Pointer-drag gesture-commit tracking ──────────────────────────────────────
|
|
2101
|
+
//
|
|
2102
|
+
// Pure helper shared by SaturationBrightnessField and ColorTrack: both fields
|
|
2103
|
+
// call onChange on every pointermove tick for live preview, and must call
|
|
2104
|
+
// onCommit exactly once when the gesture ends (pointerup/pointercancel),
|
|
2105
|
+
// covering both an actual drag and a single tap-no-move click. Extracted so
|
|
2106
|
+
// the "exactly once per gesture" contract is unit-testable without simulating
|
|
2107
|
+
// real DOM pointer events (this template has no jsdom/testing-library dep).
|
|
2108
|
+
|
|
2109
|
+
/** True once a pointerdown has started a gesture that hasn't yet ended. */
|
|
2110
|
+
export type PointerGestureState = boolean;
|
|
2111
|
+
|
|
2112
|
+
export const POINTER_GESTURE_IDLE: PointerGestureState = false;
|
|
2113
|
+
|
|
2114
|
+
/** Call on pointerdown: starts tracking a new gesture. */
|
|
2115
|
+
export function startPointerGesture(): PointerGestureState {
|
|
2116
|
+
return true;
|
|
2117
|
+
}
|
|
2118
|
+
|
|
2119
|
+
/**
|
|
2120
|
+
* Call on pointerup/pointercancel. Returns the next (idle) state and whether
|
|
2121
|
+
* onCommit should fire — true iff a gesture was actually in progress, so a
|
|
2122
|
+
* stray pointerup with no matching pointerdown is a no-op.
|
|
2123
|
+
*/
|
|
2124
|
+
export function endPointerGesture(state: PointerGestureState): {
|
|
2125
|
+
state: PointerGestureState;
|
|
2126
|
+
shouldCommit: boolean;
|
|
2127
|
+
} {
|
|
2128
|
+
return { state: POINTER_GESTURE_IDLE, shouldCommit: state };
|
|
2129
|
+
}
|
|
2130
|
+
|
|
2014
2131
|
// ─── Utilities ─────────────────────────────────────────────────────────────────
|
|
2015
2132
|
|
|
2016
2133
|
export function inferPaintType(
|
|
@@ -23,18 +23,30 @@ 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
|
|
|
29
31
|
type ScrubInputIcon = (props: { className?: string }) => ReactNode;
|
|
30
32
|
|
|
31
|
-
/** Cumulative pointer movement (px) required before a label pointerdown→move
|
|
32
|
-
* is treated as a scrub drag rather than jitter during a plain click. */
|
|
33
|
-
const DRAG_THRESHOLD_PX = 3;
|
|
34
|
-
|
|
35
33
|
export interface ScrubInputChangeMeta {
|
|
36
34
|
source: "commit" | "keyboard" | "scrub";
|
|
37
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";
|
|
38
50
|
}
|
|
39
51
|
|
|
40
52
|
export interface ScrubInputProps extends ScrubExpressionOptions {
|
|
@@ -89,10 +101,12 @@ export function ScrubInput({
|
|
|
89
101
|
const skipNextBlurCommitRef = useRef(false);
|
|
90
102
|
const dragRef = useRef({
|
|
91
103
|
pointerId: -1,
|
|
92
|
-
|
|
93
|
-
prevX: 0,
|
|
94
|
-
hasDragged: false,
|
|
104
|
+
drag: startScrubDrag(0),
|
|
95
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);
|
|
96
110
|
|
|
97
111
|
useEffect(() => {
|
|
98
112
|
if (!focused) {
|
|
@@ -113,6 +127,7 @@ export function ScrubInput({
|
|
|
113
127
|
const formatted = formatScrubValue(normalized, options);
|
|
114
128
|
draftRef.current = formatted;
|
|
115
129
|
setDraft(formatted);
|
|
130
|
+
return normalized;
|
|
116
131
|
};
|
|
117
132
|
|
|
118
133
|
const commitDraft = () => {
|
|
@@ -135,7 +150,11 @@ export function ScrubInput({
|
|
|
135
150
|
// when it equals the placeholder `value` prop (e.g. typing "0"): the
|
|
136
151
|
// selected objects hold differing values, so "no change" is meaningless.
|
|
137
152
|
if (parsed.value !== value || mixed) {
|
|
138
|
-
onChange(parsed.value, {
|
|
153
|
+
onChange(parsed.value, {
|
|
154
|
+
source: "commit",
|
|
155
|
+
expression: currentDraft,
|
|
156
|
+
phase: "commit",
|
|
157
|
+
});
|
|
139
158
|
}
|
|
140
159
|
};
|
|
141
160
|
|
|
@@ -165,6 +184,7 @@ export function ScrubInput({
|
|
|
165
184
|
const base = draftParsed ? draftParsed.value : value;
|
|
166
185
|
setNextValue(base + direction * baseStep * cmdMultiplier, {
|
|
167
186
|
source: "keyboard",
|
|
187
|
+
phase: "commit",
|
|
168
188
|
});
|
|
169
189
|
return;
|
|
170
190
|
}
|
|
@@ -192,9 +212,7 @@ export function ScrubInput({
|
|
|
192
212
|
event.preventDefault();
|
|
193
213
|
dragRef.current = {
|
|
194
214
|
pointerId: event.pointerId,
|
|
195
|
-
|
|
196
|
-
prevX: event.clientX,
|
|
197
|
-
hasDragged: false,
|
|
215
|
+
drag: startScrubDrag(event.clientX),
|
|
198
216
|
};
|
|
199
217
|
event.currentTarget.setPointerCapture(event.pointerId);
|
|
200
218
|
setDragging(true);
|
|
@@ -208,39 +226,44 @@ export function ScrubInput({
|
|
|
208
226
|
// without a committed drag focuses the input so the user can type an
|
|
209
227
|
// explicit value that then applies to all.
|
|
210
228
|
if (mixed) return;
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
//
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
// makes endDrag skip its "focus the input for typing" path even though
|
|
218
|
-
// the user only meant to click.
|
|
219
|
-
const cumulativeDelta = Math.abs(event.clientX - dragRef.current.startX);
|
|
220
|
-
if (!dragRef.current.hasDragged && cumulativeDelta < DRAG_THRESHOLD_PX) {
|
|
221
|
-
dragRef.current.prevX = event.clientX;
|
|
222
|
-
return;
|
|
223
|
-
}
|
|
224
|
-
dragRef.current.prevX = event.clientX;
|
|
225
|
-
dragRef.current.hasDragged = true;
|
|
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;
|
|
226
235
|
// Use incremental deltas from the last move so that clamped/rounded values
|
|
227
236
|
// committed by onChange are respected. A total-delta approach would create
|
|
228
237
|
// a dead zone equal to the amount dragged past the clamp boundary.
|
|
229
238
|
const next =
|
|
230
239
|
value +
|
|
231
|
-
|
|
240
|
+
tick.deltaX *
|
|
232
241
|
getScrubStepFromEvent(
|
|
233
242
|
{ altKey: event.altKey, shiftKey: event.shiftKey },
|
|
234
243
|
step,
|
|
235
244
|
);
|
|
236
|
-
setNextValue(next, {
|
|
245
|
+
lastScrubValueRef.current = setNextValue(next, {
|
|
246
|
+
source: "scrub",
|
|
247
|
+
phase: "preview",
|
|
248
|
+
});
|
|
237
249
|
};
|
|
238
250
|
|
|
239
251
|
const endDrag = (event: PointerEvent<HTMLLabelElement>) => {
|
|
240
252
|
if (dragRef.current.pointerId !== event.pointerId) return;
|
|
241
253
|
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
242
|
-
const wasDrag = dragRef.current.hasDragged;
|
|
254
|
+
const wasDrag = dragRef.current.drag.hasDragged;
|
|
243
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
|
+
}
|
|
244
267
|
// If the pointer was released without dragging (a plain click), focus the
|
|
245
268
|
// input so the user can type immediately — mirrors the design editor's label click
|
|
246
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;
|