@agent-native/core 0.131.5 → 0.131.6
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 +3 -3
- package/corpus/core/CHANGELOG.md +63 -0
- package/corpus/core/docs/content/agent-native-toolkit.mdx +13 -6
- package/corpus/core/docs/content/cloneable-saas.mdx +5 -5
- package/corpus/core/docs/content/creating-templates.mdx +9 -0
- package/corpus/core/docs/content/deployment.mdx +14 -10
- package/corpus/core/docs/content/doctor.mdx +8 -1
- package/corpus/core/docs/content/drop-in-agent.mdx +1 -1
- package/corpus/core/docs/content/extensions.mdx +18 -18
- package/corpus/core/docs/content/faq.mdx +4 -4
- package/corpus/core/docs/content/key-concepts.mdx +30 -21
- package/corpus/core/docs/content/template-brain-developers.mdx +4 -1
- package/corpus/core/docs/content/template-mail-developers.mdx +4 -1
- package/corpus/core/docs/content/what-is-agent-native.mdx +6 -6
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/a2a/client.ts +449 -66
- package/corpus/core/src/a2a/correlation.ts +31 -0
- package/corpus/core/src/a2a/types.ts +4 -0
- package/corpus/core/src/action.ts +3 -0
- package/corpus/core/src/agent/engine/registry.ts +45 -5
- package/corpus/core/src/agent/production-agent.ts +151 -18
- package/corpus/core/src/agent/run-loop-with-resume.ts +190 -3
- package/corpus/core/src/agent/run-manager.ts +117 -41
- package/corpus/core/src/agent/thread-debug-history.ts +86 -0
- package/corpus/core/src/agent/types.ts +3 -1
- package/corpus/core/src/cli/create.ts +11 -1
- package/corpus/core/src/cli/templates-meta.ts +2 -2
- package/corpus/core/src/client/agent-chat-adapter.ts +91 -13
- package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +11 -9
- package/corpus/core/src/client/sse-event-processor.ts +17 -3
- package/corpus/core/src/db/client.ts +57 -17
- package/corpus/core/src/integrations/adapters/slack.ts +8 -3
- package/corpus/core/src/localization/default-messages.ts +44 -0
- package/corpus/core/src/observability/traces.ts +78 -5
- package/corpus/core/src/scripts/call-agent.ts +290 -9
- package/corpus/core/src/scripts/describe-workspace-apps.ts +2 -2
- package/corpus/core/src/secrets/crypto.ts +126 -34
- package/corpus/core/src/secrets/storage.ts +61 -25
- package/corpus/core/src/server/agent-capabilities.ts +1 -1
- package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +111 -7
- package/corpus/core/src/server/agent-chat/context-tools.ts +2 -0
- package/corpus/core/src/server/agent-chat/plugin-options.ts +34 -1
- package/corpus/core/src/server/agent-chat/prompt-resources.ts +1 -1
- package/corpus/core/src/server/agent-chat-plugin.ts +91 -59
- package/corpus/core/src/templates/default/.agents/skills/secrets/SKILL.md +14 -7
- package/corpus/core/src/templates/headless/.agents/skills/secrets/SKILL.md +14 -7
- package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
- package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
- package/corpus/core/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +14 -7
- package/corpus/core/src/vite/client.ts +1 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-ops/SKILL.md +5 -4
- package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +6 -4
- package/corpus/templates/analytics/AGENTS.md +6 -4
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +4 -3
- package/corpus/templates/analytics/changelog/2026-07-30-scheduled-dashboard-emails-complete-every-panel-without-pool.md +6 -0
- package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +28 -1
- package/corpus/templates/analytics/server/jobs/dashboard-report.ts +18 -11
- package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +4 -4
- package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +9 -5
- package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +6 -2
- package/corpus/templates/analytics/server/lib/dashboard-panel-source-resolver.ts +11 -4
- package/corpus/templates/analytics/server/lib/dashboard-report-render.ts +49 -31
- package/corpus/templates/analytics/server/lib/first-party-analytics.ts +16 -8
- package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +9 -3
- package/corpus/templates/analytics/server/lib/production-serverless-runtime.ts +11 -0
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -2
- package/corpus/templates/analytics/server/plugins/analytics-alert-jobs.ts +2 -1
- package/corpus/templates/analytics/server/plugins/dashboard-report-jobs.ts +2 -1
- package/corpus/templates/analytics/server/plugins/uptime-monitor-jobs.ts +1 -12
- package/corpus/templates/brain/.agents/skills/brain/RUNBOOK.md +54 -6
- package/corpus/templates/brain/.agents/skills/brain/SKILL.md +20 -9
- package/corpus/templates/brain/.agents/skills/ingestion-and-connectors/SKILL.md +33 -1
- package/corpus/templates/brain/AGENTS.md +3 -1
- package/corpus/templates/brain/README.md +4 -1
- package/corpus/templates/brain/actions/_schemas.ts +30 -8
- package/corpus/templates/brain/actions/ask-brain.ts +124 -14
- package/corpus/templates/brain/actions/create-source.ts +18 -2
- package/corpus/templates/brain/actions/enqueue-captures-distillation.ts +8 -123
- package/corpus/templates/brain/actions/enqueue-distillation.ts +6 -127
- package/corpus/templates/brain/actions/import-capture.ts +17 -5
- package/corpus/templates/brain/actions/import-transcript.ts +17 -5
- package/corpus/templates/brain/actions/update-source.ts +25 -5
- package/corpus/templates/brain/app/components/layout/Sidebar.tsx +1 -1
- package/corpus/templates/brain/changelog/2026-07-30-blessed-resources-can-feed-cited-company-answers.md +6 -0
- package/corpus/templates/brain/changelog/2026-07-30-the-left-sidebar-no-longer-shows-a-blank-organization-placeh.md +6 -0
- package/corpus/templates/brain/server/lib/brain.ts +49 -19
- package/corpus/templates/brain/server/lib/distillation-queue.ts +147 -0
- package/corpus/templates/brain/server/lib/source-policy.ts +264 -0
- package/corpus/templates/brain/server/plugins/agent-chat.ts +3 -2
- package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +116 -19
- package/corpus/templates/clips/app/components/meetings/google-oauth-identity-notice.tsx +51 -0
- package/corpus/templates/clips/app/i18n/en-US.ts +4 -0
- package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +3 -1
- package/corpus/templates/clips/changelog/2026-07-30-google-calendar-warning.md +6 -0
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +72 -8
- package/corpus/templates/content/changelog/2026-07-30-the-slash-command-hint-now-stays-on-only-the-active-empty-li.md +6 -0
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +506 -11
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +148 -17
- package/corpus/templates/design/app/components/design/canvas-interactions/design-canvas-interactions.ts +357 -0
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +7 -466
- package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +15 -311
- package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +19 -997
- package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +8 -1216
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +31 -38
- package/corpus/templates/design/package.json +0 -1
- package/corpus/templates/dispatch/AGENTS.md +8 -0
- package/corpus/templates/dispatch/DEVELOPING.md +29 -0
- package/corpus/templates/dispatch/actions/view-screen.ts +34 -2
- package/corpus/templates/dispatch/app/i18n-data.ts +457 -0
- package/corpus/templates/dispatch/changelog/2026-07-30-delegated-dispatch-work-continues-reliably-in-the-background.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-07-30-find-failed-runs-across-apps.md +6 -0
- package/corpus/templates/dispatch/netlify.toml +3 -0
- package/corpus/templates/slides/.agents/skills/analytics-data-for-decks/SKILL.md +8 -12
- package/corpus/templates/slides/AGENTS.md +4 -4
- package/corpus/templates/slides/actions/duplicate-deck.ts +19 -4
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +2 -10
- package/corpus/templates/slides/app/components/deck/MermaidRenderer.tsx +12 -1
- package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +30 -13
- package/corpus/templates/slides/app/components/editor/DeckEditorSkeleton.tsx +35 -0
- package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +63 -56
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +21 -76
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +1110 -292
- package/corpus/templates/slides/app/components/editor/SlideOverflowWarning.tsx +53 -0
- package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +235 -18
- package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +4 -1
- package/corpus/templates/slides/app/components/editor/canvas-interactions/index.ts +11 -0
- package/corpus/templates/slides/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +129 -0
- package/corpus/templates/slides/app/components/editor/selection-overlay-measurement.ts +70 -0
- package/corpus/templates/slides/app/components/editor/slide-object-interactions.ts +519 -65
- package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +36 -426
- package/corpus/templates/slides/app/components/visual-editor/DrawOverlay.tsx +19 -458
- package/corpus/templates/slides/app/context/DeckContext.tsx +179 -72
- package/corpus/templates/slides/app/global.css +105 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +8 -0
- package/corpus/templates/slides/app/lib/deck-editor-loading.ts +26 -0
- package/corpus/templates/slides/app/lib/mermaid-blocks.ts +27 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +71 -38
- package/corpus/templates/slides/app/pages/Index.tsx +98 -41
- package/corpus/templates/slides/changelog/2026-07-30-deck-loading-no-longer-flashes-an-unavailable-message.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-duplicating-a-deck-from-the-deck-list-now-opens-the-copy-imm.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-layout-overflow-warning-is-readable-and-dismissible.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-shared-canvas-annotations.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-slide-objects-can-be-moved-as-a-group-copied-and-pasted-with.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-slide-text-editing-and-object-controls-now-match-google-slides.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-style-panel-now-scrolls-with-speaker-notes-open-shows-the-sl.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-top-toolbar-controls-now-use-consistent-sizing-with-undo-and.md +6 -0
- package/corpus/templates/slides/netlify.toml +3 -1
- package/corpus/templates/slides/package.json +0 -1
- package/corpus/templates/slides/server/lib/chat-attachments.ts +18 -0
- package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -0
- package/corpus/templates/slides/vite.config.ts +0 -1
- package/corpus/toolkit/CHANGELOG.md +13 -0
- package/corpus/toolkit/README.md +19 -0
- package/corpus/toolkit/agent-native.eject.json +38 -0
- package/corpus/toolkit/package.json +29 -1
- package/corpus/toolkit/src/canvas-annotations/CanvasCommentPins.tsx +861 -0
- package/corpus/toolkit/src/canvas-annotations/DrawOverlay.tsx +1233 -0
- package/corpus/toolkit/src/canvas-annotations/index.ts +15 -0
- package/corpus/toolkit/src/canvas-annotations/types.ts +14 -0
- package/corpus/toolkit/src/canvas-interactions/canvas-interactions.ts +933 -0
- package/corpus/toolkit/src/canvas-interactions/index.ts +67 -0
- package/corpus/toolkit/src/design-tweaks/scrub-input-utils.ts +311 -0
- package/corpus/toolkit/src/design-tweaks/scrub-input.tsx +491 -0
- package/corpus/toolkit/src/design-tweaks/visual-style-controls.tsx +26 -171
- package/corpus/toolkit/src/index.ts +1 -0
- package/dist/a2a/client.d.ts +23 -0
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +309 -44
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/correlation.d.ts +1 -0
- package/dist/a2a/correlation.d.ts.map +1 -1
- package/dist/a2a/correlation.js +27 -0
- package/dist/a2a/correlation.js.map +1 -1
- package/dist/a2a/types.d.ts +4 -0
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/a2a/types.js.map +1 -1
- package/dist/action.d.ts +3 -0
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js.map +1 -1
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +34 -7
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/production-agent.d.ts +40 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +113 -15
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-loop-with-resume.d.ts +21 -0
- package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
- package/dist/agent/run-loop-with-resume.js +163 -4
- package/dist/agent/run-loop-with-resume.js.map +1 -1
- package/dist/agent/run-manager.d.ts +16 -9
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +93 -42
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/thread-debug-history.d.ts +10 -0
- package/dist/agent/thread-debug-history.d.ts.map +1 -0
- package/dist/agent/thread-debug-history.js +68 -0
- package/dist/agent/thread-debug-history.js.map +1 -0
- package/dist/agent/types.d.ts +3 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +6 -1
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/templates-meta.js +2 -2
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +76 -13
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.js +1 -1
- package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +12 -3
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +48 -17
- package/dist/db/client.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/integrations/adapters/slack.js +7 -3
- package/dist/integrations/adapters/slack.js.map +1 -1
- package/dist/localization/default-messages.d.ts +43 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +43 -0
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/mcp/screen-memory-stdio.d.ts.map +1 -1
- package/dist/notifications/routes.d.ts +6 -6
- package/dist/observability/traces.d.ts +3 -1
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js +73 -4
- package/dist/observability/traces.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +12 -12
- package/dist/provider-api/actions/provider-api.d.ts +13 -13
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +233 -10
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/scripts/describe-workspace-apps.js +2 -2
- package/dist/scripts/describe-workspace-apps.js.map +1 -1
- package/dist/secrets/crypto.d.ts +31 -21
- package/dist/secrets/crypto.d.ts.map +1 -1
- package/dist/secrets/crypto.js +108 -33
- package/dist/secrets/crypto.js.map +1 -1
- package/dist/secrets/storage.d.ts +3 -5
- package/dist/secrets/storage.d.ts.map +1 -1
- package/dist/secrets/storage.js +40 -25
- package/dist/secrets/storage.js.map +1 -1
- package/dist/server/agent-capabilities.js +1 -1
- package/dist/server/agent-capabilities.js.map +1 -1
- package/dist/server/agent-chat/action-filters-a2a.d.ts +17 -3
- package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
- package/dist/server/agent-chat/action-filters-a2a.js +92 -3
- package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
- package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
- package/dist/server/agent-chat/context-tools.js +2 -0
- package/dist/server/agent-chat/context-tools.js.map +1 -1
- package/dist/server/agent-chat/plugin-options.d.ts +23 -0
- package/dist/server/agent-chat/plugin-options.d.ts.map +1 -1
- package/dist/server/agent-chat/plugin-options.js +4 -1
- package/dist/server/agent-chat/plugin-options.js.map +1 -1
- package/dist/server/agent-chat/prompt-resources.js +1 -1
- package/dist/server/agent-chat/prompt-resources.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +2 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +79 -56
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/templates/default/.agents/skills/secrets/SKILL.md +14 -7
- package/dist/templates/headless/.agents/skills/secrets/SKILL.md +14 -7
- package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
- package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
- package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +14 -7
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +1 -0
- package/dist/vite/client.js.map +1 -1
- package/docs/content/agent-native-toolkit.mdx +13 -6
- package/docs/content/cloneable-saas.mdx +5 -5
- package/docs/content/creating-templates.mdx +9 -0
- package/docs/content/deployment.mdx +14 -10
- package/docs/content/doctor.mdx +8 -1
- package/docs/content/drop-in-agent.mdx +1 -1
- package/docs/content/extensions.mdx +18 -18
- package/docs/content/faq.mdx +4 -4
- package/docs/content/key-concepts.mdx +30 -21
- package/docs/content/template-brain-developers.mdx +4 -1
- package/docs/content/template-mail-developers.mdx +4 -1
- package/docs/content/what-is-agent-native.mdx +6 -6
- package/package.json +2 -2
- package/src/a2a/client.ts +449 -66
- package/src/a2a/correlation.ts +31 -0
- package/src/a2a/types.ts +4 -0
- package/src/action.ts +3 -0
- package/src/agent/engine/registry.ts +45 -5
- package/src/agent/production-agent.ts +151 -18
- package/src/agent/run-loop-with-resume.ts +190 -3
- package/src/agent/run-manager.ts +117 -41
- package/src/agent/thread-debug-history.ts +86 -0
- package/src/agent/types.ts +3 -1
- package/src/cli/create.ts +11 -1
- package/src/cli/templates-meta.ts +2 -2
- package/src/client/agent-chat-adapter.ts +91 -13
- package/src/client/resources/McpIntegrationDialog.tsx +11 -9
- package/src/client/sse-event-processor.ts +17 -3
- package/src/db/client.ts +57 -17
- package/src/integrations/adapters/slack.ts +8 -3
- package/src/localization/default-messages.ts +44 -0
- package/src/observability/traces.ts +78 -5
- package/src/scripts/call-agent.ts +290 -9
- package/src/scripts/describe-workspace-apps.ts +2 -2
- package/src/secrets/crypto.ts +126 -34
- package/src/secrets/storage.ts +61 -25
- package/src/server/agent-capabilities.ts +1 -1
- package/src/server/agent-chat/action-filters-a2a.ts +111 -7
- package/src/server/agent-chat/context-tools.ts +2 -0
- package/src/server/agent-chat/plugin-options.ts +34 -1
- package/src/server/agent-chat/prompt-resources.ts +1 -1
- package/src/server/agent-chat-plugin.ts +91 -59
- package/src/templates/default/.agents/skills/secrets/SKILL.md +14 -7
- package/src/templates/headless/.agents/skills/secrets/SKILL.md +14 -7
- package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
- package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
- package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +14 -7
- package/src/vite/client.ts +1 -0
|
@@ -32,7 +32,6 @@ interface DeckCardProps {
|
|
|
32
32
|
onRename: (id: string, newTitle: string) => void;
|
|
33
33
|
onDuplicate: (id: string) => void;
|
|
34
34
|
onToggleStar: (id: string, starred: boolean) => void;
|
|
35
|
-
isDuplicating?: boolean;
|
|
36
35
|
designSystemTitle?: string | null;
|
|
37
36
|
isWorkspaceDefault?: boolean;
|
|
38
37
|
canSetWorkspaceDefault?: boolean;
|
|
@@ -45,7 +44,6 @@ export default function DeckCard({
|
|
|
45
44
|
onRename,
|
|
46
45
|
onDuplicate,
|
|
47
46
|
onToggleStar,
|
|
48
|
-
isDuplicating = false,
|
|
49
47
|
designSystemTitle,
|
|
50
48
|
isWorkspaceDefault = false,
|
|
51
49
|
canSetWorkspaceDefault = false,
|
|
@@ -230,15 +228,9 @@ export default function DeckCard({
|
|
|
230
228
|
<IconPencil className="w-3.5 h-3.5 me-2" />
|
|
231
229
|
Rename
|
|
232
230
|
</DropdownMenuItem>
|
|
233
|
-
<DropdownMenuItem
|
|
234
|
-
onSelect={() => {
|
|
235
|
-
if (isDuplicating) return;
|
|
236
|
-
onDuplicate(deck.id);
|
|
237
|
-
}}
|
|
238
|
-
disabled={isDuplicating}
|
|
239
|
-
>
|
|
231
|
+
<DropdownMenuItem onSelect={() => onDuplicate(deck.id)}>
|
|
240
232
|
<IconCopy className="w-3.5 h-3.5 me-2" />
|
|
241
|
-
|
|
233
|
+
Duplicate
|
|
242
234
|
</DropdownMenuItem>
|
|
243
235
|
<DropdownMenuItem
|
|
244
236
|
onSelect={(event) => {
|
|
@@ -46,11 +46,13 @@ let idCounter = 0;
|
|
|
46
46
|
interface MermaidRendererProps {
|
|
47
47
|
definition: string;
|
|
48
48
|
className?: string;
|
|
49
|
+
index?: number;
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
export function MermaidRenderer({
|
|
52
53
|
definition,
|
|
53
54
|
className,
|
|
55
|
+
index,
|
|
54
56
|
}: MermaidRendererProps) {
|
|
55
57
|
const containerRef = useRef<HTMLDivElement>(null);
|
|
56
58
|
const [svg, setSvg] = useState<string>("");
|
|
@@ -98,6 +100,7 @@ export function MermaidRenderer({
|
|
|
98
100
|
if (error) {
|
|
99
101
|
return (
|
|
100
102
|
<div
|
|
103
|
+
data-mermaid-index={index}
|
|
101
104
|
className={`flex items-center justify-center p-4 text-xs text-red-400/70 ${className || ""}`}
|
|
102
105
|
>
|
|
103
106
|
<pre className="whitespace-pre-wrap">{error}</pre>
|
|
@@ -105,11 +108,19 @@ export function MermaidRenderer({
|
|
|
105
108
|
);
|
|
106
109
|
}
|
|
107
110
|
|
|
108
|
-
if (!svg)
|
|
111
|
+
if (!svg) {
|
|
112
|
+
// Mermaid's import + render is async, so this placeholder is the only
|
|
113
|
+
// thing in the DOM until it resolves. Without it, an edit to another
|
|
114
|
+
// element on the same slide made while the diagram is still loading
|
|
115
|
+
// would see zero `[data-mermaid-index]` nodes when serializing the
|
|
116
|
+
// slide, and silently drop the diagram from the saved content.
|
|
117
|
+
return <div data-mermaid-index={index} className={className} />;
|
|
118
|
+
}
|
|
109
119
|
|
|
110
120
|
return (
|
|
111
121
|
<div
|
|
112
122
|
ref={containerRef}
|
|
123
|
+
data-mermaid-index={index}
|
|
113
124
|
className={`flex items-center justify-center [&_svg]:max-w-full [&_svg]:max-h-full ${className || ""}`}
|
|
114
125
|
dangerouslySetInnerHTML={{ __html: svg }}
|
|
115
126
|
/>
|
|
@@ -14,6 +14,7 @@ import rehypeRaw from "rehype-raw";
|
|
|
14
14
|
import { Skeleton } from "@/components/ui/skeleton";
|
|
15
15
|
import type { Slide } from "@/context/DeckContext";
|
|
16
16
|
import { type AspectRatio, getAspectRatioDims } from "@/lib/aspect-ratios";
|
|
17
|
+
import { extractMermaidBlocks } from "@/lib/mermaid-blocks";
|
|
17
18
|
import {
|
|
18
19
|
sanitizeCssValue,
|
|
19
20
|
sanitizeSlideHtml,
|
|
@@ -37,6 +38,8 @@ interface SlideRendererProps {
|
|
|
37
38
|
* The renderer no longer shrinks slides for vertical overflow — instead the
|
|
38
39
|
* editor surfaces this so the agent can rewrite the slide to fit. */
|
|
39
40
|
onOverflowChange?: (info: SlideOverflowInfo) => void;
|
|
41
|
+
/** Fires after AutoFit has applied its final transform for this render. */
|
|
42
|
+
onAutofitSettled?: () => void;
|
|
40
43
|
}
|
|
41
44
|
|
|
42
45
|
export const layoutClasses: Record<string, string> = {
|
|
@@ -311,9 +314,12 @@ function useSlideAutofit(
|
|
|
311
314
|
canvasHeight: number,
|
|
312
315
|
fitKey: string,
|
|
313
316
|
onOverflowChange?: (info: SlideOverflowInfo) => void,
|
|
317
|
+
onAutofitSettled?: () => void,
|
|
314
318
|
) {
|
|
315
319
|
const overflowCallbackRef = useRef(onOverflowChange);
|
|
316
320
|
overflowCallbackRef.current = onOverflowChange;
|
|
321
|
+
const autofitSettledRef = useRef(onAutofitSettled);
|
|
322
|
+
autofitSettledRef.current = onAutofitSettled;
|
|
317
323
|
|
|
318
324
|
useIsomorphicLayoutEffect(() => {
|
|
319
325
|
const root = ref.current;
|
|
@@ -395,6 +401,7 @@ function useSlideAutofit(
|
|
|
395
401
|
viewportHeight: 0,
|
|
396
402
|
},
|
|
397
403
|
);
|
|
404
|
+
autofitSettledRef.current?.();
|
|
398
405
|
}
|
|
399
406
|
};
|
|
400
407
|
|
|
@@ -437,6 +444,7 @@ function AutoFitContent({
|
|
|
437
444
|
className = "",
|
|
438
445
|
children,
|
|
439
446
|
onOverflowChange,
|
|
447
|
+
onAutofitSettled,
|
|
440
448
|
}: {
|
|
441
449
|
canvasWidth: number;
|
|
442
450
|
canvasHeight: number;
|
|
@@ -444,9 +452,17 @@ function AutoFitContent({
|
|
|
444
452
|
className?: string;
|
|
445
453
|
children: ReactNode;
|
|
446
454
|
onOverflowChange?: (info: SlideOverflowInfo) => void;
|
|
455
|
+
onAutofitSettled?: () => void;
|
|
447
456
|
}) {
|
|
448
457
|
const ref = useRef<HTMLDivElement>(null);
|
|
449
|
-
useSlideAutofit(
|
|
458
|
+
useSlideAutofit(
|
|
459
|
+
ref,
|
|
460
|
+
canvasWidth,
|
|
461
|
+
canvasHeight,
|
|
462
|
+
fitKey,
|
|
463
|
+
onOverflowChange,
|
|
464
|
+
onAutofitSettled,
|
|
465
|
+
);
|
|
450
466
|
|
|
451
467
|
return (
|
|
452
468
|
<div
|
|
@@ -469,18 +485,9 @@ function BlankSlideContent({ content }: { content: string }) {
|
|
|
469
485
|
// includes the per-block `contentEditable="true"` set by SlideEditor's
|
|
470
486
|
// double-click-to-edit flow, which made inline text editing appear to do nothing.
|
|
471
487
|
const { mermaidBlocks, htmlWithPlaceholders, dangerousHtml } = useMemo(() => {
|
|
472
|
-
// Extract mermaid blocks BEFORE sanitization
|
|
473
|
-
//
|
|
474
|
-
|
|
475
|
-
// `A --> B` and breaks the mermaid parser.
|
|
476
|
-
const blocks: string[] = [];
|
|
477
|
-
const contentWithPlaceholders = content.replace(
|
|
478
|
-
/<div\s+class="mermaid"[^>]*>([\s\S]*?)<\/div>/gi,
|
|
479
|
-
(_, definition) => {
|
|
480
|
-
blocks.push(String(definition).trim());
|
|
481
|
-
return `<div data-mermaid-index="${blocks.length - 1}"></div>`;
|
|
482
|
-
},
|
|
483
|
-
);
|
|
488
|
+
// Extract mermaid blocks BEFORE sanitization — see mermaid-blocks.ts for
|
|
489
|
+
// why (sanitizer HTML-escaping breaks the mermaid parser).
|
|
490
|
+
const { blocks, contentWithPlaceholders } = extractMermaidBlocks(content);
|
|
484
491
|
|
|
485
492
|
// Apply white filter to all logo images (brandfetch, logo.dev, etc.) for dark backgrounds
|
|
486
493
|
const processed = sanitizeSlideHtml(
|
|
@@ -547,6 +554,7 @@ function MermaidHtmlContent({
|
|
|
547
554
|
<MermaidRenderer
|
|
548
555
|
key={`mermaid-${i}`}
|
|
549
556
|
definition={mermaidBlocks[idx]}
|
|
557
|
+
index={idx}
|
|
550
558
|
className="my-4 w-full"
|
|
551
559
|
/>
|
|
552
560
|
);
|
|
@@ -564,11 +572,13 @@ export function SlideInner({
|
|
|
564
572
|
designSystem,
|
|
565
573
|
aspectRatio,
|
|
566
574
|
onOverflowChange,
|
|
575
|
+
onAutofitSettled,
|
|
567
576
|
}: {
|
|
568
577
|
slide: Slide;
|
|
569
578
|
designSystem?: DesignSystemData;
|
|
570
579
|
aspectRatio?: AspectRatio;
|
|
571
580
|
onOverflowChange?: (info: SlideOverflowInfo) => void;
|
|
581
|
+
onAutofitSettled?: () => void;
|
|
572
582
|
}) {
|
|
573
583
|
const t = useT();
|
|
574
584
|
const dims = getAspectRatioDims(aspectRatio);
|
|
@@ -651,6 +661,7 @@ export function SlideInner({
|
|
|
651
661
|
fitKey={left}
|
|
652
662
|
className="slide-content text-white/90"
|
|
653
663
|
onOverflowChange={onOverflowChange}
|
|
664
|
+
onAutofitSettled={onAutofitSettled}
|
|
654
665
|
>
|
|
655
666
|
<ReactMarkdown
|
|
656
667
|
components={markdownComponents}
|
|
@@ -664,6 +675,7 @@ export function SlideInner({
|
|
|
664
675
|
canvasHeight={dims.height}
|
|
665
676
|
fitKey={right}
|
|
666
677
|
className="slide-content text-white/90"
|
|
678
|
+
onAutofitSettled={onAutofitSettled}
|
|
667
679
|
>
|
|
668
680
|
<ReactMarkdown
|
|
669
681
|
components={markdownComponents}
|
|
@@ -689,6 +701,7 @@ export function SlideInner({
|
|
|
689
701
|
fitKey={content}
|
|
690
702
|
className="h-full w-full"
|
|
691
703
|
onOverflowChange={onOverflowChange}
|
|
704
|
+
onAutofitSettled={onAutofitSettled}
|
|
692
705
|
>
|
|
693
706
|
<BlankSlideContent content={content} />
|
|
694
707
|
</AutoFitContent>
|
|
@@ -714,6 +727,7 @@ export function SlideInner({
|
|
|
714
727
|
fitKey={content}
|
|
715
728
|
className="slide-content text-white/90 w-full"
|
|
716
729
|
onOverflowChange={onOverflowChange}
|
|
730
|
+
onAutofitSettled={onAutofitSettled}
|
|
717
731
|
>
|
|
718
732
|
<ReactMarkdown
|
|
719
733
|
components={markdownComponents}
|
|
@@ -733,6 +747,7 @@ export default function SlideRenderer({
|
|
|
733
747
|
designSystem,
|
|
734
748
|
aspectRatio,
|
|
735
749
|
onOverflowChange,
|
|
750
|
+
onAutofitSettled,
|
|
736
751
|
}: SlideRendererProps) {
|
|
737
752
|
const dims = getAspectRatioDims(aspectRatio);
|
|
738
753
|
|
|
@@ -753,6 +768,7 @@ export default function SlideRenderer({
|
|
|
753
768
|
designSystem={designSystem}
|
|
754
769
|
aspectRatio={aspectRatio}
|
|
755
770
|
onOverflowChange={onOverflowChange}
|
|
771
|
+
onAutofitSettled={onAutofitSettled}
|
|
756
772
|
/>
|
|
757
773
|
</div>
|
|
758
774
|
<ScaleHelper
|
|
@@ -783,6 +799,7 @@ export default function SlideRenderer({
|
|
|
783
799
|
designSystem={designSystem}
|
|
784
800
|
aspectRatio={aspectRatio}
|
|
785
801
|
onOverflowChange={onOverflowChange}
|
|
802
|
+
onAutofitSettled={onAutofitSettled}
|
|
786
803
|
/>
|
|
787
804
|
</div>
|
|
788
805
|
<ScaleHelper targetWidth={dims.width} />
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Skeleton } from "@/components/ui/skeleton";
|
|
2
|
+
|
|
3
|
+
export function DeckEditorSkeleton({ label }: { label: string }) {
|
|
4
|
+
return (
|
|
5
|
+
<div
|
|
6
|
+
className="flex h-full min-h-0 flex-1 flex-col overflow-hidden bg-background"
|
|
7
|
+
role="status"
|
|
8
|
+
aria-label={label}
|
|
9
|
+
data-testid="deck-editor-loading"
|
|
10
|
+
>
|
|
11
|
+
<div className="flex h-11 shrink-0 items-center gap-3 border-b border-border px-3">
|
|
12
|
+
<Skeleton className="size-8 rounded-md" />
|
|
13
|
+
<Skeleton className="h-5 w-36" />
|
|
14
|
+
<div className="ml-auto flex items-center gap-2">
|
|
15
|
+
<Skeleton className="h-8 w-20 rounded-md" />
|
|
16
|
+
<Skeleton className="size-8 rounded-md" />
|
|
17
|
+
<Skeleton className="size-8 rounded-md" />
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
<div className="flex min-h-0 flex-1">
|
|
21
|
+
<div className="hidden w-56 shrink-0 flex-col gap-4 border-r border-border p-4 sm:w-64 md:flex">
|
|
22
|
+
{[0, 1, 2].map((index) => (
|
|
23
|
+
<div key={index} className="flex gap-3">
|
|
24
|
+
<Skeleton className="h-4 w-4 shrink-0 rounded-sm" />
|
|
25
|
+
<Skeleton className="aspect-video flex-1 rounded-md" />
|
|
26
|
+
</div>
|
|
27
|
+
))}
|
|
28
|
+
</div>
|
|
29
|
+
<div className="flex min-w-0 flex-1 items-center justify-center bg-muted/20 p-6">
|
|
30
|
+
<Skeleton className="aspect-video w-full max-w-4xl rounded-md shadow-sm" />
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
@@ -51,14 +51,14 @@ interface EditorSidebarProps {
|
|
|
51
51
|
onDuplicateSlide: (id: string) => void;
|
|
52
52
|
onDeleteSlide: (id: string) => void;
|
|
53
53
|
onAddEmptySlide: () => void;
|
|
54
|
+
/** Viewer-role decks get thumbnails only: no add, duplicate, or delete. */
|
|
55
|
+
readOnly?: boolean;
|
|
54
56
|
/** Presence map: slideId → list of users currently viewing that slide */
|
|
55
57
|
slidePresence?: Map<string, CollabUser[]>;
|
|
56
58
|
/** Lingering recent edits (e.g. agent edits) to highlight over thumbnails. */
|
|
57
59
|
recentEdits?: AttributedRecentEdit[];
|
|
58
60
|
/** Deck aspect ratio (defaults to 16:9 when omitted) */
|
|
59
61
|
aspectRatio?: AspectRatio;
|
|
60
|
-
/** True while a newly-created deck is being populated slide by slide. */
|
|
61
|
-
deckGenerating?: boolean;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
/** Extract the slide id from a `{kind:"paths",paths:["slides.<id>"]}` edit. */
|
|
@@ -183,6 +183,7 @@ function SortableSlideThumb({
|
|
|
183
183
|
registerButtonRef,
|
|
184
184
|
presenceUsers = [],
|
|
185
185
|
aspectRatio,
|
|
186
|
+
readOnly = false,
|
|
186
187
|
}: {
|
|
187
188
|
slide: Slide;
|
|
188
189
|
index: number;
|
|
@@ -190,6 +191,7 @@ function SortableSlideThumb({
|
|
|
190
191
|
onSelect: () => void;
|
|
191
192
|
onDuplicate: () => void;
|
|
192
193
|
onDelete: () => void;
|
|
194
|
+
readOnly?: boolean;
|
|
193
195
|
registerButtonRef: (slideId: string, node: HTMLButtonElement | null) => void;
|
|
194
196
|
presenceUsers?: CollabUser[];
|
|
195
197
|
aspectRatio?: AspectRatio;
|
|
@@ -204,6 +206,7 @@ function SortableSlideThumb({
|
|
|
204
206
|
isDragging,
|
|
205
207
|
} = useSortable({
|
|
206
208
|
id: slide.id,
|
|
209
|
+
disabled: readOnly,
|
|
207
210
|
});
|
|
208
211
|
|
|
209
212
|
const style = {
|
|
@@ -270,38 +273,40 @@ function SortableSlideThumb({
|
|
|
270
273
|
</button>
|
|
271
274
|
|
|
272
275
|
{/* Actions - always visible on touch devices */}
|
|
273
|
-
|
|
274
|
-
<
|
|
275
|
-
<
|
|
276
|
-
<
|
|
277
|
-
|
|
278
|
-
e
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
<
|
|
291
|
-
<
|
|
292
|
-
|
|
293
|
-
e
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
276
|
+
{!readOnly && (
|
|
277
|
+
<div className="absolute top-2 right-2 flex gap-0.5 sm:opacity-0 sm:group-hover:opacity-100">
|
|
278
|
+
<Tooltip>
|
|
279
|
+
<TooltipTrigger asChild>
|
|
280
|
+
<button
|
|
281
|
+
onClick={(e) => {
|
|
282
|
+
e.stopPropagation();
|
|
283
|
+
onDuplicate();
|
|
284
|
+
}}
|
|
285
|
+
className="p-1.5 rounded bg-black/60 backdrop-blur-sm border border-white/10 hover:bg-black/80"
|
|
286
|
+
aria-label={t("editorSidebar.duplicateSlide")}
|
|
287
|
+
>
|
|
288
|
+
<IconCopy className="w-3 h-3 text-white/60" />
|
|
289
|
+
</button>
|
|
290
|
+
</TooltipTrigger>
|
|
291
|
+
<TooltipContent>{t("editorSidebar.duplicate")}</TooltipContent>
|
|
292
|
+
</Tooltip>
|
|
293
|
+
<Tooltip>
|
|
294
|
+
<TooltipTrigger asChild>
|
|
295
|
+
<button
|
|
296
|
+
onClick={(e) => {
|
|
297
|
+
e.stopPropagation();
|
|
298
|
+
onDelete();
|
|
299
|
+
}}
|
|
300
|
+
className="p-1.5 rounded bg-black/60 backdrop-blur-sm border border-white/10 hover:bg-red-900/80"
|
|
301
|
+
aria-label={t("editorSidebar.deleteSlide")}
|
|
302
|
+
>
|
|
303
|
+
<IconTrash className="w-3 h-3 text-white/60" />
|
|
304
|
+
</button>
|
|
305
|
+
</TooltipTrigger>
|
|
306
|
+
<TooltipContent>{t("editorSidebar.delete")}</TooltipContent>
|
|
307
|
+
</Tooltip>
|
|
308
|
+
</div>
|
|
309
|
+
)}
|
|
305
310
|
</div>
|
|
306
311
|
);
|
|
307
312
|
}
|
|
@@ -550,10 +555,10 @@ export default function EditorSidebar({
|
|
|
550
555
|
onDuplicateSlide,
|
|
551
556
|
onDeleteSlide,
|
|
552
557
|
onAddEmptySlide,
|
|
558
|
+
readOnly = false,
|
|
553
559
|
slidePresence,
|
|
554
560
|
recentEdits,
|
|
555
561
|
aspectRatio,
|
|
556
|
-
deckGenerating = false,
|
|
557
562
|
}: EditorSidebarProps) {
|
|
558
563
|
const t = useT();
|
|
559
564
|
const activeIndex = slides.findIndex((s) => s.id === activeSlideId);
|
|
@@ -577,7 +582,6 @@ export default function EditorSidebar({
|
|
|
577
582
|
[],
|
|
578
583
|
);
|
|
579
584
|
const { generating, submit: agentSubmit } = useAgentGenerating();
|
|
580
|
-
const showGeneratingSlide = deckGenerating || addSlideGenerating;
|
|
581
585
|
|
|
582
586
|
const registerSlideButton = useCallback(
|
|
583
587
|
(slideId: string, node: HTMLButtonElement | null) => {
|
|
@@ -638,7 +642,7 @@ export default function EditorSidebar({
|
|
|
638
642
|
<span className="text-xs font-medium text-muted-foreground uppercase tracking-wider">
|
|
639
643
|
{t("editorSidebar.slides")}
|
|
640
644
|
</span>
|
|
641
|
-
{
|
|
645
|
+
{readOnly ? null : addSlideGenerating ? (
|
|
642
646
|
<IconLoader2 className="w-4 h-4 text-muted-foreground animate-spin" />
|
|
643
647
|
) : (
|
|
644
648
|
<Tooltip>
|
|
@@ -674,13 +678,14 @@ export default function EditorSidebar({
|
|
|
674
678
|
onSelect={() => onSelectSlide(slide.id)}
|
|
675
679
|
onDuplicate={() => onDuplicateSlide(slide.id)}
|
|
676
680
|
onDelete={() => onDeleteSlide(slide.id)}
|
|
681
|
+
readOnly={readOnly}
|
|
677
682
|
registerButtonRef={registerSlideButton}
|
|
678
683
|
presenceUsers={slidePresence?.get(slide.id) ?? []}
|
|
679
684
|
aspectRatio={aspectRatio}
|
|
680
685
|
/>
|
|
681
686
|
))}
|
|
682
687
|
</SortableContext>
|
|
683
|
-
{
|
|
688
|
+
{addSlideGenerating && (
|
|
684
689
|
<GeneratingSlideSkeleton
|
|
685
690
|
index={slides.length}
|
|
686
691
|
aspectRatio={aspectRatio}
|
|
@@ -697,24 +702,26 @@ export default function EditorSidebar({
|
|
|
697
702
|
)}
|
|
698
703
|
</div>
|
|
699
704
|
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
705
|
+
{!readOnly && (
|
|
706
|
+
<AddSlidePopover
|
|
707
|
+
open={addOpen}
|
|
708
|
+
onOpenChange={setAddOpen}
|
|
709
|
+
anchorRef={headerAddRef}
|
|
710
|
+
deckId={deckId}
|
|
711
|
+
deckTitle={deckTitle}
|
|
712
|
+
activeSlideId={activeSlideId}
|
|
713
|
+
slideCount={slides.length}
|
|
714
|
+
activeSlideIndex={activeIndex >= 0 ? activeIndex : 0}
|
|
715
|
+
agentSubmit={(msg, ctx) => {
|
|
716
|
+
setAddSlideGenerating(true);
|
|
717
|
+
agentSubmit(msg, ctx);
|
|
718
|
+
}}
|
|
719
|
+
onDuplicateCurrent={
|
|
720
|
+
activeSlideId ? () => onDuplicateSlide(activeSlideId) : undefined
|
|
721
|
+
}
|
|
722
|
+
onAddEmpty={onAddEmptySlide}
|
|
723
|
+
/>
|
|
724
|
+
)}
|
|
718
725
|
</div>
|
|
719
726
|
);
|
|
720
727
|
}
|