@agent-native/core 0.85.6 → 0.86.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +130 -1
- package/corpus/core/README.md +0 -11
- package/corpus/core/docs/content/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/ar-SA/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/ar-SA/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/ar-SA/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/ar-SA/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/ar-SA/workspace-connections.mdx +11 -11
- package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/de-DE/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/de-DE/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/de-DE/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/de-DE/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/de-DE/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/es-ES/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/es-ES/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/es-ES/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/es-ES/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/fr-FR/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/fr-FR/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/fr-FR/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/fr-FR/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/hi-IN/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/hi-IN/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/hi-IN/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/hi-IN/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/ja-JP/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/ja-JP/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/ja-JP/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/ja-JP/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/ko-KR/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/ko-KR/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/ko-KR/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/ko-KR/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/pt-BR/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/pt-BR/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/pt-BR/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/pt-BR/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/zh-CN/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/zh-CN/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/zh-CN/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/zh-CN/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/zh-TW/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/zh-TW/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/zh-TW/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/zh-TW/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/plan-plugin.mdx +12 -11
- package/corpus/core/docs/content/sharing.mdx +1 -2
- package/corpus/core/docs/content/skills-guide.mdx +4 -3
- package/corpus/core/docs/content/template-plan.mdx +37 -6
- package/corpus/core/docs/content/tracking.mdx +1 -1
- package/corpus/core/docs/content/workspace-connections.mdx +1 -1
- package/corpus/core/package.json +6 -6
- package/corpus/core/src/agent/run-store.ts +1 -1
- package/corpus/core/src/chat-threads/store.ts +73 -11
- package/corpus/core/src/checkpoints/store.ts +13 -2
- package/corpus/core/src/cli/create.ts +3 -4
- package/corpus/core/src/cli/design-connect.ts +469 -9
- package/corpus/core/src/cli/index.ts +13 -0
- package/corpus/core/src/cli/plan-local.ts +281 -24
- package/corpus/core/src/cli/skills.ts +177 -21
- package/corpus/core/src/cli/templates-meta.ts +0 -13
- package/corpus/core/src/cli/visualize-repo.ts +715 -0
- package/corpus/core/src/client/AssistantChat.tsx +126 -17
- package/corpus/core/src/client/agent-chat-adapter.ts +6 -5
- package/corpus/core/src/client/app-providers.tsx +2 -2
- package/corpus/core/src/client/collab/index.ts +31 -0
- package/corpus/core/src/client/components/LiveCursorOverlay.tsx +16 -1
- package/corpus/core/src/client/components/PresenceBar.tsx +14 -1
- package/corpus/core/src/client/components/RecentEditHighlights.tsx +219 -0
- package/corpus/core/src/client/components/RemoteSelectionRings.tsx +40 -6
- package/corpus/core/src/client/index.ts +48 -0
- package/corpus/core/src/client/org/OrgSwitcher.tsx +0 -4
- package/corpus/core/src/client/rich-markdown-editor/SharedRichEditor.tsx +49 -32
- package/corpus/core/src/client/rich-markdown-editor/index.ts +6 -0
- package/corpus/core/src/client/rich-markdown-editor/surgical-apply.ts +192 -0
- package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +59 -8
- package/corpus/core/src/client/session-replay.ts +181 -15
- package/corpus/core/src/client/sse-event-processor.ts +90 -1
- package/corpus/core/src/client/use-action.ts +123 -25
- package/corpus/core/src/client/use-agent-engine-configured.ts +7 -1
- package/corpus/core/src/client/use-chat-threads.ts +18 -7
- package/corpus/core/src/client/use-db-sync.ts +104 -19
- package/corpus/core/src/client/use-pinch-zoom.ts +76 -11
- package/corpus/core/src/client/visual-style-controls.tsx +475 -0
- package/corpus/core/src/collab/agent-presence.ts +191 -62
- package/corpus/core/src/collab/awareness.ts +83 -6
- package/corpus/core/src/collab/client.ts +89 -146
- package/corpus/core/src/collab/index.ts +34 -0
- package/corpus/core/src/collab/presence.ts +63 -3
- package/corpus/core/src/collab/recent-edits.ts +171 -0
- package/corpus/core/src/collab/undo.ts +432 -0
- package/corpus/core/src/collab/ydoc-manager.ts +68 -0
- package/corpus/core/src/connections/catalog.ts +2 -3
- package/corpus/core/src/db/create-get-db.ts +86 -1
- package/corpus/core/src/db/ensure-additive-columns.ts +430 -0
- package/corpus/core/src/db/index.ts +6 -0
- package/corpus/core/src/db/migrations.ts +236 -35
- package/corpus/core/src/jobs/scheduler.ts +17 -14
- package/corpus/core/src/observability/traces.ts +182 -1
- package/corpus/core/src/org/context.ts +79 -2
- package/corpus/core/src/server/agent-chat-plugin.ts +10 -6
- package/corpus/core/src/server/auth-marketing.ts +0 -11
- package/corpus/core/src/server/auth.ts +11 -4
- package/corpus/core/src/server/collab-plugin.ts +56 -13
- package/corpus/core/src/server/design-token-utils.ts +1 -1
- package/corpus/core/src/server/fusion-app.ts +447 -0
- package/corpus/core/src/server/index.ts +13 -0
- package/corpus/core/src/server/onboarding-html.ts +3 -4
- package/corpus/core/src/server/poll-events.ts +14 -2
- package/corpus/core/src/server/poll.ts +219 -12
- package/corpus/core/src/server/schema-prompt.ts +28 -9
- package/corpus/core/src/settings/store.ts +33 -2
- package/corpus/core/src/sharing/actions/set-resource-visibility.ts +2 -0
- package/corpus/core/src/sharing/actions/share-resource.ts +3 -0
- package/corpus/core/src/sharing/actions/unshare-resource.ts +2 -0
- package/corpus/core/src/styles/agent-native.css +0 -5
- package/corpus/core/src/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/core/src/templates/default/package.json +3 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
- package/corpus/core/src/tracking/providers.ts +22 -1
- package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +20 -5
- package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/analytics/AGENTS.md +33 -6
- package/corpus/templates/analytics/actions/navigate.ts +14 -4
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
- package/corpus/templates/analytics/actions/view-screen.ts +57 -0
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +23 -1
- package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -0
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +21 -0
- package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +7 -0
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +15 -1
- package/corpus/templates/analytics/app/i18n-data.ts +151 -10
- package/corpus/templates/analytics/app/pages/Agents.tsx +118 -0
- package/corpus/templates/analytics/app/pages/DataSources.tsx +11 -1
- package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +76 -40
- package/corpus/templates/analytics/app/pages/sessions/session-replay-devtools.ts +5 -0
- package/corpus/templates/analytics/app/routes/agents.tsx +10 -0
- package/corpus/templates/analytics/changelog/2026-07-03-agent-admin-tools-page.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-03-agent-llm-observability-dashboard.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-03-session-recordings-now-include-response-bodies-for-5xx-error.md +6 -0
- package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +34 -0
- package/corpus/templates/analytics/docs/schemas/tracked-events.md +6 -0
- package/corpus/templates/analytics/package.json +3 -3
- package/corpus/templates/analytics/seeds/dashboards/agent-observability-llm.json +173 -0
- package/corpus/templates/analytics/server/jobs/analytics-alerts.ts +23 -5
- package/corpus/templates/analytics/server/lib/analytics-alerts.ts +58 -13
- package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +23 -0
- package/corpus/templates/analytics/server/lib/dashboard-seeds.ts +5 -0
- package/corpus/templates/analytics/server/lib/session-replay-agent-context.ts +120 -8
- package/corpus/templates/analytics/server/lib/session-replay.ts +3 -2
- package/corpus/templates/analytics/server/plugins/db.ts +93 -2
- package/corpus/templates/analytics/server/routes/api/session-replay/agent-diagnostics.json.get.ts +45 -1
- package/corpus/templates/analytics/shared/session-replay-diagnostics.ts +10 -0
- package/corpus/templates/assets/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/assets/package.json +3 -3
- package/corpus/templates/assets/server/plugins/db.ts +63 -2
- package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/brain/package.json +3 -3
- package/corpus/templates/brain/server/plugins/db.ts +75 -2
- package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/calendar/package.json +3 -3
- package/corpus/templates/calendar/server/plugins/db.ts +64 -2
- package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/chat/package.json +3 -3
- package/corpus/templates/clips/actions/finalize-recording.ts +50 -40
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +8 -6
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +3 -3
- package/corpus/templates/clips/changelog/2026-07-03-mobile-recording-pages-keep-videos-in-a-16-9-player-with-act.md +6 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +245 -77
- package/corpus/templates/clips/package.json +3 -3
- package/corpus/templates/clips/server/lib/recording-upload-state.ts +56 -0
- package/corpus/templates/clips/server/plugins/db.ts +68 -1
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +27 -3
- package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/content/actions/edit-document.ts +48 -1
- package/corpus/templates/content/actions/list-documents.ts +101 -94
- package/corpus/templates/content/actions/search-documents.ts +19 -3
- package/corpus/templates/content/actions/update-document.ts +54 -1
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +127 -7
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +97 -2
- package/corpus/templates/content/changelog/2026-07-03-agent-document-edits-now-appear-as-a-live-collaborator-prese.md +6 -0
- package/corpus/templates/content/changelog/2026-07-03-document-search-and-list-views-load-faster-on-large-workspac.md +6 -0
- package/corpus/templates/content/package.json +3 -3
- package/corpus/templates/content/server/plugins/db.ts +57 -1
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +190 -13
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +16 -4
- package/corpus/templates/design/.agents/skills/export-handoff/SKILL.md +46 -3
- package/corpus/templates/design/.agents/skills/full-app-build/SKILL.md +140 -0
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +20 -0
- package/corpus/templates/design/AGENTS.md +83 -13
- package/corpus/templates/design/actions/add-fusion-screens.ts +91 -0
- package/corpus/templates/design/actions/apply-a11y-fix.ts +5 -1
- package/corpus/templates/design/actions/apply-component-prop-edit.ts +24 -69
- package/corpus/templates/design/actions/apply-fusion-edits.ts +161 -0
- package/corpus/templates/design/actions/apply-motion-edit.ts +29 -2
- package/corpus/templates/design/actions/apply-visual-edit.ts +38 -3
- package/corpus/templates/design/actions/connect-localhost.ts +25 -18
- package/corpus/templates/design/actions/create-component.ts +5 -1
- package/corpus/templates/design/actions/create-fusion-app.ts +202 -0
- package/corpus/templates/design/actions/deploy-fusion-app.ts +123 -0
- package/corpus/templates/design/actions/edit-design.ts +13 -16
- package/corpus/templates/design/actions/export-pdf.ts +8 -1
- package/corpus/templates/design/actions/export-zip.ts +10 -1
- package/corpus/templates/design/actions/get-fusion-deploy-status.ts +86 -0
- package/corpus/templates/design/actions/get-motion-timeline.ts +26 -20
- package/corpus/templates/design/actions/grant-localhost-write-consent.ts +10 -0
- package/corpus/templates/design/actions/insert-asset.ts +190 -7
- package/corpus/templates/design/actions/list-fusion-edits.ts +96 -0
- package/corpus/templates/design/actions/list-local-files.ts +133 -0
- package/corpus/templates/design/actions/open-visual-edit.ts +27 -5
- package/corpus/templates/design/actions/present-design-variants.ts +2 -2
- package/corpus/templates/design/actions/push-fusion-app.ts +62 -0
- package/corpus/templates/design/actions/queue-fusion-edit.ts +112 -0
- package/corpus/templates/design/actions/read-local-file.ts +139 -0
- package/corpus/templates/design/actions/revoke-localhost-write-consent.ts +18 -14
- package/corpus/templates/design/actions/run-design-audit.ts +7 -4
- package/corpus/templates/design/actions/send-fusion-message.ts +69 -0
- package/corpus/templates/design/actions/sync-fusion-app.ts +196 -0
- package/corpus/templates/design/actions/write-local-file.ts +162 -36
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +12 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +600 -66
- package/corpus/templates/design/app/components/design/EditPanel.tsx +793 -304
- package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +328 -0
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +671 -154
- package/corpus/templates/design/app/components/design/LocalhostWriteConsentDialog.tsx +1 -1
- package/corpus/templates/design/app/components/design/MotionDock.tsx +234 -46
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +2070 -420
- package/corpus/templates/design/app/components/design/StatesPanel.tsx +25 -2
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +7 -98
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +640 -72
- package/corpus/templates/design/app/components/design/bridge/motion-preview.bridge.ts +605 -0
- package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +50 -26
- package/corpus/templates/design/app/components/design/code-workbench/ActivityBar.tsx +85 -0
- package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +466 -0
- package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +53 -0
- package/corpus/templates/design/app/components/design/code-workbench/commands.ts +339 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/Breadcrumbs.tsx +42 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/BufferSync.tsx +128 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/EditorTabs.tsx +363 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/MonacoHost.tsx +268 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/StatusBar.tsx +208 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-setup.ts +61 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-theme-palette.ts +191 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-theme.ts +29 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/status-bar-lang.ts +21 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/tab-drag.ts +27 -0
- package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +155 -0
- package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +551 -0
- package/corpus/templates/design/app/components/design/code-workbench/explorer/file-icons.tsx +115 -0
- package/corpus/templates/design/app/components/design/code-workbench/format/format-on-open.ts +65 -0
- package/corpus/templates/design/app/components/design/code-workbench/format/prettier-format.ts +182 -0
- package/corpus/templates/design/app/components/design/code-workbench/model-registry.ts +133 -0
- package/corpus/templates/design/app/components/design/code-workbench/quickinput/QuickInput.tsx +563 -0
- package/corpus/templates/design/app/components/design/code-workbench/quickinput/fuzzy.ts +170 -0
- package/corpus/templates/design/app/components/design/code-workbench/search/SearchView.tsx +508 -0
- package/corpus/templates/design/app/components/design/code-workbench/search/search-engine.ts +280 -0
- package/corpus/templates/design/app/components/design/code-workbench/store.tsx +734 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/create-providers.ts +39 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/inline-provider.ts +196 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/localhost-provider.ts +177 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/tree.ts +110 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/types.ts +103 -0
- package/corpus/templates/design/app/components/design/code-workbench-theme.ts +68 -0
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +16 -4
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +217 -113
- package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +111 -5
- package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +13 -2
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +79 -16
- package/corpus/templates/design/app/components/design/inspector/index.ts +9 -0
- package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +67 -2
- package/corpus/templates/design/app/components/design/types.ts +16 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +80 -1
- package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +24 -6
- package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +15 -1
- package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +6 -16
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +77 -0
- package/corpus/templates/design/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/design/app/i18n-data.ts +31 -0
- package/corpus/templates/design/app/lib/design-import.ts +95 -0
- package/corpus/templates/design/app/pages/DesignEditor.tsx +5586 -1112
- package/corpus/templates/design/app/pages/Index.tsx +90 -17
- package/corpus/templates/design/changelog/2026-07-03-canvas-interactions-now-match-figma-rotation-aware-resizing-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-inspector-fixes-mixed-selections-show-mixed-instead-of-wrong.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-keyframe-timeline-works-reliably-drag-keyframes-smoothly-pic.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-layers-panel-matches-figma-top-layer-on-top-drag-with-auto-s.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-much-faster-editor-smooth-dragging-zooming-and-panel-updates.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-pen-tool-refinements-click-the-first-point-to-close-with-a-d.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-text-editing-enter-adds-a-line-break-international-ime-typin.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-the-ai-now-edits-like-a-collaborator-on-canvas-its-cursor-gl.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-the-code-panel-is-now-a-full-vs-code-style-editor-with-a-fil.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-undo-and-redo-are-dependable-across-agent-edits-screen-switc.md +6 -0
- package/corpus/templates/design/package.json +4 -3
- package/corpus/templates/design/server/db/schema.ts +31 -0
- package/corpus/templates/design/server/lib/design-export.ts +43 -1
- package/corpus/templates/design/server/lib/fusion-screens.ts +246 -0
- package/corpus/templates/design/server/plugins/db.ts +89 -2
- package/corpus/templates/design/shared/board-file.ts +25 -5
- package/corpus/templates/design/shared/canvas-math.ts +754 -9
- package/corpus/templates/design/shared/code-layer.ts +304 -26
- package/corpus/templates/design/shared/collab-selection.ts +52 -0
- package/corpus/templates/design/shared/color-utils.ts +84 -0
- package/corpus/templates/design/shared/design-source-capabilities.ts +16 -7
- package/corpus/templates/design/shared/full-app.ts +126 -0
- package/corpus/templates/design/shared/motion-compiler.ts +75 -31
- package/corpus/templates/design/shared/motion-timeline.ts +335 -0
- package/corpus/templates/design/shared/pen-path.ts +496 -23
- package/corpus/templates/dispatch/package.json +3 -3
- package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/forms/package.json +3 -3
- package/corpus/templates/forms/server/plugins/db.ts +62 -2
- package/corpus/templates/macros/package.json +3 -3
- package/corpus/templates/macros/server/plugins/db.ts +63 -2
- package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/mail/package.json +3 -3
- package/corpus/templates/mail/server/lib/contact-frequency.ts +42 -15
- package/corpus/templates/mail/server/plugins/db.ts +63 -2
- package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +9 -3
- package/corpus/templates/plan/.agents/skills/visualize-repo/SKILL.md +92 -0
- package/corpus/templates/plan/actions/export-visual-plan.ts +5 -0
- package/corpus/templates/plan/actions/get-local-plan-folder.ts +4 -22
- package/corpus/templates/plan/actions/get-plan-version.ts +6 -16
- package/corpus/templates/plan/actions/list-plan-versions.ts +48 -20
- package/corpus/templates/plan/actions/patch-visual-plan-source.ts +41 -1
- package/corpus/templates/plan/actions/promote-local-plan-folder.ts +4 -22
- package/corpus/templates/plan/actions/update-local-plan-comments.ts +4 -2
- package/corpus/templates/plan/actions/update-local-plan-folder.ts +4 -22
- package/corpus/templates/plan/actions/update-visual-plan.ts +60 -1
- package/corpus/templates/plan/agent-native.app-skill.json +10 -0
- package/corpus/templates/plan/app/components/editor/PlanDocumentEditor.tsx +138 -39
- package/corpus/templates/plan/app/components/editor/usePlanUndoStack.ts +165 -23
- package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +80 -4
- package/corpus/templates/plan/app/global.css +11 -9
- package/corpus/templates/plan/app/hooks/use-navigation-state.ts +10 -1
- package/corpus/templates/plan/app/hooks/use-plan-presence.ts +66 -0
- package/corpus/templates/plan/app/pages/PlansPage.tsx +215 -63
- package/corpus/templates/plan/changelog/2026-07-03-local-visual-plans-and-recaps-can-save-comments-without-sign.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-03-plan-tabs-render-nested-text-instead-of-raw-json.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-03-plans-are-now-fully-real-time-collaborative-multiple-people-.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-03-plans-open-and-refresh-faster-especially-long-lived-plans-wi.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-03-undo-now-survives-agent-edits-cmd-z-keeps-working-on-your-ow.md +6 -0
- package/corpus/templates/plan/package.json +5 -3
- package/corpus/templates/plan/server/db/schema.ts +12 -0
- package/corpus/templates/plan/server/lib/local-plan-kind.ts +25 -0
- package/corpus/templates/plan/server/lib/plan-versions.ts +83 -1
- package/corpus/templates/plan/server/lib/public-action-paths.ts +0 -2
- package/corpus/templates/plan/server/plans.ts +26 -3
- package/corpus/templates/plan/server/plugins/db.ts +105 -2
- package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +8 -4
- package/corpus/templates/slides/AGENTS.md +4 -0
- package/corpus/templates/slides/actions/_agent-presence.ts +48 -0
- package/corpus/templates/slides/actions/add-slide.ts +16 -18
- package/corpus/templates/slides/actions/patch-deck.ts +4 -2
- package/corpus/templates/slides/actions/update-slide.ts +114 -77
- package/corpus/templates/slides/actions/view-screen.ts +39 -0
- package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +47 -3
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +32 -35
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +625 -199
- package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +342 -0
- package/corpus/templates/slides/app/components/editor/TweaksPanel.tsx +46 -96
- package/corpus/templates/slides/app/components/visual-editor/SaveStatusIndicator.tsx +8 -1
- package/corpus/templates/slides/app/context/DeckContext.tsx +589 -176
- package/corpus/templates/slides/app/hooks/use-deck-presence.ts +84 -42
- package/corpus/templates/slides/app/i18n/ar-SA.ts +46 -0
- package/corpus/templates/slides/app/i18n/de-DE.ts +46 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +46 -0
- package/corpus/templates/slides/app/i18n/es-ES.ts +46 -0
- package/corpus/templates/slides/app/i18n/fr-FR.ts +46 -0
- package/corpus/templates/slides/app/i18n/hi-IN.ts +46 -0
- package/corpus/templates/slides/app/i18n/ja-JP.ts +46 -0
- package/corpus/templates/slides/app/i18n/ko-KR.ts +46 -0
- package/corpus/templates/slides/app/i18n/pt-BR.ts +46 -0
- package/corpus/templates/slides/app/i18n/zh-CN.ts +46 -0
- package/corpus/templates/slides/app/i18n/zh-TW.ts +46 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +25 -13
- package/corpus/templates/slides/changelog/2026-07-03-figma-style-slide-editing.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-03-see-the-ai-working-with-you-when-the-agent-edits-a-slide-it-.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-03-undo-redo-is-now-precise-and-safe-with-collaborators-it-only.md +6 -0
- package/corpus/templates/slides/package.json +3 -3
- package/corpus/templates/slides/server/handlers/decks.ts +31 -3
- package/corpus/templates/slides/server/plugins/db.ts +65 -2
- package/corpus/templates/videos/netlify.toml +1 -12
- package/dist/agent/run-store.js +1 -1
- package/dist/agent/run-store.js.map +1 -1
- package/dist/chat-threads/store.d.ts +9 -1
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +63 -11
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/checkpoints/store.d.ts.map +1 -1
- package/dist/checkpoints/store.js +10 -2
- package/dist/checkpoints/store.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +3 -5
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/design-connect.d.ts +49 -1
- package/dist/cli/design-connect.d.ts.map +1 -1
- package/dist/cli/design-connect.js +414 -9
- package/dist/cli/design-connect.js.map +1 -1
- package/dist/cli/index.js +12 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/plan-local.d.ts +24 -0
- package/dist/cli/plan-local.d.ts.map +1 -1
- package/dist/cli/plan-local.js +188 -20
- package/dist/cli/plan-local.js.map +1 -1
- package/dist/cli/skills.d.ts +3 -1
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +173 -21
- package/dist/cli/skills.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +0 -14
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/cli/visualize-repo.d.ts +49 -0
- package/dist/cli/visualize-repo.d.ts.map +1 -0
- package/dist/cli/visualize-repo.js +561 -0
- package/dist/cli/visualize-repo.js.map +1 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +120 -15
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +6 -5
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/app-providers.d.ts +2 -2
- package/dist/client/app-providers.js.map +1 -1
- package/dist/client/collab/index.d.ts +4 -1
- package/dist/client/collab/index.d.ts.map +1 -1
- package/dist/client/collab/index.js +3 -0
- package/dist/client/collab/index.js.map +1 -1
- package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
- package/dist/client/components/LiveCursorOverlay.js +11 -3
- package/dist/client/components/LiveCursorOverlay.js.map +1 -1
- package/dist/client/components/PresenceBar.d.ts.map +1 -1
- package/dist/client/components/PresenceBar.js +6 -1
- package/dist/client/components/PresenceBar.js.map +1 -1
- package/dist/client/components/RecentEditHighlights.d.ts +43 -0
- package/dist/client/components/RecentEditHighlights.d.ts.map +1 -0
- package/dist/client/components/RecentEditHighlights.js +146 -0
- package/dist/client/components/RecentEditHighlights.js.map +1 -0
- package/dist/client/components/RemoteSelectionRings.d.ts +9 -0
- package/dist/client/components/RemoteSelectionRings.d.ts.map +1 -1
- package/dist/client/components/RemoteSelectionRings.js +22 -8
- package/dist/client/components/RemoteSelectionRings.js.map +1 -1
- package/dist/client/index.d.ts +6 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +7 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +1 -3
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +8 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.js +8 -2
- package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
- package/dist/client/rich-markdown-editor/index.d.ts +1 -0
- package/dist/client/rich-markdown-editor/index.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/index.js +1 -0
- package/dist/client/rich-markdown-editor/index.js.map +1 -1
- package/dist/client/rich-markdown-editor/surgical-apply.d.ts +66 -0
- package/dist/client/rich-markdown-editor/surgical-apply.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/surgical-apply.js +147 -0
- package/dist/client/rich-markdown-editor/surgical-apply.js.map +1 -0
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts +18 -2
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/useCollabReconcile.js +39 -8
- package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
- package/dist/client/session-replay.d.ts +10 -1
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +134 -7
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +81 -1
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/use-action.d.ts +24 -0
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +109 -27
- package/dist/client/use-action.js.map +1 -1
- package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
- package/dist/client/use-agent-engine-configured.js +7 -1
- package/dist/client/use-agent-engine-configured.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +11 -3
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/client/use-db-sync.d.ts +36 -0
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +68 -12
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/client/use-pinch-zoom.d.ts.map +1 -1
- package/dist/client/use-pinch-zoom.js +76 -11
- package/dist/client/use-pinch-zoom.js.map +1 -1
- package/dist/client/visual-style-controls.d.ts +79 -0
- package/dist/client/visual-style-controls.d.ts.map +1 -0
- package/dist/client/visual-style-controls.js +150 -0
- package/dist/client/visual-style-controls.js.map +1 -0
- package/dist/collab/agent-presence.d.ts +51 -5
- package/dist/collab/agent-presence.d.ts.map +1 -1
- package/dist/collab/agent-presence.js +144 -58
- package/dist/collab/agent-presence.js.map +1 -1
- package/dist/collab/awareness-store.d.ts +32 -0
- package/dist/collab/awareness-store.d.ts.map +1 -0
- package/dist/collab/awareness-store.js +0 -0
- package/dist/collab/awareness-store.js.map +1 -0
- package/dist/collab/awareness.d.ts +14 -3
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/awareness.js +53 -5
- package/dist/collab/awareness.js.map +1 -1
- package/dist/collab/client.d.ts +2 -0
- package/dist/collab/client.d.ts.map +1 -1
- package/dist/collab/client.js +79 -119
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/index.d.ts +3 -1
- package/dist/collab/index.d.ts.map +1 -1
- package/dist/collab/index.js +5 -1
- package/dist/collab/index.js.map +1 -1
- package/dist/collab/presence.d.ts.map +1 -1
- package/dist/collab/presence.js +54 -3
- package/dist/collab/presence.js.map +1 -1
- package/dist/collab/recent-edits.d.ts +87 -0
- package/dist/collab/recent-edits.d.ts.map +1 -0
- package/dist/collab/recent-edits.js +116 -0
- package/dist/collab/recent-edits.js.map +1 -0
- package/dist/collab/undo.d.ts +121 -0
- package/dist/collab/undo.d.ts.map +1 -0
- package/dist/collab/undo.js +244 -0
- package/dist/collab/undo.js.map +1 -0
- package/dist/collab/ydoc-manager.d.ts +10 -0
- package/dist/collab/ydoc-manager.d.ts.map +1 -1
- package/dist/collab/ydoc-manager.js +57 -0
- package/dist/collab/ydoc-manager.js.map +1 -1
- package/dist/connections/catalog.d.ts +2 -2
- package/dist/connections/catalog.d.ts.map +1 -1
- package/dist/connections/catalog.js +1 -1
- package/dist/connections/catalog.js.map +1 -1
- package/dist/db/create-get-db.d.ts +22 -0
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +73 -1
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/db/ensure-additive-columns.d.ts +93 -0
- package/dist/db/ensure-additive-columns.d.ts.map +1 -0
- package/dist/db/ensure-additive-columns.js +355 -0
- package/dist/db/ensure-additive-columns.js.map +1 -0
- package/dist/db/index.d.ts +1 -0
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +1 -0
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrations.d.ts +70 -0
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +196 -33
- package/dist/db/migrations.js.map +1 -1
- package/dist/jobs/scheduler.js +17 -10
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +5 -5
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js +155 -1
- package/dist/observability/traces.js.map +1 -1
- package/dist/org/context.d.ts +7 -0
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +54 -2
- package/dist/org/context.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/secrets/routes.d.ts +6 -6
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +10 -6
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/auth-marketing.d.ts.map +1 -1
- package/dist/server/auth-marketing.js +0 -10
- package/dist/server/auth-marketing.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +6 -4
- package/dist/server/auth.js.map +1 -1
- package/dist/server/collab-plugin.d.ts.map +1 -1
- package/dist/server/collab-plugin.js +45 -13
- package/dist/server/collab-plugin.js.map +1 -1
- package/dist/server/design-token-utils.d.ts +1 -1
- package/dist/server/design-token-utils.js +1 -1
- package/dist/server/design-token-utils.js.map +1 -1
- package/dist/server/fusion-app.d.ts +107 -0
- package/dist/server/fusion-app.d.ts.map +1 -0
- package/dist/server/fusion-app.js +371 -0
- package/dist/server/fusion-app.js.map +1 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +3 -4
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/poll-events.d.ts +2 -0
- package/dist/server/poll-events.d.ts.map +1 -1
- package/dist/server/poll-events.js +7 -2
- package/dist/server/poll-events.js.map +1 -1
- package/dist/server/poll.d.ts +47 -3
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +176 -10
- package/dist/server/poll.js.map +1 -1
- package/dist/server/schema-prompt.d.ts.map +1 -1
- package/dist/server/schema-prompt.js +24 -7
- package/dist/server/schema-prompt.js.map +1 -1
- package/dist/settings/store.d.ts.map +1 -1
- package/dist/settings/store.js +32 -3
- package/dist/settings/store.js.map +1 -1
- package/dist/sharing/actions/set-resource-visibility.js +2 -0
- package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
- package/dist/sharing/actions/share-resource.d.ts.map +1 -1
- package/dist/sharing/actions/share-resource.js +3 -0
- package/dist/sharing/actions/share-resource.js.map +1 -1
- package/dist/sharing/actions/unshare-resource.js +2 -0
- package/dist/sharing/actions/unshare-resource.js.map +1 -1
- package/dist/styles/agent-native.css +0 -5
- package/dist/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/dist/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
- package/dist/templates/default/package.json +3 -3
- package/dist/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
- package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
- package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
- package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
- package/dist/tracking/providers.d.ts.map +1 -1
- package/dist/tracking/providers.js +17 -1
- package/dist/tracking/providers.js.map +1 -1
- package/docs/content/cloneable-saas.mdx +0 -1
- package/docs/content/locales/ar-SA/cloneable-saas.mdx +0 -1
- package/docs/content/locales/ar-SA/plan-plugin.mdx +10 -9
- package/docs/content/locales/ar-SA/sharing.mdx +1 -2
- package/docs/content/locales/ar-SA/skills-guide.mdx +2 -3
- package/docs/content/locales/ar-SA/template-plan.mdx +23 -7
- package/docs/content/locales/ar-SA/tracking.mdx +1 -1
- package/docs/content/locales/ar-SA/workspace-connections.mdx +11 -11
- package/docs/content/locales/de-DE/cloneable-saas.mdx +0 -1
- package/docs/content/locales/de-DE/plan-plugin.mdx +10 -9
- package/docs/content/locales/de-DE/sharing.mdx +1 -2
- package/docs/content/locales/de-DE/skills-guide.mdx +2 -3
- package/docs/content/locales/de-DE/template-plan.mdx +23 -7
- package/docs/content/locales/de-DE/tracking.mdx +1 -1
- package/docs/content/locales/de-DE/workspace-connections.mdx +1 -1
- package/docs/content/locales/es-ES/cloneable-saas.mdx +0 -1
- package/docs/content/locales/es-ES/plan-plugin.mdx +10 -9
- package/docs/content/locales/es-ES/sharing.mdx +1 -2
- package/docs/content/locales/es-ES/skills-guide.mdx +2 -3
- package/docs/content/locales/es-ES/template-plan.mdx +23 -7
- package/docs/content/locales/es-ES/tracking.mdx +1 -1
- package/docs/content/locales/es-ES/workspace-connections.mdx +1 -1
- package/docs/content/locales/fr-FR/cloneable-saas.mdx +0 -1
- package/docs/content/locales/fr-FR/plan-plugin.mdx +10 -9
- package/docs/content/locales/fr-FR/sharing.mdx +1 -2
- package/docs/content/locales/fr-FR/skills-guide.mdx +2 -3
- package/docs/content/locales/fr-FR/template-plan.mdx +23 -7
- package/docs/content/locales/fr-FR/tracking.mdx +1 -1
- package/docs/content/locales/fr-FR/workspace-connections.mdx +1 -1
- package/docs/content/locales/hi-IN/cloneable-saas.mdx +0 -1
- package/docs/content/locales/hi-IN/plan-plugin.mdx +10 -9
- package/docs/content/locales/hi-IN/sharing.mdx +1 -2
- package/docs/content/locales/hi-IN/skills-guide.mdx +2 -3
- package/docs/content/locales/hi-IN/template-plan.mdx +23 -7
- package/docs/content/locales/hi-IN/tracking.mdx +1 -1
- package/docs/content/locales/hi-IN/workspace-connections.mdx +1 -1
- package/docs/content/locales/ja-JP/cloneable-saas.mdx +0 -1
- package/docs/content/locales/ja-JP/plan-plugin.mdx +10 -9
- package/docs/content/locales/ja-JP/sharing.mdx +1 -2
- package/docs/content/locales/ja-JP/skills-guide.mdx +2 -3
- package/docs/content/locales/ja-JP/template-plan.mdx +23 -7
- package/docs/content/locales/ja-JP/tracking.mdx +1 -1
- package/docs/content/locales/ja-JP/workspace-connections.mdx +1 -1
- package/docs/content/locales/ko-KR/cloneable-saas.mdx +0 -1
- package/docs/content/locales/ko-KR/plan-plugin.mdx +10 -9
- package/docs/content/locales/ko-KR/sharing.mdx +1 -2
- package/docs/content/locales/ko-KR/skills-guide.mdx +2 -3
- package/docs/content/locales/ko-KR/template-plan.mdx +23 -7
- package/docs/content/locales/ko-KR/tracking.mdx +1 -1
- package/docs/content/locales/ko-KR/workspace-connections.mdx +1 -1
- package/docs/content/locales/pt-BR/cloneable-saas.mdx +0 -1
- package/docs/content/locales/pt-BR/plan-plugin.mdx +10 -9
- package/docs/content/locales/pt-BR/sharing.mdx +1 -2
- package/docs/content/locales/pt-BR/skills-guide.mdx +2 -3
- package/docs/content/locales/pt-BR/template-plan.mdx +23 -7
- package/docs/content/locales/pt-BR/tracking.mdx +1 -1
- package/docs/content/locales/pt-BR/workspace-connections.mdx +1 -1
- package/docs/content/locales/zh-CN/cloneable-saas.mdx +0 -1
- package/docs/content/locales/zh-CN/plan-plugin.mdx +10 -9
- package/docs/content/locales/zh-CN/sharing.mdx +1 -2
- package/docs/content/locales/zh-CN/skills-guide.mdx +2 -3
- package/docs/content/locales/zh-CN/template-plan.mdx +23 -7
- package/docs/content/locales/zh-CN/tracking.mdx +1 -1
- package/docs/content/locales/zh-CN/workspace-connections.mdx +1 -1
- package/docs/content/locales/zh-TW/cloneable-saas.mdx +0 -1
- package/docs/content/locales/zh-TW/plan-plugin.mdx +10 -9
- package/docs/content/locales/zh-TW/sharing.mdx +1 -2
- package/docs/content/locales/zh-TW/skills-guide.mdx +2 -3
- package/docs/content/locales/zh-TW/template-plan.mdx +23 -7
- package/docs/content/locales/zh-TW/tracking.mdx +1 -1
- package/docs/content/locales/zh-TW/workspace-connections.mdx +1 -1
- package/docs/content/plan-plugin.mdx +12 -11
- package/docs/content/sharing.mdx +1 -2
- package/docs/content/skills-guide.mdx +4 -3
- package/docs/content/template-plan.mdx +37 -6
- package/docs/content/tracking.mdx +1 -1
- package/docs/content/workspace-connections.mdx +1 -1
- package/package.json +6 -6
- package/src/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/src/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
- package/src/templates/default/package.json +3 -3
- package/src/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
- package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
- package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
- package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
- package/corpus/core/docs/content/locales/ar-SA/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/de-DE/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/es-ES/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/fr-FR/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/hi-IN/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/ja-JP/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/ko-KR/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/pt-BR/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/zh-CN/template-videos.mdx +0 -334
- package/corpus/core/docs/content/locales/zh-TW/template-videos.mdx +0 -334
- package/corpus/core/docs/content/template-videos.mdx +0 -332
- package/corpus/templates/design/app/components/design/CodeWorkbenchHost.tsx +0 -697
- package/corpus/templates/slides/app/components/editor/CodeEditor.tsx +0 -49
- package/corpus/templates/videos/.agents/skills/actions/SKILL.md +0 -432
- package/corpus/templates/videos/.agents/skills/animation-tracks/SKILL.md +0 -99
- package/corpus/templates/videos/.agents/skills/capture-learnings/SKILL.md +0 -76
- package/corpus/templates/videos/.agents/skills/composition-management/SKILL.md +0 -106
- package/corpus/templates/videos/.agents/skills/create-skill/SKILL.md +0 -221
- package/corpus/templates/videos/.agents/skills/delegate-to-agent/SKILL.md +0 -263
- package/corpus/templates/videos/.agents/skills/frontend-design/SKILL.md +0 -112
- package/corpus/templates/videos/.agents/skills/security/SKILL.md +0 -263
- package/corpus/templates/videos/.agents/skills/self-modifying-code/SKILL.md +0 -88
- package/corpus/templates/videos/.agents/skills/shadcn-ui/SKILL.md +0 -95
- package/corpus/templates/videos/.builder/ANIMATED_PROPERTIES.md +0 -335
- package/corpus/templates/videos/.builder/KEYFRAME_SYNC.md +0 -166
- package/corpus/templates/videos/.builder/SEAMLESS_SYNC.md +0 -211
- package/corpus/templates/videos/.builder/rules/deploy-app.mdc +0 -22
- package/corpus/templates/videos/.builder/rules/organize-ui.mdc +0 -9
- package/corpus/templates/videos/.builder/skills/remotion/SKILL.md +0 -29
- package/corpus/templates/videos/.builder/skills/remotion/rules/animations.md +0 -27
- package/corpus/templates/videos/.builder/skills/remotion/rules/assets.md +0 -43
- package/corpus/templates/videos/.builder/skills/remotion/rules/audio.md +0 -58
- package/corpus/templates/videos/.builder/skills/remotion/rules/compositions.md +0 -129
- package/corpus/templates/videos/.builder/skills/remotion/rules/fonts.md +0 -47
- package/corpus/templates/videos/.builder/skills/remotion/rules/images.md +0 -41
- package/corpus/templates/videos/.builder/skills/remotion/rules/parameters.md +0 -59
- package/corpus/templates/videos/.builder/skills/remotion/rules/sequencing.md +0 -54
- package/corpus/templates/videos/.builder/skills/remotion/rules/tailwind.md +0 -11
- package/corpus/templates/videos/.builder/skills/remotion/rules/text-animations.md +0 -18
- package/corpus/templates/videos/.builder/skills/remotion/rules/timing.md +0 -103
- package/corpus/templates/videos/.builder/skills/remotion/rules/transparent-videos.md +0 -35
- package/corpus/templates/videos/.builder/skills/remotion/rules/trimming.md +0 -38
- package/corpus/templates/videos/.builder/skills/remotion/rules/videos.md +0 -54
- package/corpus/templates/videos/.dockerignore +0 -62
- package/corpus/templates/videos/.env.example +0 -4
- package/corpus/templates/videos/.oxfmtrc.json +0 -8
- package/corpus/templates/videos/AGENTS.md +0 -46
- package/corpus/templates/videos/CHANGELOG.md +0 -10
- package/corpus/templates/videos/DEVELOPING.md +0 -143
- package/corpus/templates/videos/README.md +0 -33
- package/corpus/templates/videos/actions/analyze-brand-assets.ts +0 -151
- package/corpus/templates/videos/actions/apply-design-system.ts +0 -35
- package/corpus/templates/videos/actions/create-design-system.ts +0 -84
- package/corpus/templates/videos/actions/create-folder.ts +0 -48
- package/corpus/templates/videos/actions/db-connect.ts +0 -45
- package/corpus/templates/videos/actions/db-health.ts +0 -24
- package/corpus/templates/videos/actions/db-status.ts +0 -28
- package/corpus/templates/videos/actions/delete-composition.ts +0 -272
- package/corpus/templates/videos/actions/delete-folder.ts +0 -27
- package/corpus/templates/videos/actions/generate-animated-component.ts +0 -470
- package/corpus/templates/videos/actions/get-composition.ts +0 -36
- package/corpus/templates/videos/actions/get-design-system.ts +0 -35
- package/corpus/templates/videos/actions/import-code.ts +0 -67
- package/corpus/templates/videos/actions/import-design-project.ts +0 -42
- package/corpus/templates/videos/actions/import-document.ts +0 -125
- package/corpus/templates/videos/actions/import-from-url.ts +0 -18
- package/corpus/templates/videos/actions/import-github.ts +0 -182
- package/corpus/templates/videos/actions/list-compositions.ts +0 -32
- package/corpus/templates/videos/actions/list-design-systems.ts +0 -66
- package/corpus/templates/videos/actions/list-folders.ts +0 -61
- package/corpus/templates/videos/actions/move-composition-to-folder.ts +0 -59
- package/corpus/templates/videos/actions/navigate.ts +0 -40
- package/corpus/templates/videos/actions/rename-folder.ts +0 -41
- package/corpus/templates/videos/actions/run.ts +0 -2
- package/corpus/templates/videos/actions/save-composition.ts +0 -114
- package/corpus/templates/videos/actions/set-default-design-system.ts +0 -40
- package/corpus/templates/videos/actions/update-composition.ts +0 -81
- package/corpus/templates/videos/actions/update-design-system.ts +0 -68
- package/corpus/templates/videos/actions/validate-compositions.ts +0 -502
- package/corpus/templates/videos/actions/view-screen.ts +0 -48
- package/corpus/templates/videos/app/components/CameraControls.tsx +0 -442
- package/corpus/templates/videos/app/components/CameraToolbar.tsx +0 -437
- package/corpus/templates/videos/app/components/CloudUpgrade.tsx +0 -287
- package/corpus/templates/videos/app/components/CollabPresenceBar.tsx +0 -81
- package/corpus/templates/videos/app/components/CompSettingsEditor.tsx +0 -107
- package/corpus/templates/videos/app/components/ComponentLibrarySidebar.tsx +0 -457
- package/corpus/templates/videos/app/components/ComponentPropsPanel.tsx +0 -227
- package/corpus/templates/videos/app/components/ComponentsSidebar.tsx +0 -70
- package/corpus/templates/videos/app/components/CompositionCard.tsx +0 -147
- package/corpus/templates/videos/app/components/CurrentElementPanel.tsx +0 -835
- package/corpus/templates/videos/app/components/CursorControls.tsx +0 -664
- package/corpus/templates/videos/app/components/CursorPositioningOverlay.tsx +0 -238
- package/corpus/templates/videos/app/components/LibraryFolderRow.tsx +0 -235
- package/corpus/templates/videos/app/components/MotionCurveSelect.tsx +0 -61
- package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +0 -192
- package/corpus/templates/videos/app/components/PropsEditor.tsx +0 -210
- package/corpus/templates/videos/app/components/QuestionFlow.tsx +0 -40
- package/corpus/templates/videos/app/components/Sidebar.tsx +0 -609
- package/corpus/templates/videos/app/components/StudioHeader.tsx +0 -109
- package/corpus/templates/videos/app/components/Timeline.tsx +0 -2067
- package/corpus/templates/videos/app/components/TrackPropertiesPanel.tsx +0 -922
- package/corpus/templates/videos/app/components/TweaksPanel.tsx +0 -277
- package/corpus/templates/videos/app/components/VideoPlayer.tsx +0 -487
- package/corpus/templates/videos/app/components/design-system/DesignSystemCard.tsx +0 -134
- package/corpus/templates/videos/app/components/design-system/DesignSystemPreview.tsx +0 -176
- package/corpus/templates/videos/app/components/design-system/DesignSystemSetup.tsx +0 -707
- package/corpus/templates/videos/app/components/keyframes/KeyframeActionButtons.tsx +0 -78
- package/corpus/templates/videos/app/components/keyframes/KeyframeNavigation.tsx +0 -59
- package/corpus/templates/videos/app/components/keyframes/PropertyNumberInput.tsx +0 -56
- package/corpus/templates/videos/app/components/layout/Header.tsx +0 -64
- package/corpus/templates/videos/app/components/layout/HeaderActions.tsx +0 -84
- package/corpus/templates/videos/app/components/layout/Layout.tsx +0 -132
- package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +0 -180
- package/corpus/templates/videos/app/components/ui/accordion.tsx +0 -56
- package/corpus/templates/videos/app/components/ui/alert-dialog.tsx +0 -139
- package/corpus/templates/videos/app/components/ui/alert.tsx +0 -59
- package/corpus/templates/videos/app/components/ui/aspect-ratio.tsx +0 -5
- package/corpus/templates/videos/app/components/ui/avatar.tsx +0 -48
- package/corpus/templates/videos/app/components/ui/badge.tsx +0 -37
- package/corpus/templates/videos/app/components/ui/breadcrumb.tsx +0 -115
- package/corpus/templates/videos/app/components/ui/button.tsx +0 -57
- package/corpus/templates/videos/app/components/ui/calendar.tsx +0 -68
- package/corpus/templates/videos/app/components/ui/card.tsx +0 -86
- package/corpus/templates/videos/app/components/ui/carousel.tsx +0 -260
- package/corpus/templates/videos/app/components/ui/chart.tsx +0 -375
- package/corpus/templates/videos/app/components/ui/checkbox.tsx +0 -28
- package/corpus/templates/videos/app/components/ui/collapsible.tsx +0 -9
- package/corpus/templates/videos/app/components/ui/command.tsx +0 -154
- package/corpus/templates/videos/app/components/ui/context-menu.tsx +0 -202
- package/corpus/templates/videos/app/components/ui/dialog.tsx +0 -130
- package/corpus/templates/videos/app/components/ui/drawer.tsx +0 -116
- package/corpus/templates/videos/app/components/ui/dropdown-menu.tsx +0 -212
- package/corpus/templates/videos/app/components/ui/form.tsx +0 -177
- package/corpus/templates/videos/app/components/ui/hover-card.tsx +0 -27
- package/corpus/templates/videos/app/components/ui/input-otp.tsx +0 -69
- package/corpus/templates/videos/app/components/ui/input.tsx +0 -22
- package/corpus/templates/videos/app/components/ui/label.tsx +0 -24
- package/corpus/templates/videos/app/components/ui/menubar.tsx +0 -234
- package/corpus/templates/videos/app/components/ui/navigation-menu.tsx +0 -128
- package/corpus/templates/videos/app/components/ui/pagination.tsx +0 -121
- package/corpus/templates/videos/app/components/ui/popover.tsx +0 -44
- package/corpus/templates/videos/app/components/ui/progress.tsx +0 -26
- package/corpus/templates/videos/app/components/ui/radio-group.tsx +0 -42
- package/corpus/templates/videos/app/components/ui/resizable.tsx +0 -43
- package/corpus/templates/videos/app/components/ui/scroll-area.tsx +0 -46
- package/corpus/templates/videos/app/components/ui/select.tsx +0 -158
- package/corpus/templates/videos/app/components/ui/separator.tsx +0 -29
- package/corpus/templates/videos/app/components/ui/sheet.tsx +0 -160
- package/corpus/templates/videos/app/components/ui/sidebar.tsx +0 -782
- package/corpus/templates/videos/app/components/ui/skeleton.tsx +0 -15
- package/corpus/templates/videos/app/components/ui/slider.tsx +0 -26
- package/corpus/templates/videos/app/components/ui/sonner.tsx +0 -58
- package/corpus/templates/videos/app/components/ui/spinner.tsx +0 -17
- package/corpus/templates/videos/app/components/ui/switch.tsx +0 -27
- package/corpus/templates/videos/app/components/ui/table.tsx +0 -117
- package/corpus/templates/videos/app/components/ui/tabs.tsx +0 -53
- package/corpus/templates/videos/app/components/ui/textarea.tsx +0 -23
- package/corpus/templates/videos/app/components/ui/toast.tsx +0 -127
- package/corpus/templates/videos/app/components/ui/toaster.tsx +0 -33
- package/corpus/templates/videos/app/components/ui/toggle-group.tsx +0 -59
- package/corpus/templates/videos/app/components/ui/toggle.tsx +0 -43
- package/corpus/templates/videos/app/components/ui/tooltip.tsx +0 -30
- package/corpus/templates/videos/app/components/ui/use-toast.ts +0 -3
- package/corpus/templates/videos/app/config/constants.ts +0 -204
- package/corpus/templates/videos/app/contexts/CompositionContext.tsx +0 -437
- package/corpus/templates/videos/app/contexts/CurrentElementContext.tsx +0 -247
- package/corpus/templates/videos/app/contexts/PlaybackContext.tsx +0 -65
- package/corpus/templates/videos/app/contexts/TimelineContext.tsx +0 -433
- package/corpus/templates/videos/app/entry.client.tsx +0 -19
- package/corpus/templates/videos/app/entry.server.tsx +0 -10
- package/corpus/templates/videos/app/global.css +0 -171
- package/corpus/templates/videos/app/hooks/use-composition-collab.ts +0 -269
- package/corpus/templates/videos/app/hooks/use-composition-design-system.ts +0 -47
- package/corpus/templates/videos/app/hooks/use-database-compositions.ts +0 -144
- package/corpus/templates/videos/app/hooks/use-db-status.ts +0 -30
- package/corpus/templates/videos/app/hooks/use-design-systems.ts +0 -21
- package/corpus/templates/videos/app/hooks/use-folders.ts +0 -199
- package/corpus/templates/videos/app/hooks/use-mobile.tsx +0 -21
- package/corpus/templates/videos/app/hooks/use-navigation-state.ts +0 -52
- package/corpus/templates/videos/app/hooks/use-question-flow.ts +0 -14
- package/corpus/templates/videos/app/hooks/use-toast.ts +0 -188
- package/corpus/templates/videos/app/hooks/useUnsavedChanges.ts +0 -48
- package/corpus/templates/videos/app/i18n/ar-SA.ts +0 -446
- package/corpus/templates/videos/app/i18n/de-DE.ts +0 -470
- package/corpus/templates/videos/app/i18n/en-US.ts +0 -452
- package/corpus/templates/videos/app/i18n/es-ES.ts +0 -468
- package/corpus/templates/videos/app/i18n/fr-FR.ts +0 -469
- package/corpus/templates/videos/app/i18n/hi-IN.ts +0 -446
- package/corpus/templates/videos/app/i18n/index.ts +0 -34
- package/corpus/templates/videos/app/i18n/ja-JP.ts +0 -460
- package/corpus/templates/videos/app/i18n/ko-KR.ts +0 -453
- package/corpus/templates/videos/app/i18n/pt-BR.ts +0 -461
- package/corpus/templates/videos/app/i18n/zh-CN.ts +0 -437
- package/corpus/templates/videos/app/i18n/zh-TW.ts +0 -437
- package/corpus/templates/videos/app/lib/database-compositions.ts +0 -67
- package/corpus/templates/videos/app/lib/design-systems.ts +0 -234
- package/corpus/templates/videos/app/lib/tab-id.ts +0 -1
- package/corpus/templates/videos/app/lib/utils.ts +0 -1
- package/corpus/templates/videos/app/pages/ComponentLibrary.tsx +0 -134
- package/corpus/templates/videos/app/pages/ComponentLibraryView.tsx +0 -362
- package/corpus/templates/videos/app/pages/CompositionView.tsx +0 -715
- package/corpus/templates/videos/app/pages/DesignSystems.tsx +0 -180
- package/corpus/templates/videos/app/pages/Index.tsx +0 -258
- package/corpus/templates/videos/app/pages/NewComposition.tsx +0 -95
- package/corpus/templates/videos/app/pages/NotFound.tsx +0 -36
- package/corpus/templates/videos/app/remotion/CameraHost.tsx +0 -223
- package/corpus/templates/videos/app/remotion/animations/useElementAnimations.ts +0 -231
- package/corpus/templates/videos/app/remotion/componentRegistry.ts +0 -473
- package/corpus/templates/videos/app/remotion/components/AnimatedElement.tsx +0 -436
- package/corpus/templates/videos/app/remotion/components/InteractiveElement.tsx +0 -159
- package/corpus/templates/videos/app/remotion/components/InteractiveZoneEditor.tsx +0 -273
- package/corpus/templates/videos/app/remotion/compositions/BlankComposition.tsx +0 -204
- package/corpus/templates/videos/app/remotion/compositions/index.ts +0 -2
- package/corpus/templates/videos/app/remotion/createComponentCursorTrack.ts +0 -132
- package/corpus/templates/videos/app/remotion/docs/CURSOR_TRACKS.md +0 -285
- package/corpus/templates/videos/app/remotion/easingFunctions.ts +0 -255
- package/corpus/templates/videos/app/remotion/hooks/createInteractiveComposition.tsx +0 -283
- package/corpus/templates/videos/app/remotion/hooks/useCursorHistory.ts +0 -72
- package/corpus/templates/videos/app/remotion/hooks/useCursorTypeFromHover.ts +0 -35
- package/corpus/templates/videos/app/remotion/hooks/useEditableZones.tsx +0 -267
- package/corpus/templates/videos/app/remotion/hooks/useHoverAnimation.ts +0 -90
- package/corpus/templates/videos/app/remotion/hooks/useHoverAnimationSmooth.ts +0 -146
- package/corpus/templates/videos/app/remotion/hooks/useInteractiveComponent.ts +0 -711
- package/corpus/templates/videos/app/remotion/hooks/useRegisterInteractiveElement.ts +0 -56
- package/corpus/templates/videos/app/remotion/library-components/Button.tsx +0 -252
- package/corpus/templates/videos/app/remotion/library-components/Card.tsx +0 -241
- package/corpus/templates/videos/app/remotion/library-components/CodePanel.tsx +0 -1005
- package/corpus/templates/videos/app/remotion/library-components/FileItem.tsx +0 -196
- package/corpus/templates/videos/app/remotion/library-components/FolderItem.tsx +0 -199
- package/corpus/templates/videos/app/remotion/library-components/PrimaryButton.tsx +0 -177
- package/corpus/templates/videos/app/remotion/library-components/SecondaryButton.tsx +0 -167
- package/corpus/templates/videos/app/remotion/library-components/SectionHeader.tsx +0 -108
- package/corpus/templates/videos/app/remotion/library-components/TEMPLATE.tsx +0 -211
- package/corpus/templates/videos/app/remotion/library-components/index.ts +0 -10
- package/corpus/templates/videos/app/remotion/registry.ts +0 -91
- package/corpus/templates/videos/app/remotion/testing/animationTestUtils.ts +0 -366
- package/corpus/templates/videos/app/remotion/trackAnimation.ts +0 -179
- package/corpus/templates/videos/app/remotion/trackHelpers.ts +0 -110
- package/corpus/templates/videos/app/remotion/ui-components/Cursor.tsx +0 -182
- package/corpus/templates/videos/app/remotion/ui-components/InteractiveButton.tsx +0 -116
- package/corpus/templates/videos/app/remotion/ui-components/InteractiveCard.tsx +0 -126
- package/corpus/templates/videos/app/remotion/ui-components/index.ts +0 -16
- package/corpus/templates/videos/app/remotion/utils/animationHelpers.ts +0 -444
- package/corpus/templates/videos/app/remotion/utils/interactiveElements.ts +0 -235
- package/corpus/templates/videos/app/remotion/utils/springAnimation.ts +0 -76
- package/corpus/templates/videos/app/root.tsx +0 -165
- package/corpus/templates/videos/app/routes/$.tsx +0 -10
- package/corpus/templates/videos/app/routes/_index.tsx +0 -25
- package/corpus/templates/videos/app/routes/c.$compositionId.tsx +0 -10
- package/corpus/templates/videos/app/routes/components.tsx +0 -10
- package/corpus/templates/videos/app/routes/design-systems.tsx +0 -10
- package/corpus/templates/videos/app/routes/extensions.$id.$slug.tsx +0 -2
- package/corpus/templates/videos/app/routes/extensions.$id.tsx +0 -5
- package/corpus/templates/videos/app/routes/extensions._index.tsx +0 -5
- package/corpus/templates/videos/app/routes/extensions.tsx +0 -5
- package/corpus/templates/videos/app/routes/settings.tsx +0 -88
- package/corpus/templates/videos/app/routes/team.tsx +0 -11
- package/corpus/templates/videos/app/routes.ts +0 -4
- package/corpus/templates/videos/app/state.ts +0 -77
- package/corpus/templates/videos/app/types/elementAnimations.ts +0 -121
- package/corpus/templates/videos/app/types.ts +0 -200
- package/corpus/templates/videos/app/utils/compositionHelpers.ts +0 -445
- package/corpus/templates/videos/app/utils/debug.ts +0 -63
- package/corpus/templates/videos/app/utils/keyframeUtils.ts +0 -331
- package/corpus/templates/videos/app/utils/timelineCoordinates.ts +0 -79
- package/corpus/templates/videos/app/vite-env.d.ts +0 -6
- package/corpus/templates/videos/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +0 -6
- package/corpus/templates/videos/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +0 -6
- package/corpus/templates/videos/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +0 -6
- package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +0 -6
- package/corpus/templates/videos/changelog/2026-06-29-video-layouts-adapt-when-the-agent-sidebar-is-open.md +0 -6
- package/corpus/templates/videos/components.json +0 -20
- package/corpus/templates/videos/data/sync-config.json +0 -3
- package/corpus/templates/videos/docs/examples/create-composition.example.ts +0 -128
- package/corpus/templates/videos/drizzle.config.ts +0 -3
- package/corpus/templates/videos/learnings.defaults.md +0 -5
- package/corpus/templates/videos/package.json +0 -114
- package/corpus/templates/videos/public/agent-native-icon-dark.svg +0 -10
- package/corpus/templates/videos/public/agent-native-icon-light.svg +0 -10
- package/corpus/templates/videos/public/agent-native-logo-dark.svg +0 -21
- package/corpus/templates/videos/public/agent-native-logo-light.svg +0 -21
- package/corpus/templates/videos/public/favicon.svg +0 -1
- package/corpus/templates/videos/public/icon-180.svg +0 -1
- package/corpus/templates/videos/public/icon-192.svg +0 -1
- package/corpus/templates/videos/public/icon-512.svg +0 -1
- package/corpus/templates/videos/public/manifest.json +0 -21
- package/corpus/templates/videos/public/placeholder.svg +0 -1
- package/corpus/templates/videos/public/robots.txt +0 -14
- package/corpus/templates/videos/react-router.config.ts +0 -7
- package/corpus/templates/videos/server/db/index.ts +0 -37
- package/corpus/templates/videos/server/db/schema.ts +0 -55
- package/corpus/templates/videos/server/middleware/auth.ts +0 -15
- package/corpus/templates/videos/server/plugins/agent-chat.ts +0 -29
- package/corpus/templates/videos/server/plugins/auth.ts +0 -14
- package/corpus/templates/videos/server/plugins/collab.ts +0 -11
- package/corpus/templates/videos/server/plugins/core-routes.ts +0 -22
- package/corpus/templates/videos/server/plugins/db.ts +0 -160
- package/corpus/templates/videos/server/routes/[...page].get.ts +0 -5
- package/corpus/templates/videos/server/routes/[...page].head.ts +0 -1
- package/corpus/templates/videos/server/routes/api/save-composition-defaults.post.ts +0 -274
- package/corpus/templates/videos/shared/api.ts +0 -75
- package/corpus/templates/videos/ssr-entry.ts +0 -15
- package/corpus/templates/videos/tsconfig.json +0 -21
- package/corpus/templates/videos/vite.config.ts +0 -19
- package/corpus/templates/videos/vitest.config.ts +0 -16
- package/docs/content/locales/ar-SA/template-videos.mdx +0 -336
- package/docs/content/locales/de-DE/template-videos.mdx +0 -336
- package/docs/content/locales/es-ES/template-videos.mdx +0 -336
- package/docs/content/locales/fr-FR/template-videos.mdx +0 -336
- package/docs/content/locales/hi-IN/template-videos.mdx +0 -336
- package/docs/content/locales/ja-JP/template-videos.mdx +0 -336
- package/docs/content/locales/ko-KR/template-videos.mdx +0 -336
- package/docs/content/locales/pt-BR/template-videos.mdx +0 -336
- package/docs/content/locales/zh-CN/template-videos.mdx +0 -334
- package/docs/content/locales/zh-TW/template-videos.mdx +0 -334
- package/docs/content/template-videos.mdx +0 -332
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
alphaToOpacity,
|
|
3
3
|
parseCssColor,
|
|
4
|
+
parseCssColorExtended,
|
|
4
5
|
rgbaToCss,
|
|
5
6
|
rgbaToHex,
|
|
6
7
|
rgbaToHsl,
|
|
@@ -137,6 +138,17 @@ export interface DesignColorPickerLabels {
|
|
|
137
138
|
export interface DesignColorPickerProps {
|
|
138
139
|
value: string;
|
|
139
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;
|
|
140
152
|
onPaintValueChange?: (value: string) => void;
|
|
141
153
|
onImageFillChange?: (value: ImageFillValue) => void;
|
|
142
154
|
backgroundImage?: string;
|
|
@@ -204,86 +216,10 @@ interface HsvaColor {
|
|
|
204
216
|
|
|
205
217
|
const FALLBACK_COLOR: RgbaColor = { r: 0, g: 0, b: 0, a: 1 };
|
|
206
218
|
|
|
207
|
-
//
|
|
208
|
-
//
|
|
209
|
-
// `
|
|
210
|
-
//
|
|
211
|
-
// getComputedStyle: space-separated `rgb(R G B)`, `rgb(R G B / A)`, and
|
|
212
|
-
// opaque formats like `oklch(...)` or `color(display-p3 ...)`.
|
|
213
|
-
//
|
|
214
|
-
// This local wrapper extends the parser to cover those cases so that colors
|
|
215
|
-
// arriving from the canvas's computed-style bridge are always usable.
|
|
216
|
-
|
|
217
|
-
const MODERN_RGB_PATTERN =
|
|
218
|
-
/^rgba?\(\s*([0-9.]+)\s+([0-9.]+)\s+([0-9.]+)(?:\s*\/\s*([0-9.]+%?))?\s*\)$/i;
|
|
219
|
-
|
|
220
|
-
/** Canvas element reused across calls for DOM-based color resolution. */
|
|
221
|
-
let _resolverCanvas: HTMLCanvasElement | null = null;
|
|
222
|
-
let _resolverCtx: CanvasRenderingContext2D | null = null;
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Parses a CSS color string into RgbaColor, extending the base parser with:
|
|
226
|
-
* - Modern space-separated `rgb(R G B)` / `rgb(R G B / A)` syntax
|
|
227
|
-
* - Opaque formats (oklch, color, etc.) resolved via a hidden canvas
|
|
228
|
-
*
|
|
229
|
-
* Falls back to null if the value is unparseable and the DOM is unavailable.
|
|
230
|
-
*/
|
|
231
|
-
function parseCssColorExtended(value: string): RgbaColor | null {
|
|
232
|
-
// 1. Try the standard parser first (handles hex, comma rgb/rgba, hsl/hsla).
|
|
233
|
-
const standard = parseCssColor(value);
|
|
234
|
-
if (standard) return standard;
|
|
235
|
-
|
|
236
|
-
const trimmed = value.trim();
|
|
237
|
-
if (!trimmed || trimmed === "transparent" || trimmed === "none") return null;
|
|
238
|
-
|
|
239
|
-
// 2. Modern space-separated rgb/rgba — CSS Level 4.
|
|
240
|
-
const modernRgb = trimmed.match(MODERN_RGB_PATTERN);
|
|
241
|
-
if (modernRgb) {
|
|
242
|
-
const parseAlphaLocal = (v: string | undefined): number => {
|
|
243
|
-
if (!v) return 1;
|
|
244
|
-
if (v.endsWith("%"))
|
|
245
|
-
return Math.max(0, Math.min(1, Number(v.slice(0, -1)) / 100));
|
|
246
|
-
return Math.max(0, Math.min(1, Number(v)));
|
|
247
|
-
};
|
|
248
|
-
return {
|
|
249
|
-
r: Math.round(Math.max(0, Math.min(255, Number(modernRgb[1])))),
|
|
250
|
-
g: Math.round(Math.max(0, Math.min(255, Number(modernRgb[2])))),
|
|
251
|
-
b: Math.round(Math.max(0, Math.min(255, Number(modernRgb[3])))),
|
|
252
|
-
a: parseAlphaLocal(modernRgb[4]),
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// 3. DOM-based resolver for oklch, color(display-p3 ...), hsl (modern), etc.
|
|
257
|
-
// Uses a hidden 1×1 canvas to resolve any valid CSS color to rgb().
|
|
258
|
-
if (typeof document === "undefined") return null;
|
|
259
|
-
try {
|
|
260
|
-
if (!_resolverCanvas) {
|
|
261
|
-
_resolverCanvas = document.createElement("canvas");
|
|
262
|
-
_resolverCanvas.width = 1;
|
|
263
|
-
_resolverCanvas.height = 1;
|
|
264
|
-
}
|
|
265
|
-
if (!_resolverCtx) {
|
|
266
|
-
_resolverCtx = _resolverCanvas.getContext("2d", {
|
|
267
|
-
willReadFrequently: true,
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
const ctx = _resolverCtx;
|
|
271
|
-
if (!ctx) return null;
|
|
272
|
-
// Detect invalid color values: save fillStyle before and after assignment.
|
|
273
|
-
// If the browser rejects the value, fillStyle won't change.
|
|
274
|
-
const prev = ctx.fillStyle;
|
|
275
|
-
ctx.fillStyle = trimmed;
|
|
276
|
-
const next = ctx.fillStyle; // browser normalises to rgb/hex on accept
|
|
277
|
-
// If the value was rejected, fillStyle stays at the previous value.
|
|
278
|
-
if (next === prev) return null;
|
|
279
|
-
ctx.clearRect(0, 0, 1, 1);
|
|
280
|
-
ctx.fillRect(0, 0, 1, 1);
|
|
281
|
-
const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;
|
|
282
|
-
return { r, g, b, a: a / 255 };
|
|
283
|
-
} catch {
|
|
284
|
-
return null;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
219
|
+
// `parseCssColorExtended` (from color-utils) extends `parseCssColor` with
|
|
220
|
+
// modern CSS Level 4 syntax (space-separated rgb, `oklch(...)`,
|
|
221
|
+
// `color(display-p3 ...)`) so that colors arriving from the canvas's
|
|
222
|
+
// computed-style bridge are always usable.
|
|
287
223
|
|
|
288
224
|
const DEFAULT_LABELS: DesignColorPickerLabels = {
|
|
289
225
|
trigger: "Open color picker", // i18n-ignore fallback component label
|
|
@@ -686,6 +622,7 @@ const BLEND_MODE_OPTIONS = [
|
|
|
686
622
|
export function DesignColorPicker({
|
|
687
623
|
value,
|
|
688
624
|
onChange,
|
|
625
|
+
onChangeComplete,
|
|
689
626
|
onPaintValueChange,
|
|
690
627
|
onImageFillChange,
|
|
691
628
|
backgroundImage,
|
|
@@ -848,11 +785,24 @@ export function DesignColorPicker({
|
|
|
848
785
|
|
|
849
786
|
// ── Emit helpers ────────────────────────────────────────────────────────────
|
|
850
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
|
+
|
|
851
798
|
const emitColor = (nextColor: RgbaColor, nextOpacity = effectiveOpacity) => {
|
|
852
|
-
|
|
799
|
+
const next = rgbaToCss(withColorOpacity(nextColor, nextOpacity));
|
|
800
|
+
lastEmittedValueRef.current = next;
|
|
801
|
+
onChange(next);
|
|
853
802
|
};
|
|
854
803
|
|
|
855
804
|
const emitPaintValue = (nextValue: string) => {
|
|
805
|
+
lastEmittedValueRef.current = nextValue;
|
|
856
806
|
if (onPaintValueChange) onPaintValueChange(nextValue);
|
|
857
807
|
else onChange(nextValue);
|
|
858
808
|
};
|
|
@@ -865,18 +815,26 @@ export function DesignColorPicker({
|
|
|
865
815
|
emitColor(hslToRgba({ ...nextHsl, a: opacityToAlpha(effectiveOpacity) }));
|
|
866
816
|
};
|
|
867
817
|
|
|
818
|
+
// Shared by the invalid-commit path below and the Escape handler in the hex
|
|
819
|
+
// input: reverts the draft to the currently active color (the selected
|
|
820
|
+
// gradient stop while editing a gradient, otherwise the solid color).
|
|
821
|
+
const revertHexDraft = () => {
|
|
822
|
+
const reverted = toDisplayHex(activeGradient ? fieldColor : color);
|
|
823
|
+
hexDraftRef.current = reverted;
|
|
824
|
+
setHexDraft(reverted);
|
|
825
|
+
};
|
|
826
|
+
|
|
868
827
|
const commitHex = () => {
|
|
869
|
-
const currentDraft = hexDraftRef.current;
|
|
828
|
+
const currentDraft = expandHexShorthand(hexDraftRef.current);
|
|
870
829
|
const parsed = parseCssColor(`#${currentDraft.replace(/^#/, "")}`);
|
|
871
830
|
if (!parsed) {
|
|
872
|
-
|
|
873
|
-
hexDraftRef.current = reverted;
|
|
874
|
-
setHexDraft(reverted);
|
|
831
|
+
revertHexDraft();
|
|
875
832
|
return;
|
|
876
833
|
}
|
|
877
834
|
if (activeGradient) {
|
|
878
835
|
const hexIncludesAlpha = hasHexAlpha(currentDraft);
|
|
879
836
|
emitStopColor(hexIncludesAlpha ? parsed : { ...parsed, a: fieldColor.a });
|
|
837
|
+
notifyChangeComplete();
|
|
880
838
|
return;
|
|
881
839
|
}
|
|
882
840
|
const hexIncludesAlpha = hasHexAlpha(currentDraft);
|
|
@@ -885,11 +843,19 @@ export function DesignColorPicker({
|
|
|
885
843
|
: effectiveOpacity;
|
|
886
844
|
if (hexIncludesAlpha && onOpacityChange) onOpacityChange(nextOpacity);
|
|
887
845
|
emitColor(parsed, nextOpacity);
|
|
846
|
+
notifyChangeComplete();
|
|
888
847
|
};
|
|
889
848
|
|
|
890
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
|
+
);
|
|
891
857
|
if (onOpacityChange) onOpacityChange(nextOpacity);
|
|
892
|
-
else onChange(
|
|
858
|
+
else onChange(lastEmittedValueRef.current);
|
|
893
859
|
};
|
|
894
860
|
|
|
895
861
|
// ── Gradient editing ─────────────────────────────────────────────────────────
|
|
@@ -913,9 +879,14 @@ export function DesignColorPicker({
|
|
|
913
879
|
: color;
|
|
914
880
|
const rawFieldHsv = rgbaToHsv(fieldColor);
|
|
915
881
|
// Preserve the last non-zero hue so dragging through gray doesn't lose it.
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
882
|
+
// Recorded as an effect (not mutated during render) so the ref update is a
|
|
883
|
+
// render side-effect, not a render-body mutation.
|
|
884
|
+
useEffect(() => {
|
|
885
|
+
if (rawFieldHsv.s > 0 && rawFieldHsv.v > 0) {
|
|
886
|
+
lastHueRef.current = rawFieldHsv.h;
|
|
887
|
+
}
|
|
888
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
889
|
+
}, [rawFieldHsv.h, rawFieldHsv.s, rawFieldHsv.v]);
|
|
919
890
|
const fieldHsv: HsvaColor =
|
|
920
891
|
rawFieldHsv.s === 0
|
|
921
892
|
? { ...rawFieldHsv, h: lastHueRef.current }
|
|
@@ -998,12 +969,18 @@ export function DesignColorPicker({
|
|
|
998
969
|
|
|
999
970
|
setLocalPaintType(nextType);
|
|
1000
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.
|
|
1001
975
|
if (nextType === "none") {
|
|
976
|
+
lastEmittedValueRef.current = "transparent";
|
|
1002
977
|
onChange("transparent");
|
|
978
|
+
notifyChangeComplete();
|
|
1003
979
|
return;
|
|
1004
980
|
}
|
|
1005
981
|
if (nextType === "solid") {
|
|
1006
982
|
emitColor(color, effectiveOpacity > 0 ? effectiveOpacity : 100);
|
|
983
|
+
notifyChangeComplete();
|
|
1007
984
|
return;
|
|
1008
985
|
}
|
|
1009
986
|
if (GRADIENT_TYPES.has(nextType)) {
|
|
@@ -1016,6 +993,7 @@ export function DesignColorPicker({
|
|
|
1016
993
|
const next: GradientValue = { ...base, kind: nextType as GradientKind };
|
|
1017
994
|
setSelectedStopId(next.stops[0]?.id ?? "");
|
|
1018
995
|
emitGradient(next);
|
|
996
|
+
notifyChangeComplete();
|
|
1019
997
|
return;
|
|
1020
998
|
}
|
|
1021
999
|
if (nextType === "image") {
|
|
@@ -1027,20 +1005,24 @@ export function DesignColorPicker({
|
|
|
1027
1005
|
emitPaintValue(
|
|
1028
1006
|
nextImageFill.url ? imageFillToCss(nextImageFill) : "transparent",
|
|
1029
1007
|
);
|
|
1008
|
+
notifyChangeComplete();
|
|
1030
1009
|
return;
|
|
1031
1010
|
}
|
|
1032
1011
|
if (nextType === "video") {
|
|
1033
1012
|
// No standalone CSS for video; mark the fill type and keep a checker fill
|
|
1034
1013
|
// until a source is wired. The agent can replace it with a <video> layer.
|
|
1035
1014
|
emitPaintValue("transparent");
|
|
1015
|
+
notifyChangeComplete();
|
|
1036
1016
|
return;
|
|
1037
1017
|
}
|
|
1038
1018
|
if (nextType === "noise") {
|
|
1039
1019
|
emitPaintValue(NOISE_FALLBACK_CSS);
|
|
1020
|
+
notifyChangeComplete();
|
|
1040
1021
|
return;
|
|
1041
1022
|
}
|
|
1042
1023
|
if (nextType === "pattern") {
|
|
1043
1024
|
emitPaintValue(PATTERN_FALLBACK_CSS);
|
|
1025
|
+
notifyChangeComplete();
|
|
1044
1026
|
return;
|
|
1045
1027
|
}
|
|
1046
1028
|
};
|
|
@@ -1063,8 +1045,11 @@ export function DesignColorPicker({
|
|
|
1063
1045
|
const parsed = parseCssColor(result.sRGBHex);
|
|
1064
1046
|
if (parsed) emitStopColor({ ...parsed, a: fieldColor.a });
|
|
1065
1047
|
} else {
|
|
1048
|
+
lastEmittedValueRef.current = result.sRGBHex;
|
|
1066
1049
|
onChange(result.sRGBHex);
|
|
1067
1050
|
}
|
|
1051
|
+
// The eyedropper pick is a single discrete commit, not a drag tick.
|
|
1052
|
+
notifyChangeComplete();
|
|
1068
1053
|
}
|
|
1069
1054
|
} catch {
|
|
1070
1055
|
// Browser cancels are expected; keep the current color.
|
|
@@ -1099,9 +1084,7 @@ export function DesignColorPicker({
|
|
|
1099
1084
|
e.currentTarget.blur();
|
|
1100
1085
|
}
|
|
1101
1086
|
if (e.key === "Escape") {
|
|
1102
|
-
|
|
1103
|
-
hexDraftRef.current = reverted;
|
|
1104
|
-
setHexDraft(reverted);
|
|
1087
|
+
revertHexDraft();
|
|
1105
1088
|
skipNextHexBlurCommitRef.current = true;
|
|
1106
1089
|
e.currentTarget.blur();
|
|
1107
1090
|
}
|
|
@@ -1235,12 +1218,12 @@ export function DesignColorPicker({
|
|
|
1235
1218
|
// switch causes the canvas to re-project the element. Without this,
|
|
1236
1219
|
// Radix treats the resulting focus shift as an "interact outside" event
|
|
1237
1220
|
// and closes the popover before the type switch is visible.
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
}
|
|
1221
|
+
// Radix fires a dedicated `onFocusOutside` (not `onInteractOutside`
|
|
1222
|
+
// with e.type === "focusoutside" — that never matches) whenever focus
|
|
1223
|
+
// moves outside the content; suppress it so canvas-driven focus
|
|
1224
|
+
// re-projection can't close the popover. Genuine pointer clicks
|
|
1225
|
+
// outside still close it via the default onInteractOutside behavior.
|
|
1226
|
+
onFocusOutside={(e) => e.preventDefault()}
|
|
1244
1227
|
>
|
|
1245
1228
|
<div className="rounded-md bg-popover text-popover-foreground">
|
|
1246
1229
|
{view === "shader" ? (
|
|
@@ -1420,6 +1403,7 @@ export function DesignColorPicker({
|
|
|
1420
1403
|
emitColorFromHsv(nextHsv);
|
|
1421
1404
|
}
|
|
1422
1405
|
}}
|
|
1406
|
+
onCommit={notifyChangeComplete}
|
|
1423
1407
|
/>
|
|
1424
1408
|
</div>
|
|
1425
1409
|
)}
|
|
@@ -1475,6 +1459,13 @@ export function DesignColorPicker({
|
|
|
1475
1459
|
backgroundImage="linear-gradient(90deg, #ff0000, #ffff00, #00ff00, #00ffff, #0000ff, #ff00ff, #ff0000)"
|
|
1476
1460
|
onChange={(next) => {
|
|
1477
1461
|
const h = next === 360 ? 0 : next;
|
|
1462
|
+
// Record the dragged hue immediately so the slider
|
|
1463
|
+
// doesn't snap back to a stale hue on the next
|
|
1464
|
+
// render when the color is (or becomes) achromatic
|
|
1465
|
+
// — the round-tripped color's s/v may still be 0,
|
|
1466
|
+
// so the lastHueRef-sync effect's s>0&&v>0 guard
|
|
1467
|
+
// won't fire on its own.
|
|
1468
|
+
lastHueRef.current = h;
|
|
1478
1469
|
if (activeGradient) {
|
|
1479
1470
|
emitStopColor(
|
|
1480
1471
|
hsvToRgba({
|
|
@@ -1487,6 +1478,7 @@ export function DesignColorPicker({
|
|
|
1487
1478
|
emitColorFromHsv({ ...hsv, h });
|
|
1488
1479
|
}
|
|
1489
1480
|
}}
|
|
1481
|
+
onCommit={notifyChangeComplete}
|
|
1490
1482
|
/>
|
|
1491
1483
|
|
|
1492
1484
|
{/* Current-color swatch left of alpha (matches the design editor's layout) */}
|
|
@@ -1520,6 +1512,7 @@ export function DesignColorPicker({
|
|
|
1520
1512
|
setOpacity(next);
|
|
1521
1513
|
}
|
|
1522
1514
|
}}
|
|
1515
|
+
onCommit={notifyChangeComplete}
|
|
1523
1516
|
/>
|
|
1524
1517
|
</div>
|
|
1525
1518
|
</div>
|
|
@@ -1627,7 +1620,7 @@ export function DesignColorPicker({
|
|
|
1627
1620
|
: [rgbaToCss(color)]
|
|
1628
1621
|
).map((docColor) => {
|
|
1629
1622
|
const currentHex = rgbaToHex(
|
|
1630
|
-
|
|
1623
|
+
parseCssColorExtended(docColor) ?? color,
|
|
1631
1624
|
);
|
|
1632
1625
|
const isActive =
|
|
1633
1626
|
rgbaToHex(color) === currentHex && !activeGradient;
|
|
@@ -1647,9 +1640,13 @@ export function DesignColorPicker({
|
|
|
1647
1640
|
)}
|
|
1648
1641
|
style={swatchStyle(docColor)}
|
|
1649
1642
|
onClick={() => {
|
|
1650
|
-
const parsed =
|
|
1643
|
+
const parsed =
|
|
1644
|
+
parseCssColorExtended(docColor) ?? color;
|
|
1651
1645
|
if (activeGradient) emitStopColor(parsed);
|
|
1652
1646
|
else emitColor(parsed);
|
|
1647
|
+
// A swatch click is a discrete, one-shot
|
|
1648
|
+
// commit, not a drag tick.
|
|
1649
|
+
notifyChangeComplete();
|
|
1653
1650
|
}}
|
|
1654
1651
|
/>
|
|
1655
1652
|
</TooltipTrigger>
|
|
@@ -1773,14 +1770,22 @@ function SaturationBrightnessField({
|
|
|
1773
1770
|
label,
|
|
1774
1771
|
disabled,
|
|
1775
1772
|
onChange,
|
|
1773
|
+
onCommit,
|
|
1776
1774
|
}: {
|
|
1777
1775
|
hsv: HsvaColor;
|
|
1778
1776
|
label: string;
|
|
1779
1777
|
disabled: boolean;
|
|
1780
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;
|
|
1781
1786
|
}) {
|
|
1782
1787
|
const fieldRef = useRef<HTMLDivElement>(null);
|
|
1783
|
-
const draggingRef = useRef(
|
|
1788
|
+
const draggingRef = useRef<PointerGestureState>(POINTER_GESTURE_IDLE);
|
|
1784
1789
|
const hueColor = rgbaToCss(hsvToRgba({ h: hsv.h, s: 100, v: 100, a: 1 }));
|
|
1785
1790
|
|
|
1786
1791
|
const updateFromPointer = (event: PointerEvent<HTMLDivElement>) => {
|
|
@@ -1802,18 +1807,22 @@ function SaturationBrightnessField({
|
|
|
1802
1807
|
if (event.key === "ArrowRight") {
|
|
1803
1808
|
event.preventDefault();
|
|
1804
1809
|
onChange({ ...hsv, s: clamp(hsv.s + step, 0, 100) });
|
|
1810
|
+
onCommit?.();
|
|
1805
1811
|
}
|
|
1806
1812
|
if (event.key === "ArrowLeft") {
|
|
1807
1813
|
event.preventDefault();
|
|
1808
1814
|
onChange({ ...hsv, s: clamp(hsv.s - step, 0, 100) });
|
|
1815
|
+
onCommit?.();
|
|
1809
1816
|
}
|
|
1810
1817
|
if (event.key === "ArrowUp") {
|
|
1811
1818
|
event.preventDefault();
|
|
1812
1819
|
onChange({ ...hsv, v: clamp(hsv.v + step, 0, 100) });
|
|
1820
|
+
onCommit?.();
|
|
1813
1821
|
}
|
|
1814
1822
|
if (event.key === "ArrowDown") {
|
|
1815
1823
|
event.preventDefault();
|
|
1816
1824
|
onChange({ ...hsv, v: clamp(hsv.v - step, 0, 100) });
|
|
1825
|
+
onCommit?.();
|
|
1817
1826
|
}
|
|
1818
1827
|
};
|
|
1819
1828
|
|
|
@@ -1825,7 +1834,7 @@ function SaturationBrightnessField({
|
|
|
1825
1834
|
aria-disabled={disabled}
|
|
1826
1835
|
onPointerDown={(event) => {
|
|
1827
1836
|
if (disabled) return;
|
|
1828
|
-
draggingRef.current =
|
|
1837
|
+
draggingRef.current = startPointerGesture();
|
|
1829
1838
|
event.currentTarget.setPointerCapture(event.pointerId);
|
|
1830
1839
|
updateFromPointer(event);
|
|
1831
1840
|
}}
|
|
@@ -1834,13 +1843,17 @@ function SaturationBrightnessField({
|
|
|
1834
1843
|
updateFromPointer(event);
|
|
1835
1844
|
}}
|
|
1836
1845
|
onPointerUp={(event) => {
|
|
1837
|
-
draggingRef.current
|
|
1846
|
+
const ended = endPointerGesture(draggingRef.current);
|
|
1847
|
+
draggingRef.current = ended.state;
|
|
1838
1848
|
if (event.currentTarget.hasPointerCapture(event.pointerId)) {
|
|
1839
1849
|
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
1840
1850
|
}
|
|
1851
|
+
if (ended.shouldCommit) onCommit?.();
|
|
1841
1852
|
}}
|
|
1842
1853
|
onPointerCancel={() => {
|
|
1843
|
-
draggingRef.current
|
|
1854
|
+
const ended = endPointerGesture(draggingRef.current);
|
|
1855
|
+
draggingRef.current = ended.state;
|
|
1856
|
+
if (ended.shouldCommit) onCommit?.();
|
|
1844
1857
|
}}
|
|
1845
1858
|
onKeyDown={stepWithKeyboard}
|
|
1846
1859
|
className={cn(
|
|
@@ -1875,6 +1888,7 @@ function ColorTrack({
|
|
|
1875
1888
|
backgroundSize,
|
|
1876
1889
|
backgroundPosition,
|
|
1877
1890
|
onChange,
|
|
1891
|
+
onCommit,
|
|
1878
1892
|
}: {
|
|
1879
1893
|
label: string;
|
|
1880
1894
|
value: number;
|
|
@@ -1885,9 +1899,16 @@ function ColorTrack({
|
|
|
1885
1899
|
backgroundSize?: string;
|
|
1886
1900
|
backgroundPosition?: string;
|
|
1887
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;
|
|
1888
1909
|
}) {
|
|
1889
1910
|
const trackRef = useRef<HTMLDivElement>(null);
|
|
1890
|
-
const draggingRef = useRef(
|
|
1911
|
+
const draggingRef = useRef<PointerGestureState>(POINTER_GESTURE_IDLE);
|
|
1891
1912
|
const percent = ((value - min) / (max - min)) * 100;
|
|
1892
1913
|
|
|
1893
1914
|
const updateFromPointer = (event: PointerEvent<HTMLDivElement>) => {
|
|
@@ -1903,18 +1924,22 @@ function ColorTrack({
|
|
|
1903
1924
|
if (event.key === "ArrowRight" || event.key === "ArrowUp") {
|
|
1904
1925
|
event.preventDefault();
|
|
1905
1926
|
onChange(clamp(value + step, min, max));
|
|
1927
|
+
onCommit?.();
|
|
1906
1928
|
}
|
|
1907
1929
|
if (event.key === "ArrowLeft" || event.key === "ArrowDown") {
|
|
1908
1930
|
event.preventDefault();
|
|
1909
1931
|
onChange(clamp(value - step, min, max));
|
|
1932
|
+
onCommit?.();
|
|
1910
1933
|
}
|
|
1911
1934
|
if (event.key === "Home") {
|
|
1912
1935
|
event.preventDefault();
|
|
1913
1936
|
onChange(min);
|
|
1937
|
+
onCommit?.();
|
|
1914
1938
|
}
|
|
1915
1939
|
if (event.key === "End") {
|
|
1916
1940
|
event.preventDefault();
|
|
1917
1941
|
onChange(max);
|
|
1942
|
+
onCommit?.();
|
|
1918
1943
|
}
|
|
1919
1944
|
};
|
|
1920
1945
|
|
|
@@ -1931,7 +1956,7 @@ function ColorTrack({
|
|
|
1931
1956
|
onKeyDown={stepWithKeyboard}
|
|
1932
1957
|
onPointerDown={(event) => {
|
|
1933
1958
|
if (disabled) return;
|
|
1934
|
-
draggingRef.current =
|
|
1959
|
+
draggingRef.current = startPointerGesture();
|
|
1935
1960
|
event.currentTarget.setPointerCapture(event.pointerId);
|
|
1936
1961
|
updateFromPointer(event);
|
|
1937
1962
|
}}
|
|
@@ -1940,13 +1965,17 @@ function ColorTrack({
|
|
|
1940
1965
|
updateFromPointer(event);
|
|
1941
1966
|
}}
|
|
1942
1967
|
onPointerUp={(event) => {
|
|
1943
|
-
draggingRef.current
|
|
1968
|
+
const ended = endPointerGesture(draggingRef.current);
|
|
1969
|
+
draggingRef.current = ended.state;
|
|
1944
1970
|
if (event.currentTarget.hasPointerCapture(event.pointerId)) {
|
|
1945
1971
|
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
1946
1972
|
}
|
|
1973
|
+
if (ended.shouldCommit) onCommit?.();
|
|
1947
1974
|
}}
|
|
1948
1975
|
onPointerCancel={() => {
|
|
1949
|
-
draggingRef.current
|
|
1976
|
+
const ended = endPointerGesture(draggingRef.current);
|
|
1977
|
+
draggingRef.current = ended.state;
|
|
1978
|
+
if (ended.shouldCommit) onCommit?.();
|
|
1950
1979
|
}}
|
|
1951
1980
|
className={cn(
|
|
1952
1981
|
"relative h-3.5 cursor-pointer rounded-full border border-border/60 outline-none",
|
|
@@ -1999,8 +2028,8 @@ function ScrubbyNumberInput({
|
|
|
1999
2028
|
}, [value]);
|
|
2000
2029
|
|
|
2001
2030
|
const commit = () => {
|
|
2002
|
-
const parsed =
|
|
2003
|
-
if (
|
|
2031
|
+
const parsed = parseNumericDraft(draftRef.current);
|
|
2032
|
+
if (parsed === null) {
|
|
2004
2033
|
const reverted = String(value);
|
|
2005
2034
|
draftRef.current = reverted;
|
|
2006
2035
|
setDraft(reverted);
|
|
@@ -2068,6 +2097,37 @@ function ScrubbyNumberInput({
|
|
|
2068
2097
|
);
|
|
2069
2098
|
}
|
|
2070
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
|
+
|
|
2071
2131
|
// ─── Utilities ─────────────────────────────────────────────────────────────────
|
|
2072
2132
|
|
|
2073
2133
|
export function inferPaintType(
|
|
@@ -2095,7 +2155,7 @@ export function inferPaintType(
|
|
|
2095
2155
|
return "linear";
|
|
2096
2156
|
}
|
|
2097
2157
|
if (lower.startsWith("url(")) return "image";
|
|
2098
|
-
const parsed =
|
|
2158
|
+
const parsed = parseCssColorExtended(value);
|
|
2099
2159
|
if (opacity <= 0 || parsed?.a === 0 || value.trim() === "transparent") {
|
|
2100
2160
|
return "none";
|
|
2101
2161
|
}
|
|
@@ -2189,13 +2249,19 @@ function triggerSwatchStyle(
|
|
|
2189
2249
|
return swatchStyle(rgbaToCss(color));
|
|
2190
2250
|
}
|
|
2191
2251
|
|
|
2252
|
+
/** Values that render their own background without needing color parsing. */
|
|
2253
|
+
function looksLikeImageOrGradient(value: string): boolean {
|
|
2254
|
+
const lower = value.trim().toLowerCase();
|
|
2255
|
+
return lower.includes("gradient(") || lower.startsWith("url(");
|
|
2256
|
+
}
|
|
2257
|
+
|
|
2192
2258
|
function swatchStyle(value: string): {
|
|
2193
2259
|
backgroundColor?: string;
|
|
2194
2260
|
backgroundImage?: string;
|
|
2195
2261
|
backgroundSize?: string;
|
|
2196
2262
|
backgroundPosition?: string;
|
|
2197
2263
|
} {
|
|
2198
|
-
const parsed =
|
|
2264
|
+
const parsed = parseCssColorExtended(value);
|
|
2199
2265
|
if (parsed && parsed.a < 1) {
|
|
2200
2266
|
return {
|
|
2201
2267
|
backgroundImage: `${CHECKERBOARD_IMAGE}, linear-gradient(${rgbaToCss(parsed)}, ${rgbaToCss(parsed)})`,
|
|
@@ -2204,7 +2270,16 @@ function swatchStyle(value: string): {
|
|
|
2204
2270
|
};
|
|
2205
2271
|
}
|
|
2206
2272
|
if (parsed) return { backgroundColor: rgbaToCss(parsed) };
|
|
2207
|
-
|
|
2273
|
+
if (value && looksLikeImageOrGradient(value)) {
|
|
2274
|
+
return { backgroundImage: value };
|
|
2275
|
+
}
|
|
2276
|
+
// Unparseable and not a gradient/image value (e.g. a stale/invalid document
|
|
2277
|
+
// color) — show a neutral checkerboard instead of an invalid `background-image`
|
|
2278
|
+
// that would otherwise render as a blank swatch.
|
|
2279
|
+
return {
|
|
2280
|
+
backgroundImage: CHECKERBOARD_IMAGE,
|
|
2281
|
+
backgroundSize: "8px 8px",
|
|
2282
|
+
};
|
|
2208
2283
|
}
|
|
2209
2284
|
|
|
2210
2285
|
function alphaTrackBackground(color: RgbaColor): string {
|
|
@@ -2275,3 +2350,32 @@ function clampFloat(value: number, min: number, max: number): number {
|
|
|
2275
2350
|
function hasHexAlpha(value: string): boolean {
|
|
2276
2351
|
return /^#?(?:[0-9a-f]{4}|[0-9a-f]{8})$/i.test(value.trim());
|
|
2277
2352
|
}
|
|
2353
|
+
|
|
2354
|
+
/**
|
|
2355
|
+
* Parses a `ScrubbyNumberInput` draft string into a finite number, or `null`
|
|
2356
|
+
* when the draft should be treated as invalid (and thus reverted rather than
|
|
2357
|
+
* committed). `Number("")` is `0`, not `NaN`, so an emptied field must be
|
|
2358
|
+
* special-cased — otherwise clearing the input and blurring/pressing Enter
|
|
2359
|
+
* would silently commit `0` instead of reverting to the last real value.
|
|
2360
|
+
*/
|
|
2361
|
+
export function parseNumericDraft(draft: string): number | null {
|
|
2362
|
+
const trimmed = draft.trim();
|
|
2363
|
+
if (trimmed === "") return null;
|
|
2364
|
+
const parsed = Number(trimmed);
|
|
2365
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
2366
|
+
}
|
|
2367
|
+
|
|
2368
|
+
/**
|
|
2369
|
+
* Expands a bare 1-digit hex fragment (e.g. "F") into the standard 3-digit
|
|
2370
|
+
* shorthand ("FFF", which `parseCssColor` then doubles up to "FFFFFF") so a
|
|
2371
|
+
* single typed hex digit still commits instead of being rejected as
|
|
2372
|
+
* unparseable. Standard 3/4/6/8-digit hex (already handled by
|
|
2373
|
+
* `parseCssColor`) passes through unchanged.
|
|
2374
|
+
*/
|
|
2375
|
+
export function expandHexShorthand(value: string): string {
|
|
2376
|
+
const trimmed = value.trim().replace(/^#/, "");
|
|
2377
|
+
if (/^[0-9a-f]$/i.test(trimmed)) {
|
|
2378
|
+
return trimmed.repeat(3);
|
|
2379
|
+
}
|
|
2380
|
+
return trimmed;
|
|
2381
|
+
}
|