@agent-native/core 0.88.0 → 0.90.2
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 +96 -2
- package/corpus/core/docs/content/agent-native-toolkit.mdx +87 -146
- package/corpus/core/docs/content/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/components.mdx +16 -4
- package/corpus/core/docs/content/data-programs.mdx +329 -0
- package/corpus/core/docs/content/deployment.mdx +9 -9
- package/corpus/core/docs/content/extensions.mdx +8 -7
- package/corpus/core/docs/content/generative-ui.mdx +5 -3
- package/corpus/core/docs/content/key-concepts.mdx +6 -9
- package/corpus/core/docs/content/locales/ar-SA/agent-native-toolkit.mdx +100 -70
- package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/ar-SA/components.mdx +12 -2
- package/corpus/core/docs/content/locales/ar-SA/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/ar-SA/deployment.mdx +8 -9
- package/corpus/core/docs/content/locales/ar-SA/extensions.mdx +6 -4
- package/corpus/core/docs/content/locales/ar-SA/key-concepts.mdx +7 -9
- package/corpus/core/docs/content/locales/ar-SA/real-time-collaboration.mdx +9 -10
- package/corpus/core/docs/content/locales/de-DE/agent-native-toolkit.mdx +100 -74
- package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/de-DE/components.mdx +12 -2
- package/corpus/core/docs/content/locales/de-DE/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/de-DE/deployment.mdx +8 -9
- package/corpus/core/docs/content/locales/de-DE/extensions.mdx +6 -4
- package/corpus/core/docs/content/locales/de-DE/key-concepts.mdx +8 -10
- package/corpus/core/docs/content/locales/de-DE/real-time-collaboration.mdx +9 -10
- package/corpus/core/docs/content/locales/es-ES/agent-native-toolkit.mdx +100 -74
- package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/es-ES/components.mdx +12 -2
- package/corpus/core/docs/content/locales/es-ES/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/es-ES/deployment.mdx +8 -9
- package/corpus/core/docs/content/locales/es-ES/extensions.mdx +6 -4
- package/corpus/core/docs/content/locales/es-ES/key-concepts.mdx +8 -10
- package/corpus/core/docs/content/locales/es-ES/real-time-collaboration.mdx +9 -10
- package/corpus/core/docs/content/locales/fr-FR/agent-native-toolkit.mdx +100 -76
- package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/fr-FR/components.mdx +12 -2
- package/corpus/core/docs/content/locales/fr-FR/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/fr-FR/deployment.mdx +8 -9
- package/corpus/core/docs/content/locales/fr-FR/extensions.mdx +6 -4
- package/corpus/core/docs/content/locales/fr-FR/key-concepts.mdx +8 -10
- package/corpus/core/docs/content/locales/fr-FR/real-time-collaboration.mdx +9 -10
- package/corpus/core/docs/content/locales/hi-IN/agent-native-toolkit.mdx +100 -71
- package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/hi-IN/components.mdx +20 -10
- package/corpus/core/docs/content/locales/hi-IN/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/hi-IN/deployment.mdx +8 -9
- package/corpus/core/docs/content/locales/hi-IN/extensions.mdx +6 -4
- package/corpus/core/docs/content/locales/hi-IN/key-concepts.mdx +8 -10
- package/corpus/core/docs/content/locales/hi-IN/real-time-collaboration.mdx +9 -10
- package/corpus/core/docs/content/locales/ja-JP/agent-native-toolkit.mdx +100 -64
- package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/ja-JP/components.mdx +12 -2
- package/corpus/core/docs/content/locales/ja-JP/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/ja-JP/deployment.mdx +8 -9
- package/corpus/core/docs/content/locales/ja-JP/extensions.mdx +6 -4
- package/corpus/core/docs/content/locales/ja-JP/key-concepts.mdx +9 -11
- package/corpus/core/docs/content/locales/ja-JP/real-time-collaboration.mdx +9 -10
- package/corpus/core/docs/content/locales/ko-KR/agent-native-toolkit.mdx +100 -60
- package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/ko-KR/components.mdx +20 -10
- package/corpus/core/docs/content/locales/ko-KR/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/ko-KR/deployment.mdx +8 -9
- package/corpus/core/docs/content/locales/ko-KR/extensions.mdx +16 -14
- package/corpus/core/docs/content/locales/ko-KR/key-concepts.mdx +9 -11
- package/corpus/core/docs/content/locales/ko-KR/real-time-collaboration.mdx +9 -10
- package/corpus/core/docs/content/locales/pt-BR/agent-native-toolkit.mdx +100 -74
- package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/pt-BR/components.mdx +12 -2
- package/corpus/core/docs/content/locales/pt-BR/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/pt-BR/deployment.mdx +8 -9
- package/corpus/core/docs/content/locales/pt-BR/extensions.mdx +6 -4
- package/corpus/core/docs/content/locales/pt-BR/key-concepts.mdx +8 -11
- package/corpus/core/docs/content/locales/pt-BR/real-time-collaboration.mdx +9 -10
- package/corpus/core/docs/content/locales/zh-CN/agent-native-toolkit.mdx +100 -58
- package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/zh-CN/components.mdx +20 -10
- package/corpus/core/docs/content/locales/zh-CN/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/zh-CN/deployment.mdx +7 -9
- package/corpus/core/docs/content/locales/zh-CN/extensions.mdx +16 -14
- package/corpus/core/docs/content/locales/zh-CN/key-concepts.mdx +7 -11
- package/corpus/core/docs/content/locales/zh-CN/real-time-collaboration.mdx +10 -11
- package/corpus/core/docs/content/locales/zh-TW/agent-native-toolkit.mdx +100 -58
- package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/zh-TW/components.mdx +20 -10
- package/corpus/core/docs/content/locales/zh-TW/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/zh-TW/deployment.mdx +7 -9
- package/corpus/core/docs/content/locales/zh-TW/extensions.mdx +16 -14
- package/corpus/core/docs/content/locales/zh-TW/key-concepts.mdx +7 -11
- package/corpus/core/docs/content/locales/zh-TW/real-time-collaboration.mdx +10 -11
- package/corpus/core/docs/content/real-time-collaboration.mdx +10 -11
- package/corpus/core/docs/content/toolkit-app-adapters.mdx +46 -0
- package/corpus/core/docs/content/toolkit-collaboration-ui.mdx +48 -0
- package/corpus/core/docs/content/toolkit-sharing-ui.mdx +33 -0
- package/corpus/core/docs/content/toolkit-shell-hooks.mdx +27 -0
- package/corpus/core/docs/content/toolkit-ui.mdx +69 -0
- package/corpus/core/package.json +5 -1
- package/corpus/core/src/agent/durable-background.ts +53 -0
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +7 -1
- package/corpus/core/src/agent/engine/anthropic-engine.ts +29 -1
- package/corpus/core/src/agent/engine/builder-engine.ts +1 -0
- package/corpus/core/src/agent/engine/output-tokens.ts +26 -13
- package/corpus/core/src/agent/engine/registry.ts +45 -26
- package/corpus/core/src/agent/engine/translate-ai-sdk.ts +56 -7
- package/corpus/core/src/agent/engine/translate-anthropic.ts +43 -1
- package/corpus/core/src/agent/engine/types.ts +16 -0
- package/corpus/core/src/agent/model-config.ts +100 -0
- package/corpus/core/src/agent/production-agent.ts +492 -241
- package/corpus/core/src/agent/runtime-context.ts +50 -12
- package/corpus/core/src/agent/tool-result-images.ts +178 -0
- package/corpus/core/src/brand-kit/fig/index.ts +8 -4
- package/corpus/core/src/client/AgentPanel.tsx +89 -32
- package/corpus/core/src/client/AssistantChat.tsx +95 -46
- package/corpus/core/src/client/KeepTabOpenNotice.tsx +176 -0
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +7 -0
- package/corpus/core/src/client/RunStuckBanner.tsx +13 -1
- package/corpus/core/src/client/chat/run-recovery.tsx +7 -1
- package/corpus/core/src/client/clipboard.ts +17 -13
- package/corpus/core/src/client/components/AgentPresenceChip.tsx +4 -69
- package/corpus/core/src/client/components/LiveCursorOverlay.tsx +5 -240
- package/corpus/core/src/client/components/PresenceBar.tsx +4 -346
- package/corpus/core/src/client/components/RecentEditHighlights.tsx +4 -219
- package/corpus/core/src/client/components/RemoteSelectionRings.tsx +5 -220
- package/corpus/core/src/client/composer/TiptapComposer.tsx +94 -38
- package/corpus/core/src/client/db-admin/SqlEditor.tsx +13 -3
- package/corpus/core/src/client/dynamic-suggestions.ts +6 -1
- package/corpus/core/src/client/extensions/ExtensionViewer.tsx +0 -14
- package/corpus/core/src/client/extensions/ExtensionsListPage.tsx +29 -30
- package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +2 -1
- package/corpus/core/src/client/host-bridge.ts +29 -8
- package/corpus/core/src/client/i18n.tsx +7 -1
- package/corpus/core/src/client/index.ts +5 -0
- package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +34 -69
- package/corpus/core/src/client/rich-markdown-editor/SharedRichEditor.tsx +4 -0
- package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +18 -7
- package/corpus/core/src/client/settings/SettingsPanel.tsx +409 -230
- package/corpus/core/src/client/settings/SettingsTabsPage.tsx +5 -7
- package/corpus/core/src/client/settings/index.ts +5 -1
- package/corpus/core/src/client/sharing/VisibilityBadge.tsx +4 -37
- package/corpus/core/src/client/use-action.ts +39 -2
- package/corpus/core/src/client/use-db-sync.ts +44 -18
- package/corpus/core/src/client/use-run-stuck-detection.ts +10 -1
- package/corpus/core/src/coding-tools/run-code.ts +473 -74
- package/corpus/core/src/coding-tools/sandbox/background.ts +406 -0
- package/corpus/core/src/coding-tools/sandbox/executions-store.ts +517 -0
- package/corpus/core/src/coding-tools/sandbox/index.ts +53 -13
- package/corpus/core/src/coding-tools/sandbox/local-child-process-adapter.ts +61 -4
- package/corpus/core/src/collab/client.ts +870 -562
- package/corpus/core/src/collab/presence.ts +12 -23
- package/corpus/core/src/collab/recent-edits.ts +13 -32
- package/corpus/core/src/data-programs/actions.ts +335 -0
- package/corpus/core/src/data-programs/contract.ts +284 -0
- package/corpus/core/src/data-programs/execute.ts +693 -0
- package/corpus/core/src/data-programs/index.ts +72 -0
- package/corpus/core/src/data-programs/schema.ts +148 -0
- package/corpus/core/src/data-programs/store.ts +755 -0
- package/corpus/core/src/db/create-get-db.ts +32 -2
- package/corpus/core/src/deploy/build.ts +34 -0
- package/corpus/core/src/extensions/actions.ts +2 -2
- package/corpus/core/src/file-upload/builder.ts +11 -0
- package/corpus/core/src/integrations/webhook-handler.ts +27 -8
- package/corpus/core/src/local-artifacts/index.ts +1 -1
- package/corpus/core/src/localization/default-messages.ts +1 -2
- package/corpus/core/src/mcp-client/index.ts +29 -0
- package/corpus/core/src/onboarding/default-steps.ts +5 -2
- package/corpus/core/src/resources/store.ts +34 -3
- package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +4 -8
- package/corpus/core/src/scripts/agent-engines/test-agent-engine.ts +9 -2
- package/corpus/core/src/scripts/db/tool-mode.ts +2 -2
- package/corpus/core/src/scripts/resources/migrate-learnings.ts +9 -13
- package/corpus/core/src/server/agent-chat-plugin.ts +154 -62
- package/corpus/core/src/server/agent-discovery.ts +67 -7
- package/corpus/core/src/server/auth.ts +90 -3
- package/corpus/core/src/server/builder-design-systems.ts +2 -2
- package/corpus/core/src/server/core-routes-plugin.ts +119 -22
- package/corpus/core/src/server/credential-provider.ts +28 -8
- package/corpus/core/src/server/csrf.ts +3 -0
- package/corpus/core/src/server/framework-request-handler.ts +52 -4
- package/corpus/core/src/server/oauth-helpers.ts +11 -1
- package/corpus/core/src/server/onboarding-html.ts +80 -48
- package/corpus/core/src/server/prompts/shared-rules.ts +2 -2
- package/corpus/core/src/server/transcribe-voice.ts +93 -9
- package/corpus/core/src/styles/agent-native.css +57 -45
- package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/core/src/templates/default/AGENTS.md +11 -14
- package/corpus/core/src/templates/default/actions/navigate.ts +1 -1
- package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/de-DE.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/en-US.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/es-ES.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +0 -1
- package/corpus/core/src/templates/default/app/routes/settings.tsx +22 -33
- package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +20 -7
- package/corpus/core/src/templates/headless/AGENTS.md +9 -6
- package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/data-programs/SKILL.md +128 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +10 -4
- package/corpus/core/src/vite/agents-bundle-plugin.ts +26 -1
- package/corpus/core/src/vite/client.ts +12 -0
- package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/analytics/.agents/skills/analysis-workspace/SKILL.md +8 -0
- package/corpus/templates/analytics/.agents/skills/data-programs/SKILL.md +348 -0
- package/corpus/templates/analytics/.agents/skills/provider-api/SKILL.md +10 -0
- package/corpus/templates/analytics/AGENTS.md +31 -32
- package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +1 -1
- package/corpus/templates/analytics/actions/delete-data-source-credentials.ts +32 -0
- package/corpus/templates/analytics/actions/ensure-risk-meeting-dashboard.ts +247 -0
- package/corpus/templates/analytics/actions/update-data-source-credentials.ts +123 -0
- package/corpus/templates/analytics/app/components/InlineMetric.tsx +2 -2
- package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +2 -7
- package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +11 -16
- package/corpus/templates/analytics/app/components/dashboard/DateRangePicker.tsx +1 -2
- package/corpus/templates/analytics/app/components/dashboard/MetricCard.tsx +2 -7
- package/corpus/templates/analytics/app/components/dashboard/RecentActivity.tsx +3 -6
- package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +1 -6
- package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +2 -7
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +11 -15
- package/corpus/templates/analytics/app/components/dashboard/StatsCard.tsx +1 -7
- package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +2 -7
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +16 -16
- package/corpus/templates/analytics/app/components/layout/Header.tsx +2 -2
- package/corpus/templates/analytics/app/components/layout/HeaderActions.tsx +2 -1
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -2
- package/corpus/templates/analytics/app/components/layout/MobileNav.tsx +33 -17
- package/corpus/templates/analytics/app/components/layout/NewAnalysisDialog.tsx +6 -6
- package/corpus/templates/analytics/app/components/layout/NewDashboardDialog.tsx +4 -3
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +119 -68
- package/corpus/templates/analytics/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/alert.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/avatar.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/button.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/calendar.tsx +1 -1
- package/corpus/templates/analytics/app/components/ui/card.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/collapsible.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/command.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/date-picker.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/input.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/label.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/progress.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/select.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/sonner.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/table.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/toaster.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/toggle-group.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/analytics/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/analytics/app/global.css +26 -3
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +27 -4
- package/corpus/templates/analytics/app/i18n-data.ts +277 -42
- package/corpus/templates/analytics/app/pages/Agents.tsx +19 -19
- package/corpus/templates/analytics/app/pages/DataDictionary.tsx +21 -21
- package/corpus/templates/analytics/app/pages/DataSources.tsx +31 -54
- package/corpus/templates/analytics/app/pages/NotFound.tsx +2 -1
- package/corpus/templates/analytics/app/pages/Placeholder.tsx +2 -1
- package/corpus/templates/analytics/app/pages/Settings.tsx +19 -37
- package/corpus/templates/analytics/app/pages/adhoc/DashboardSkeleton.tsx +3 -2
- package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +8 -13
- package/corpus/templates/analytics/app/pages/adhoc/_shared/components/DateRangeInput.tsx +1 -2
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/ChartTypePicker.tsx +2 -4
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/DateRangePicker.tsx +1 -2
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventCombobox.tsx +7 -7
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventPanel.tsx +2 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventRow.tsx +2 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/ExplorerChart.tsx +3 -8
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/FilterBuilder.tsx +5 -4
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/GroupByPicker.tsx +2 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/PropertyCombobox.tsx +7 -7
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/PropertyValueCombobox.tsx +7 -7
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/SqlPreview.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer/index.tsx +16 -16
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/ChartCard.tsx +16 -21
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +32 -32
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +14 -14
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/EmailReportDialog.tsx +14 -13
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +200 -52
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +23 -28
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewSqlPopover.tsx +13 -12
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +15 -15
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +32 -36
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +2 -1
- package/corpus/templates/analytics/app/pages/analyses/AnalysesList.tsx +8 -7
- package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +19 -19
- package/corpus/templates/analytics/app/pages/analyses/LegacyFusionAnalysis.tsx +11 -15
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +14 -14
- package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +7 -12
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +12 -12
- package/corpus/templates/analytics/app/pages/settings/AlertRulesSettingsCard.tsx +25 -25
- package/corpus/templates/analytics/app/root.tsx +22 -19
- package/corpus/templates/analytics/app/routes/catalog.tsx +8 -8
- package/corpus/templates/analytics/changelog/2026-07-06-dashboard-lists-and-headers-stay-compact.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-06-dashboards-can-now-chart-data-programs-saved-server-side-scr.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-06-extension-pages-and-mobile-headers-now-share-one-background-shade.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-06-mobile-chat-header-is-more-compact-and-the-menu-button-opens-navigation.md +5 -0
- package/corpus/templates/analytics/learnings.defaults.md +36 -0
- package/corpus/templates/analytics/seeds/data-programs/risk-meeting-cohort.js +254 -0
- package/corpus/templates/analytics/seeds/data-programs/risk-meeting-pylon-early-warning.js +184 -0
- package/corpus/templates/analytics/server/handlers/sql-query.ts +1 -1
- package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +109 -1
- package/corpus/templates/assets/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +5 -0
- package/corpus/templates/assets/.agents/skills/logo-composite/SKILL.md +34 -6
- package/corpus/templates/assets/AGENTS.md +23 -4
- package/corpus/templates/assets/actions/_generation-preset-settings.ts +48 -0
- package/corpus/templates/assets/actions/_helpers.ts +8 -1
- package/corpus/templates/assets/actions/_preset-skeleton-validation.ts +64 -0
- package/corpus/templates/assets/actions/create-generation-preset.ts +11 -3
- package/corpus/templates/assets/actions/generate-image-batch.ts +7 -2
- package/corpus/templates/assets/actions/generate-image.ts +342 -25
- package/corpus/templates/assets/actions/get-library.ts +4 -3
- package/corpus/templates/assets/actions/navigate.ts +2 -1
- package/corpus/templates/assets/actions/refresh-generation-run.ts +5 -1
- package/corpus/templates/assets/actions/update-asset.ts +1 -0
- package/corpus/templates/assets/actions/update-generation-preset.ts +8 -1
- package/corpus/templates/assets/actions/view-screen.ts +8 -1
- package/corpus/templates/assets/app/components/create/RecentDraftsSection.tsx +3 -2
- package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +25 -11
- package/corpus/templates/assets/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/assets/app/components/layout/PageShell.tsx +4 -4
- package/corpus/templates/assets/app/components/layout/Sidebar.tsx +12 -12
- package/corpus/templates/assets/app/components/library/CreateLibraryDialog.tsx +8 -8
- package/corpus/templates/assets/app/components/library/EditLibraryDialog.tsx +7 -7
- package/corpus/templates/assets/app/components/library/LibraryCard.tsx +8 -8
- package/corpus/templates/assets/app/components/library/LibraryPresetGrid.tsx +3 -2
- package/corpus/templates/assets/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/button.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/card.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/input.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/label.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/select.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/sonner.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/assets/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/assets/app/global.css +1 -0
- package/corpus/templates/assets/app/hooks/use-image-model-menu.ts +1 -0
- package/corpus/templates/assets/app/hooks/use-navigation-state.ts +11 -0
- package/corpus/templates/assets/app/i18n/zh-TW.ts +64 -0
- package/corpus/templates/assets/app/i18n-data.ts +650 -0
- package/corpus/templates/assets/app/root.tsx +12 -9
- package/corpus/templates/assets/app/routes/asset.$id.tsx +21 -20
- package/corpus/templates/assets/app/routes/audit.tsx +15 -14
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +93 -87
- package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +1474 -0
- package/corpus/templates/assets/app/routes/library.tsx +74 -32
- package/corpus/templates/assets/app/routes/settings.tsx +21 -35
- package/corpus/templates/assets/changelog/2026-07-06-mobile-layouts-no-longer-stack-two-top-headers.md +5 -0
- package/corpus/templates/assets/server/lib/generation.ts +366 -44
- package/corpus/templates/assets/server/lib/image-processing.ts +252 -0
- package/corpus/templates/assets/server/lib/preset-skeleton.ts +137 -0
- package/corpus/templates/assets/shared/api.ts +47 -0
- package/corpus/templates/brain/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/brain/.agents/skills/ask-across-everything/SKILL.md +6 -1
- package/corpus/templates/brain/.agents/skills/brain/SKILL.md +63 -5
- package/corpus/templates/brain/.agents/skills/ingestion-and-connectors/SKILL.md +112 -0
- package/corpus/templates/brain/AGENTS.md +93 -8
- package/corpus/templates/brain/app/components/brain/CanonicalPreviewSheet.tsx +6 -5
- package/corpus/templates/brain/app/components/brain/Surface.tsx +3 -8
- package/corpus/templates/brain/app/components/layout/Layout.tsx +7 -7
- package/corpus/templates/brain/app/components/layout/Sidebar.tsx +6 -6
- package/corpus/templates/brain/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/button.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/card.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/input.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/label.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/progress.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/select.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/table.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/brain/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/brain/app/global.css +1 -0
- package/corpus/templates/brain/app/hooks/use-distillation-bridge.ts +9 -4
- package/corpus/templates/brain/app/root.tsx +11 -8
- package/corpus/templates/brain/app/routes/knowledge.tsx +19 -19
- package/corpus/templates/brain/app/routes/ops.tsx +18 -18
- package/corpus/templates/brain/app/routes/review.tsx +22 -27
- package/corpus/templates/brain/app/routes/search.tsx +20 -20
- package/corpus/templates/brain/app/routes/settings.tsx +25 -40
- package/corpus/templates/brain/app/routes/sources.tsx +23 -23
- package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/calendar/actions/find-a-time.ts +29 -16
- package/corpus/templates/calendar/actions/list-bookings.ts +33 -2
- package/corpus/templates/calendar/actions/list-events.ts +34 -8
- package/corpus/templates/calendar/actions/update-calendar-visual-preferences.ts +105 -34
- package/corpus/templates/calendar/app/components/ThemeToggle.tsx +5 -5
- package/corpus/templates/calendar/app/components/TimezoneCombobox.tsx +6 -6
- package/corpus/templates/calendar/app/components/booking/BookingConfirmation.tsx +2 -1
- package/corpus/templates/calendar/app/components/booking/BookingForm.tsx +9 -8
- package/corpus/templates/calendar/app/components/booking/DatePicker.tsx +2 -2
- package/corpus/templates/calendar/app/components/booking/TimeSlotPicker.tsx +3 -2
- package/corpus/templates/calendar/app/components/calendar/AddCalendarDialog.tsx +10 -15
- package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +6 -6
- package/corpus/templates/calendar/app/components/calendar/CommandPalette.tsx +73 -3
- package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +27 -27
- package/corpus/templates/calendar/app/components/calendar/DayView.tsx +553 -267
- package/corpus/templates/calendar/app/components/calendar/DeleteEventDialog.tsx +9 -12
- package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +10 -13
- package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +7 -7
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +21 -21
- package/corpus/templates/calendar/app/components/calendar/EventDialog.tsx +11 -11
- package/corpus/templates/calendar/app/components/calendar/EventOptionControls.tsx +9 -9
- package/corpus/templates/calendar/app/components/calendar/FindTimePanel.tsx +9 -9
- package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +6 -6
- package/corpus/templates/calendar/app/components/calendar/GoogleSetupWizard.tsx +3 -3
- package/corpus/templates/calendar/app/components/calendar/GoogleSyncButton.tsx +1 -1
- package/corpus/templates/calendar/app/components/calendar/GuestNotificationDialog.tsx +8 -10
- package/corpus/templates/calendar/app/components/calendar/IntegrationsSidebar.tsx +12 -12
- package/corpus/templates/calendar/app/components/calendar/KeyboardShortcutsHelp.tsx +2 -2
- package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +93 -41
- package/corpus/templates/calendar/app/components/calendar/PeopleSearchDialog.tsx +6 -6
- package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +530 -299
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +229 -134
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +135 -108
- package/corpus/templates/calendar/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/button.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/card.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/collapsible.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/command.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/input.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/label.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/radio-group.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/select.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/table.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/calendar/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/calendar/app/global.css +1 -0
- package/corpus/templates/calendar/app/hooks/use-event-drag.ts +63 -9
- package/corpus/templates/calendar/app/hooks/use-google-auth.ts +15 -27
- package/corpus/templates/calendar/app/hooks/use-grid-create-drag.ts +254 -0
- package/corpus/templates/calendar/app/hooks/use-mobile.ts +1 -0
- package/corpus/templates/calendar/app/hooks/use-view-preferences.ts +287 -21
- package/corpus/templates/calendar/app/hooks/use-zoom-auth.ts +56 -19
- package/corpus/templates/calendar/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/calendar/app/i18n-data.ts +31 -0
- package/corpus/templates/calendar/app/lib/event-colors.ts +29 -8
- package/corpus/templates/calendar/app/pages/AvailabilitySettings.tsx +11 -11
- package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +45 -50
- package/corpus/templates/calendar/app/pages/BookingPage.tsx +2 -2
- package/corpus/templates/calendar/app/pages/BookingsList.tsx +12 -12
- package/corpus/templates/calendar/app/pages/CalendarView.tsx +438 -271
- package/corpus/templates/calendar/app/pages/ManageBookingPage.tsx +13 -13
- package/corpus/templates/calendar/app/pages/Settings.tsx +15 -29
- package/corpus/templates/calendar/app/root.tsx +19 -15
- package/corpus/templates/calendar/app/routes/event.tsx +2 -2
- package/corpus/templates/calendar/changelog/2026-07-06-calendar-now-loads-view-preferences-much-more-efficiently.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-connected-calendars-keep-their-own-color-when-you-customize-.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-create-events-from-the-command-menu-with-natural-phrases-lik.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-drag-across-empty-week-or-day-slots-to-create-an-event-with-.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-dragging-and-resizing-events-is-much-smoother-especially-on-.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-each-connected-google-account-can-now-have-its-own-calendar-.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-events-spanning-multiple-days-now-show-on-every-day-they-cov.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-google-calendar-now-finishes-connecting-correctly-after-sign.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-public-booking-pages-respond-faster.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-the-app-header-no-longer-shows-the-global-notifications-bell.md +6 -0
- package/corpus/templates/calendar/package.json +1 -0
- package/corpus/templates/calendar/server/handlers/bookings.ts +46 -52
- package/corpus/templates/calendar/server/handlers/google-auth.ts +21 -5
- package/corpus/templates/calendar/server/lib/google-calendar.ts +32 -3
- package/corpus/templates/calendar/shared/calendar-view-preferences.ts +66 -2
- package/corpus/templates/chat/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/chat/app/components/layout/Layout.tsx +6 -6
- package/corpus/templates/chat/app/components/layout/Sidebar.tsx +12 -12
- package/corpus/templates/chat/app/components/ui/button.tsx +1 -0
- package/corpus/templates/chat/app/components/ui/card.tsx +1 -0
- package/corpus/templates/chat/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/chat/app/components/ui/input.tsx +1 -0
- package/corpus/templates/chat/app/components/ui/label.tsx +1 -0
- package/corpus/templates/chat/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/chat/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/chat/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/chat/app/global.css +1 -0
- package/corpus/templates/chat/app/root.tsx +7 -4
- package/corpus/templates/chat/app/routes/settings.tsx +6 -21
- package/corpus/templates/clips/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +18 -4
- package/corpus/templates/clips/.env.example +8 -0
- package/corpus/templates/clips/actions/accept-invite.ts +3 -0
- package/corpus/templates/clips/actions/add-recording-to-space.ts +55 -27
- package/corpus/templates/clips/actions/add-vocabulary-term.ts +3 -1
- package/corpus/templates/clips/actions/archive-recording.ts +5 -12
- package/corpus/templates/clips/actions/cleanup-transcript.ts +5 -4
- package/corpus/templates/clips/actions/clear-edits.ts +42 -29
- package/corpus/templates/clips/actions/create-meeting.ts +87 -40
- package/corpus/templates/clips/actions/create-recording.ts +6 -3
- package/corpus/templates/clips/actions/delete-meeting.ts +25 -0
- package/corpus/templates/clips/actions/delete-recording-permanent.ts +3 -0
- package/corpus/templates/clips/actions/disconnect-calendar.ts +10 -4
- package/corpus/templates/clips/actions/export-insights-csv.ts +28 -8
- package/corpus/templates/clips/actions/finalize-meeting.ts +106 -33
- package/corpus/templates/clips/actions/finalize-recording.ts +201 -3
- package/corpus/templates/clips/actions/get-organization-insights.ts +51 -7
- package/corpus/templates/clips/actions/import-loom-recording.ts +17 -0
- package/corpus/templates/clips/actions/lib/audio-only-transcription.ts +18 -1
- package/corpus/templates/clips/actions/lib/create-recording-schema.ts +7 -1
- package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +16 -0
- package/corpus/templates/clips/actions/list-clip-views.ts +60 -0
- package/corpus/templates/clips/actions/regenerate-summary.ts +10 -0
- package/corpus/templates/clips/actions/remove-vocabulary-term.ts +59 -0
- package/corpus/templates/clips/actions/request-transcript.ts +170 -25
- package/corpus/templates/clips/actions/restore-recording.ts +5 -12
- package/corpus/templates/clips/actions/save-browser-transcript.ts +13 -2
- package/corpus/templates/clips/actions/set-chapters.ts +6 -15
- package/corpus/templates/clips/actions/set-thumbnail.ts +77 -36
- package/corpus/templates/clips/actions/split-recording.ts +49 -35
- package/corpus/templates/clips/actions/stitch-recordings.ts +7 -4
- package/corpus/templates/clips/actions/stop-meeting-recording.ts +15 -1
- package/corpus/templates/clips/actions/sync-calendars.ts +10 -108
- package/corpus/templates/clips/actions/trash-recording.ts +43 -14
- package/corpus/templates/clips/actions/trim-recording.ts +48 -27
- package/corpus/templates/clips/actions/undo-edit.ts +49 -37
- package/corpus/templates/clips/app/components/capture-install-options.tsx +6 -6
- package/corpus/templates/clips/app/components/dictate/vocabulary-section.tsx +208 -0
- package/corpus/templates/clips/app/components/editable-recording-title.tsx +2 -2
- package/corpus/templates/clips/app/components/editor/chapters-editor.tsx +7 -7
- package/corpus/templates/clips/app/components/editor/editor-toolbar.tsx +26 -26
- package/corpus/templates/clips/app/components/editor/split-button.tsx +5 -4
- package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +9 -9
- package/corpus/templates/clips/app/components/editor/thumbnail-picker.tsx +11 -16
- package/corpus/templates/clips/app/components/editor/timeline.tsx +3 -3
- package/corpus/templates/clips/app/components/editor/transcript-editor.tsx +5 -5
- package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +4 -4
- package/corpus/templates/clips/app/components/library/create-space-dialog.tsx +8 -8
- package/corpus/templates/clips/app/components/library/empty-state.tsx +2 -1
- package/corpus/templates/clips/app/components/library/folder-tree.tsx +14 -14
- package/corpus/templates/clips/app/components/library/library-grid.tsx +24 -98
- package/corpus/templates/clips/app/components/library/library-layout.tsx +25 -21
- package/corpus/templates/clips/app/components/library/organization-switcher.tsx +11 -11
- package/corpus/templates/clips/app/components/library/recording-card.tsx +44 -50
- package/corpus/templates/clips/app/components/library/search-bar.tsx +5 -5
- package/corpus/templates/clips/app/components/library/sort-menu.tsx +5 -4
- package/corpus/templates/clips/app/components/library/tag-input.tsx +4 -4
- package/corpus/templates/clips/app/components/meetings/attendee-stack.tsx +2 -6
- package/corpus/templates/clips/app/components/meetings/auto-record-prompt.tsx +1 -1
- package/corpus/templates/clips/app/components/meetings/bullet-link.tsx +4 -4
- package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +5 -5
- package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +3 -3
- package/corpus/templates/clips/app/components/meetings/quick-ask-sidebar.tsx +17 -9
- package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +6 -11
- package/corpus/templates/clips/app/components/meetings/transcript-bubbles.tsx +215 -21
- package/corpus/templates/clips/app/components/player/access-password-prompt.tsx +3 -2
- package/corpus/templates/clips/app/components/player/comments-panel.tsx +14 -14
- package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +7 -6
- package/corpus/templates/clips/app/components/player/insights-panel.tsx +18 -6
- package/corpus/templates/clips/app/components/player/player-controls.tsx +42 -36
- package/corpus/templates/clips/app/components/player/reactions-tray.tsx +4 -4
- package/corpus/templates/clips/app/components/player/settings-panel.tsx +13 -12
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +80 -49
- package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +3 -2
- package/corpus/templates/clips/app/components/player/timestamped-comment-button.tsx +2 -2
- package/corpus/templates/clips/app/components/player/transcript-panel.tsx +7 -7
- package/corpus/templates/clips/app/components/player/video-player.tsx +182 -15
- package/corpus/templates/clips/app/components/recorder/camera-visualizer.tsx +1 -1
- package/corpus/templates/clips/app/components/recorder/microphone-visualizer.tsx +1 -1
- package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +49 -36
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +399 -57
- package/corpus/templates/clips/app/components/recorder/recording-toolbar.tsx +6 -5
- package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +7 -6
- package/corpus/templates/clips/app/components/sharing/share-ui.tsx +10 -10
- package/corpus/templates/clips/app/components/sharing/viewed-by-popover.tsx +132 -0
- package/corpus/templates/clips/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/avatar.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/button.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/card.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/collapsible.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/context-menu.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/input.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/label.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/scroll-area.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/select.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/slider.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/sonner.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/table.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/clips/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +5 -9
- package/corpus/templates/clips/app/components/workspace/insights-hub.tsx +9 -19
- package/corpus/templates/clips/app/components/workspace/invite-dialog.tsx +10 -9
- package/corpus/templates/clips/app/components/workspace/members-list.tsx +11 -10
- package/corpus/templates/clips/app/components/workspace/notifications-list.tsx +2 -1
- package/corpus/templates/clips/app/components/workspace/top-creators-table.tsx +3 -2
- package/corpus/templates/clips/app/components/workspace/top-videos-table.tsx +3 -2
- package/corpus/templates/clips/app/global.css +1 -0
- package/corpus/templates/clips/app/hooks/use-desktop-promo.ts +2 -1
- package/corpus/templates/clips/app/hooks/use-mobile.ts +1 -0
- package/corpus/templates/clips/app/hooks/use-player-shortcuts.ts +14 -10
- package/corpus/templates/clips/app/hooks/use-view-tracking.ts +14 -0
- package/corpus/templates/clips/app/i18n/ar-SA.ts +56 -0
- package/corpus/templates/clips/app/i18n/de-DE.ts +53 -0
- package/corpus/templates/clips/app/i18n/en-US.ts +52 -0
- package/corpus/templates/clips/app/i18n/es-ES.ts +53 -0
- package/corpus/templates/clips/app/i18n/fr-FR.ts +53 -0
- package/corpus/templates/clips/app/i18n/hi-IN.ts +52 -0
- package/corpus/templates/clips/app/i18n/ja-JP.ts +53 -0
- package/corpus/templates/clips/app/i18n/ko-KR.ts +52 -0
- package/corpus/templates/clips/app/i18n/pt-BR.ts +53 -0
- package/corpus/templates/clips/app/i18n/zh-CN.ts +51 -0
- package/corpus/templates/clips/app/i18n/zh-TW.ts +51 -0
- package/corpus/templates/clips/app/lib/recorder-preferences.ts +4 -0
- package/corpus/templates/clips/app/lib/timestamp-mapping.ts +5 -0
- package/corpus/templates/clips/app/root.tsx +26 -23
- package/corpus/templates/clips/app/routes/_app.dictate.tsx +39 -23
- package/corpus/templates/clips/app/routes/_app.library._index.tsx +27 -1
- package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +134 -39
- package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +20 -20
- package/corpus/templates/clips/app/routes/_app.notifications.tsx +3 -3
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +92 -60
- package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +8 -13
- package/corpus/templates/clips/app/routes/_app.spaces._index.tsx +1 -1
- package/corpus/templates/clips/app/routes/_app.trash.tsx +96 -31
- package/corpus/templates/clips/app/routes/bug-report.done.tsx +1 -1
- package/corpus/templates/clips/app/routes/bug-report.tsx +11 -11
- package/corpus/templates/clips/app/routes/download.tsx +2 -2
- package/corpus/templates/clips/app/routes/embed.$shareId.tsx +2 -1
- package/corpus/templates/clips/app/routes/invite.$token.tsx +8 -13
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +263 -251
- package/corpus/templates/clips/app/routes/record.tsx +185 -78
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +51 -29
- package/corpus/templates/clips/app/routes/share.meeting.$meetingId.tsx +71 -16
- package/corpus/templates/clips/changelog/2026-07-05-mobile-clip-pages-use-a-tighter-viewer-layout-with-inline-ac.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-ai-setup-now-switches-to-your-saved-provider-key-and-uses-fa.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-browsers-that-can-t-play-a-clip-s-video-format-now-see-a-cle.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-calendar-connections-no-longer-ask-you-to-reconnect-after-te.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-chrome-extension-recordings-keep-your-selected-microphone.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-clip-recordings-now-use-streaming-uploads-by-default.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-clip-titles-in-the-library-grid-now-open-the-clip-instead-of.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-desktop-countdown-now-dims-the-screen-before-recording.md +5 -0
- package/corpus/templates/clips/changelog/2026-07-06-desktop-popover-no-longer-drops-bluetooth-headphones-into-call-quality-mode.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-desktop-recorder-now-refreshes-cameras-and-mics-when-the-pop.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-desktop-recordings-keep-microphone-volume-clear-while-recor.md +5 -0
- package/corpus/templates/clips/changelog/2026-07-06-desktop-recordings-no-longer-get-stuck-optimizing-when-scree.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-dictation-history-from-the-desktop-app-now-appears-in-the-di.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-dictation-no-longer-overwrites-your-clipboard-and-messaging-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-double-tap-your-dictation-key-for-hands-free-dictation-tap-a.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-fixed-desktop-recordings-sometimes-uploading-without-audio-a.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-fixed-desktop-recordings-that-could-get-stuck-uploading-and-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-fixed-recordings-sometimes-capturing-from-the-wrong-micropho.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-hands-free-dictation-and-meeting-cleanup-recover-more-reliab.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-live-meetings-show-time-remaining-and-you-can-end-a-meeting-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-manage-your-personal-dictation-dictionary-from-the-dictate-t.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-meetings-interrupted-by-quitting-or-crashing-now-close-out-c.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-mic-only-desktop-recordings-now-use-the-selected-microphone-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-paste-your-last-dictation-anytime-with-cmd-ctrl-v-or-from-th.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-press-esc-to-cancel-a-dictation-in-progress.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-recordings-whose-video-file-contains-no-audio-track-no-longe.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-search-inside-meeting-transcripts.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-see-who-viewed-your-shared-clips-and-when-click-the-view-cou.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-share-links-for-agents-now-appear-as-soon-as-the-share-menu-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-share-popovers-now-stay-above-video-playback-controls.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-shared-clip-pages-now-recover-automatically-from-transient-v.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-the-desktop-app-now-walks-you-through-permissions-on-first-l.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-transcript-cleanup-preferences-now-save-per-user.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-transcripts-now-retry-automatically-after-transient-failures.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-video-compression-now-runs-in-the-background-without-blocking.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-native-microphone-recordings-now-reduce-steady-background-noise.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-recording-transcripts-now-line-up-with-the-video-start-afte.md +6 -0
- package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
- package/corpus/templates/clips/chrome-extension/src/background.ts +141 -48
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +383 -59
- package/corpus/templates/clips/chrome-extension/src/overlay.ts +51 -10
- package/corpus/templates/clips/chrome-extension/src/popup.ts +57 -6
- package/corpus/templates/clips/desktop/package.json +1 -1
- package/corpus/templates/clips/desktop/scripts/sign-macos-local.ts +67 -0
- package/corpus/templates/clips/desktop/src/app.tsx +38 -13
- package/corpus/templates/clips/desktop/src/components/SourceRow.tsx +1 -0
- package/corpus/templates/clips/desktop/src/hooks/useMediaDevices.ts +88 -28
- package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +165 -55
- package/corpus/templates/clips/desktop/src/hooks/useMicMeter.ts +35 -10
- package/corpus/templates/clips/desktop/src/lib/backtrack.ts +12 -0
- package/corpus/templates/clips/desktop/src/lib/media-capture-constraints.ts +129 -34
- package/corpus/templates/clips/desktop/src/lib/media-device-selection.ts +157 -0
- package/corpus/templates/clips/desktop/src/lib/permissions.ts +2 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +109 -47
- package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +22 -2
- package/corpus/templates/clips/desktop/src/lib/transcription-engine.ts +29 -1
- package/corpus/templates/clips/desktop/src/lib/updater.ts +6 -0
- package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +372 -31
- package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +90 -0
- package/corpus/templates/clips/desktop/src/overlays/flow-bar.tsx +4 -6
- package/corpus/templates/clips/desktop/src/overlays/onboarding.tsx +214 -9
- package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +37 -52
- package/corpus/templates/clips/desktop/src/styles.css +1 -1
- package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +7 -0
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +371 -43
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +79 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +1418 -260
- package/corpus/templates/clips/desktop/src-tauri/src/native_speech.rs +188 -44
- package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +197 -8
- package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +64 -8
- package/corpus/templates/clips/desktop/src-tauri/src/state.rs +3 -2
- package/corpus/templates/clips/desktop/src-tauri/src/system_audio.rs +10 -0
- package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +29 -8
- package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +136 -13
- package/corpus/templates/clips/desktop/vite.config.ts +3 -0
- package/corpus/templates/clips/package.json +1 -1
- package/corpus/templates/clips/server/db/schema.ts +26 -0
- package/corpus/templates/clips/server/jobs/builder-media-compression.ts +41 -0
- package/corpus/templates/clips/server/jobs/stale-meeting-sweeper.ts +294 -0
- package/corpus/templates/clips/server/lib/builder-media-compression.ts +976 -0
- package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +107 -56
- package/corpus/templates/clips/server/lib/env-flags.ts +4 -0
- package/corpus/templates/clips/server/lib/google-calendar-client.ts +8 -1
- package/corpus/templates/clips/server/lib/media-worker.ts +153 -0
- package/corpus/templates/clips/server/lib/s3-upload-provider.ts +58 -17
- package/corpus/templates/clips/server/lib/streaming-upload-mode.ts +17 -5
- package/corpus/templates/clips/server/lib/video-remux.ts +90 -0
- package/corpus/templates/clips/server/plugins/calendar-jobs.ts +4 -0
- package/corpus/templates/clips/server/plugins/db.ts +196 -0
- package/corpus/templates/clips/server/register-secrets.ts +78 -0
- package/corpus/templates/clips/server/routes/_agent-native/clips/user-prefs.get.ts +15 -0
- package/corpus/templates/clips/server/routes/_agent-native/clips/user-prefs.put.ts +27 -0
- package/corpus/templates/clips/server/routes/api/media-worker/callback.post.ts +88 -0
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +87 -7
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +11 -4
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +55 -13
- package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +24 -42
- package/corpus/templates/clips/server/routes/api/view-event.post.ts +29 -1
- package/corpus/templates/clips/shared/finalize-recovery.ts +23 -3
- package/corpus/templates/clips/shared/media-device-selection.ts +157 -0
- package/corpus/templates/clips/shared/media-worker-contract.ts +146 -0
- package/corpus/templates/content/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +67 -2
- package/corpus/templates/content/AGENTS.md +73 -65
- package/corpus/templates/content/actions/_builder-cms-read-client.ts +188 -8
- package/corpus/templates/content/actions/_builder-docs-client.ts +41 -3
- package/corpus/templates/content/actions/_database-source-utils.ts +998 -160
- package/corpus/templates/content/actions/_database-utils.ts +44 -4
- package/corpus/templates/content/actions/_local-file-documents.ts +90 -1
- package/corpus/templates/content/actions/_notion-action-utils.ts +12 -4
- package/corpus/templates/content/actions/add-content-database-source-field-property.ts +23 -1
- package/corpus/templates/content/actions/attach-content-database-source.ts +85 -12
- package/corpus/templates/content/actions/change-content-database-source-role.ts +9 -1
- package/corpus/templates/content/actions/delete-content-database.ts +1 -0
- package/corpus/templates/content/actions/delete-document.ts +8 -0
- package/corpus/templates/content/actions/get-document.ts +11 -2
- package/corpus/templates/content/actions/list-content-databases.ts +57 -9
- package/corpus/templates/content/actions/prepare-builder-source-review.ts +23 -6
- package/corpus/templates/content/actions/refresh-content-database-source.ts +26 -3
- package/corpus/templates/content/actions/remove-local-file-source.ts +100 -0
- package/corpus/templates/content/actions/restore-content-database.ts +1 -0
- package/corpus/templates/content/actions/sync-notion-comments.ts +174 -20
- package/corpus/templates/content/actions/update-document.ts +134 -5
- package/corpus/templates/content/app/blocks/SourceComponentBlock.tsx +31 -3
- package/corpus/templates/content/app/blocks/contentBlockRegistry.tsx +4 -4
- package/corpus/templates/content/app/components/EmptyState.tsx +1 -1
- package/corpus/templates/content/app/components/ThemeToggle.tsx +6 -6
- package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +5 -5
- package/corpus/templates/content/app/components/editor/BuilderBodySyncingNotice.tsx +21 -0
- package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +5 -5
- package/corpus/templates/content/app/components/editor/ContentReferencePreview.tsx +1 -1
- package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +9 -14630
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +142 -79
- package/corpus/templates/content/app/components/editor/DocumentEditorSkeleton.tsx +36 -0
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +98 -46
- package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +29 -44
- package/corpus/templates/content/app/components/editor/EmojiPicker.tsx +5 -4
- package/corpus/templates/content/app/components/editor/LinkHoverPreview.tsx +5 -4
- package/corpus/templates/content/app/components/editor/NotionConflictBanner.tsx +1 -1
- package/corpus/templates/content/app/components/editor/NotionSyncBar.tsx +2 -2
- package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +5 -5
- package/corpus/templates/content/app/components/editor/TableHoverControls.tsx +13 -13
- package/corpus/templates/content/app/components/editor/VersionHistoryPanel.tsx +10 -10
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +28 -11
- package/corpus/templates/content/app/components/editor/body-hydration.ts +112 -0
- package/corpus/templates/content/app/components/editor/builder-body-hydration-pump.ts +52 -0
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +736 -69
- package/corpus/templates/content/app/components/editor/database/navigation-state.ts +36 -1
- package/corpus/templates/content/app/components/editor/database/settings.tsx +3224 -0
- package/corpus/templates/content/app/components/editor/database/shared.tsx +19 -19
- package/corpus/templates/content/app/components/editor/database/text.ts +23 -0
- package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +50 -9
- package/corpus/templates/content/app/components/editor/extensions/AudioBlock.tsx +19 -18
- package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +57 -31
- package/corpus/templates/content/app/components/editor/extensions/LocalMdxComponentNode.tsx +8 -8
- package/corpus/templates/content/app/components/editor/extensions/NotionExtensions.tsx +9 -0
- package/corpus/templates/content/app/components/editor/extensions/VideoBlock.tsx +19 -18
- package/corpus/templates/content/app/components/editor/previewDocumentSaveController.ts +21 -1
- package/corpus/templates/content/app/components/layout/Header.tsx +1 -5
- package/corpus/templates/content/app/components/layout/Layout.tsx +25 -8
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +214 -56
- package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +33 -30
- package/corpus/templates/content/app/components/sidebar/NotionButton.tsx +11 -11
- package/corpus/templates/content/app/components/sidebar/document-sidebar-sections.ts +109 -1
- package/corpus/templates/content/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/content/app/components/ui/button.tsx +1 -0
- package/corpus/templates/content/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/content/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/content/app/components/ui/input.tsx +1 -0
- package/corpus/templates/content/app/components/ui/label.tsx +1 -0
- package/corpus/templates/content/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/content/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/content/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/content/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/content/app/components/ui/sonner.tsx +1 -0
- package/corpus/templates/content/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/content/app/components/ui/table.tsx +1 -0
- package/corpus/templates/content/app/components/ui/toaster.tsx +1 -0
- package/corpus/templates/content/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/content/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/content/app/global.css +42 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +346 -42
- package/corpus/templates/content/app/hooks/use-db-sync.ts +9 -0
- package/corpus/templates/content/app/hooks/use-documents.ts +136 -37
- package/corpus/templates/content/app/hooks/use-mobile.ts +1 -0
- package/corpus/templates/content/app/hooks/use-notion.ts +85 -15
- package/corpus/templates/content/app/i18n/zh-TW.ts +49 -0
- package/corpus/templates/content/app/i18n-data.ts +508 -0
- package/corpus/templates/content/app/root.tsx +57 -29
- package/corpus/templates/content/app/routes/_app._index.tsx +1 -1
- package/corpus/templates/content/app/routes/_app.local-files.tsx +268 -81
- package/corpus/templates/content/app/routes/_app.settings.tsx +4 -21
- package/corpus/templates/content/changelog/2026-07-01-builder-database-sources-keep-loading-rows-in-the-background.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-source-attach-starts-with-usable-rows.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-source-attachment-now-stays-connected-after-large.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-source-components-show-preservation-and-review-states.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-builder-source-refreshes-now-show-progress-for-large-docs-blog.md +6 -0
- package/corpus/templates/content/changelog/2026-07-01-database-pages-now-delete-to-trash-without-route-errors.md +6 -0
- package/corpus/templates/content/changelog/2026-07-02-builder-source-refreshes-recover-from-stalled-background-row.md +6 -0
- package/corpus/templates/content/changelog/2026-07-02-builder-sourced-rows-open-with-sync-protection.md +6 -0
- package/corpus/templates/content/changelog/2026-07-02-database-rows-and-pages-open-faster-from-recently-loaded-dat.md +6 -0
- package/corpus/templates/content/changelog/2026-07-02-preview-panels-close-reliably-narrow-sidebar-row-actions-sta.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-builder-sync-progress-no-longer-shows-continue.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-document-headers-and-page-bodies-now-share-one-background-shade.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-export-submenus-stay-visible-outside-the-page-actions-menu.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-fixed-collaborative-documents-reapplying-content-before-save.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-local-files-now-remember-sidebar-collapse-state-and-include-.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-notion-comment-sync-now-preserves-threads-replies-stay-attac.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-notion-sync-is-far-more-reliable-auto-sync-no-longer-overwri.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-opening-pages-now-highlights-the-sidebar-item-and-shows-the-.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-presence-markers-in-the-editor-are-now-compact-instead-of-co.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-sidebar-collapse-now-keeps-the-same-background-shade-as-the-.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-the-content-header-no-longer-shows-the-global-notifications-.md +6 -0
- package/corpus/templates/content/parity/matrix.md +24 -24
- package/corpus/templates/content/parity/matrix.ts +7 -3
- package/corpus/templates/content/server/db/schema.ts +15 -0
- package/corpus/templates/content/server/lib/notion-sync.ts +481 -39
- package/corpus/templates/content/server/lib/notion.ts +212 -48
- package/corpus/templates/content/server/plugins/db.ts +20 -0
- package/corpus/templates/content/server/routes/api/documents/[id]/notion/resolve.post.ts +14 -2
- package/corpus/templates/content/server/routes/api/notion/callback.get.ts +54 -6
- package/corpus/templates/content/shared/api.ts +13 -0
- package/corpus/templates/content/shared/builder-mdx.ts +84 -15
- package/corpus/templates/content/shared/builder-source-component-registry.ts +177 -0
- package/corpus/templates/content/shared/nfm.ts +459 -66
- package/corpus/templates/content/shared/source-component-block.ts +72 -6
- package/corpus/templates/content/vite.config.ts +17 -1
- package/corpus/templates/design/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +44 -25
- package/corpus/templates/design/.agents/skills/responsive-breakpoints/SKILL.md +98 -0
- package/corpus/templates/design/.agents/skills/shader-fills/SKILL.md +162 -0
- package/corpus/templates/design/AGENTS.md +12 -4
- package/corpus/templates/design/actions/add-breakpoint.ts +6 -3
- package/corpus/templates/design/actions/apply-a11y-fix.ts +57 -37
- package/corpus/templates/design/actions/apply-component-prop-edit.ts +41 -20
- package/corpus/templates/design/actions/apply-motion-edit.ts +251 -38
- package/corpus/templates/design/actions/apply-shader-fill.ts +90 -66
- package/corpus/templates/design/actions/apply-visual-edit.ts +282 -55
- package/corpus/templates/design/actions/create-component.ts +29 -60
- package/corpus/templates/design/actions/create-file.ts +9 -2
- package/corpus/templates/design/actions/duplicate-design.ts +31 -2
- package/corpus/templates/design/actions/edit-design.ts +36 -38
- package/corpus/templates/design/actions/generate-design-title.ts +87 -0
- package/corpus/templates/design/actions/generate-design.ts +53 -18
- package/corpus/templates/design/actions/generate-screens.ts +108 -4
- package/corpus/templates/design/actions/get-motion-timeline.ts +35 -7
- package/corpus/templates/design/actions/import-design-source.ts +8 -58
- package/corpus/templates/design/actions/insert-asset.ts +34 -29
- package/corpus/templates/design/actions/insert-design-native-asset.ts +129 -32
- package/corpus/templates/design/actions/insert-figma-library-asset.ts +35 -30
- package/corpus/templates/design/actions/present-design-variants.ts +7 -2
- package/corpus/templates/design/actions/remove-motion-timeline.ts +31 -36
- package/corpus/templates/design/actions/run-design-audit.ts +127 -1
- package/corpus/templates/design/actions/take-design-screenshot.ts +673 -0
- package/corpus/templates/design/actions/update-file.ts +190 -75
- package/corpus/templates/design/app/components/ThemeToggle.tsx +6 -6
- package/corpus/templates/design/app/components/design/BreakpointBar.tsx +403 -0
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +480 -233
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +708 -53
- package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +2 -2
- package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +99 -24
- package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +6 -97
- package/corpus/templates/design/app/components/design/DrawOverlay.tsx +7 -7
- package/corpus/templates/design/app/components/design/EditPanel.tsx +1120 -6977
- package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +9 -8
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +433 -99
- package/corpus/templates/design/app/components/design/LocalhostWriteConsentDialog.tsx +6 -5
- package/corpus/templates/design/app/components/design/MotionDock.tsx +1138 -117
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +2610 -1398
- package/corpus/templates/design/app/components/design/QuestionFlow.tsx +3 -3
- package/corpus/templates/design/app/components/design/ReadOnlyDesignBanner.tsx +22 -0
- package/corpus/templates/design/app/components/design/ReviewPanel.tsx +3 -3
- package/corpus/templates/design/app/components/design/StatesPanel.tsx +13 -13
- package/corpus/templates/design/app/components/design/TokensPanel.tsx +14 -14
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +6 -6
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2221 -244
- package/corpus/templates/design/app/components/design/bridge/motion-preview.bridge.ts +187 -11
- package/corpus/templates/design/app/components/design/bridge/shader-fill-preview.bridge.ts +376 -1
- package/corpus/templates/design/app/components/design/bridge/shader-runtime.bridge.ts +746 -0
- package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +17 -0
- package/corpus/templates/design/app/components/design/code-workbench/ActivityBar.tsx +3 -3
- package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +5 -8
- package/corpus/templates/design/app/components/design/code-workbench/editor/EditorTabs.tsx +6 -6
- package/corpus/templates/design/app/components/design/code-workbench/editor/MonacoHost.tsx +2 -1
- package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +18 -20
- package/corpus/templates/design/app/components/design/code-workbench/quickinput/QuickInput.tsx +1 -1
- package/corpus/templates/design/app/components/design/code-workbench/search/SearchView.tsx +6 -6
- package/corpus/templates/design/app/components/design/edit-panel/appearance-properties.tsx +518 -0
- package/corpus/templates/design/app/components/design/edit-panel/code-inspect-helpers.tsx +562 -0
- package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +763 -0
- package/corpus/templates/design/app/components/design/edit-panel/document-colors.ts +94 -0
- package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +780 -0
- package/corpus/templates/design/app/components/design/edit-panel/element-classification.ts +446 -0
- package/corpus/templates/design/app/components/design/edit-panel/element-identity.ts +79 -0
- package/corpus/templates/design/app/components/design/edit-panel/field-primitives.tsx +315 -0
- package/corpus/templates/design/app/components/design/edit-panel/fill-gradient-helpers.ts +344 -0
- package/corpus/templates/design/app/components/design/edit-panel/fill-properties.tsx +594 -0
- package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +119 -0
- package/corpus/templates/design/app/components/design/edit-panel/inspector-controls.tsx +248 -0
- package/corpus/templates/design/app/components/design/edit-panel/interaction-state-helpers.ts +45 -0
- package/corpus/templates/design/app/components/design/edit-panel/layout-properties.tsx +693 -0
- package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +724 -0
- package/corpus/templates/design/app/components/design/edit-panel/position-helpers.ts +207 -0
- package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +628 -0
- package/corpus/templates/design/app/components/design/edit-panel/selection-helpers.ts +91 -0
- package/corpus/templates/design/app/components/design/edit-panel/stroke-properties.tsx +649 -0
- package/corpus/templates/design/app/components/design/edit-panel/style-change-types.ts +118 -0
- package/corpus/templates/design/app/components/design/edit-panel/style-options.ts +88 -0
- package/corpus/templates/design/app/components/design/edit-panel/transform-helpers.ts +100 -0
- package/corpus/templates/design/app/components/design/edit-panel/typography-helpers.ts +117 -0
- package/corpus/templates/design/app/components/design/edit-panel/typography-properties.tsx +501 -0
- package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +3 -3
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +98 -47
- package/corpus/templates/design/app/components/design/inspector/BreakpointOverrideIndicator.tsx +82 -0
- package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +3 -3
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +207 -105
- package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +6 -6
- package/corpus/templates/design/app/components/design/inspector/GlslShaderPanel.tsx +1097 -0
- package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +44 -0
- package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +6 -6
- package/corpus/templates/design/app/components/design/inspector/InteractionStatePanel.tsx +258 -0
- package/corpus/templates/design/app/components/design/inspector/MotionKeyframeDiamond.tsx +144 -0
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +106 -16
- package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +14 -14
- package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +9 -9
- package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +6 -6
- package/corpus/templates/design/app/components/design/inspector/frame-size-presets.ts +116 -0
- package/corpus/templates/design/app/components/design/inspector/index.ts +26 -0
- package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +29 -0
- package/corpus/templates/design/app/components/design/multi-screen/alt-hover-measurement.ts +171 -0
- package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +220 -0
- package/corpus/templates/design/app/components/design/multi-screen/chrome-transitions.ts +35 -0
- package/corpus/templates/design/app/components/design/multi-screen/cross-screen-drop.ts +134 -0
- package/corpus/templates/design/app/components/design/multi-screen/culling.ts +185 -0
- package/corpus/templates/design/app/components/design/multi-screen/gradient-overlay-geometry.ts +120 -0
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +892 -0
- package/corpus/templates/design/app/components/design/multi-screen/vector-edit-geometry.ts +21 -0
- package/corpus/templates/design/app/components/design/types.ts +15 -0
- package/corpus/templates/design/app/components/design-system/DesignSystemCard.tsx +3 -2
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +124 -23
- package/corpus/templates/design/app/components/layout/Header.tsx +2 -2
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +5 -5
- package/corpus/templates/design/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/design/app/components/ui/avatar.tsx +1 -0
- package/corpus/templates/design/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/design/app/components/ui/button.tsx +1 -0
- package/corpus/templates/design/app/components/ui/card.tsx +1 -0
- package/corpus/templates/design/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/design/app/components/ui/collapsible.tsx +1 -0
- package/corpus/templates/design/app/components/ui/context-menu.tsx +1 -0
- package/corpus/templates/design/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/design/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/design/app/components/ui/input.tsx +1 -0
- package/corpus/templates/design/app/components/ui/label.tsx +1 -0
- package/corpus/templates/design/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/design/app/components/ui/select.tsx +1 -0
- package/corpus/templates/design/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/design/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/design/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/design/app/components/ui/slider.tsx +1 -0
- package/corpus/templates/design/app/components/ui/sonner.tsx +1 -0
- package/corpus/templates/design/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/design/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/design/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/design/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/design/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/design/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +7 -7
- package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +7 -7
- package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +3 -3
- package/corpus/templates/design/app/global.css +9 -8
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +259 -2
- package/corpus/templates/design/app/i18n/zh-TW.ts +166 -13
- package/corpus/templates/design/app/i18n-breakpoints.ts +205 -0
- package/corpus/templates/design/app/i18n-data.ts +1702 -187
- package/corpus/templates/design/app/i18n-motion.ts +563 -0
- package/corpus/templates/design/app/lib/design-import.ts +73 -0
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +6 -6
- package/corpus/templates/design/app/pages/DesignSystems.tsx +31 -31
- package/corpus/templates/design/app/pages/Index.tsx +66 -51
- package/corpus/templates/design/app/pages/NotFound.tsx +2 -1
- package/corpus/templates/design/app/pages/Present.tsx +2 -1
- package/corpus/templates/design/app/pages/VisualEdit.tsx +2 -1
- package/corpus/templates/design/app/root.tsx +7 -4
- package/corpus/templates/design/app/routes/settings.tsx +22 -49
- package/corpus/templates/design/changelog/2026-06-29-design-inspector-controls-now-match-figmas-softer-dark-chrome.md +1 -1
- package/corpus/templates/design/changelog/2026-06-30-design-now-has-a-figma-style-left-rail-for-file-agent-assets.md +1 -1
- package/corpus/templates/design/changelog/2026-06-30-design-tools-now-use-a-quieter-figma-style-list-layout.md +1 -1
- package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +1 -1
- package/corpus/templates/design/changelog/2026-07-03-canvas-interactions-now-match-figma-rotation-aware-resizing-.md +1 -1
- package/corpus/templates/design/changelog/2026-07-03-layers-panel-matches-figma-top-layer-on-top-drag-with-auto-s.md +1 -1
- package/corpus/templates/design/changelog/2026-07-05-code-sidebar-tabs-now-use-a-quieter-active-highlight-that-ma.md +6 -0
- package/corpus/templates/design/changelog/2026-07-05-designs-get-ai-generated-names-from-your-prompt.md +6 -0
- package/corpus/templates/design/changelog/2026-07-05-local-code-screens-keep-their-connection-when-duplicated-and.md +6 -0
- package/corpus/templates/design/changelog/2026-07-05-press-a-to-draw-screens-on-the-canvas-inside-a-screen-it-dr.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-3d-rotation-and-perspective-controls-on-every-element.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-ai-generated-and-duplicated-screens-now-get-their-editor-sel.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-applying-shaders-and-fills-in-quick-succession-can-no-longer.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-breakpoint-frames-in-the-overview-now-support-click-to-selec.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-breakpoint-segments-in-the-inspector-now-show-a-device-icon-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-breakpoint-targeting-now-lives-in-one-compact-control-in-the.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-canvas-edits-can-no-longer-be-overwritten-by-stale-collabora.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-canvas-edits-inside-screens-save-reliably-again.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-cleaner-inspector-removed-the-ask-ai-box-from-the-design-tab.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-clicking-empty-canvas-space-now-deselects-an-element-inside-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-dragging-an-element-onto-a-rectangle-now-nests-it-inside-wit.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-dragging-screens-and-objects-on-the-canvas-is-now-much-smoot.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-drawing-a-shape-or-text-on-the-canvas-no-longer-flashes-away.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-dropping-an-element-between-two-others-inside-a-screen-now-s.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-duplicating-a-screen-now-places-the-copy-exactly-where-you-d.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-edit-gradients-directly-on-elements-inside-screens-scale-str.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-edits-from-collaborators-and-the-agent-now-update-the-canvas.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fig-files-now-stay-on-the-builder-indexing-path-through-desi.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-a-bug-where-most-style-position-and-text-edits-briefly.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-a-confusing-raw-error-message-when-a-file-upload-fails.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-a-rare-case-where-an-edit-could-be-silently-overwritte.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-inserted-assets-sometimes-disappearing-reappearing-or-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-inspector-value-scrubbing-producing-erratic-numbers-an.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-padding-gap-and-min-max-size-scrubbing-not-updating-th.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-text-stroke-color-turning-black-and-glyphs-disappearin.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-the-collapsed-effects-and-stroke-inspector-sections-sh.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-the-new-design-dialog-closing-unexpectedly-when-using-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fixed-the-typography-section-missing-when-selecting-text-nes.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-full-view-no-longer-flashes-back-to-the-overview-on-entry-no.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-keyframe-animation-timeline-per-property-keyframes-easing-cu.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-mobile-layouts-no-longer-stack-two-top-headers.md +5 -0
- package/corpus/templates/design/changelog/2026-07-06-moving-restyling-and-scrubbing-values-on-elements-in-ai-gene.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-padding-and-corner-radius-value-scrubbing-now-snaps-to-whole.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-padding-handles-now-only-resize-on-the-handle-line-itself-sh.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-preview-and-edit-hover-focus-and-pressed-states-with-real-cs.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-promoting-an-element-to-a-component-now-works-correctly-for-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-reduced-url-history-churn-and-selection-overlay-flicker-whil.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-removed-the-decorative-dot-before-screen-names-in-the-overvi.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-responsive-breakpoints-edit-at-any-width-with-cascading-over.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-screen-labels-no-longer-turn-blue-when-you-hover-inside-the-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-scrolling-a-screen-with-an-element-selected-stays-smooth-on-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-selecting-multiple-elements-and-dragging-now-moves-the-whole.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-selection-borders-handles-and-value-readouts-now-stay-the-sa.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-selection-handles-and-editing-chrome-now-stay-a-constant-siz.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-shader-fills-and-effects-ai-authored-or-preset-glsl-shaders-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-text-drawn-on-the-canvas-now-defaults-to-white-and-inter-in-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-text-dropped-into-a-shape-now-stays-readable-instead-of-disa.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-add-tweak-controls-prompt-no-longer-jumps-to-the-corner-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-design-agent-now-visually-reviews-rendered-screenshots-o.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-padding-value-readout-now-stays-visible-while-you-hover-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-selected-element-attachment-now-clears-from-the-chat-com.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-the-zoom-menu-is-more-compact-with-tight-rows-and-right-alig.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-undo-and-redo-no-longer-flash-the-screen-changes-now-apply-i.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-zoom-presets-like-zoom-to-50-now-stay-on-the-focused-screen-.md +6 -0
- package/corpus/templates/design/server/handlers/import-design-file.ts +4 -43
- package/corpus/templates/design/server/handlers/index-design-system-with-builder.ts +2 -2
- package/corpus/templates/design/server/lib/import-design-files.ts +11 -2
- package/corpus/templates/design/server/lib/visible-clipboard-html.ts +32 -0
- package/corpus/templates/design/server/source-workspace.ts +139 -59
- package/corpus/templates/design/shared/board-file.ts +11 -2
- package/corpus/templates/design/shared/breakpoint-media.ts +543 -0
- package/corpus/templates/design/shared/canvas-math.ts +354 -35
- package/corpus/templates/design/shared/code-layer.ts +277 -8
- package/corpus/templates/design/shared/design-review.ts +1 -0
- package/corpus/templates/design/shared/design-state.ts +11 -4
- package/corpus/templates/design/shared/interaction-states.ts +548 -0
- package/corpus/templates/design/shared/motion-compiler.ts +186 -23
- package/corpus/templates/design/shared/motion-easing.ts +294 -0
- package/corpus/templates/design/shared/motion-timeline.ts +400 -34
- package/corpus/templates/design/shared/prompt-title.ts +95 -0
- package/corpus/templates/design/shared/responsive-classes.ts +448 -10
- package/corpus/templates/design/shared/screen-annotation.ts +46 -0
- package/corpus/templates/design/shared/shader-fills.ts +1009 -0
- package/corpus/templates/design/shared/shader-presets.ts +852 -4
- package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/dispatch/actions/list-staged-datasets.ts +3 -0
- package/corpus/templates/dispatch/app/routes/settings.tsx +3 -17
- package/corpus/templates/forms/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/forms/app/components/CloudUpgrade.tsx +10 -10
- package/corpus/templates/forms/app/components/ThemeToggle.tsx +5 -5
- package/corpus/templates/forms/app/components/builder/FieldPropertiesPanel.tsx +11 -10
- package/corpus/templates/forms/app/components/builder/FieldRenderer.tsx +10 -13
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +17 -17
- package/corpus/templates/forms/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/button.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/calendar.tsx +1 -1
- package/corpus/templates/forms/app/components/ui/card.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/command.tsx +1 -1
- package/corpus/templates/forms/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/input.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/label.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/radio-group.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/scroll-area.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/select.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/slider.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/table.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/forms/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/forms/app/global.css +1 -0
- package/corpus/templates/forms/app/hooks/use-mobile.ts +1 -0
- package/corpus/templates/forms/app/hooks/use-navigation-state.ts +0 -1
- package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +24 -26
- package/corpus/templates/forms/app/pages/FormFillPage.tsx +2 -2
- package/corpus/templates/forms/app/pages/FormsListPage.tsx +21 -21
- package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +11 -11
- package/corpus/templates/forms/app/pages/ResponsesPage.tsx +4 -4
- package/corpus/templates/forms/app/root.tsx +11 -8
- package/corpus/templates/forms/app/routes/_app.settings.tsx +6 -21
- package/corpus/templates/forms/app/routes/form-preview.tsx +3 -3
- package/corpus/templates/forms/changelog/2026-07-06-the-form-builder-header-no-longer-shows-the-global-notificat.md +6 -0
- package/corpus/templates/macros/app/components/AddExerciseDialog.tsx +1 -1
- package/corpus/templates/macros/app/components/AddMealDialog.tsx +1 -1
- package/corpus/templates/macros/app/components/AddWeightDialog.tsx +1 -1
- package/corpus/templates/macros/app/components/DailyProgress.tsx +7 -7
- package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +2 -1
- package/corpus/templates/macros/app/components/WeightCard.tsx +10 -10
- package/corpus/templates/macros/app/components/WeightTracker.tsx +1 -1
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +6 -10
- package/corpus/templates/macros/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/macros/app/components/ui/label.tsx +1 -0
- package/corpus/templates/macros/app/components/ui/select.tsx +1 -0
- package/corpus/templates/macros/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/macros/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/macros/app/components/ui/sonner.tsx +1 -0
- package/corpus/templates/macros/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/macros/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/macros/app/global.css +1 -0
- package/corpus/templates/macros/app/root.tsx +17 -14
- package/corpus/templates/macros/app/routes/_index.tsx +1 -1
- package/corpus/templates/macros/app/routes/analytics.tsx +8 -8
- package/corpus/templates/macros/app/routes/settings.tsx +4 -19
- package/corpus/templates/mail/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/mail/.agents/skills/contacts-and-crm/SKILL.md +67 -0
- package/corpus/templates/mail/.agents/skills/draft-queue/SKILL.md +35 -1
- package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +74 -33
- package/corpus/templates/mail/AGENTS.md +102 -16
- package/corpus/templates/mail/actions/archive-email.ts +67 -11
- package/corpus/templates/mail/actions/manage-snippets.ts +106 -0
- package/corpus/templates/mail/actions/mark-read.ts +45 -11
- package/corpus/templates/mail/actions/send-queued-drafts.ts +77 -42
- package/corpus/templates/mail/actions/star-email.ts +55 -10
- package/corpus/templates/mail/actions/trash-email.ts +48 -9
- package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +1 -1
- package/corpus/templates/mail/app/components/ThemeToggle.tsx +6 -6
- package/corpus/templates/mail/app/components/agent-engine-picker.tsx +10 -10
- package/corpus/templates/mail/app/components/email/CodeBlockLangPicker.tsx +4 -3
- package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +5 -5
- package/corpus/templates/mail/app/components/email/ComposeEditor.tsx +109 -10
- package/corpus/templates/mail/app/components/email/ComposeModal.tsx +44 -19
- package/corpus/templates/mail/app/components/email/ComposeSlashMenu.tsx +139 -17
- package/corpus/templates/mail/app/components/email/EmailList.tsx +522 -314
- package/corpus/templates/mail/app/components/email/EmailListItem.tsx +130 -45
- package/corpus/templates/mail/app/components/email/EmailThread.tsx +9 -9
- package/corpus/templates/mail/app/components/email/InlineReplyComposer.tsx +35 -13
- package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +13 -13
- package/corpus/templates/mail/app/components/email/MobileActionBar.tsx +13 -13
- package/corpus/templates/mail/app/components/email/RecipientInput.tsx +53 -42
- package/corpus/templates/mail/app/components/email/SendLaterButton.tsx +5 -4
- package/corpus/templates/mail/app/components/email/SnoozeModal.tsx +1 -1
- package/corpus/templates/mail/app/components/email/SnoozePopover.tsx +6 -6
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +19 -23
- package/corpus/templates/mail/app/components/layout/HeaderActions.tsx +12 -4
- package/corpus/templates/mail/app/components/layout/SearchBar.tsx +138 -18
- package/corpus/templates/mail/app/components/settings/GmailFiltersSection.tsx +23 -23
- package/corpus/templates/mail/app/components/settings/SnippetsSection.tsx +303 -0
- package/corpus/templates/mail/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/button.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/calendar.tsx +1 -1
- package/corpus/templates/mail/app/components/ui/command.tsx +1 -1
- package/corpus/templates/mail/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/drawer.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/select.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/mail/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/mail/app/global.css +20 -3
- package/corpus/templates/mail/app/hooks/use-emails.ts +187 -0
- package/corpus/templates/mail/app/hooks/use-snippets.ts +103 -0
- package/corpus/templates/mail/app/i18n/ar-SA.ts +17 -0
- package/corpus/templates/mail/app/i18n/de-DE.ts +18 -0
- package/corpus/templates/mail/app/i18n/en-US.ts +17 -0
- package/corpus/templates/mail/app/i18n/es-ES.ts +17 -0
- package/corpus/templates/mail/app/i18n/fr-FR.ts +18 -0
- package/corpus/templates/mail/app/i18n/hi-IN.ts +17 -0
- package/corpus/templates/mail/app/i18n/ja-JP.ts +18 -0
- package/corpus/templates/mail/app/i18n/ko-KR.ts +17 -0
- package/corpus/templates/mail/app/i18n/pt-BR.ts +17 -0
- package/corpus/templates/mail/app/i18n/zh-CN.ts +16 -0
- package/corpus/templates/mail/app/i18n/zh-TW.ts +16 -0
- package/corpus/templates/mail/app/pages/DraftQueuePage.tsx +14 -14
- package/corpus/templates/mail/app/pages/InboxPage.tsx +3 -3
- package/corpus/templates/mail/app/pages/NotFound.tsx +2 -1
- package/corpus/templates/mail/app/pages/SettingsPage.tsx +64 -66
- package/corpus/templates/mail/app/root.tsx +21 -18
- package/corpus/templates/mail/app/routes/_index.tsx +2 -1
- package/corpus/templates/mail/app/routes/email.tsx +2 -2
- package/corpus/templates/mail/changelog/2026-07-06-a-queued-draft-can-no-longer-be-sent-twice-by-simultaneous-s.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-bulk-archive-trash-star-and-mark-read-now-complete-in-one-fa.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-dark-mode-sidebars-and-notifications-now-use-the-softer-gray.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-inbox-automations-pick-up-new-mail-faster.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-inbox-lists-stay-fast-as-scheduled-and-snoozed-mail-accumula.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-long-inboxes-scroll-smoothly-and-stay-fast-as-more-mail-load.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-paste-or-drop-images-straight-into-the-composer-to-send-them.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-save-reusable-snippets-and-insert-them-from-the-compose-slas.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-scrolling-older-mail-keeps-loading-correctly-when-no-gmail-a.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-search-shows-instant-matches-from-already-loaded-mail-while-.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-sends-now-fail-with-a-clear-error-instead-of-quietly-missing.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-the-mail-header-no-longer-shows-the-global-notifications-bel.md +6 -0
- package/corpus/templates/mail/package.json +1 -0
- package/corpus/templates/mail/server/db/schema.ts +11 -0
- package/corpus/templates/mail/server/handlers/emails.ts +20 -1
- package/corpus/templates/mail/server/lib/automation-engine.ts +53 -25
- package/corpus/templates/mail/server/lib/google-auth.ts +140 -9
- package/corpus/templates/mail/server/lib/jobs.ts +22 -6
- package/corpus/templates/mail/server/lib/outgoing-email.ts +11 -2
- package/corpus/templates/mail/server/lib/queued-drafts.ts +145 -4
- package/corpus/templates/mail/server/plugins/db.ts +29 -0
- package/corpus/templates/plan/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/plan/app/components/editor/PlanDocumentEditor.tsx +42 -3
- package/corpus/templates/plan/app/components/layout/Layout.tsx +5 -4
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +20 -20
- package/corpus/templates/plan/app/components/plan/CanvasArea.tsx +3 -2
- package/corpus/templates/plan/app/components/plan/DocumentArea.tsx +2 -2
- package/corpus/templates/plan/app/components/plan/GuestModeBanner.tsx +2 -1
- package/corpus/templates/plan/app/components/plan/LocalCodebasePicker.tsx +8 -8
- package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +6 -1
- package/corpus/templates/plan/app/components/plan/PlanImageViewer.tsx +8 -12
- package/corpus/templates/plan/app/components/plan/PlanMarkdownEditor.tsx +6 -1
- package/corpus/templates/plan/app/components/plan/PlanVisualSurface.tsx +3 -3
- package/corpus/templates/plan/app/components/plan/planBlocks.tsx +4 -4
- package/corpus/templates/plan/app/components/plan/wireframe/kit/rough.tsx +61 -27
- package/corpus/templates/plan/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/avatar.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/button.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/card.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/collapsible.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/input.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/label.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/scroll-area.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/select.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/sonner.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/toggle-group.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/plan/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/plan/app/global.css +13 -0
- package/corpus/templates/plan/app/hooks/use-plan-presence.ts +11 -1
- package/corpus/templates/plan/app/lib/plan-access-prompt.ts +74 -0
- package/corpus/templates/plan/app/lib/plan-annotation-runtime.ts +1435 -0
- package/corpus/templates/plan/app/lib/plan-comment-editor-helpers.ts +142 -0
- package/corpus/templates/plan/app/lib/plan-local-bridge.ts +376 -0
- package/corpus/templates/plan/app/lib/plan-native-anchors.ts +682 -0
- package/corpus/templates/plan/app/pages/PlansPage.tsx +216 -2747
- package/corpus/templates/plan/app/root.tsx +13 -10
- package/corpus/templates/plan/app/routes/_index.tsx +1 -2
- package/corpus/templates/plan/app/routes/local-plans.$slug.tsx +1 -1
- package/corpus/templates/plan/app/routes/plans.$id.tsx +1 -2
- package/corpus/templates/plan/app/routes/plans.tsx +1 -2
- package/corpus/templates/plan/app/routes/recaps.$id.tsx +1 -2
- package/corpus/templates/plan/app/routes/recaps.tsx +1 -2
- package/corpus/templates/plan/app/routes/settings.tsx +7 -21
- package/corpus/templates/plan/changelog/2026-07-05-plan-pages-open-at-the-top-unless-a-shared-link-targets-a-sp.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-06-fixed-collaborative-plan-editing-so-content-no-longer-duplic.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-06-fixed-visual-reports-using-excessive-cpu-while-rendering-ske.md +6 -0
- package/corpus/templates/slides/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/slides/app/components/ThemeToggle.tsx +6 -6
- package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +5 -5
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +7 -7
- package/corpus/templates/slides/app/components/deck/ExcalidrawSlide.tsx +2 -1
- package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +1 -1
- package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +3 -2
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +15 -14
- package/corpus/templates/slides/app/components/editor/AnimationsPanel.tsx +7 -7
- package/corpus/templates/slides/app/components/editor/BlockBubbleMenu.tsx +5 -5
- package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +6 -6
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +29 -16
- package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +10 -9
- package/corpus/templates/slides/app/components/editor/GenerateSlidesDialog.tsx +6 -5
- package/corpus/templates/slides/app/components/editor/HistoryPanel.tsx +12 -12
- package/corpus/templates/slides/app/components/editor/ImageDropPromptPopover.tsx +4 -3
- package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +5 -4
- package/corpus/templates/slides/app/components/editor/ImportButton.tsx +14 -4
- package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +2 -1
- package/corpus/templates/slides/app/components/editor/ShareDialog.tsx +10 -10
- package/corpus/templates/slides/app/components/editor/SlideBubbleMenu.tsx +10 -10
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +6 -6
- package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +2 -1
- package/corpus/templates/slides/app/components/editor/TweaksPanel.tsx +1 -1
- package/corpus/templates/slides/app/components/layout/Header.tsx +2 -2
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +5 -5
- package/corpus/templates/slides/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/button.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/card.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/input.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/label.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/scroll-area.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/select.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/toast.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/toaster.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/toggle-group.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/slides/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +6 -6
- package/corpus/templates/slides/app/components/visual-editor/DrawOverlay.tsx +7 -7
- package/corpus/templates/slides/app/global.css +1 -0
- package/corpus/templates/slides/app/hooks/use-toast.ts +1 -0
- package/corpus/templates/slides/app/lib/upload-response.ts +71 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +3 -3
- package/corpus/templates/slides/app/pages/DesignSystems.tsx +1 -1
- package/corpus/templates/slides/app/pages/Index.tsx +14 -17
- package/corpus/templates/slides/app/root.tsx +13 -10
- package/corpus/templates/slides/app/routes/settings.tsx +6 -21
- package/corpus/templates/slides/changelog/2026-07-06-mobile-layouts-no-longer-stack-two-top-headers.md +5 -0
- package/corpus/templates/slides/server/handlers/uploads.ts +7 -2
- package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
- package/dist/agent/durable-background.d.ts +29 -0
- package/dist/agent/durable-background.d.ts.map +1 -1
- package/dist/agent/durable-background.js +46 -0
- package/dist/agent/durable-background.js.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +7 -2
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/anthropic-engine.js +28 -2
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +1 -1
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/engine/output-tokens.d.ts +3 -3
- package/dist/agent/engine/output-tokens.d.ts.map +1 -1
- package/dist/agent/engine/output-tokens.js +16 -14
- package/dist/agent/engine/output-tokens.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +3 -3
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +28 -25
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/engine/translate-ai-sdk.d.ts +14 -2
- package/dist/agent/engine/translate-ai-sdk.d.ts.map +1 -1
- package/dist/agent/engine/translate-ai-sdk.js +33 -18
- package/dist/agent/engine/translate-ai-sdk.js.map +1 -1
- package/dist/agent/engine/translate-anthropic.d.ts.map +1 -1
- package/dist/agent/engine/translate-anthropic.js +42 -1
- package/dist/agent/engine/translate-anthropic.js.map +1 -1
- package/dist/agent/engine/types.d.ts +15 -0
- package/dist/agent/engine/types.d.ts.map +1 -1
- package/dist/agent/engine/types.js.map +1 -1
- package/dist/agent/model-config.d.ts +8 -0
- package/dist/agent/model-config.d.ts.map +1 -1
- package/dist/agent/model-config.js +86 -0
- package/dist/agent/model-config.js.map +1 -1
- package/dist/agent/production-agent.d.ts +91 -5
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +389 -180
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/runtime-context.d.ts +29 -0
- package/dist/agent/runtime-context.d.ts.map +1 -1
- package/dist/agent/runtime-context.js +40 -11
- package/dist/agent/runtime-context.js.map +1 -1
- package/dist/agent/tool-result-images.d.ts +49 -0
- package/dist/agent/tool-result-images.d.ts.map +1 -0
- package/dist/agent/tool-result-images.js +141 -0
- package/dist/agent/tool-result-images.js.map +1 -0
- package/dist/brand-kit/fig/index.d.ts.map +1 -1
- package/dist/brand-kit/fig/index.js +6 -3
- package/dist/brand-kit/fig/index.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +67 -18
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +72 -40
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/KeepTabOpenNotice.d.ts +55 -0
- package/dist/client/KeepTabOpenNotice.d.ts.map +1 -0
- package/dist/client/KeepTabOpenNotice.js +85 -0
- package/dist/client/KeepTabOpenNotice.js.map +1 -0
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +2 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/RunStuckBanner.d.ts +7 -1
- package/dist/client/RunStuckBanner.d.ts.map +1 -1
- package/dist/client/RunStuckBanner.js +7 -2
- package/dist/client/RunStuckBanner.js.map +1 -1
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +7 -1
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/clipboard.d.ts.map +1 -1
- package/dist/client/clipboard.js +5 -6
- package/dist/client/clipboard.js.map +1 -1
- package/dist/client/components/AgentPresenceChip.d.ts +1 -11
- package/dist/client/components/AgentPresenceChip.d.ts.map +1 -1
- package/dist/client/components/AgentPresenceChip.js +1 -41
- package/dist/client/components/AgentPresenceChip.js.map +1 -1
- package/dist/client/components/LiveCursorOverlay.d.ts +1 -44
- package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
- package/dist/client/components/LiveCursorOverlay.js +1 -123
- package/dist/client/components/LiveCursorOverlay.js.map +1 -1
- package/dist/client/components/PresenceBar.d.ts +1 -26
- package/dist/client/components/PresenceBar.d.ts.map +1 -1
- package/dist/client/components/PresenceBar.js +1 -164
- package/dist/client/components/PresenceBar.js.map +1 -1
- package/dist/client/components/RecentEditHighlights.d.ts +1 -42
- package/dist/client/components/RecentEditHighlights.d.ts.map +1 -1
- package/dist/client/components/RecentEditHighlights.js +1 -145
- package/dist/client/components/RecentEditHighlights.js.map +1 -1
- package/dist/client/components/RemoteSelectionRings.d.ts +1 -51
- package/dist/client/components/RemoteSelectionRings.d.ts.map +1 -1
- package/dist/client/components/RemoteSelectionRings.js +1 -129
- package/dist/client/components/RemoteSelectionRings.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +4 -0
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +74 -26
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/db-admin/SqlEditor.d.ts.map +1 -1
- package/dist/client/db-admin/SqlEditor.js +13 -3
- package/dist/client/db-admin/SqlEditor.js.map +1 -1
- package/dist/client/dynamic-suggestions.d.ts.map +1 -1
- package/dist/client/dynamic-suggestions.js +7 -1
- package/dist/client/dynamic-suggestions.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +7 -7
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsListPage.js +5 -7
- package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
- package/dist/client/host-bridge.d.ts +2 -0
- package/dist/client/host-bridge.d.ts.map +1 -1
- package/dist/client/host-bridge.js +26 -10
- package/dist/client/host-bridge.js.map +1 -1
- package/dist/client/i18n.d.ts +1 -0
- package/dist/client/i18n.d.ts.map +1 -1
- package/dist/client/i18n.js +3 -1
- package/dist/client/i18n.js.map +1 -1
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.js +12 -31
- package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +3 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.js +2 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts +3 -1
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/useCollabReconcile.js +17 -8
- package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts +3 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +103 -9
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
- package/dist/client/settings/SettingsTabsPage.js +5 -5
- package/dist/client/settings/SettingsTabsPage.js.map +1 -1
- package/dist/client/settings/index.d.ts +1 -1
- package/dist/client/settings/index.d.ts.map +1 -1
- package/dist/client/settings/index.js +1 -1
- package/dist/client/settings/index.js.map +1 -1
- package/dist/client/sharing/VisibilityBadge.d.ts +1 -10
- package/dist/client/sharing/VisibilityBadge.d.ts.map +1 -1
- package/dist/client/sharing/VisibilityBadge.js +1 -18
- package/dist/client/sharing/VisibilityBadge.js.map +1 -1
- package/dist/client/use-action.d.ts +3 -0
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +34 -3
- package/dist/client/use-action.js.map +1 -1
- package/dist/client/use-db-sync.d.ts +4 -0
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +37 -18
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/client/use-run-stuck-detection.d.ts +8 -1
- package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
- package/dist/client/use-run-stuck-detection.js +3 -2
- package/dist/client/use-run-stuck-detection.js.map +1 -1
- package/dist/coding-tools/run-code.d.ts +36 -0
- package/dist/coding-tools/run-code.d.ts.map +1 -1
- package/dist/coding-tools/run-code.js +333 -62
- package/dist/coding-tools/run-code.js.map +1 -1
- package/dist/coding-tools/sandbox/background.d.ts +141 -0
- package/dist/coding-tools/sandbox/background.d.ts.map +1 -0
- package/dist/coding-tools/sandbox/background.js +279 -0
- package/dist/coding-tools/sandbox/background.js.map +1 -0
- package/dist/coding-tools/sandbox/executions-store.d.ts +138 -0
- package/dist/coding-tools/sandbox/executions-store.d.ts.map +1 -0
- package/dist/coding-tools/sandbox/executions-store.js +380 -0
- package/dist/coding-tools/sandbox/executions-store.js.map +1 -0
- package/dist/coding-tools/sandbox/index.d.ts +22 -13
- package/dist/coding-tools/sandbox/index.d.ts.map +1 -1
- package/dist/coding-tools/sandbox/index.js +31 -13
- package/dist/coding-tools/sandbox/index.js.map +1 -1
- package/dist/coding-tools/sandbox/local-child-process-adapter.d.ts.map +1 -1
- package/dist/coding-tools/sandbox/local-child-process-adapter.js +61 -4
- package/dist/coding-tools/sandbox/local-child-process-adapter.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/client.d.ts +16 -12
- package/dist/collab/client.d.ts.map +1 -1
- package/dist/collab/client.js +744 -496
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/presence.d.ts +2 -20
- package/dist/collab/presence.d.ts.map +1 -1
- package/dist/collab/presence.js +3 -0
- package/dist/collab/presence.js.map +1 -1
- package/dist/collab/recent-edits.d.ts +2 -37
- package/dist/collab/recent-edits.d.ts.map +1 -1
- package/dist/collab/recent-edits.js +2 -9
- package/dist/collab/recent-edits.js.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/data-programs/actions.d.ts +19 -0
- package/dist/data-programs/actions.d.ts.map +1 -0
- package/dist/data-programs/actions.js +279 -0
- package/dist/data-programs/actions.js.map +1 -0
- package/dist/data-programs/contract.d.ts +70 -0
- package/dist/data-programs/contract.d.ts.map +1 -0
- package/dist/data-programs/contract.js +225 -0
- package/dist/data-programs/contract.js.map +1 -0
- package/dist/data-programs/execute.d.ts +96 -0
- package/dist/data-programs/execute.d.ts.map +1 -0
- package/dist/data-programs/execute.js +454 -0
- package/dist/data-programs/execute.js.map +1 -0
- package/dist/data-programs/index.d.ts +11 -0
- package/dist/data-programs/index.d.ts.map +1 -0
- package/dist/data-programs/index.js +11 -0
- package/dist/data-programs/index.js.map +1 -0
- package/dist/data-programs/schema.d.ts +517 -0
- package/dist/data-programs/schema.d.ts.map +1 -0
- package/dist/data-programs/schema.js +138 -0
- package/dist/data-programs/schema.js.map +1 -0
- package/dist/data-programs/store.d.ts +158 -0
- package/dist/data-programs/store.d.ts.map +1 -0
- package/dist/data-programs/store.js +493 -0
- package/dist/data-programs/store.js.map +1 -0
- package/dist/db/create-get-db.d.ts +25 -0
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +25 -2
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +34 -0
- package/dist/deploy/build.js.map +1 -1
- package/dist/extensions/actions.js +2 -2
- package/dist/extensions/actions.js.map +1 -1
- package/dist/file-upload/builder.d.ts.map +1 -1
- package/dist/file-upload/builder.js +9 -0
- package/dist/file-upload/builder.js.map +1 -1
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +21 -10
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/local-artifacts/index.js +1 -1
- package/dist/local-artifacts/index.js.map +1 -1
- package/dist/localization/default-messages.d.ts +0 -1
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +1 -2
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp-client/index.d.ts +9 -0
- package/dist/mcp-client/index.d.ts.map +1 -1
- package/dist/mcp-client/index.js +23 -0
- package/dist/mcp-client/index.js.map +1 -1
- package/dist/observability/routes.d.ts +3 -3
- package/dist/onboarding/default-steps.d.ts.map +1 -1
- package/dist/onboarding/default-steps.js +2 -2
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/store.d.ts.map +1 -1
- package/dist/resources/store.js +35 -3
- package/dist/resources/store.js.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +4 -8
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/scripts/agent-engines/test-agent-engine.d.ts.map +1 -1
- package/dist/scripts/agent-engines/test-agent-engine.js +7 -2
- package/dist/scripts/agent-engines/test-agent-engine.js.map +1 -1
- package/dist/scripts/db/tool-mode.js +3 -3
- package/dist/scripts/db/tool-mode.js.map +1 -1
- package/dist/scripts/resources/migrate-learnings.d.ts +5 -1
- package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -1
- package/dist/scripts/resources/migrate-learnings.js +8 -10
- package/dist/scripts/resources/migrate-learnings.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +20 -6
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +138 -59
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-discovery.d.ts.map +1 -1
- package/dist/server/agent-discovery.js +62 -8
- package/dist/server/agent-discovery.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +75 -3
- package/dist/server/auth.js.map +1 -1
- package/dist/server/builder-design-systems.js +2 -2
- package/dist/server/builder-design-systems.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +100 -20
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +6 -3
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +25 -8
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/csrf.js +3 -0
- package/dist/server/csrf.js.map +1 -1
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +37 -1
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/server/oauth-helpers.d.ts.map +1 -1
- package/dist/server/oauth-helpers.js +9 -1
- package/dist/server/oauth-helpers.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +80 -48
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/prompts/shared-rules.js +2 -2
- package/dist/server/prompts/shared-rules.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts.map +1 -1
- package/dist/server/transcribe-voice.js +77 -15
- package/dist/server/transcribe-voice.js.map +1 -1
- package/dist/styles/agent-native.css +57 -45
- package/dist/templates/default/.agents/skills/actions/SKILL.md +55 -0
- package/dist/templates/default/AGENTS.md +11 -14
- package/dist/templates/default/actions/navigate.ts +1 -1
- package/dist/templates/default/app/i18n/ar-SA.ts +0 -1
- package/dist/templates/default/app/i18n/de-DE.ts +0 -1
- package/dist/templates/default/app/i18n/en-US.ts +0 -1
- package/dist/templates/default/app/i18n/es-ES.ts +0 -1
- package/dist/templates/default/app/i18n/fr-FR.ts +0 -1
- package/dist/templates/default/app/i18n/hi-IN.ts +0 -1
- package/dist/templates/default/app/i18n/ja-JP.ts +0 -1
- package/dist/templates/default/app/i18n/ko-KR.ts +0 -1
- package/dist/templates/default/app/i18n/pt-BR.ts +0 -1
- package/dist/templates/default/app/i18n/zh-CN.ts +0 -1
- package/dist/templates/default/app/i18n/zh-TW.ts +0 -1
- package/dist/templates/default/app/routes/settings.tsx +22 -33
- package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +20 -7
- package/dist/templates/headless/AGENTS.md +9 -6
- package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +55 -0
- package/dist/templates/workspace-core/.agents/skills/data-programs/SKILL.md +128 -0
- package/dist/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +10 -4
- package/dist/vite/agents-bundle-plugin.d.ts.map +1 -1
- package/dist/vite/agents-bundle-plugin.js +26 -1
- package/dist/vite/agents-bundle-plugin.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +11 -0
- package/dist/vite/client.js.map +1 -1
- package/docs/content/agent-native-toolkit.mdx +87 -146
- package/docs/content/cloneable-saas.mdx +19 -19
- package/docs/content/components.mdx +16 -4
- package/docs/content/data-programs.mdx +329 -0
- package/docs/content/deployment.mdx +9 -9
- package/docs/content/extensions.mdx +8 -7
- package/docs/content/generative-ui.mdx +5 -3
- package/docs/content/key-concepts.mdx +6 -9
- package/docs/content/locales/ar-SA/agent-native-toolkit.mdx +100 -70
- package/docs/content/locales/ar-SA/cloneable-saas.mdx +19 -19
- package/docs/content/locales/ar-SA/components.mdx +12 -2
- package/docs/content/locales/ar-SA/data-programs.mdx +329 -0
- package/docs/content/locales/ar-SA/deployment.mdx +8 -9
- package/docs/content/locales/ar-SA/extensions.mdx +6 -4
- package/docs/content/locales/ar-SA/key-concepts.mdx +7 -9
- package/docs/content/locales/ar-SA/real-time-collaboration.mdx +9 -10
- package/docs/content/locales/de-DE/agent-native-toolkit.mdx +100 -74
- package/docs/content/locales/de-DE/cloneable-saas.mdx +19 -19
- package/docs/content/locales/de-DE/components.mdx +12 -2
- package/docs/content/locales/de-DE/data-programs.mdx +329 -0
- package/docs/content/locales/de-DE/deployment.mdx +8 -9
- package/docs/content/locales/de-DE/extensions.mdx +6 -4
- package/docs/content/locales/de-DE/key-concepts.mdx +8 -10
- package/docs/content/locales/de-DE/real-time-collaboration.mdx +9 -10
- package/docs/content/locales/es-ES/agent-native-toolkit.mdx +100 -74
- package/docs/content/locales/es-ES/cloneable-saas.mdx +19 -19
- package/docs/content/locales/es-ES/components.mdx +12 -2
- package/docs/content/locales/es-ES/data-programs.mdx +329 -0
- package/docs/content/locales/es-ES/deployment.mdx +8 -9
- package/docs/content/locales/es-ES/extensions.mdx +6 -4
- package/docs/content/locales/es-ES/key-concepts.mdx +8 -10
- package/docs/content/locales/es-ES/real-time-collaboration.mdx +9 -10
- package/docs/content/locales/fr-FR/agent-native-toolkit.mdx +100 -76
- package/docs/content/locales/fr-FR/cloneable-saas.mdx +19 -19
- package/docs/content/locales/fr-FR/components.mdx +12 -2
- package/docs/content/locales/fr-FR/data-programs.mdx +329 -0
- package/docs/content/locales/fr-FR/deployment.mdx +8 -9
- package/docs/content/locales/fr-FR/extensions.mdx +6 -4
- package/docs/content/locales/fr-FR/key-concepts.mdx +8 -10
- package/docs/content/locales/fr-FR/real-time-collaboration.mdx +9 -10
- package/docs/content/locales/hi-IN/agent-native-toolkit.mdx +100 -71
- package/docs/content/locales/hi-IN/cloneable-saas.mdx +19 -19
- package/docs/content/locales/hi-IN/components.mdx +20 -10
- package/docs/content/locales/hi-IN/data-programs.mdx +329 -0
- package/docs/content/locales/hi-IN/deployment.mdx +8 -9
- package/docs/content/locales/hi-IN/extensions.mdx +6 -4
- package/docs/content/locales/hi-IN/key-concepts.mdx +8 -10
- package/docs/content/locales/hi-IN/real-time-collaboration.mdx +9 -10
- package/docs/content/locales/ja-JP/agent-native-toolkit.mdx +100 -64
- package/docs/content/locales/ja-JP/cloneable-saas.mdx +19 -19
- package/docs/content/locales/ja-JP/components.mdx +12 -2
- package/docs/content/locales/ja-JP/data-programs.mdx +329 -0
- package/docs/content/locales/ja-JP/deployment.mdx +8 -9
- package/docs/content/locales/ja-JP/extensions.mdx +6 -4
- package/docs/content/locales/ja-JP/key-concepts.mdx +9 -11
- package/docs/content/locales/ja-JP/real-time-collaboration.mdx +9 -10
- package/docs/content/locales/ko-KR/agent-native-toolkit.mdx +100 -60
- package/docs/content/locales/ko-KR/cloneable-saas.mdx +19 -19
- package/docs/content/locales/ko-KR/components.mdx +20 -10
- package/docs/content/locales/ko-KR/data-programs.mdx +329 -0
- package/docs/content/locales/ko-KR/deployment.mdx +8 -9
- package/docs/content/locales/ko-KR/extensions.mdx +16 -14
- package/docs/content/locales/ko-KR/key-concepts.mdx +9 -11
- package/docs/content/locales/ko-KR/real-time-collaboration.mdx +9 -10
- package/docs/content/locales/pt-BR/agent-native-toolkit.mdx +100 -74
- package/docs/content/locales/pt-BR/cloneable-saas.mdx +19 -19
- package/docs/content/locales/pt-BR/components.mdx +12 -2
- package/docs/content/locales/pt-BR/data-programs.mdx +329 -0
- package/docs/content/locales/pt-BR/deployment.mdx +8 -9
- package/docs/content/locales/pt-BR/extensions.mdx +6 -4
- package/docs/content/locales/pt-BR/key-concepts.mdx +8 -11
- package/docs/content/locales/pt-BR/real-time-collaboration.mdx +9 -10
- package/docs/content/locales/zh-CN/agent-native-toolkit.mdx +100 -58
- package/docs/content/locales/zh-CN/cloneable-saas.mdx +19 -19
- package/docs/content/locales/zh-CN/components.mdx +20 -10
- package/docs/content/locales/zh-CN/data-programs.mdx +329 -0
- package/docs/content/locales/zh-CN/deployment.mdx +7 -9
- package/docs/content/locales/zh-CN/extensions.mdx +16 -14
- package/docs/content/locales/zh-CN/key-concepts.mdx +7 -11
- package/docs/content/locales/zh-CN/real-time-collaboration.mdx +10 -11
- package/docs/content/locales/zh-TW/agent-native-toolkit.mdx +100 -58
- package/docs/content/locales/zh-TW/cloneable-saas.mdx +19 -19
- package/docs/content/locales/zh-TW/components.mdx +20 -10
- package/docs/content/locales/zh-TW/data-programs.mdx +329 -0
- package/docs/content/locales/zh-TW/deployment.mdx +7 -9
- package/docs/content/locales/zh-TW/extensions.mdx +16 -14
- package/docs/content/locales/zh-TW/key-concepts.mdx +7 -11
- package/docs/content/locales/zh-TW/real-time-collaboration.mdx +10 -11
- package/docs/content/real-time-collaboration.mdx +10 -11
- package/docs/content/toolkit-app-adapters.mdx +46 -0
- package/docs/content/toolkit-collaboration-ui.mdx +48 -0
- package/docs/content/toolkit-sharing-ui.mdx +33 -0
- package/docs/content/toolkit-shell-hooks.mdx +27 -0
- package/docs/content/toolkit-ui.mdx +69 -0
- package/package.json +6 -2
- package/src/templates/default/.agents/skills/actions/SKILL.md +55 -0
- package/src/templates/default/AGENTS.md +11 -14
- package/src/templates/default/actions/navigate.spec.ts +53 -0
- package/src/templates/default/actions/navigate.ts +1 -1
- package/src/templates/default/app/i18n/ar-SA.ts +0 -1
- package/src/templates/default/app/i18n/de-DE.ts +0 -1
- package/src/templates/default/app/i18n/en-US.ts +0 -1
- package/src/templates/default/app/i18n/es-ES.ts +0 -1
- package/src/templates/default/app/i18n/fr-FR.ts +0 -1
- package/src/templates/default/app/i18n/hi-IN.ts +0 -1
- package/src/templates/default/app/i18n/ja-JP.ts +0 -1
- package/src/templates/default/app/i18n/ko-KR.ts +0 -1
- package/src/templates/default/app/i18n/pt-BR.ts +0 -1
- package/src/templates/default/app/i18n/zh-CN.ts +0 -1
- package/src/templates/default/app/i18n/zh-TW.ts +0 -1
- package/src/templates/default/app/routes/settings.tsx +22 -33
- package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +20 -7
- package/src/templates/headless/AGENTS.md +9 -6
- package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +55 -0
- package/src/templates/workspace-core/.agents/skills/data-programs/SKILL.md +128 -0
- package/src/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +10 -4
- package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +0 -153
- package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +0 -133
- package/corpus/templates/design/app/pages/DesignEditor.tsx +0 -22928
- package/corpus/templates/design/server/lib/figma-import/clipboard.ts +0 -122
- package/corpus/templates/design/server/lib/figma-import/decode.ts +0 -455
- package/corpus/templates/design/server/lib/figma-import/processor.ts +0 -116
- package/corpus/templates/design/server/lib/figma-import/render-html.ts +0 -397
- package/corpus/templates/design/server/lib/figma-import/types.ts +0 -60
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import { usePinchZoom, useT } from "@agent-native/core/client";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
DEFAULT_CANVAS_MAX_ZOOM,
|
|
4
|
+
DEFAULT_CANVAS_MIN_ZOOM,
|
|
5
|
+
getDraftGeometryFromPoints,
|
|
6
|
+
} from "@shared/canvas-math";
|
|
3
7
|
import { ensureCodeLayerNodeIdsInHtml } from "@shared/code-layer";
|
|
8
|
+
import { IconPlugConnectedX, IconRefresh } from "@tabler/icons-react";
|
|
4
9
|
import { useRef, useEffect, useCallback, useMemo, useState } from "react";
|
|
5
10
|
|
|
11
|
+
import { Button } from "@/components/ui/button";
|
|
6
12
|
// NOTE: This wires up the NEW shared visual-editor DrawOverlay + comment-pin
|
|
7
13
|
// components from `@/components/visual-editor`. The legacy iframe-only
|
|
8
14
|
// DrawOverlay at `./DrawOverlay.tsx` is intentionally NOT used here — both
|
|
@@ -21,6 +27,7 @@ import { hitTestBridgeScript } from "../../../.generated/bridge/hit-test.generat
|
|
|
21
27
|
import { motionPreviewBridgeScript } from "../../../.generated/bridge/motion-preview.generated";
|
|
22
28
|
import { navBridgeScript } from "../../../.generated/bridge/nav.generated";
|
|
23
29
|
import { shaderFillPreviewBridgeScript } from "../../../.generated/bridge/shader-fill-preview.generated";
|
|
30
|
+
import { shaderRuntimeBridgeScript } from "../../../.generated/bridge/shader-runtime.generated";
|
|
24
31
|
import { tweakBridgeScript } from "../../../.generated/bridge/tweak.generated";
|
|
25
32
|
import { zoomBridgeScript } from "../../../.generated/bridge/zoom.generated";
|
|
26
33
|
import { isTrustedCanvasBridgeMessage } from "./bridge-security";
|
|
@@ -78,7 +85,15 @@ function isAllowedFusionOrigin(
|
|
|
78
85
|
export interface MotionTrackWire {
|
|
79
86
|
targetNodeId: string;
|
|
80
87
|
property: string;
|
|
88
|
+
/**
|
|
89
|
+
* Keyframes normalised to the TRACK's own span; `ease` accepts CSS timing
|
|
90
|
+
* functions plus `spring(bounce[, settle])` tokens and `linear(...)` lists.
|
|
91
|
+
*/
|
|
81
92
|
keyframes: Array<{ t: number; value: string; ease?: string }>;
|
|
93
|
+
/** Track start offset within the timeline, ms (staggering). */
|
|
94
|
+
delayMs?: number;
|
|
95
|
+
/** Per-track animation span, ms. Omitted = whole timeline. */
|
|
96
|
+
durationMs?: number;
|
|
82
97
|
}
|
|
83
98
|
|
|
84
99
|
/**
|
|
@@ -96,14 +111,28 @@ ${motionPreviewBridgeScript}
|
|
|
96
111
|
`;
|
|
97
112
|
|
|
98
113
|
/**
|
|
99
|
-
* Shader
|
|
100
|
-
*
|
|
101
|
-
*
|
|
114
|
+
* Shader scripts. ALWAYS injected alongside the other bridge scripts:
|
|
115
|
+
*
|
|
116
|
+
* 1. The code-backed GLSL shader RUNTIME (window.__anShaders) — renders
|
|
117
|
+
* persisted `<script type="application/x-agent-native-shader">` blocks
|
|
118
|
+
* onto annotated elements via WebGL, and powers live GLSL previews.
|
|
119
|
+
* Persisted screens embed their own copy for standalone export; the
|
|
120
|
+
* runtime is idempotent so double-injection is safe. Source of truth:
|
|
121
|
+
* app/components/design/bridge/shader-runtime.bridge.ts (also embedded
|
|
122
|
+
* into saved HTML by shared/shader-fills.ts ensureShaderRuntime()).
|
|
123
|
+
*
|
|
124
|
+
* 2. The shader-fill preview BRIDGE — postMessage protocol handler. Legacy
|
|
125
|
+
* messages apply a CSS gradient approximation of a shader fill to the
|
|
126
|
+
* selected element; `glsl-shader-*` messages delegate to the runtime for
|
|
127
|
+
* live WebGL previews, knob scrubbing, and rescans. Nothing persists.
|
|
102
128
|
*
|
|
103
129
|
* Source: app/components/design/bridge/shader-fill-preview.bridge.ts
|
|
104
|
-
* Compiled: .generated/bridge
|
|
130
|
+
* Compiled: .generated/bridge/*.generated.ts (run bridge/codegen.ts to update)
|
|
105
131
|
*/
|
|
106
132
|
const SHADER_FILL_PREVIEW_BRIDGE_SCRIPT = `
|
|
133
|
+
<script data-agent-native-shader-runtime data-runtime-version="1">
|
|
134
|
+
${shaderRuntimeBridgeScript}
|
|
135
|
+
</script>
|
|
107
136
|
<script data-agent-native-shader-fill-preview-bridge>
|
|
108
137
|
${shaderFillPreviewBridgeScript}
|
|
109
138
|
</script>
|
|
@@ -410,6 +439,13 @@ interface DesignCanvasProps {
|
|
|
410
439
|
onExitDrawMode?: () => void;
|
|
411
440
|
/** Whether comment-pin drop mode is active. */
|
|
412
441
|
pinMode?: boolean;
|
|
442
|
+
/**
|
|
443
|
+
* When true, suppresses rendering of comment pins on this canvas (e.g. the
|
|
444
|
+
* Figma-style Shift+C "hide comments" toggle in single-screen mode). Only
|
|
445
|
+
* affects pin *visibility* — pin drop mode (`pinMode`) still behaves
|
|
446
|
+
* normally underneath so toggling this back off doesn't lose anything.
|
|
447
|
+
*/
|
|
448
|
+
commentPinsHidden?: boolean;
|
|
413
449
|
selectedSelector?: string | null;
|
|
414
450
|
selectedSelectorCandidates?: string[];
|
|
415
451
|
selectedSelectorGroups?: string[][];
|
|
@@ -457,6 +493,14 @@ interface DesignCanvasProps {
|
|
|
457
493
|
* When omitted the bridge falls back to "ease".
|
|
458
494
|
*/
|
|
459
495
|
motionDefaultEase?: string;
|
|
496
|
+
/**
|
|
497
|
+
* Timeline duration in ms, threaded to the motion-preview bridge with the
|
|
498
|
+
* tracks so per-track `delayMs`/`durationMs` offsets can be mapped before
|
|
499
|
+
* the first scrub tick arrives (ticks also carry it). Optional — without
|
|
500
|
+
* it, offset tracks preview correctly from the first `motion-preview`
|
|
501
|
+
* message onward.
|
|
502
|
+
*/
|
|
503
|
+
motionDurationMs?: number;
|
|
460
504
|
/**
|
|
461
505
|
* Explicit iframe width in pixels. When provided it overrides the width
|
|
462
506
|
* derived from `deviceFrame`, enabling per-breakpoint preview (e.g. Mobile
|
|
@@ -486,6 +530,52 @@ interface DesignCanvasProps {
|
|
|
486
530
|
/** The CSS `background` value returned by preview-shader-fill. */
|
|
487
531
|
css: string;
|
|
488
532
|
} | null;
|
|
533
|
+
/**
|
|
534
|
+
* On-canvas gradient-edit handles (Figma parity) for a gradient fill on an
|
|
535
|
+
* element INSIDE this screen's iframe content (as opposed to a board/draft
|
|
536
|
+
* primitive or the screen-frame's own background, which MultiScreenCanvas
|
|
537
|
+
* already draws chrome for directly — see DesignEditor's gradientEditTarget
|
|
538
|
+
* derivation). When set, posts `{ type: "gradient-edit-target", nodeId,
|
|
539
|
+
* cssValue }` into the iframe so the editor-chrome bridge renders drag
|
|
540
|
+
* handles on that element; `null`/`undefined` posts `{ type:
|
|
541
|
+
* "gradient-edit-clear" }`. `nodeId` must be a `data-agent-native-node-id`
|
|
542
|
+
* value. See editor-chrome.bridge.ts's gradientEditTarget doc comment for
|
|
543
|
+
* the full contract this implements.
|
|
544
|
+
*/
|
|
545
|
+
gradientEditTarget?: {
|
|
546
|
+
nodeId: string;
|
|
547
|
+
cssValue: string;
|
|
548
|
+
} | null;
|
|
549
|
+
/**
|
|
550
|
+
* Called with the bridge's `gradient-edit-change` postMessages while a
|
|
551
|
+
* gradient-edit drag on an in-screen element (gradientEditTarget above) is
|
|
552
|
+
* live — `phase: "preview"` on every drag tick, `"commit"` once on
|
|
553
|
+
* pointerup, mirroring GradientEditOverlayTarget's onChange contract in
|
|
554
|
+
* MultiScreenCanvas.tsx so the parent can route both through the same
|
|
555
|
+
* style-apply path `visual-style-change` uses.
|
|
556
|
+
*/
|
|
557
|
+
onGradientEditChange?: (
|
|
558
|
+
nodeId: string,
|
|
559
|
+
cssValue: string,
|
|
560
|
+
phase: "preview" | "commit",
|
|
561
|
+
) => void;
|
|
562
|
+
/**
|
|
563
|
+
* Interaction-state forced preview (Figma/Webflow parity, phase 2 — see
|
|
564
|
+
* `shared/interaction-states.ts`'s "Forced-preview mechanism" doc comment).
|
|
565
|
+
* When set, posts `{ type: "state-preview", nodeId, state }` into the
|
|
566
|
+
* iframe so the editor-chrome bridge sets `data-an-state-preview="<state>"`
|
|
567
|
+
* on the matching `[data-agent-native-node-id]` element — the persisted
|
|
568
|
+
* twin CSS rule (written by `duplicateStatePreviewRules`) does the actual
|
|
569
|
+
* styling, so the bridge does zero CSS work of its own.
|
|
570
|
+
* `null`/`undefined` posts `{ type: "state-preview", nodeId: null, state:
|
|
571
|
+
* null }`, clearing whichever element is currently force-previewing.
|
|
572
|
+
* Mirrors `gradientEditTarget`'s postMessage-sync-effect pattern exactly —
|
|
573
|
+
* see that prop's doc comment above.
|
|
574
|
+
*/
|
|
575
|
+
statePreviewTarget?: {
|
|
576
|
+
nodeId: string;
|
|
577
|
+
state: string;
|
|
578
|
+
} | null;
|
|
489
579
|
/**
|
|
490
580
|
* Called when the user clicks the component-instance source tag (the
|
|
491
581
|
* "ComponentName →" pill that floats above a selected component root).
|
|
@@ -514,6 +604,52 @@ interface DesignCanvasProps {
|
|
|
514
604
|
* `draftPrimitiveToInsert` on the overview side).
|
|
515
605
|
*/
|
|
516
606
|
onCreatePrimitive?: (spec: CreatePrimitiveSpec) => void;
|
|
607
|
+
/**
|
|
608
|
+
* OS file drag-and-drop (Figma parity): fired when the user drops native
|
|
609
|
+
* OS files (e.g. images dragged from Finder/Explorer) onto this single-
|
|
610
|
+
* screen canvas. `target.screenContentPoint` is the drop point converted to
|
|
611
|
+
* SCREEN-CONTENT coordinates via `getScreenContentPointFromClient` — the
|
|
612
|
+
* same space `onCreatePrimitive` geometry and `draftPrimitiveToInsert` use
|
|
613
|
+
* — NOT viewport pixels. `target.screenId` echoes this canvas's own
|
|
614
|
+
* `screenId` prop (when set) so a caller wiring both MultiScreenCanvas and
|
|
615
|
+
* DesignCanvas can use one shared handler keyed on screen id. This
|
|
616
|
+
* component only resolves WHERE the drop landed — it does NOT read file
|
|
617
|
+
* contents, upload, or insert anything; that remains the caller's job
|
|
618
|
+
* (DesignEditor's paste-image pipeline), matching `onCreatePrimitive`'s own
|
|
619
|
+
* division of responsibility.
|
|
620
|
+
*/
|
|
621
|
+
onDropFiles?: (
|
|
622
|
+
files: File[],
|
|
623
|
+
target: {
|
|
624
|
+
screenContentPoint: { x: number; y: number };
|
|
625
|
+
screenId?: string;
|
|
626
|
+
},
|
|
627
|
+
) => void;
|
|
628
|
+
/**
|
|
629
|
+
* Contract for DesignEditor: when true, the Figma-style "hand" tool is
|
|
630
|
+
* armed, so a plain left-button drag anywhere on this canvas (over the
|
|
631
|
+
* scroll-container background OR over the iframe/creation-overlay area)
|
|
632
|
+
* pans instead of selecting/drawing. Mirrors MultiScreenCanvas's own
|
|
633
|
+
* `tool === "hand"` → `beginPan` gating (see `e.button === 0 && tool ===
|
|
634
|
+
* "hand"` in MultiScreenCanvas). Middle-mouse-button drag always pans
|
|
635
|
+
* regardless of this prop, matching MultiScreenCanvas's unconditional
|
|
636
|
+
* `e.button === 1` branch. Defaults to `false` (no behavior change when
|
|
637
|
+
* omitted) — DesignEditor should pass `activeTool === "hand"` (or its
|
|
638
|
+
* equivalent tool-state) once wired.
|
|
639
|
+
*/
|
|
640
|
+
handToolActive?: boolean;
|
|
641
|
+
/**
|
|
642
|
+
* Contract for DesignEditor: when true, the spacebar is currently held
|
|
643
|
+
* down, which — Figma-style — temporarily activates the same pan-on-drag
|
|
644
|
+
* behavior as `handToolActive` without changing the active tool. This
|
|
645
|
+
* component does not listen for the spacebar itself (keydown/keyup would
|
|
646
|
+
* need to be captured at a level that already reaches this component
|
|
647
|
+
* reliably, e.g. a window-level listener in DesignEditor gated on not
|
|
648
|
+
* being in a text-editing context); DesignEditor should track pressed
|
|
649
|
+
* state there and pass it through here. Defaults to `false` (no behavior
|
|
650
|
+
* change when omitted).
|
|
651
|
+
*/
|
|
652
|
+
spacePanActive?: boolean;
|
|
517
653
|
}
|
|
518
654
|
|
|
519
655
|
/** Creation tools supported by the single-screen click-to-place overlay. */
|
|
@@ -523,7 +659,11 @@ export type CreationTool =
|
|
|
523
659
|
| "line"
|
|
524
660
|
| "arrow"
|
|
525
661
|
| "text"
|
|
526
|
-
| "pen"
|
|
662
|
+
| "pen"
|
|
663
|
+
// Figma parity: the frame tool (F/A) used inside a focused screen places a
|
|
664
|
+
// bare container <div> (a nested "frame") instead of forcing a jump out to
|
|
665
|
+
// overview to draw a new screen.
|
|
666
|
+
| "frame";
|
|
527
667
|
|
|
528
668
|
/**
|
|
529
669
|
* Geometry payload emitted by the single-screen creation overlay. Coordinates
|
|
@@ -579,6 +719,71 @@ export function getScreenContentPointFromClient(
|
|
|
579
719
|
};
|
|
580
720
|
}
|
|
581
721
|
|
|
722
|
+
/**
|
|
723
|
+
* Computes the scroll-container delta needed to keep a given viewport
|
|
724
|
+
* (client) point anchored to the same content underneath it while zooming.
|
|
725
|
+
*
|
|
726
|
+
* This is the cursor-anchor math used by the `pinch-zoom-wheel` bridge
|
|
727
|
+
* handler (forwarded from inside the iframe, since wheel events don't bubble
|
|
728
|
+
* out of iframes — see `zoom.bridge.ts`) to mirror `usePinchZoom`'s own
|
|
729
|
+
* zoom-to-cursor behavior for gestures that occur over the iframe itself.
|
|
730
|
+
*
|
|
731
|
+
* IMPORTANT — this math is only correct when the scaled layer's
|
|
732
|
+
* `transform-origin` is `top left` (or equivalent), so that the layer's own
|
|
733
|
+
* top-left corner is a fixed point in scroll-content space regardless of
|
|
734
|
+
* zoom. If the scaled layer is instead centered via `transform-origin:
|
|
735
|
+
* center center` plus flex/grid centering, the *painted* box re-centers
|
|
736
|
+
* around the container's center on every zoom change — the flex-centering
|
|
737
|
+
* repositions the *layout* box so its center lands at the container's
|
|
738
|
+
* center, and `transform-origin: center` then scales around that already-
|
|
739
|
+
* centered point. That is a well-defined anchor too, but it is NOT the one
|
|
740
|
+
* this function (or usePinchZoom) computes, so cursor-following would drift.
|
|
741
|
+
* See the long comment on the "none"-mode zoom layer in the component render
|
|
742
|
+
* for how DesignCanvas keeps this invariant true while still looking
|
|
743
|
+
* centered at rest.
|
|
744
|
+
*
|
|
745
|
+
* @param anchorClient The viewport point to keep stationary (e.g. cursor
|
|
746
|
+
* position converted from iframe-document space to viewport space).
|
|
747
|
+
* @param containerRect The scroll container's `getBoundingClientRect()`.
|
|
748
|
+
* @param scrollOffset The scroll container's current `{ scrollLeft,
|
|
749
|
+
* scrollTop }`.
|
|
750
|
+
* @param zoomRatio `nextZoom / currentZoom` — how much the zoom is about to
|
|
751
|
+
* change by by (>1 zooming in, <1 zooming out).
|
|
752
|
+
*/
|
|
753
|
+
export function getZoomToCursorScrollDelta(
|
|
754
|
+
anchorClient: { x: number; y: number },
|
|
755
|
+
containerRect: { left: number; top: number },
|
|
756
|
+
scrollOffset: { scrollLeft: number; scrollTop: number },
|
|
757
|
+
zoomRatio: number,
|
|
758
|
+
): { dx: number; dy: number } {
|
|
759
|
+
const cx = anchorClient.x - containerRect.left + scrollOffset.scrollLeft;
|
|
760
|
+
const cy = anchorClient.y - containerRect.top + scrollOffset.scrollTop;
|
|
761
|
+
return {
|
|
762
|
+
dx: cx * (zoomRatio - 1),
|
|
763
|
+
dy: cy * (zoomRatio - 1),
|
|
764
|
+
};
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
/**
|
|
768
|
+
* True when a drag event is carrying native OS files (e.g. dragged in from
|
|
769
|
+
* Finder/Explorer) rather than an internal HTML5 DOM drag (element reorder,
|
|
770
|
+
* the extensions-panel native-asset drag, etc). A real OS file drag always
|
|
771
|
+
* includes the "Files" type in `dataTransfer.types` — reliably present during
|
|
772
|
+
* dragenter/dragover even before drop, when `dataTransfer.files` itself is
|
|
773
|
+
* empty for security reasons — so this is the correct check to gate
|
|
774
|
+
* preventDefault()/overlay logic on, not `files.length`.
|
|
775
|
+
*/
|
|
776
|
+
export function isOsFileDragEvent(event: {
|
|
777
|
+
dataTransfer: { types: readonly string[] | DOMStringList } | null;
|
|
778
|
+
}): boolean {
|
|
779
|
+
const types = event.dataTransfer?.types;
|
|
780
|
+
if (!types) return false;
|
|
781
|
+
for (let i = 0; i < types.length; i += 1) {
|
|
782
|
+
if (types[i] === "Files") return true;
|
|
783
|
+
}
|
|
784
|
+
return false;
|
|
785
|
+
}
|
|
786
|
+
|
|
582
787
|
function getExternalPreviewUrl(content: string): string | null {
|
|
583
788
|
const trimmed = content.trim();
|
|
584
789
|
if (!/^https?:\/\//i.test(trimmed)) return null;
|
|
@@ -632,6 +837,21 @@ function snapshotEndpointUrl(bridgeUrl: string, previewUrl: string): string {
|
|
|
632
837
|
return endpoint.toString();
|
|
633
838
|
}
|
|
634
839
|
|
|
840
|
+
/**
|
|
841
|
+
* Exponential backoff delay (ms) for the localhost bridge snapshot auto-retry
|
|
842
|
+
* loop, keyed by the zero-based retry attempt number (0 = first retry after
|
|
843
|
+
* the initial failed fetch). Doubles each attempt starting at 1.5s, capped at
|
|
844
|
+
* ~15s so a genuinely-down dev server settles into a slow, low-noise poll
|
|
845
|
+
* instead of hammering the bridge every 1.5s forever.
|
|
846
|
+
*/
|
|
847
|
+
const SNAPSHOT_RETRY_BASE_DELAY_MS = 1500;
|
|
848
|
+
const SNAPSHOT_RETRY_MAX_DELAY_MS = 15000;
|
|
849
|
+
export function getSnapshotRetryDelayMs(attempt: number): number {
|
|
850
|
+
const safeAttempt = Number.isFinite(attempt) ? Math.max(0, attempt) : 0;
|
|
851
|
+
const delay = SNAPSHOT_RETRY_BASE_DELAY_MS * 2 ** safeAttempt;
|
|
852
|
+
return Math.min(SNAPSHOT_RETRY_MAX_DELAY_MS, delay);
|
|
853
|
+
}
|
|
854
|
+
|
|
635
855
|
const TRANSPARENT_EMBEDDED_FRAME_STYLE =
|
|
636
856
|
"<style data-agent-native-transparent-frame>html,body{background:transparent!important;}body{background-color:transparent!important;}</style>";
|
|
637
857
|
|
|
@@ -759,6 +979,7 @@ export function DesignCanvas({
|
|
|
759
979
|
drawMode,
|
|
760
980
|
onExitDrawMode,
|
|
761
981
|
pinMode,
|
|
982
|
+
commentPinsHidden,
|
|
762
983
|
selectedSelector,
|
|
763
984
|
selectedSelectorCandidates = [],
|
|
764
985
|
selectedSelectorGroups = [],
|
|
@@ -776,16 +997,41 @@ export function DesignCanvas({
|
|
|
776
997
|
onPrototypeNavigate,
|
|
777
998
|
motionTracks,
|
|
778
999
|
motionDefaultEase,
|
|
1000
|
+
motionDurationMs,
|
|
779
1001
|
previewWidthPx,
|
|
780
1002
|
onComponentSourceJump,
|
|
781
1003
|
shaderFillPreview,
|
|
1004
|
+
gradientEditTarget,
|
|
1005
|
+
onGradientEditChange,
|
|
1006
|
+
statePreviewTarget,
|
|
782
1007
|
activeCreationTool = null,
|
|
783
1008
|
onCreatePrimitive,
|
|
1009
|
+
onDropFiles,
|
|
1010
|
+
handToolActive = false,
|
|
1011
|
+
spacePanActive = false,
|
|
784
1012
|
}: DesignCanvasProps) {
|
|
785
1013
|
const t = useT();
|
|
786
1014
|
const iframeRef = useRef<HTMLIFrameElement>(null);
|
|
787
1015
|
const scrollContainerRef = useRef<HTMLDivElement>(null);
|
|
1016
|
+
const zoomLayerRef = useRef<HTMLDivElement>(null);
|
|
788
1017
|
const zoomRef = useRef(zoom);
|
|
1018
|
+
// Zoom-invariant chrome: the non-embedded-frame render path below wraps the
|
|
1019
|
+
// iframe in its own CSS `transform: scale(zoom / 100)` (see the
|
|
1020
|
+
// `deviceFrame === "none"` and framed branches further down) — a purely
|
|
1021
|
+
// visual, OUTER scale the bridge running INSIDE the iframe has no way to
|
|
1022
|
+
// observe. `editorChromeScaleX/Y` is the only channel that tells the bridge
|
|
1023
|
+
// what scale its own chrome (selection borders, resize handles, spacing
|
|
1024
|
+
// overlays) must counter-scale by to stay a constant on-screen size, Figma-
|
|
1025
|
+
// style, instead of visually shrinking/growing with content as the user
|
|
1026
|
+
// zooms. The overview caller already folds its own zoom into the
|
|
1027
|
+
// editorChromeScaleX/Y it passes down for exactly this reason; this
|
|
1028
|
+
// component must do the same with its OWN `zoom` prop for single-view,
|
|
1029
|
+
// multiplying in whatever scale the caller passed (default 1) rather than
|
|
1030
|
+
// assuming the caller already accounted for it — single-view's caller
|
|
1031
|
+
// historically didn't pass either prop at all, so the bridge always
|
|
1032
|
+
// computed with scale=1 and chrome scaled with content on every zoom.
|
|
1033
|
+
const effectiveEditorChromeScaleX = (zoom / 100) * editorChromeScaleX;
|
|
1034
|
+
const effectiveEditorChromeScaleY = (zoom / 100) * editorChromeScaleY;
|
|
789
1035
|
const previousContentKeyRef = useRef(contentKey);
|
|
790
1036
|
const runtimeReplacementContentRef = useRef(runtimeReplacementContent);
|
|
791
1037
|
const runtimeReplacementKeyRef = useRef(runtimeReplacementKey);
|
|
@@ -838,6 +1084,12 @@ export function DesignCanvas({
|
|
|
838
1084
|
} | null>(null);
|
|
839
1085
|
const [externalSnapshotRetryNonce, setExternalSnapshotRetryNonce] =
|
|
840
1086
|
useState(0);
|
|
1087
|
+
// Exponential backoff for the auto-retry loop below: 1.5s → 3s → 6s →
|
|
1088
|
+
// capped at ~15s, so a genuinely-down dev server doesn't get hammered with
|
|
1089
|
+
// a fixed 1.5s-forever retry loop. Resets to 0 on a successful fetch or a
|
|
1090
|
+
// manual retry click (see handleManualSnapshotRetry) so the next failure
|
|
1091
|
+
// starts the backoff over rather than continuing to climb.
|
|
1092
|
+
const snapshotRetryAttemptRef = useRef(0);
|
|
841
1093
|
const onExternalContentSnapshotRef = useRef(onExternalContentSnapshot);
|
|
842
1094
|
const isEmbeddedFrame = Boolean(embeddedFrame);
|
|
843
1095
|
// Resolve the URL to render in the iframe:
|
|
@@ -889,6 +1141,7 @@ export function DesignCanvas({
|
|
|
889
1141
|
useEffect(() => {
|
|
890
1142
|
const previewUrl = rawExternalPreviewUrl;
|
|
891
1143
|
if (sourceType !== "localhost" || !bridgeUrl || !previewUrl) {
|
|
1144
|
+
snapshotRetryAttemptRef.current = 0;
|
|
892
1145
|
setFetchedExternalSnapshot((current) =>
|
|
893
1146
|
current?.url === previewUrl ? current : null,
|
|
894
1147
|
);
|
|
@@ -896,6 +1149,7 @@ export function DesignCanvas({
|
|
|
896
1149
|
return;
|
|
897
1150
|
}
|
|
898
1151
|
if (externalSnapshotHtml) {
|
|
1152
|
+
snapshotRetryAttemptRef.current = 0;
|
|
899
1153
|
setExternalSnapshotState(null);
|
|
900
1154
|
return;
|
|
901
1155
|
}
|
|
@@ -905,9 +1159,11 @@ export function DesignCanvas({
|
|
|
905
1159
|
const endpoint = snapshotEndpointUrl(bridgeUrl, previewUrl);
|
|
906
1160
|
const scheduleRetry = () => {
|
|
907
1161
|
if (!requiresEditableExternalSnapshot || cancelled) return;
|
|
1162
|
+
const delay = getSnapshotRetryDelayMs(snapshotRetryAttemptRef.current);
|
|
1163
|
+
snapshotRetryAttemptRef.current += 1;
|
|
908
1164
|
retryTimer = window.setTimeout(() => {
|
|
909
1165
|
setExternalSnapshotRetryNonce((nonce) => nonce + 1);
|
|
910
|
-
},
|
|
1166
|
+
}, delay);
|
|
911
1167
|
};
|
|
912
1168
|
setExternalSnapshotState({ url: previewUrl, status: "loading" });
|
|
913
1169
|
void (async () => {
|
|
@@ -948,6 +1204,7 @@ export function DesignCanvas({
|
|
|
948
1204
|
},
|
|
949
1205
|
}).content;
|
|
950
1206
|
if (cancelled) return;
|
|
1207
|
+
snapshotRetryAttemptRef.current = 0;
|
|
951
1208
|
setFetchedExternalSnapshot({ url: previewUrl, html: stamped });
|
|
952
1209
|
setExternalSnapshotState(null);
|
|
953
1210
|
onExternalContentSnapshotRef.current?.({
|
|
@@ -982,6 +1239,15 @@ export function DesignCanvas({
|
|
|
982
1239
|
sourceType,
|
|
983
1240
|
]);
|
|
984
1241
|
|
|
1242
|
+
// Manual retry (offline-state "Retry" button): reset the backoff so the
|
|
1243
|
+
// user-initiated attempt fires immediately rather than waiting out
|
|
1244
|
+
// whatever delay the auto-retry loop had climbed to, then trigger the
|
|
1245
|
+
// fetch effect above via the nonce dependency.
|
|
1246
|
+
const handleManualSnapshotRetry = useCallback(() => {
|
|
1247
|
+
snapshotRetryAttemptRef.current = 0;
|
|
1248
|
+
setExternalSnapshotRetryNonce((nonce) => nonce + 1);
|
|
1249
|
+
}, []);
|
|
1250
|
+
|
|
985
1251
|
const queuedAnnotationPins = useMemo(
|
|
986
1252
|
() =>
|
|
987
1253
|
annotationPins.filter(
|
|
@@ -1016,12 +1282,68 @@ export function DesignCanvas({
|
|
|
1016
1282
|
containerRef: scrollContainerRef,
|
|
1017
1283
|
zoom,
|
|
1018
1284
|
setZoom: onZoomChange ?? (() => {}),
|
|
1019
|
-
|
|
1020
|
-
|
|
1285
|
+
// Match the overview's Figma-parity zoom range (2%–25600%) rather than a
|
|
1286
|
+
// narrower single-screen-only clamp. Both the "none" (fills-canvas) and
|
|
1287
|
+
// framed (desktop/tablet/mobile DeviceFrame) render paths share this same
|
|
1288
|
+
// `zoom` prop/state and hook call today — there's no separate framed-mode
|
|
1289
|
+
// clamp to preserve. DeviceFrame chrome (title bars, home indicator) and
|
|
1290
|
+
// the iframe both scale proportionally via the outer `transform: scale()`
|
|
1291
|
+
// wrapper, so extreme zoom just renders very small/very large, it doesn't
|
|
1292
|
+
// break layout or clip content (fixed-px chrome scales with everything
|
|
1293
|
+
// else). Verified 1280px-wide desktop frame at 256x (25600%) renders at
|
|
1294
|
+
// ~327,680px, comfortably under browser max-element-size limits.
|
|
1295
|
+
min: DEFAULT_CANVAS_MIN_ZOOM,
|
|
1296
|
+
max: DEFAULT_CANVAS_MAX_ZOOM,
|
|
1021
1297
|
zoomToCursor: deviceFrame === "none",
|
|
1022
1298
|
enabled: Boolean(onZoomChange),
|
|
1023
1299
|
});
|
|
1024
1300
|
|
|
1301
|
+
// T-zoom-anchor: the "none"-mode zoom layer now uses `transform-origin: top
|
|
1302
|
+
// left` (see the render below) so Cmd/Ctrl+wheel and pinch zoom correctly
|
|
1303
|
+
// keep the point under the cursor stationary — usePinchZoom's own
|
|
1304
|
+
// zoomToCursor math and the pinch-zoom-wheel handler above both assume that
|
|
1305
|
+
// invariant. That means the layout is no longer flex-centered, so on first
|
|
1306
|
+
// mount (and whenever the content is re-keyed, e.g. a screen switch) we
|
|
1307
|
+
// imperatively center the scroll position once here — mirroring what the
|
|
1308
|
+
// flex-centering used to give us "for free" at rest — without touching
|
|
1309
|
+
// scroll position during an actual zoom gesture (those already apply their
|
|
1310
|
+
// own precise scroll deltas above).
|
|
1311
|
+
//
|
|
1312
|
+
// BP-DEEP item 2: also re-center when `previewWidthPx` changes (a
|
|
1313
|
+
// breakpoint chip is clicked). Without this, switching to a narrower
|
|
1314
|
+
// breakpoint shrinks the wrapper's rendered width in place — the scroll
|
|
1315
|
+
// container's existing scrollLeft (from whatever it was showing at the
|
|
1316
|
+
// WIDER content's width) is left untouched, so the narrower frame renders
|
|
1317
|
+
// pinned to the left edge of the visible area instead of centered. This is
|
|
1318
|
+
// the single-screen equivalent of the device-preview control's centered
|
|
1319
|
+
// `deviceFrame !== "none"` branch below, without giving up the top-left
|
|
1320
|
+
// transform-origin the zoom-anchor math above depends on.
|
|
1321
|
+
useEffect(() => {
|
|
1322
|
+
if (deviceFrame !== "none") return;
|
|
1323
|
+
const scroll = scrollContainerRef.current;
|
|
1324
|
+
const layer = zoomLayerRef.current;
|
|
1325
|
+
if (!scroll || !layer) return;
|
|
1326
|
+
// Read the SCROLL CONTAINER's own scrollWidth/scrollHeight, not the zoom
|
|
1327
|
+
// layer's: `transform: scale()` never changes an element's own layout
|
|
1328
|
+
// size (scrollWidth/scrollHeight of the transformed element itself stay
|
|
1329
|
+
// at its pre-transform size), but it DOES change how much scrollable
|
|
1330
|
+
// overflow it contributes to its ancestor — which is exactly the
|
|
1331
|
+
// post-transform visual bounds we need here.
|
|
1332
|
+
scroll.scrollLeft = Math.max(
|
|
1333
|
+
0,
|
|
1334
|
+
(scroll.scrollWidth - scroll.clientWidth) / 2,
|
|
1335
|
+
);
|
|
1336
|
+
scroll.scrollTop = Math.max(
|
|
1337
|
+
0,
|
|
1338
|
+
(scroll.scrollHeight - scroll.clientHeight) / 2,
|
|
1339
|
+
);
|
|
1340
|
+
// Only re-center on a genuine content swap (screen switch / remount) or a
|
|
1341
|
+
// breakpoint width change, not on every zoom change — an active zoom
|
|
1342
|
+
// gesture manages its own scroll delta and would otherwise be fought by
|
|
1343
|
+
// this effect on every render.
|
|
1344
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
1345
|
+
}, [deviceFrame, contentKey, previewWidthPx]);
|
|
1346
|
+
|
|
1025
1347
|
// Build the srcdoc. The tweak bridge ALWAYS goes in so the panel works
|
|
1026
1348
|
// outside Edit mode. The editor chrome bridge is omitted for Interact mode
|
|
1027
1349
|
// so preview/app users can interact with the app normally.
|
|
@@ -1044,8 +1366,14 @@ export function DesignCanvas({
|
|
|
1044
1366
|
readOnly ? "true" : "false",
|
|
1045
1367
|
)
|
|
1046
1368
|
.replace("__TEXT_EDITING_ENABLED__", editMode ? "true" : "false")
|
|
1047
|
-
.replace(
|
|
1048
|
-
|
|
1369
|
+
.replace(
|
|
1370
|
+
"__EDITOR_CHROME_SCALE_X__",
|
|
1371
|
+
String(effectiveEditorChromeScaleX),
|
|
1372
|
+
)
|
|
1373
|
+
.replace(
|
|
1374
|
+
"__EDITOR_CHROME_SCALE_Y__",
|
|
1375
|
+
String(effectiveEditorChromeScaleY),
|
|
1376
|
+
)
|
|
1049
1377
|
.replace(
|
|
1050
1378
|
"__DESIGN_CANVAS_SCREEN_ID__",
|
|
1051
1379
|
JSON.stringify(screenId ?? contentKey ?? ""),
|
|
@@ -1186,6 +1514,15 @@ export function DesignCanvas({
|
|
|
1186
1514
|
}
|
|
1187
1515
|
return;
|
|
1188
1516
|
}
|
|
1517
|
+
if (e.data.type === "gradient-edit-change") {
|
|
1518
|
+
const nodeId = String(e.data.nodeId || "");
|
|
1519
|
+
const cssValue = String(e.data.cssValue || "");
|
|
1520
|
+
const phase = e.data.phase === "commit" ? "commit" : "preview";
|
|
1521
|
+
if (nodeId && cssValue) {
|
|
1522
|
+
onGradientEditChange?.(nodeId, cssValue, phase);
|
|
1523
|
+
}
|
|
1524
|
+
return;
|
|
1525
|
+
}
|
|
1189
1526
|
if (e.data.type === "text-content-change") {
|
|
1190
1527
|
const selector = String(e.data.selector || "");
|
|
1191
1528
|
const value = String(e.data.value ?? "");
|
|
@@ -1421,11 +1758,15 @@ export function DesignCanvas({
|
|
|
1421
1758
|
// a synthetic WheelEvent to trigger the hook's listener — untrusted
|
|
1422
1759
|
// events are inconsistent across browsers — so just compute the
|
|
1423
1760
|
// next zoom directly using the same exponential factor + cursor-anchor
|
|
1424
|
-
// math. Clamp range matches the usePinchZoom call above
|
|
1761
|
+
// math. Clamp range matches the usePinchZoom call above
|
|
1762
|
+
// (DEFAULT_CANVAS_MIN_ZOOM–DEFAULT_CANVAS_MAX_ZOOM).
|
|
1425
1763
|
const currentZoom = zoomRef.current;
|
|
1426
1764
|
const clampedDelta = Math.max(-50, Math.min(50, rawDeltaY));
|
|
1427
1765
|
const factor = Math.exp(-clampedDelta * 0.01);
|
|
1428
|
-
const nextZoom = Math.max(
|
|
1766
|
+
const nextZoom = Math.max(
|
|
1767
|
+
DEFAULT_CANVAS_MIN_ZOOM,
|
|
1768
|
+
Math.min(DEFAULT_CANVAS_MAX_ZOOM, currentZoom * factor),
|
|
1769
|
+
);
|
|
1429
1770
|
if (!Number.isFinite(nextZoom) || nextZoom === currentZoom) return;
|
|
1430
1771
|
if (deviceFrame === "none") {
|
|
1431
1772
|
const rawClientX = Number(e.data.clientX);
|
|
@@ -1436,18 +1777,23 @@ export function DesignCanvas({
|
|
|
1436
1777
|
}
|
|
1437
1778
|
// The iframe lives inside a `transform: scale(zoom/100)` wrapper, so
|
|
1438
1779
|
// its visual scale relative to viewport is currentZoom / 100. Convert
|
|
1439
|
-
// the iframe-document point under the cursor → viewport point
|
|
1440
|
-
//
|
|
1780
|
+
// the iframe-document point under the cursor → viewport point, then
|
|
1781
|
+
// preserve cursor anchoring while zooming via
|
|
1782
|
+
// getZoomToCursorScrollDelta (requires the zoom layer's
|
|
1783
|
+
// transform-origin to be "top left" — see that function's doc
|
|
1784
|
+
// comment and the "none"-mode zoom layer render comment).
|
|
1441
1785
|
const iframeRect = iframe.getBoundingClientRect();
|
|
1442
1786
|
const scrollRect = scroll.getBoundingClientRect();
|
|
1443
1787
|
const scale = currentZoom / 100;
|
|
1444
1788
|
const viewportX = iframeRect.left + rawClientX * scale;
|
|
1445
1789
|
const viewportY = iframeRect.top + rawClientY * scale;
|
|
1446
|
-
const cx = viewportX - scrollRect.left + scroll.scrollLeft;
|
|
1447
|
-
const cy = viewportY - scrollRect.top + scroll.scrollTop;
|
|
1448
1790
|
const ratio = nextZoom / currentZoom;
|
|
1449
|
-
const dx
|
|
1450
|
-
|
|
1791
|
+
const { dx, dy } = getZoomToCursorScrollDelta(
|
|
1792
|
+
{ x: viewportX, y: viewportY },
|
|
1793
|
+
scrollRect,
|
|
1794
|
+
scroll,
|
|
1795
|
+
ratio,
|
|
1796
|
+
);
|
|
1451
1797
|
onZoomChange(nextZoom);
|
|
1452
1798
|
requestAnimationFrame(() => {
|
|
1453
1799
|
scroll.scrollLeft += dx;
|
|
@@ -1466,6 +1812,7 @@ export function DesignCanvas({
|
|
|
1466
1812
|
onElementHover,
|
|
1467
1813
|
onClearSelection,
|
|
1468
1814
|
onVisualStyleChange,
|
|
1815
|
+
onGradientEditChange,
|
|
1469
1816
|
onTextContentChange,
|
|
1470
1817
|
onTextEditingStateChange,
|
|
1471
1818
|
onElementDblClickText,
|
|
@@ -1534,6 +1881,7 @@ export function DesignCanvas({
|
|
|
1534
1881
|
type: "motion-load-tracks",
|
|
1535
1882
|
tracks: motionTracks,
|
|
1536
1883
|
defaultEase: motionDefaultEase,
|
|
1884
|
+
durationMs: motionDurationMs,
|
|
1537
1885
|
},
|
|
1538
1886
|
"*",
|
|
1539
1887
|
);
|
|
@@ -1565,6 +1913,7 @@ export function DesignCanvas({
|
|
|
1565
1913
|
lockedSelectors,
|
|
1566
1914
|
motionTracks,
|
|
1567
1915
|
motionDefaultEase,
|
|
1916
|
+
motionDurationMs,
|
|
1568
1917
|
scaleMode,
|
|
1569
1918
|
selectedSelector,
|
|
1570
1919
|
selectedSelectorCandidates,
|
|
@@ -1627,11 +1976,12 @@ export function DesignCanvas({
|
|
|
1627
1976
|
type: "motion-load-tracks",
|
|
1628
1977
|
tracks: motionTracks,
|
|
1629
1978
|
defaultEase: motionDefaultEase,
|
|
1979
|
+
durationMs: motionDurationMs,
|
|
1630
1980
|
},
|
|
1631
1981
|
"*",
|
|
1632
1982
|
);
|
|
1633
1983
|
}
|
|
1634
|
-
}, [motionTracks, motionDefaultEase]);
|
|
1984
|
+
}, [motionTracks, motionDefaultEase, motionDurationMs]);
|
|
1635
1985
|
|
|
1636
1986
|
// Sync shader-fill preview to the iframe whenever the prop changes.
|
|
1637
1987
|
// When cleared (null / undefined) send a clear message so the bridge
|
|
@@ -1655,6 +2005,47 @@ export function DesignCanvas({
|
|
|
1655
2005
|
}
|
|
1656
2006
|
}, [shaderFillPreview]);
|
|
1657
2007
|
|
|
2008
|
+
// Item 8 — sync the in-screen gradient-edit target to the iframe whenever
|
|
2009
|
+
// the prop changes. Mirrors shaderFillPreview's pattern exactly: cleared
|
|
2010
|
+
// (null/undefined) posts gradient-edit-clear, set posts gradient-edit-target
|
|
2011
|
+
// so the editor-chrome bridge renders drag handles on that node.
|
|
2012
|
+
useEffect(() => {
|
|
2013
|
+
const win = iframeRef.current?.contentWindow;
|
|
2014
|
+
if (!win) return;
|
|
2015
|
+
if (!gradientEditTarget) {
|
|
2016
|
+
win.postMessage({ type: "gradient-edit-clear" }, "*");
|
|
2017
|
+
} else {
|
|
2018
|
+
win.postMessage(
|
|
2019
|
+
{
|
|
2020
|
+
type: "gradient-edit-target",
|
|
2021
|
+
nodeId: gradientEditTarget.nodeId,
|
|
2022
|
+
cssValue: gradientEditTarget.cssValue,
|
|
2023
|
+
},
|
|
2024
|
+
"*",
|
|
2025
|
+
);
|
|
2026
|
+
}
|
|
2027
|
+
}, [gradientEditTarget]);
|
|
2028
|
+
|
|
2029
|
+
// Interaction-state forced preview (phase 2) — sync statePreviewTarget to
|
|
2030
|
+
// the iframe whenever the prop changes, exactly mirroring gradientEditTarget's
|
|
2031
|
+
// sync effect above: cleared (null/undefined) posts a clearing
|
|
2032
|
+
// state-preview message, set posts the node id + state so the bridge sets
|
|
2033
|
+
// `data-an-state-preview` on the matching element (see the
|
|
2034
|
+
// `statePreviewTarget` prop doc comment and shared/interaction-states.ts's
|
|
2035
|
+
// "Forced-preview mechanism" doc comment for the full contract).
|
|
2036
|
+
useEffect(() => {
|
|
2037
|
+
const win = iframeRef.current?.contentWindow;
|
|
2038
|
+
if (!win) return;
|
|
2039
|
+
win.postMessage(
|
|
2040
|
+
{
|
|
2041
|
+
type: "state-preview",
|
|
2042
|
+
nodeId: statePreviewTarget?.nodeId ?? null,
|
|
2043
|
+
state: statePreviewTarget?.state ?? null,
|
|
2044
|
+
},
|
|
2045
|
+
"*",
|
|
2046
|
+
);
|
|
2047
|
+
}, [statePreviewTarget]);
|
|
2048
|
+
|
|
1658
2049
|
// Push the constant-size chrome scale into the iframe LIVE (CSS vars only) when
|
|
1659
2050
|
// overview zoom settles. This is intentionally separate from the srcdoc build so
|
|
1660
2051
|
// a scale change never rebuilds srcdoc / reloads the iframe (which flashes the
|
|
@@ -1665,10 +2056,14 @@ export function DesignCanvas({
|
|
|
1665
2056
|
useEffect(() => {
|
|
1666
2057
|
postOneShotBridgeMessage({
|
|
1667
2058
|
type: "set-editor-chrome-scale",
|
|
1668
|
-
scaleX:
|
|
1669
|
-
scaleY:
|
|
2059
|
+
scaleX: effectiveEditorChromeScaleX,
|
|
2060
|
+
scaleY: effectiveEditorChromeScaleY,
|
|
1670
2061
|
});
|
|
1671
|
-
}, [
|
|
2062
|
+
}, [
|
|
2063
|
+
effectiveEditorChromeScaleX,
|
|
2064
|
+
effectiveEditorChromeScaleY,
|
|
2065
|
+
postOneShotBridgeMessage,
|
|
2066
|
+
]);
|
|
1672
2067
|
|
|
1673
2068
|
// Sync readOnly to the bridge IN-PLACE via postMessage so switching the active
|
|
1674
2069
|
// surface (board ↔ screen) does not rebuild srcdoc / reload the iframe.
|
|
@@ -2013,6 +2408,144 @@ export function DesignCanvas({
|
|
|
2013
2408
|
surface.focus({ preventScroll: true });
|
|
2014
2409
|
}, []);
|
|
2015
2410
|
|
|
2411
|
+
// Single-screen pan (Figma parity §3): middle-mouse-button drag always
|
|
2412
|
+
// pans (mirrors MultiScreenCanvas's unconditional `e.button === 1` branch
|
|
2413
|
+
// in its own beginPan); a plain left-button drag pans too when the hand
|
|
2414
|
+
// tool is armed (`handToolActive`) or the spacebar is held
|
|
2415
|
+
// (`spacePanActive` — see the prop doc comment for why DesignCanvas
|
|
2416
|
+
// doesn't listen for the spacebar itself). Movement is 1:1 and
|
|
2417
|
+
// un-animated (direct scrollLeft/scrollTop deltas each mousemove, no
|
|
2418
|
+
// inertia/momentum), matching MultiScreenCanvas's own beginPan feel —
|
|
2419
|
+
// plain `mousemove`/`mouseup` window listeners for the drag's lifetime,
|
|
2420
|
+
// same pattern as its `installDragListeners(handleMouseMove, handlePanEnd)`.
|
|
2421
|
+
//
|
|
2422
|
+
// These handlers live on the scroll container itself, so they fire for
|
|
2423
|
+
// drags that start over the empty canvas background or the creation
|
|
2424
|
+
// overlay (both real DOM nodes in this document). A drag that starts
|
|
2425
|
+
// *inside* the iframe's own document does not reach these handlers —
|
|
2426
|
+
// mousedown does not cross a same-origin/cross-document boundary any more
|
|
2427
|
+
// than wheel events do (see the pinch-zoom-wheel bridge message above for
|
|
2428
|
+
// the equivalent problem with wheel) — so panning from inside interactive
|
|
2429
|
+
// iframe content is a follow-up that would need its own bridge message,
|
|
2430
|
+
// not a gap introduced by this change.
|
|
2431
|
+
const [isPanningState, setIsPanningState] = useState(false);
|
|
2432
|
+
|
|
2433
|
+
const handleScrollSurfaceMouseDown = useCallback(
|
|
2434
|
+
(e: React.MouseEvent<HTMLDivElement>) => {
|
|
2435
|
+
const isMiddleButton = e.button === 1;
|
|
2436
|
+
const isLeftPanGesture =
|
|
2437
|
+
e.button === 0 && (handToolActive || spacePanActive);
|
|
2438
|
+
if (!isMiddleButton && !isLeftPanGesture) return;
|
|
2439
|
+
e.preventDefault();
|
|
2440
|
+
let lastClientX = e.clientX;
|
|
2441
|
+
let lastClientY = e.clientY;
|
|
2442
|
+
setIsPanningState(true);
|
|
2443
|
+
|
|
2444
|
+
const handleMouseMove = (ev: MouseEvent) => {
|
|
2445
|
+
const scroll = scrollContainerRef.current;
|
|
2446
|
+
if (!scroll) return;
|
|
2447
|
+
const dx = ev.clientX - lastClientX;
|
|
2448
|
+
const dy = ev.clientY - lastClientY;
|
|
2449
|
+
lastClientX = ev.clientX;
|
|
2450
|
+
lastClientY = ev.clientY;
|
|
2451
|
+
// 1:1 drag-scroll, no inertia: dragging right/down moves the
|
|
2452
|
+
// viewport left/up over the content, i.e. subtract the pointer delta
|
|
2453
|
+
// from scroll position.
|
|
2454
|
+
scroll.scrollLeft -= dx;
|
|
2455
|
+
scroll.scrollTop -= dy;
|
|
2456
|
+
};
|
|
2457
|
+
const handleMouseUp = () => {
|
|
2458
|
+
setIsPanningState(false);
|
|
2459
|
+
window.removeEventListener("mousemove", handleMouseMove);
|
|
2460
|
+
window.removeEventListener("mouseup", handleMouseUp);
|
|
2461
|
+
};
|
|
2462
|
+
window.addEventListener("mousemove", handleMouseMove);
|
|
2463
|
+
window.addEventListener("mouseup", handleMouseUp);
|
|
2464
|
+
},
|
|
2465
|
+
[handToolActive, spacePanActive],
|
|
2466
|
+
);
|
|
2467
|
+
|
|
2468
|
+
const panCursor = isPanningState
|
|
2469
|
+
? "grabbing"
|
|
2470
|
+
: handToolActive || spacePanActive
|
|
2471
|
+
? "grab"
|
|
2472
|
+
: null;
|
|
2473
|
+
|
|
2474
|
+
// OS file drag-and-drop (Figma parity §1): the sandboxed iframe sits on top
|
|
2475
|
+
// of the wrapper and is a normal DOM element to the parent document's drag
|
|
2476
|
+
// events (dragenter/dragover/drop still bubble through it to the wrapper —
|
|
2477
|
+
// unlike mouse clicks, an iframe does not need its own listeners to forward
|
|
2478
|
+
// these), but relying on that alone is fragile across browsers/sandbox
|
|
2479
|
+
// combinations. Track a native-file-drag-in-progress flag via a
|
|
2480
|
+
// dragenter/dragleave depth counter (nested elements each fire enter/leave)
|
|
2481
|
+
// so a transparent capture overlay — mirroring the SingleScreenCreationOverlay
|
|
2482
|
+
// mount pattern above — mounts ONLY while an OS file drag is actually over
|
|
2483
|
+
// this wrapper, guaranteeing the drop lands on our own handler instead of
|
|
2484
|
+
// being swallowed by the iframe.
|
|
2485
|
+
const [nativeFileDragActive, setNativeFileDragActive] = useState(false);
|
|
2486
|
+
const nativeFileDragDepthRef = useRef(0);
|
|
2487
|
+
|
|
2488
|
+
const resetNativeFileDragState = useCallback(() => {
|
|
2489
|
+
nativeFileDragDepthRef.current = 0;
|
|
2490
|
+
setNativeFileDragActive(false);
|
|
2491
|
+
}, []);
|
|
2492
|
+
|
|
2493
|
+
const handleWrapperDragEnter = useCallback(
|
|
2494
|
+
(e: React.DragEvent<HTMLDivElement>) => {
|
|
2495
|
+
if (!isOsFileDragEvent(e)) return;
|
|
2496
|
+
e.preventDefault();
|
|
2497
|
+
nativeFileDragDepthRef.current += 1;
|
|
2498
|
+
setNativeFileDragActive(true);
|
|
2499
|
+
},
|
|
2500
|
+
[],
|
|
2501
|
+
);
|
|
2502
|
+
|
|
2503
|
+
const handleWrapperDragOver = useCallback(
|
|
2504
|
+
(e: React.DragEvent<HTMLDivElement>) => {
|
|
2505
|
+
if (!isOsFileDragEvent(e)) return;
|
|
2506
|
+
e.preventDefault();
|
|
2507
|
+
e.dataTransfer.dropEffect = "copy";
|
|
2508
|
+
},
|
|
2509
|
+
[],
|
|
2510
|
+
);
|
|
2511
|
+
|
|
2512
|
+
const handleWrapperDragLeave = useCallback(
|
|
2513
|
+
(e: React.DragEvent<HTMLDivElement>) => {
|
|
2514
|
+
if (!isOsFileDragEvent(e)) return;
|
|
2515
|
+
nativeFileDragDepthRef.current = Math.max(
|
|
2516
|
+
0,
|
|
2517
|
+
nativeFileDragDepthRef.current - 1,
|
|
2518
|
+
);
|
|
2519
|
+
if (nativeFileDragDepthRef.current === 0) {
|
|
2520
|
+
setNativeFileDragActive(false);
|
|
2521
|
+
}
|
|
2522
|
+
},
|
|
2523
|
+
[],
|
|
2524
|
+
);
|
|
2525
|
+
|
|
2526
|
+
const handleWrapperDrop = useCallback(
|
|
2527
|
+
(e: React.DragEvent<HTMLDivElement>) => {
|
|
2528
|
+
if (!isOsFileDragEvent(e)) return;
|
|
2529
|
+
e.preventDefault();
|
|
2530
|
+
const files = Array.from(e.dataTransfer.files ?? []);
|
|
2531
|
+
resetNativeFileDragState();
|
|
2532
|
+
if (files.length === 0 || !onDropFiles) return;
|
|
2533
|
+
const iframe = iframeRef.current;
|
|
2534
|
+
const rect = iframe?.getBoundingClientRect();
|
|
2535
|
+
const screenContentPoint =
|
|
2536
|
+
iframe && rect
|
|
2537
|
+
? getScreenContentPointFromClient(e.clientX, e.clientY, rect, {
|
|
2538
|
+
width: iframe.clientWidth,
|
|
2539
|
+
height: iframe.clientHeight,
|
|
2540
|
+
})
|
|
2541
|
+
: { x: e.clientX, y: e.clientY };
|
|
2542
|
+
onDropFiles(files, { screenContentPoint, screenId });
|
|
2543
|
+
},
|
|
2544
|
+
[onDropFiles, resetNativeFileDragState, screenId],
|
|
2545
|
+
);
|
|
2546
|
+
|
|
2547
|
+
useEffect(() => resetNativeFileDragState, [resetNativeFileDragState]);
|
|
2548
|
+
|
|
2016
2549
|
// Wrap the iframe in a positioned container so DrawOverlay /
|
|
2017
2550
|
// CanvasCommentPins can absolutely-position themselves on top of the
|
|
2018
2551
|
// iframe. The pin component anchors to `.design-canvas-iframe-wrapper`
|
|
@@ -2023,6 +2556,10 @@ export function DesignCanvas({
|
|
|
2023
2556
|
const iframeElement = (
|
|
2024
2557
|
<div
|
|
2025
2558
|
className="design-canvas-iframe-wrapper relative inline-block ring-1 ring-border/60 shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_8px_24px_-12px_rgba(0,0,0,0.45)]"
|
|
2559
|
+
onDragEnter={handleWrapperDragEnter}
|
|
2560
|
+
onDragOver={handleWrapperDragOver}
|
|
2561
|
+
onDragLeave={handleWrapperDragLeave}
|
|
2562
|
+
onDrop={handleWrapperDrop}
|
|
2026
2563
|
style={{
|
|
2027
2564
|
width: embeddedFrame
|
|
2028
2565
|
? embeddedFrameFluid
|
|
@@ -2036,6 +2573,26 @@ export function DesignCanvas({
|
|
|
2036
2573
|
: deviceFrame === "none"
|
|
2037
2574
|
? "100%"
|
|
2038
2575
|
: (iframeHeight ?? undefined),
|
|
2576
|
+
// BP-DEEP item 2: when a breakpoint chip constrains the viewport
|
|
2577
|
+
// (previewWidthPx) the wrapper is NARROWER than the canvas, so there
|
|
2578
|
+
// is no horizontal overflow for the scroll-centering effect above to
|
|
2579
|
+
// act on — without a layout-level center the frame pins to the
|
|
2580
|
+
// canvas's left edge, which reads as broken next to the
|
|
2581
|
+
// device-preview control's flex-centered framed modes. Block + auto
|
|
2582
|
+
// margins center it in the zoom layer's LAYOUT space, which is safe
|
|
2583
|
+
// for the T-zoom-anchor invariant: the margin inset is constant in
|
|
2584
|
+
// layer-local coordinates (transform scale never changes layout), so
|
|
2585
|
+
// the cursor-anchored zoom math — which only assumes the zoom
|
|
2586
|
+
// layer's own top-left corner stays a fixed point in scroll-content
|
|
2587
|
+
// space — is untouched. Base editing (previewWidthPx unset) keeps
|
|
2588
|
+
// the original inline-block full-width layout unchanged.
|
|
2589
|
+
...(previewWidthPx != null && !embeddedFrame
|
|
2590
|
+
? {
|
|
2591
|
+
display: "block",
|
|
2592
|
+
marginLeft: "auto",
|
|
2593
|
+
marginRight: "auto",
|
|
2594
|
+
}
|
|
2595
|
+
: null),
|
|
2039
2596
|
}}
|
|
2040
2597
|
>
|
|
2041
2598
|
<iframe
|
|
@@ -2098,17 +2655,72 @@ export function DesignCanvas({
|
|
|
2098
2655
|
onCreatePrimitive={onCreatePrimitive}
|
|
2099
2656
|
/>
|
|
2100
2657
|
) : null}
|
|
2101
|
-
{
|
|
2102
|
-
|
|
2103
|
-
|
|
2658
|
+
{/* OS file drag-over capture overlay — sits over the iframe, NOT
|
|
2659
|
+
inside it, mirroring the SingleScreenCreationOverlay mount pattern
|
|
2660
|
+
just above. Only mounts while a native OS file drag is actually in
|
|
2661
|
+
progress over this wrapper (see handleWrapperDragEnter/Leave), so it
|
|
2662
|
+
never changes existing pointer/click behavior otherwise. Skipped
|
|
2663
|
+
while a creation tool is active — the two capture surfaces would
|
|
2664
|
+
otherwise compete for the same pointer gestures, and an in-app
|
|
2665
|
+
creation-tool drag is never simultaneously an OS file drag. */}
|
|
2666
|
+
{nativeFileDragActive && !activeCreationTool ? (
|
|
2667
|
+
<div
|
|
2668
|
+
data-design-canvas-file-drop-overlay
|
|
2669
|
+
className="pointer-events-none absolute inset-0 z-30 flex items-center justify-center rounded-[inherit] border-2 border-dashed border-[var(--design-editor-accent-color)] bg-[var(--design-editor-accent-color)]/5"
|
|
2670
|
+
>
|
|
2671
|
+
<div className="rounded-md border bg-background/95 px-3 py-2 text-xs font-medium text-foreground shadow-sm">
|
|
2104
2672
|
{
|
|
2105
|
-
|
|
2106
|
-
? "Waiting for localhost bridge snapshot..." /* i18n-ignore local dev bridge status */
|
|
2107
|
-
: "Preparing editable preview..." /* i18n-ignore local dev snapshot status */
|
|
2673
|
+
"Drop to add to this screen" /* i18n-ignore transient OS-drag overlay, mirrors other short drop-hint literals in this file */
|
|
2108
2674
|
}
|
|
2109
2675
|
</div>
|
|
2110
2676
|
</div>
|
|
2111
2677
|
) : null}
|
|
2678
|
+
{waitingForEditableExternalSnapshot ? (
|
|
2679
|
+
<div className="pointer-events-none absolute inset-0 z-10 flex items-center justify-center bg-background/85 px-4 text-center text-sm text-muted-foreground">
|
|
2680
|
+
{externalSnapshotState?.status === "error" ? (
|
|
2681
|
+
// A real offline dev server previously looked identical to the
|
|
2682
|
+
// ordinary "still loading" state and retried forever on a fixed
|
|
2683
|
+
// 1.5s timer — see getSnapshotRetryDelayMs for the backoff that
|
|
2684
|
+
// now paces the auto-retry loop. Surface the actual failure here
|
|
2685
|
+
// (network error / non-2xx / bridge error message) plus a manual
|
|
2686
|
+
// retry action so the user isn't staring at an unexplained
|
|
2687
|
+
// eternal spinner.
|
|
2688
|
+
<div className="pointer-events-auto flex max-w-[28rem] flex-col items-center gap-2 rounded-md border bg-card px-4 py-3 shadow-sm">
|
|
2689
|
+
<div className="flex items-center gap-1.5 font-medium text-foreground">
|
|
2690
|
+
<IconPlugConnectedX className="size-4 shrink-0 text-destructive" />
|
|
2691
|
+
{
|
|
2692
|
+
"Local dev server unreachable" /* i18n-ignore local dev bridge offline title */
|
|
2693
|
+
}
|
|
2694
|
+
</div>
|
|
2695
|
+
<div className="text-xs text-muted-foreground">
|
|
2696
|
+
{
|
|
2697
|
+
"Is it still running?" /* i18n-ignore local dev bridge offline subtitle */
|
|
2698
|
+
}
|
|
2699
|
+
</div>
|
|
2700
|
+
{externalSnapshotState.message ? (
|
|
2701
|
+
<div className="w-full truncate rounded bg-muted px-2 py-1 font-mono text-[11px] text-muted-foreground">
|
|
2702
|
+
{externalSnapshotState.message}
|
|
2703
|
+
</div>
|
|
2704
|
+
) : null}
|
|
2705
|
+
<Button
|
|
2706
|
+
type="button"
|
|
2707
|
+
variant="outline"
|
|
2708
|
+
size="sm"
|
|
2709
|
+
onClick={handleManualSnapshotRetry}
|
|
2710
|
+
>
|
|
2711
|
+
<IconRefresh className="size-3.5" />
|
|
2712
|
+
{"Retry" /* i18n-ignore local dev bridge retry button */}
|
|
2713
|
+
</Button>
|
|
2714
|
+
</div>
|
|
2715
|
+
) : (
|
|
2716
|
+
<div className="max-w-[28rem] rounded-md border bg-card px-4 py-3 shadow-sm">
|
|
2717
|
+
{
|
|
2718
|
+
"Preparing editable preview..." /* i18n-ignore local dev snapshot status */
|
|
2719
|
+
}
|
|
2720
|
+
</div>
|
|
2721
|
+
)}
|
|
2722
|
+
</div>
|
|
2723
|
+
) : null}
|
|
2112
2724
|
{/* Draw-to-prompt overlay — sits over the iframe, NOT inside it. */}
|
|
2113
2725
|
<SharedDrawOverlay
|
|
2114
2726
|
visible={!!drawMode}
|
|
@@ -2225,21 +2837,57 @@ export function DesignCanvas({
|
|
|
2225
2837
|
tabIndex={-1}
|
|
2226
2838
|
onPointerEnter={focusScrollSurface}
|
|
2227
2839
|
onMouseEnter={focusScrollSurface}
|
|
2840
|
+
onMouseDown={handleScrollSurfaceMouseDown}
|
|
2228
2841
|
className="relative flex-1 h-full overflow-auto"
|
|
2842
|
+
style={{ cursor: panCursor || undefined }}
|
|
2229
2843
|
>
|
|
2230
2844
|
{/* Canvas area. "none" mode fills the canvas (responsive preview);
|
|
2231
2845
|
framed modes are centered inside the canvas with zoom applied. */}
|
|
2232
2846
|
{deviceFrame === "none" ? (
|
|
2233
|
-
<div
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2847
|
+
<div
|
|
2848
|
+
ref={zoomLayerRef}
|
|
2849
|
+
className="relative h-full w-full"
|
|
2850
|
+
style={{
|
|
2851
|
+
// T-zoom-anchor: transform-origin MUST be top-left here (not
|
|
2852
|
+
// center-center) to match usePinchZoom's documented contract
|
|
2853
|
+
// ("Assumes the scaled content uses transform-origin: top left
|
|
2854
|
+
// ... Disable for layouts with transform-origin: center center")
|
|
2855
|
+
// and the pinch-zoom-wheel bridge-forwarded handler above, both of
|
|
2856
|
+
// which compute the cursor-anchored scroll delta assuming the
|
|
2857
|
+
// scaled box's own top-left corner is a fixed point in
|
|
2858
|
+
// scroll-content space. Centering this box via flexbox instead
|
|
2859
|
+
// (the previous approach) re-centers the *painted* box around the
|
|
2860
|
+
// container's center on every zoom change, which moves that
|
|
2861
|
+
// "fixed" point every time the box's rendered size changes —
|
|
2862
|
+
// exactly the invariant the cursor-anchor math depends on, so
|
|
2863
|
+
// Cmd/Ctrl+wheel or pinch zoom would drift away from the cursor.
|
|
2864
|
+
// Initial centering (and re-centering on a content/screen swap)
|
|
2865
|
+
// is instead handled by imperatively setting scrollLeft/scrollTop
|
|
2866
|
+
// once — see the effect keyed on [deviceFrame, contentKey] above
|
|
2867
|
+
// usePinchZoom — so the layout itself stays simple and
|
|
2868
|
+
// top-left-anchored while still looking centered at rest.
|
|
2869
|
+
//
|
|
2870
|
+
// BP-DEEP v2 item 5 — zoom-out must anchor CENTER: below 100%
|
|
2871
|
+
// the painted layer is SMALLER than the container, so there is
|
|
2872
|
+
// no scrollable overflow and the old transform shrank the canvas
|
|
2873
|
+
// toward the container's top-left corner. The translate() below
|
|
2874
|
+
// (only nonzero when zoom < 100) re-centers the painted layer in
|
|
2875
|
+
// both axes. This cannot break the cursor-anchor math above:
|
|
2876
|
+
// translate percentages resolve against the layer's LAYOUT box
|
|
2877
|
+
// (constant, zoom-independent), and in the sub-100% regime where
|
|
2878
|
+
// the offset is nonzero the container has no overflow — the
|
|
2879
|
+
// anchor math's scroll deltas clamp to 0 regardless — while at
|
|
2880
|
+
// >= 100% the offset is exactly 0 and the original top-left
|
|
2881
|
+
// contract holds verbatim. The offset is also continuous at
|
|
2882
|
+
// 100% (0), so crossing the boundary mid-gesture cannot jump.
|
|
2883
|
+
transform:
|
|
2884
|
+
zoom < 100
|
|
2885
|
+
? `translate(${(100 - zoom) / 2}%, ${(100 - zoom) / 2}%) scale(${zoom / 100})`
|
|
2886
|
+
: `scale(${zoom / 100})`,
|
|
2887
|
+
transformOrigin: "top left",
|
|
2888
|
+
}}
|
|
2889
|
+
>
|
|
2890
|
+
{wrappedContent}
|
|
2243
2891
|
</div>
|
|
2244
2892
|
) : (
|
|
2245
2893
|
<div className="relative flex items-center justify-center min-h-full">
|
|
@@ -2256,20 +2904,25 @@ export function DesignCanvas({
|
|
|
2256
2904
|
|
|
2257
2905
|
{/* Canvas comment pins — anchored to the iframe wrapper. The pins
|
|
2258
2906
|
themselves render via fixed positioning, so we mount them outside
|
|
2259
|
-
the zoom-transformed container to keep coordinates stable.
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
|
|
2907
|
+
the zoom-transformed container to keep coordinates stable.
|
|
2908
|
+
Suppressed entirely when commentPinsHidden (Figma-style Shift+C
|
|
2909
|
+
"hide comments" toggle) is set — existing pins disappear and pin
|
|
2910
|
+
drop-mode has nothing to render into until it's toggled back on. */}
|
|
2911
|
+
{!commentPinsHidden && (
|
|
2912
|
+
<CanvasCommentPins
|
|
2913
|
+
active={!!pinMode}
|
|
2914
|
+
submitMode={drawMode ? "queue" : "direct"}
|
|
2915
|
+
onPinsChange={setAnnotationPins}
|
|
2916
|
+
submitQueuedSignal={pinSubmitSignal}
|
|
2917
|
+
clickPlaneUnderToolbar={!!drawMode}
|
|
2918
|
+
onClose={() => onExitPinMode?.()}
|
|
2919
|
+
canvasSelector=".design-canvas-iframe-wrapper"
|
|
2920
|
+
contextId={commentContextId || designId || "design"}
|
|
2921
|
+
contextLabel={
|
|
2922
|
+
commentContextLabel || designTitle || commentContextId || designId
|
|
2923
|
+
}
|
|
2924
|
+
/>
|
|
2925
|
+
)}
|
|
2273
2926
|
</div>
|
|
2274
2927
|
);
|
|
2275
2928
|
}
|
|
@@ -2293,6 +2946,8 @@ const CREATION_DEFAULT_SIZE: Record<
|
|
|
2293
2946
|
rectangle: { width: 160, height: 100 },
|
|
2294
2947
|
ellipse: { width: 120, height: 120 },
|
|
2295
2948
|
text: { width: 160, height: 32 },
|
|
2949
|
+
// Figma's frame-tool click default is a 100x100 frame.
|
|
2950
|
+
frame: { width: 100, height: 100 },
|
|
2296
2951
|
};
|
|
2297
2952
|
|
|
2298
2953
|
/** Default line/arrow length (screen-content px) for a click (no drag). */
|